目录
1.交叉熵损失函数的计算过程:
交叉熵损失函数经常用于分类问题中,特别是在神经网络做分类问题时,也经常使用交叉熵作为损失函数,此外,由于交叉熵涉及到计算每个类别的概率,所以交叉熵几乎每次都和sigmoid(或softmax)函数一起出现。
我们用神经网络最后一层输出的情况,来看一眼整个模型预测、获得损失和学习的流程:
- 神经网络最后一层得到每个类别的得分scores(也叫logits);
- 该得分经过sigmoid(或softmax)函数获得概率输出;
- 模型预测的类别概率输出与真实类别的one hot形式进行交叉熵损失函数的计算。
2.交叉熵损失函数的公式:
参考:https://zhuanlan.zhihu.com/p/35709485
3.NLL loss(负对数似然函数损失)定义和pytorch实现
但是pytorch中的NLL loss定义中却没有对score做log运算(仅对输入score做求和取负),因此官方文档要求,在使用nll_loss之前需要对score做log运算,这样计算出来的就是nll-loss原本的定义:
torch.nn.functional.nll_loss — PyTorch 1.11.0 documentation
并通过参数reduction 可以控制输出是否做“不做操作|平均|求和”
4.NLL_Loss和交叉熵损失函数关系
- 就数学上的严格定义而言,二者区别在于是否对score做softmax运算,即:
- 就pytorch的实现而言,二者的区别在于是否对score做log_foftmax运算(因为pytorch中NLL_Loss没有对score做log运算):
换句话说,在pytorch中,NLLLoss 的 输入 是一个对数概率向量和一个目标标签. 它不会为我们计算对数概率. 适合网络的最后一层是log_softmax. 损失函数 nn.CrossEntropyLoss() 与 NLLLoss() 相同, 唯一的不同是它为我们去做 softmax.
CrossEntropyLoss()=log_softmax() + NLLLoss()
其中,softmax()定义如下:
log_softmax()定义如下:
参考:损失函数——负对数似然_Pr4da的博客-CSDN博客_负对数似然损失函数