之前在代码中经常看见交叉熵损失函数 (CrossEntropy Loss),只知道它是分类问题中经常使用的一种损失函数,对于其内部的原理总是模模糊糊,而且一般使用交叉熵作为损失函数时,在模型的输出层总会接一个 softmax 函数,至于为什么要怎么做也是不懂,所以专门花了一些时间打算从原理入手,搞懂它,故在此写一篇博客进行总结,以便以后翻阅。

交叉熵简介

交叉熵是信息论中的一个重要概念,主要用于度量两个概率分布间的差异性,要理解交叉熵,需要先了解下面几个概念。

信息量

信息奠基人香农(Shannon)认为 “信息是用来消除随机不确定性的东西”,也就是说衡量信息量的大小就是看这个信息消除不确定性的程度。

“太阳从东边升起”,这条信息并没有减少不确定性,因为太阳肯定是从东边升起的,这是一句废话,信息量为 0。

”2018 年中国队成功进入世界杯 “,从直觉上来看,这句话具有很大的信息量。因为中国队进入世界杯的不确定性因素很大,而这句话消除了进入世界杯的不确定性,所以按照定义,这句话的信息量很大。

根据上述可总结如下:信息量的大小与信息发生的概率成反比。概率越大,信息量越小。概率越小,信息量越大。

设某一事件发生的概率为 P(x),其信息量表示为:
I(x)=−log⁡(P(x)) I\left ( x \right ) = -\log\left ( P\left ( x \right ) \right )
其中 I(x) I\left ( x \right ) 表示信息量,这里 log⁡ \log 表示以 e 为底的自然对数。

信息熵

信息熵也被称为熵,用来表示所有信息量的期望。

期望是试验中每次可能结果的概率乘以其结果的总和。

所以信息量的熵可表示为:(这里的 X X 是一个离散型随机变量)
H(X)=−∑i=1nP(xi)log⁡(P(xi)))(X=x1,x2,x3…,xn) H\left ( \mathbf{X} \right ) = -\sum \limits{i=1}^n P(x{i}) \log \left ( P \left ( x{i} \right ))) \qquad ( \mathbf{X}= x{1},x{2},x{3}…,x_{n} \right)
使用明天的天气概率来计算其信息熵:

序号 事件 概率 P 信息量
1 明天是晴天 0.5 −log⁡(0.5) -\log \left ( 0.5 \right )
2 明天出雨天 0.2 −log⁡(0.2) -\log \left ( 0.2 \right )
3 多云 0.3 −log⁡(0.3) -\log \left ( 0.3 \right )

H(X)=−(0.5∗log⁡(0.5)+0.2∗log⁡(0.2)+0.3∗log⁡(0.3)) H\left ( \mathbf{X} \right ) = -\left ( 0.5 \log \left ( 0.5 \right ) + 0.2 \log \left ( 0.2 \right ) + 0.3 * \log \left ( 0.3 \right ) \right)

对于 0-1 分布的问题,由于其结果只用两种情况,是或不是,设某一件事情发生的概率为 P(x) P\left ( x \right ),则另一件事情发生的概率为 1−P(x) 1-P\left ( x \right ),所以对于 0-1 分布的问题,计算熵的公式可以简化如下:
H(X)=−∑n=1nP(xilog⁡(P(xi)))=−[P(x)log⁡(P(x))+(1−P(x))log⁡(1−P(x))]=−P(x)log⁡(P(x))−(1−P(x))log⁡(1−P(x)) H\left ( \mathbf{X} \right ) = -\sum \limits{n=1}^n P(x{i}\log \left ( P \left (x_{i} \right )) \right) \ = -\left [ P\left ( x \right) \log \left ( P\left ( x \right ) \right ) + \left ( 1 - P\left ( x \right ) \right) \log \left ( 1-P\left ( x \right ) \right ) \right] \ = -P\left ( x \right) \log \left ( P\left ( x \right ) \right ) - \left ( 1 - P\left ( x \right ) \right) \log \left ( 1-P\left ( x \right ) \right)

相对熵(KL 散度)

如果对于同一个随机变量 X X 有两个单独的概率分布 P(x) P\left(x\right) 和 Q(x) Q\left(x\right),则我们可以使用 KL 散度来衡量这两个概率分布之间的差异

