PyTorch学习笔记之softmax和log_softmax的区别、CrossEntropyLoss() 与 NLLLoss() 的区别、log似然代价函数

1、softmax

函数 Softmax(x) 也是一个 non-linearity, 但它的特殊之处在于它通常是网络中一次操作. 这是因为它接受了一个实数向量并返回一个概率分布.其定义如下. 定义 x 是一个实数的向量(正数或负数都无所谓, 没有限制). 然后, 第i个 Softmax(x) 的组成是

在这里插入图片描述
输出是一个概率分布: 每个元素都是非负的, 并且所有元素的总和都是1.

2、log_softmax

在softmax的结果上再做多一次log运算

While mathematically equivalent to log(softmax(x)), doing these two
    operations separately is slower, and numerically unstable. This function
    uses an alternative formulation to compute the output and gradient correctly.
   

虽然在数学上等价于log(softmax(x)),但做这两个单独操作速度较慢,数值上也不稳定。这个函数使用另一种公式来正确计算输出和梯度。

测试:

import torch
import torch.autograd as autograd
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import numpy as np

data=autograd.Variable(torch.FloatTensor([1.0,2.0,3.0]))
log_softmax=F.log_softmax(data,dim=0)
print(log_softmax)

softmax=F.softmax(data,dim=0)
print(softmax)

np_softmax=softmax.data.numpy()
log_np_softmax=np.log(np_softmax)
print(log_np_softmax)

3、nn.CrossEntropyLoss() 与 NLLLoss()

NLLLoss 的 输入 是一个对数概率向量和一个目标标签. 它不会为我们计算对数概率. 适合网络的最后一层是log_softmax. 损失函数 nn.CrossEntropyLoss() 与 NLLLoss() 相同, 唯一的不同是它为我们去做 softmax.

4、log似然代价函数

在这里插入图片描述
其中,ak表示第k个神经元的输出值;yk表示第k个神经元对应的真实值,取值为0或1。实际上,做分类时候,只有一个yk为1,其他均为0,最终结果是C=−yklogak(ak对应着正确的那一个分类,log默认是e为底,ak∈[0,1],当ak最大时候,C=0),损失为0.

`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、付费专栏及课程。

余额充值