一、基础知识

1. 交叉熵损失可以采用“sigmoid+BCE”或是“softmax+CE”。pyytorch的使用:

  • “sigmoid+BCE”: 
torch.nn.BCELoss(weight=None, reduction='mean')
torch.nn.BCEWithLogitsLoss(weight=None, reduction='mean', pos_weight=None)

BCEWithLogitsLoss损失函数把 Sigmoid 层集成到了 BCELoss 类中. 该版比用一个简单的 Sigmoid 层和 BCELoss 在数值上更稳定, 因为把这两个操作合并为一个层之后, 可以利用 log-sum-exp 的 技巧来实现数值稳定.

  • “softmax+CE”:
torch.nn.CrossEntropyLoss(weight=None,ignore_index=-100, reduction='mean')

2. 如何选择“sigmoid+BCE”还是“softmax+CE”?

  • 在分类问题中,如果遇到类别间不互斥的情况,只能采用“sigmoid+BCE”当作多个二分类问题处理;--> 二分类只能用“sigmoid+BCE”
  • 如果遇到类别间互斥的情况(只能有一类胜出),“sigmoid+BCE”化为多个二分类问题与“softmax+CE”直接进行分类都是有被用到的方法。-->多分类两者都有应用

二、理论部分

2.1 BCE 损失函数

设标签为y,网络预测结果为  ,BCE损失函数为:

此时有:

 因此,采用sigmoid激活函数+BCE损失函数,回传的梯度值是正比于预测与真值之差的。

2.2 CE 损失函数

设标签为 y,网络预测结果为 ,CE损失函数为:

此时有,

  可以观察到,对于只有一个类别是正确类别的分类问题:

 因此,softmax激活函数+CE损失函数,回传梯度的大小都是与预测值的偏差成正比。

 三、参考文章

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