Pytorch中易混淆的损失函数与激活函数【softmax, log_softmax, NLLLoss, CrossEntropy】

定义

  • softmax:将一个数值序列映射到概率空间(每个元素分布并且所有和为1)
  • log_softmax:在softmax的基础上取对数
  • NLLLoss:对log_softmax与one-hot进行计算
  • CrossEntropy:衡量两个概率分布的差别(交叉熵)

在分类问题中,CrossEntropy等价于log_softmax 结合 nll_loss。

激活函数

softmax

import torch
import torch.nn.functional as F
'''
torch.nn.functional 涉及了所有 torch.nn 需要 类 和 方法 ,torch.nn 构建的模块通常就是调用 torch.nn.functional 里的方法实现的.
'''
torch.manual_seed(0)
output = torch.randn(2, 3)
print(output)
#tensor([[ 1.5410, -0.2934, -2.1788],
#        [ 0.5684, -1.0845, -1.3986]])
print(F.softmax(output, dim=1))
# 这里dim的意思是计算Softmax的维度,这里设置dim=1,可以看到每一行的加和为1。0是对列 1 是对行
#tensor([[0.8446, 0.1349, 0.0205],
#       [0.7511, 0.1438, 0.1051]])

T-softmax

T-softmax的目的是平滑分布,不让分布太过于极端。比如可以看下面的实例哈。

import numpy as np

def softmax(x):
    x_exp = np.exp(x)
    return x_exp / np.sum(x_exp)

output = np.array([0.1, 1.6, 3.6])
print(softmax(output))
#[0.02590865 0.11611453 0.85797681]

使用带温度系数的softmax函数:

def softmax_t(x, t):
    x_exp = np.exp(x / t)
    return x_exp / np.sum(x_exp)

output = np.array([0.1, 1.6, 3.6])
print(softmax_t(output, 5))
#[0.22916797 0.3093444  0.46148762]

设置为5可以看到分布在【0,1】的数更加平滑了。

log_softmax

这个很好理解,其实就是对softmax处理之后的结果执行一次对数运算。可以理解为 log(softmax(output))

print(F.log_softmax(output, dim=1))
print(torch.log(F.softmax(output, dim=1)))
# 输出结果是一致的

tensor([[-0.1689, -2.0033, -3.8886], [-0.2862, -1.9392, -2.2532]]) tensor([[-0.1689, -2.0033, -3.8886], [-0.2862, -1.9392, -2.2532]])

损失函数

NLLLoss

该函数的全称是negative log likelihood loss. 若

`log_softmax NLLLoss`是深度学习领域中用于计算交叉熵损失的一种常见组合技术,尤其在分类任务中非常流行。 ### log_softmax 首先,我们解释一下`log_softmax`函数的作用。给定输入向量 `x`,log_softmax 函数会先应用 softmax 函数将每个元素转换成概率分布形式: \[ \text{softmax}(x)_i = \frac{\exp(x_i)}{\sum_{j=1}^{n} \exp(x_j)} \] 然后,对得到的概率分布取自然对数: \[ \text{log\_softmax}(x)_i = \ln(\text{softmax}(x)_i) \] 这个操作不仅简化了指数运算和归一化步骤,同时在数值稳定性方面也更优。尤其是在反向传播过程中,避免了直接对较大的指数值求对数可能会产生的数值溢出问题。 ### NLLLoss (Negative Log Likelihood Loss) 接下来说说 NLLLoss 的含义。NLLLoss,即负对数似然损失(Negative Log Likelihood Loss),是一种常用的损失函数,用于评估模型预测结果与实际标签之间的差距。在分类任务中,其目标是最小化模型预测的类别概率与真实标签之间的负对数似然度之和。 公式表示如下: \[ L(y, p) = -\log(p_y) \] 其中,\(y\) 表示真实标签,而 \(p_y\) 是模型预测属于该标签的概率。 ### 将二者结合使用 在实践中,我们将两个组件结合使用是因为它们各自的特点使其相得益彰: 1. **数值稳定性**:通过在计算过程中使用 `log_softmax` 可以提高数值稳定性和防止数值溢出的问题。 2. **简化梯度计算**:`log_softmax` 计算的导数可以直接与 NLLLoss 的导数关联起来,减少了梯度传播过程中的复杂性。 3. **提升训练效率**:这种组合使得梯度更新更为直接,从而加速了模型的训练过程,并有助于优化性能。 因此,在深度学习框架如 PyTorch 和 TensorFlow 中,`LogSoftmax + NLLLoss` 这种组合经常被推荐用于监督学习的任务特别是分类任务中。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值