Nll&ce Loss

Posted by Packy on January 12, 2020

NLLLoss 和 CE Loss 区别

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

CrossEntropyLoss()=log_softmax() + NLLLoss()

CrossEntropyLoss 和 NLLLoss 区别就是有没有做softmax

如果网络最后一层已经对输出做了softmax,则可以用NLLLoss ,否则就用交叉熵损失。

本质是一样的,基本上都是用交叉熵损失来进行分类任务的loss计算,只是实现上有的喜欢分开实现,分两步骤。

对于网络最后一层已经做了softmax的框架

def cal_loss(pred, gold, smoothing=True):

’’’ Calculate cross entropy loss, apply label smoothing if needed. ‘’’

gold = gold.contiguous().view(-1)

if smoothing:

​ eps = 0.2

​ n_class = pred.size(1)

​ one_hot = torch.zeros_like(pred).scatter(1, gold.view(-1, 1), 1)

​ print(one_hot)

​ one_hot = one_hot * (1 - eps) + (1 - one_hot) * eps / (n_class - 1)

​ #log_prb = F.log_softmax(pred, dim=1)

​ log_prb = pred

​ loss = -(one_hot * log_prb).sum(dim=1).mean()

else:

​ loss = F.cross_entropy(pred, gold, reduction=’mean’)

return loss

用这部分作为标签平滑的计算

1.背景介绍:

在多分类训练任务中,输入图片经过神级网络的计算,会得到当前输入图片对应于各个类别的置信度分数,这些分数会被softmax进行归一化处理,最终得到当前输入图片属于每个类别的概率。

之后在使用交叉熵函数来计算损失值:

最终在训练网络时,最小化预测概率和标签真实概率的交叉熵,从而得到最优的预测概率分布。在此过程中,为了达到最好的拟合效果,最优的预测概率分布为:

也就是说,网络会驱使自身往正确标签和错误标签差值大的方向学习,在训练数据不足以表征所以的样本特征的情况下,这就会导致网络过拟合。

2.label smoothing原理

label smoothing的提出就是为了解决上述问题。最早是在Inception v2中被提出,是一种正则化的策略。其通过”软化”传统的one-hot类型标签,使得在计算损失值时能够有效抑制过拟合现象。如下图所示,label smoothing相当于减少真实样本标签的类别在计算损失函数时的权重,最终起到抑制过拟合的效果。

1.label smoothing将真实概率分布作如下改变:

其实更新后的分布就相当于往真实分布中加入了噪声,为了便于计算,该噪声服从简单的均匀分布。

2.与之对应,label smoothing将交叉熵损失函数作如下改变:

3.与之对应,label smoothing将最优的预测概率分布作如下改变:

阿尔法可以是任意实数,最终通过抑制正负样本输出差值,使得网络能有更好的泛化能力。

————————————————

版权声明:本文为CSDN博主「yuanCruise」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qiu931110/article/details/86684241