下面直接列出公式,再举例子加以说明。
DKL(p∣∣q)=∑i=1np(xi)log⁡(p(xi)q(xi)) D{KL}\left ( p || q \right) = \sum \limits{i=1}^n p\left ( x{i}\right ) \log \left ( \frac{p\left ( x{i} \right )}{q\left ( x{i} \right )} \right )
在机器学习中,常常使用 P(x) P\left(x\right) 来表示样本的真实分布,Q(x) Q \left(x\right) 来表示模型所预测的分布,比如在一个三分类任务中(例如,猫狗马分类器),x1,x2,x3 x
{1}, x{2}, x{3} 分别代表猫,狗,马,例如一张猫的图片真实分布 P(X)=[1,0,0] P\left(X\right) = [1, 0, 0], 预测分布 Q(X)=[0.7,0.2,0.1] Q\left(X\right) = [0.7, 0.2, 0.1],计算 KL 散度:
DKL(p∣∣q)=∑i=1np(xi)log⁡(p(xi)q(xi))=p(x1)log⁡(p(x1)q(x1))+p(x2)log⁡(p(x2)q(x2))+p(x3)log⁡(p(x3)q(x3))=1∗log⁡(10.7)=0.36 D{KL}\left ( p || q \right) = \sum \limits{i=1}^n p\left ( x{i}\right ) \log \left ( \frac{p\left ( x{i} \right )}{q\left ( x{i} \right )} \right ) \ = p\left ( x{1}\right ) \log \left ( \frac{p\left ( x{1} \right )}{q\left ( x{1} \right )} \right ) + p\left ( x{2}\right ) \log \left ( \frac{p\left ( x{2} \right )}{q\left ( x{2} \right )} \right ) + p\left ( x{3}\right ) \log \left ( \frac{p\left ( x{3} \right )}{q\left ( x{3} \right )} \right ) \= 1 * \log \left ( \frac{1}{0.7} \right ) = 0.36
KL 散度越小,表示 P(x) P\left(x\right) 与 Q(x) Q\left(x\right) 的分布更加接近,可以通过反复训练 Q(x) Q\left(x \right) 来使 Q(x) Q\left(x \right) 的分布逼近 P(x) P\left(x \right)。

交叉熵

首先将 KL 散度公式拆开:
DKL(p∣∣q)=∑i=1np(xi)log⁡(p(xi)q(xi))=∑i=1np(xi)log(p(xi))−∑i=1np(xi)log(q(xi))=−H(p(x))+[−∑i=1np(xi)log(q(xi))] D{KL}\left ( p || q \right) = \sum \limits{i=1}^n p\left ( x{i}\right ) \log \left ( \frac{p\left ( x{i} \right )}{q\left ( x{i} \right )} \right ) \= \sum \limits{i=1}^n p \left (x{i}\right) log \left(p \left (x{i}\right)\right) - \sum \limits{i=1}^n p \left (x{i}\right) log \left(q \left (x{i}\right)\right) \= -H \left (p \left(x \right) \right) + \left [-\sum \limits{i=1}^n p \left (x{i}\right) log \left(q \left (x{i}\right)\right) \right]
前者 H(p(x)) H \left (p \left (x \right)\right) 表示信息熵,后者即为交叉熵,KL 散度 = 交叉熵 - 信息熵

交叉熵公式表示为:
H(p,q)=−∑i=1np(xi)log(q(xi)) H \left (p, q\right) = -\sum \limits{i=1}^n p \left (x{i}\right) log \left(q \left (x_{i}\right)\right)
在机器学习训练网络时,输入数据与标签常常已经确定,那么真实概率分布 P(x) P\left(x \right) 也就确定下来了,所以信息熵在这里就是一个常量。由于 KL 散度的值表示真实概率分布 P(x) P\left(x\right) 与预测概率分布 Q(x) Q \left(x\right) 之间的差异,值越小表示预测的结果越好,所以需要最小化 KL 散度,而交叉熵等于 KL 散度加上一个常量(信息熵),且公式相比 KL 散度更加容易计算,所以在机器学习中常常使用交叉熵损失函数来计算 loss 就行了。

交叉熵在单分类问题中的应用

在线性回归问题中,常常使用 MSE(Mean Squared Error) 作为 loss 函数,而在分类问题中常常使用交叉熵作为 loss 函数。

下面通过一个例子来说明如何计算交叉熵损失值。

假设我们输入一张狗的图片,标签与预测值如下:

*
Label 0 1 0
Pred 0.2 0.7 0.1

那么 loss
loss=−(0∗log⁡(0.2)+1∗log⁡(0.7)+0∗log⁡(0.1))=0.36 loss = -\left ( 0 \log \left ( 0.2 \right ) + 1 \log \left ( 0.7 \right ) + 0 * \log \left ( 0.1 \right )\right) = 0.36
一个 batch 的 loss 为
loss=−1m∑i=1m∑j=1np(xij)log(q(xij)) loss = -\frac{1}{m}\sum \limits{i=1}^m \sum \limits{j=1}^n p \left (x{ij}\right) log \left(q \left (x{ij}\right)\right)
其中 m 表示样本个数。

总结:

  • 交叉熵能够衡量同一个随机变量中的两个不同概率分布的差异程度,在机器学习中就表示为真实概率分布与预测概率分布之间的差异。交叉熵的值越小,模型预测效果就越好。
  • 交叉熵在分类问题中常常与 softmax 是标配,softmax 将输出的结果进行处理,使其多个分类的预测值和为 1,再通过交叉熵来计算损失。

参考:

https://blog.csdn.net/tsyccnh/article/details/79163834

THE END

交叉熵损失函数原理详解 - 图1
https://blog.csdn.net/b1055077005/article/details/100152102