最近一直在总结Pytorch中Loss的各种用法,交叉熵是深度学习中最常用的计算方法,写这个稿子把交叉熵的来龙去脉做一个总结。
作者:元峰
来源:AIZOO
什么是交叉熵
信息量
引用百度百科中信息量的例子来看,
在日常生活中,极少发生的事件一旦发生是容易引起人们关注的,而司空见惯的事不会引起注意,也就是说,极少见的事件所带来的信息量多。如果用统计学的术语来描述,就是出现概率小的事件信息量多。因此,事件出现得概率越小,信息量愈大。即信息量的多少是与事件发生频繁(即概率大小)成反比。
故越小概率的事情发生的事件本身具有的信息量就越大。例如在去年夏天,小卡拒了湖人投奔快船还捎带打劫雷霆了一个泡椒,这种闷声大发财的事情就有很大的信息量。
信息量的计算公式为:
信息熵
理解了信息量之后,信息熵的理解也就不再困难了。熵原本是热力学中的一个概念,是用来衡量混乱程度的物理量。信息熵则是借用热力学的概念,衡量在事件发生前对于产生信息量的期望。即信息量是确定的具体事件发生后的信息的度量,信息熵是事件发生前预估的期望。
信息熵的计算公式为:
可以看到信息熵是一个求和的函数,是求得信息量的期望。还是以小卡为例,小卡转会前,假设去湖人的概率是0.4,去其他30支球队的概率分别为(计算方便),猛龙概率为0(心疼...),那么小卡转会的信息熵为
所以小卡转会这个事件预计的信息量为,但是实际小卡去了快船,实际的信息量为。因为这是一个非常轰动的事件,所以实际的信息量大于了估计所得的期望。
KL散度与交叉熵
理解了信息量和信息熵之后,接下来就是交叉熵的概念了。介绍交叉熵之前,Loss是绕不开的。Loss的通俗解释就是预测值和真实值的差异,然后有各种各样的方法来衡量这个差异有多大,本文所介绍的交叉熵也是一种衡量Loss的方法。
KL散度
在讲交叉熵之前,有一个类似的东西叫KL散度,KL散度是用来衡量两个分布之间差异的指标,计算公式为
公式里面是真实值,是预测值,如果与相同时,即两者之间没有差异。
交叉熵
现在我们将KL散度的公式进行变形,
其中是真实值的信息熵,第二项
就是多分类的交叉熵。因此KL散度也被成为相对熵。对于二分类而言,交叉熵为
二分类交叉熵
Pytorch总共提供了两种二分类交叉熵,一种是nn.BCELoss
,另一种是nn.BCEWithLogitsLoss
,这两个的差别非常细微,nn.BCEWithLogitsLoss=nn.Sigmoid+nn.BCELoss
。这里结合Pytorch的代码做一下验证,首先先验证nn.BCELoss
,
对于nn.BCEWithLogitsLoss
而言,使用的代码为
可以看到两者的输入完全相同,输出nn.BCEWithLogitsLoss
完全等于nn.BCELoss
加上nn.Sigmoid
。
多分类交叉熵
对于多分类交叉熵函数而言,一般使用nn.CrossEntropyLoss
,该函数的计算流程为:
- 在输入值上施加
nn.Softmax
函数 - 对于第一步所得结果使用
log
函数,将较为耗时的乘法运算改为加法运算,并将其归一化到之间 - 将第二步所得输出输入
nn.NLLLoss
函数中,nn.NNLLLoss
的作用就是接受负对数似然值,然后对其求平均。
具体的案例在下一节的CIFAR-10的分类问题中。
实际应用
分类问题
这里我们使用Pytorch自带的CIFAR-10的数据集进行分类,训练的网络为
网络结构如下图所示:
使用的loss为nn.CrossEntropyLoss
,使用的优化器为SGD优化器,batch size为4,分类的图片类别为10类。
网络的输入为:
网络的输出为
输出是一个4×10
的矩阵,对应的label为,
将网络直接的输出输入到nn.softmax
可得,并验证加和结果为
接下来,将nn.softmax
的输出输入torch.log
可以得到
最后将log_outputs
通过nn.NLLLoss
并与nn.CrossEntropy
对比
可以发现经过组合的loss和直接用nn.CrossEntroyLoss
得到的loss是一样的。
下一次推送我们将会解析一下Kaiming大神的Focal Loss。
参考文献
[1] https://gombru.github.io/2018...\_entropy\_loss/
[2] https://www.baidu.com/link?ur...\_TPjZ8WbzU3im5Hq1JstcfLngNj4y0P5H4gC9lAhGLWnTBAgoucSnBu-Ek\_fwM-RuyWSOfPxv4Idbxr0hm-udxOVd3Yz4rFgPymoQpsOb8\_UsSmub-I&wd=&eqid=b0181d0f0002cd51000000045eccec89
[3] https://pytorch.org/docs/mast...
[4] https://pytorch.org/docs/mast...
相关文章
关于作者
我是元峰,互联网+AI领域的创业者,欢迎在微信搜索“AIZOO”关注我们的公众号AIZOO。
如果您是有算法需求,例如目标检测、人脸识别、缺陷检测、行人检测的算法需求,欢迎添加我们的微信号AIZOOTech与我们交流,我们团队是一群算法工程师的创业团队,会以高效、稳定、高性价比的产品满足您的需求。
如果您是算法或者开发工程师,也可以添加我们的微信号AIXZOOTech,请备注学校or公司名称-研究方向-昵称,例如“西电-图像算法-元峰”,元峰会拉您进我们的算法交流群,一起交流算法和开发的知识,以及对接项目。
关注元峰微信号“AIZOOTech”
更多算法模型相关请关注AIZOO专栏