交叉熵损失函数和NLL_loss

目录

 1.交叉熵损失函数的计算过程:

2.交叉熵损失函数的公式:

3.NLL loss(负对数似然函数损失)

4.NLL_Loss和交叉熵损失函数关系


 1.交叉熵损失函数的计算过程:

 交叉熵损失函数和NLL_loss_第1张图片

交叉熵损失函数经常用于分类问题中,特别是在神经网络做分类问题时,也经常使用交叉熵作为损失函数,此外,由于交叉熵涉及到计算每个类别的概率,所以交叉熵几乎每次都和sigmoid(或softmax)函数一起出现。

我们用神经网络最后一层输出的情况,来看一眼整个模型预测、获得损失和学习的流程:

  1. 神经网络最后一层得到每个类别的得分scores(也叫logits)
  2. 该得分经过sigmoid(或softmax)函数获得概率输出;
  3. 模型预测的类别概率输出与真实类别的one hot形式进行交叉熵损失函数的计算。

2.交叉熵损失函数的公式:

参考:https://zhuanlan.zhihu.com/p/35709485

交叉熵损失函数和NLL_loss_第2张图片

3.NLL loss(负对数似然函数损失)定义和pytorch实现

NLL\_Loss=-\sum log(P)

但是pytorch中的NLL loss定义中却没有对score做log运算(仅对输入score做求和取负),因此官方文档要求,在使用nll_loss之前需要对score做log运算,这样计算出来的就是nll-loss原本的定义:

torch.nn.functional.nll_loss — PyTorch 1.11.0 documentation

交叉熵损失函数和NLL_loss_第3张图片

 并通过参数reduction 可以控制输出是否做“不做操作|平均|求和”

4.NLL_Loss和交叉熵损失函数关系

  • 就数学上的严格定义而言,二者区别在于是否对score做softmax运算,即:

CrossEntropy(score)=NLL\_Loss(softmax(score))

  • 就pytorch的实现而言,二者的区别在于是否对score做log_foftmax运算(因为pytorch中NLL_Loss没有对score做log运算):

CrossEntropy(score)=NLL\_Loss(log\_softmax(score))

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

CrossEntropyLoss()=log_softmax() + NLLLoss() 

其中,softmax()定义如下:

log_softmax()定义如下:

参考:损失函数——负对数似然_Pr4da的博客-CSDN博客_负对数似然损失函数

Pytorch详解NLLLoss和CrossEntropyLoss_豪哥123的博客-CSDN博客_nllloss

CrossEntropyLoss与NLLLoss的总结_街道口扛把子的博客-CSDN博客_f.nll_loss

你可能感兴趣的:(机器学习)