【深度学习】Cross Entropy Loss

Cross Entropy Loss (CE)被经常用在分类问题中,但之前也没仔细了解过其中一些细节。本博客主要针对Pytorch中对CE的支持,但也结合了对TensorFlow中的CE的支持。

其中本博客参考总结了大量其他博客的内容,在文中给出了链接,这些知识需要读者们按需自己点开阅读。但由于CE其实很基本,大家多了解一点CE的由来,Pytorch和TensorFlow对其工程上的实现,也没什么坏处。码字不易,读者若是觉得有用,请点个赞支持一下博主。

起因

最常见的分类问题是类间互斥的分类,也就是说网络输出的每个类的score要送入Softmax,以达到所有类别的prob在0~1之间,而且加起来等于1。但其实有些分类问题不是类间互斥,例如一张图片中既包含猫,也包含狗。

其实我关注到这个问题的原因是,在检测问题中,有个要预测的值是表示“box是否是包含object,objectness”,这本身是一个0-1分类问题。但随着检测方法的发展,这个值的label变的并不是0或1,而是加入了iou等一些考虑因素,也就是label=objectness*IoU(pred_box,gt_box)。

这就出现了两个问题:
1)label不再是0-1
2) 所有类别prob加起来也不再是1

这就使得pytorch中的CrossEntropyLoss不再适用。以下部分将对如下方面进行详解:
1)CE的由来
2)Tensorflow中的CE是怎么定义的
3)pytorch中的CE是怎么定义的
4)pytorch中CE和BCE等的区别

Cross Entropy Loss的由来

网上有很多,我主要是看的这个知乎回答,通过这个回答我们可以得到如下结论:
1)CE的由来可以由信息熵,KL散度推得
2)如果使用sigmoid函数作为分类问题最后归一到0-1之间的函数的话,MSELoss的效果要远不如CrossEntropyLoss
注:其中对于CE中梯度的推导,知乎回答并不是很详细,可以参考另外一篇博客

如果读者对CE的由来不敢兴趣的话,这里直接给出CE的公式:
在这里插入图片描述

Tensorflow中的CE

作为一个主流框架,Tensorflow对CE的支持还是比较全的,具体可以参考这篇博客。从这个博客中,我们可以得到如下知识:
1)Tensorflow中对CE的支持很多,分别对应了不同的情况
2)sigmoid_cross_entropy_with_logits适用每个类别相互独立但互不排斥的情况
3)softmax_cross_entropy_with_logits适用每个类别相互独立且排斥的情况
4)sparse_softmax_cross_entropy_with_logits每个类别相互独立且排斥的情况,相比于3)中的公式,区别在于label的输入时类别的索引,要求格式为int32或者int64
5)weighted_cross_entropy_with_logits计算具有权重的sigmoid交叉熵sigmoid_cross_entropy_with_logits()

注:要理解上述,还是得看一下参考的博客,这里为了偷懒,就不把原博客全搬过来了。

Pytorch中的CE

Pytorch中的CE的官网文档并没有给出CE的公式,而是只说了CE是NLLLoss与Softmax相结合的,那么去看NLLLoss的官方文档,可以看到如下:
在这里插入图片描述
CE只是在NLLLoss之前加了Softmax。看NLLLoss,其label也就是上面的y也是类别的索引,CE也是一样,要求label或者说target的输入是类别的索引。而且CE已经结合了Softmax,所以一定是对应着类间互斥的情况。

到这里,这就说明了在起因中我说Pytorch的CE的支持有些问题。

而Pytorch中的CE则是对应着TensorFlow中的sparse_softmax_cross_entropy_with_logits()的。

Pytorch中CE和BCE的区别

Pytorch除了支持CE,还支持了Binary Cross Entropy Loss,其两者区别绝不仅仅是一个多类一个是二分类,我们看一下BCELoss的官方文档,BCELoss如下:
在这里插入图片描述
而且从例子中看到,label的输入时概率,而不再是类别的索引了。

再看一下Pytorch中支持的另外一个BCE的变种,BCEWithLogitsLoss
在这里插入图片描述对比TensorFlow中的,就很像是weighted_cross_entropy_with_logits()函数的。

以上就是我的学习过程。

Pytorch中的MultiLabelSoftMarginLoss

那么其实还留下一个问题就是Pytorch中是否有TensorFlow中weighted_cross_entropy_with_logits()类似的CE的支持吗?

还有一个就是MultiLabelSoftMarginLoss,之前根本没有注意到这个loss,从其官方文档中可以看到loss具体公式如下:
在这里插入图片描述
细看其公式,可以看出来,与之前提到的weighted_cross_entropy_with_logits()很相似的,weighted_cross_entropy_with_logits()如下:
在这里插入图片描述
但其问题在于label是one-hot编码的类

如果小可爱耐心地看到了这里,那就找我愉快地讨论一下吧。

猜你喜欢

转载自blog.csdn.net/wqwqqwqw1231/article/details/105506506
今日推荐