一、基础知识
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损失函数,回传梯度的大小都是与预测值的偏差成正比。