交叉熵损失函数原理详解#

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

交叉熵简介#

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

信息量#

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

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

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

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

设某一事件发生的概率为\(P(x)\),其信息量表示为:

\[\mathrm{I}(\mathrm{x})=-\log (\mathrm{P}(\mathrm{x}))\]

其中\(I(x)\)表示信息量,这里\(\log\)表示以\(e\)为底的自然对数。

信息熵#

信息摘也被称为熵,用来表示所有信息量的期望。 期望是试验中每次可能结果的概率乘以其结果的总和。 所以信息量的摘可表示为:(这里的\(\mathrm{X}\)是一个离散型随机变量)

\[\mathrm{H}(\mathbf{X}) = -\sum_{\mathrm{i} = 1}^{\mathrm{n}} \mathrm{P}(\mathrm{x}_{\mathrm{i}}) \log (\mathrm{P}(\mathrm{x}_{\mathrm{i}}))\quad\left(\mathbf{X} = \mathrm{x}_{1}, \mathrm{x}_{2}, \mathrm{x}_{3} \ldots, \mathrm{x}_{\mathrm{n}}\right)\]

使用明天的天气概率来计算其信息熵:

序号

事件

概率P

信息量

1

明天是晴天

0.5

-log(0.5)

2

明天出雨天

0.2

-log(0.2)

3

多云

0.3

-log(0.3)

公式的话

\[\mathrm{H}(\mathbf{X})=-(0.5 * \log (0.5)+0.2 * \log (0.2)+0.3 * \log (0.3))\]

对于0-1分布的问题,由于其结果只用两种情况,是或不是,设某一件事情发生的概率为\(P(x)\),则另一件事情发生的概率为\(1 − P ( x )\),所以对于0-1分布的问题,计算熵的公式可以简化如下:

\[\begin{split}\begin{array}{c} \mathrm{H}(\mathbf{X})=-\sum_{\mathrm{n}=1}^{\mathrm{n}} \mathrm{P}\left(\mathrm{x}_{\mathrm{i}} \log \left(\mathrm{P}\left(\mathrm{x}_{\mathrm{i}}\right)\right)\right) \\ =-[\mathrm{P}(\mathrm{x}) \log (\mathrm{P}(\mathrm{x}))+(1-\mathrm{P}(\mathrm{x})) \log (1-\mathrm{P}(\mathrm{x}))] \\ =-\mathrm{P}(\mathrm{x}) \log (\mathrm{P}(\mathrm{x}))-(1-\mathrm{P}(\mathrm{x})) \log (1-\mathrm{P}(\mathrm{x})) \end{array}\end{split}\]

相对熵 (KL散度)#

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

下面直接列出公式,再举例子加以说明。

\[D_{K L}(p \| q)=\sum_{i=1}^{n} p\left(x_{i}\right) \log \left(\frac{p\left(x_{i}\right)}{q\left(x_{i}\right)}\right)\]

在机器学习中,常常使用\(\mathrm{P}(\mathrm{x})\)来表示样本的真实分布,\(\mathrm{Q}(\mathrm{x})\)来表示模型所预测的分布,比如在一个三分类任务中 (例如,猫狗马分类器),\(\mathrm{x}_{1}, \mathrm{x}_{2}, \mathrm{x}_{3}\)分别代表猫,狗,马,例如一张猫的图片真实分布\(\mathrm{P}(\mathrm{X})=[1,0,0]\),预测分布\(\mathrm{Q}(\mathrm{X})=[0.7,0.2,0.1]\),计算KL散度:

\[\begin{split}\begin{array}{c} D_{K L}(p \| q)=\sum_{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 \end{array}\end{split}\]

KL散度越小,表示\(\mathrm{P}(\mathrm{x})\)\(\mathrm{Q}(\mathrm{x})\)的分布更加接近,可以通过反复训练\(\mathrm{Q}(\mathrm{x})\)来使\(\mathrm{Q}(\mathrm{x})\)的分布逼近\(\mathrm{P}(\mathrm{x})\)

交叉嫡#

首先将KL散度公式拆开:

\[\begin{split}\begin{array}{c} D_{K L}(p \| q)=\sum_{i=1}^{n} p\left(x_{i}\right) \log \left(\frac{p\left(x_{i}\right)}{q\left(x_{i}\right)}\right) \\ =\sum_{i=1}^{n} p\left(x_{i}\right) \log \left(p\left(x_{i}\right)\right)-\sum_{i=1}^{n} p\left(x_{i}\right) \log \left(q\left(x_{i}\right)\right) \\ =-H(p(x))+\left[-\sum_{i=1}^{n} p\left(x_{i}\right) \log \left(q\left(x_{i}\right)\right)\right] \end{array}\end{split}\]

前者\(\mathrm{H}(\mathrm{p}(\mathrm{x}))\)表示信息熵,后者即为交叉熵,KL散度 = 交叉熵 - 信息摘

交叉摘公式表示为:

\[H(p, q)=-\sum_{i=1}^{n} p\left(x_{i}\right) \log \left(q\left(x_{i}\right)\right)\]

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

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

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

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

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

*

Label

0

1

0

Pred

0.2

0.7

0.1

那么loss

\[\text { loss }=-(0 * \log (0.2)+1 * \log (0.7)+0 * \log (0.1))=0.36\]

一个batch的loss为

\[\operatorname{loss}=-\frac{1}{m} \sum_{i=1}^{m} \sum_{j=1}^{n} p\left(x_{i j}\right) \log \left(q\left(x_{i j}\right)\right)\]

其中\(m\)表示样本个数。

总结:#

  • 交叉熵能够衡量同一个随机变量中的两个不同概率分布的差异程度,在机器学习中就表示为真实概率分布与预测概率分布之间的差异。交叉熵的值越小,模型预测效果就越好。

  • 交叉熵在分类问题中常常与softmax是标配,softmax将输出的结果进行处理,使其多个分类的预测值和为1,再通过交叉熵来计算损失。