CrossEntropyLoss与NLLLoss的总结

nll_loss(negative log likelihood loss):最大似然 / log似然代价函数
CrossEntropyLoss: 交叉熵损失函数。交叉熵描述了两个概率分布之间的距离,当交叉熵越小说明二者之间越接近。

nn.CrossEntropyLoss() 与 NLLLoss()

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

CrossEntropyLoss()=log_softmax() + NLLLoss() 

log似然代价函数

在这里插入图片描述

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

作者:HawardScut
来源:CSDN
原文:https://blog.csdn.net/hao5335156/article/details/80607732
版权声明:本文为博主原创文章,转载请附上博文链接!

用pytorch的一段代码验证CrossEntropyLoss和log+sorfmax + NLLLoss结果是一致的

data = torch.randn(2, 5)
log_soft = F.log_softmax(data, dim=1)
print('log_soft:', log_soft, '\n')

target = torch.tensor([1, 2])
entropy_out = F.cross_entropy(data, target)
nll_out = F.nll_loss(log_soft, target)
print('entropy_out:', entropy_out)
print('nll_out:', nll_out)

打印输出结果为

log_soft: tensor([[-1.7060, -2.9883, -0.4641, -2.7265, -2.6049],
        [-3.5031, -0.9056, -1.0348, -1.7917, -3.1319]])

entropy_out: tensor(2.0116)
nll_out: tensor(2.0116)

得到的结果是batch内的均值。

具体到一个数据,如果得到的输出为一个概率的分布,logits值越大的,经过log_softmax计算,得到的值(负数)越大。nll可以看做在标签位置对这个负数求出绝对值,从结果可以看出,如果预测与标签匹配,这个值小,不匹配,这个值大。因此我们训练的目的是让nll_loss变小。
在这里插入图片描述

参考资料:

https://blog.csdn.net/hao5335156/article/details/80607732
Pytorch详解NLLLoss和CrossEntropyLoss

你可能感兴趣的:(深度学习)