交叉熵

上一篇译文《香农熵》中介绍了熵的由来及其计算公式的产生,这篇译文介绍另外一个与香农熵相关的概念:交叉熵(Cross-Entropy)

注:可能文中对一些专有名词的翻译不够精确,所以有的名词后面注解了其对应的原始英文单词

原文:A Friendly Introduction to Cross-Entropy Loss

简介(Introduction)

当我们要建立一个基于概率论的分类模型时,我们会将模型的输入映射到一组概率预测值。而且我们会不断调整模型的参数使得我们的预测结果尽可能地接近真实情况。

这篇博文中我们主要关注模型中每个实物类相互独立的情况。比如,我们可能对一张图片是否是风景,房子或者其他东西感兴趣。我们的模型可能会接收一张图片作为输入,然后产生三个数值作为输出,每个值代表的是属于这三种类别的概率。

在模型训练期间,我们输入一张风景户脱贫,我们希望模型输出结果尽可能逼近真实情况,即\(y = (1.0, 0.0, 0.0)^{\rm{T}}\). 如果我们的模型预测结果是另外一种情况,比如\(\hat{y} = (0.4, 0.1, 0.5)^{\rm{T}}\),我们可能需要调整模型参数,让\(\hat{y}\)尽可能接近\(y\)

但是我们怎样定义这个“接近”程度呢?特别地,我们怎么定义\(\hat{y}\)\(y\)之间的距离呢?

这篇博文介绍了一种可行的方案— 交叉熵(Cross-Entropy),并且说明了为什么交叉熵比较适合分类任务。

香农熵(Entropy)

假定这样一个场景:在交通高峰期,你站在波士顿的高速路上观察来来往往的汽车。你需要将你观察到的车的型号告诉你的另外一个朋友。而且你被限制在只能通过0和1两个符号来表达你所观察到的情况,而且传达这样的信息是比较昂贵的。没传递一个比特的信息你将会被收取0.1美元的费用。

对于每种型号的汽车你需要一个比特序列来标识这种汽车。

你会怎么样给每种汽车分配唯一的比特序列呢?你会给Toyota Camry(日本丰田某种型号的汽车)和Tesla Model S(美国特斯拉某种型号的汽车)相同长度的比特序列吗?

不,你可能不会。你或许会给Camry更少的比特,因为你知道你最终发送的关于Camry的比特序列的数量会远远多于Tesla Model S的数量。你现在所做的就是从你的知识储备中找出了关于汽车数量分布的信息,然后用于减少你平均发送的比特数量。

假设你能够知道所有汽车数量的真实的分布规律\(y\),这样你就可以利用该规律来最大限度地减少平均发送比特数量。你可能会给第\(i\)个类型分配\(\log{\frac{1}{y_i}}\)个比特,其中\(y_i\)是第\(i\)个类型出现的概率。

举例来说,比如丰田车的数量是特斯拉的128倍,则相对于特斯拉,我们可以给丰田少分配7个比特:

\[b_{toyota} = \log{\frac{1}{128p_{tesla}}} = \log{\frac{1}{p_{tesal}}} + \log{\frac{1}{128}} = b_{tesla} - 7\]

通过底层的数量分布规律,我们实现了最优(最少比特)的一种信息传输。这种平均最少的比特数叫做信息熵(Entropy)。其表示使用最优的编码进行描述的最少的比特数,用公式表示为:

\[H(y) = \sum\limits_{i}y_i\log{\frac{1}{y_i}} = -\sum\limits_{i}y_i\log{y_i}\]

交叉熵(Cross-Entropy)

如果我们将底层的分布规律作为我们编码某个符号的工具,则熵描述了我们使用正确的工具\(y\)辅助编码所需要的比特数。这是最优的一种方式,因为我们无法找到比这个更少的平均比特数来编码我们的符号。

相对的,交叉熵(Cross-Entropy)表示的是如果我们使用了错误的工具\(\hat{y}\),编码该符号所需要的平均比特数。即编码第\(i\)个符号使用了\(\log{\frac{1}{\hat{y_i}}}\)个比特而不是最优的\(\log{\frac{1}{y_i}}\)个比特。当然,我们还是想使得我们的结果尽可能接近真实分布\(y\)得到的结果,因为是真实的分布规律产生了各种符号的分布排列:

\[H(y, \hat{y}) = \sum\limits_{i}y_i\log{\frac{1}{\hat{yi}}} = -\sum\limits_{i}y_i\log{\hat{y_i}}\]

交叉熵的值永远大于香农熵,使用错误的分布规律\(\hat{y}\)进行编码可能会使用更多的比特数。我们期望的结果是\(\hat{y}\)分布和\(y\)分布尽可能接近,这样交叉熵和香农熵的值尽可能相等。

相对熵(KL散度,KL Divergence)

KL散度是交叉熵和香农熵的差值:

\[KL(y || \hat{y}) = \sum\limits_{i}y_i\log{\frac{1}{\hat{y_i}}} - \sum\limits_{i}y_i\log{\frac{1}{y_i}} = \sum\limits_{i}y_i\log{\frac{y_i}{\hat{y_i}}}\]

相对熵表示了相对于真实分布\(y\)我们使用\(\hat{y}\)进行编码所使用的评价额外比特数。你可以将这个理解为由于使用了错误分布而额外交的税。相对熵永远大于等于0,当且仅当\(\hat{y}\)等于\(y\)的时候等于0.

注意到减小交叉熵其实相当于减少相对熵(对于相对熵,交叉熵相当于添加了一个常数香农熵)。

预测能力(Predictive Power)

通过上面的讨论,我们可以很自信地说交叉熵可以用来衡量两种分布\(y\)\(\hat{y}\)之间的距离。并且将交叉熵作为我们模型训练中的损失函数。特别地,对于我们第\(n\)批的训练样本,总的损失可以表示为:

\[H(\{y^{(n)}\}, \{\hat{y}^{(n)}\}) = \sum\limits_{n}H(y^{(n)}, \hat{y}^{(n)})\]

我们来看另外一种方法。

如果我们希望我们的目标函数能够直接衡量模型的预测能力,至少对于训练数据的预测能力,我们该怎么办?

一个常用的方法就是优化模型参数使得训练数据在该模型下的似然率最大。对于分类问题我们通常使用判别模型(discriminative model),我们的训练数据通常包含其对应的标签。对于给定输入,模型的预测等于实际的标签值,则模型是成功的,否则,模型是失败的。

因为我们假设我们的样本分布是独立同分布的,所以样本的似然值可以分解为每个样本的似然值得乘积:

\[L(\{y^{(n)}\}, \{\hat{y}^{(n)}\}) = \prod\limits_{n}L(y^{(n)}, \hat{y}^{(n)})\]

什么是第\(n\)个样本的似然值呢?就是以概率\(y\)表示的相对于实际样本标签的预测值\(\hat{y}\)的分量.

返回到我们之前的例子。如果第一张训练的样本图片是一张风景图片,则\(y^{(1)}=(1.0, 0.0, 0.0)^{\rm{T}}\),似然值\(L(y^{(1)}, \hat{y}^{(1)})\)则是预测的结果\(\hat{y}^{(1)} = (0.4, 0.1, 0.5)^{\rm{T}}\)的第一个分量\(\hat{y}^{(1)}_{1} = 0.4\)

继续这个例子,假设我们总共有四张图片,对应的标签是{风景,其它,风景,房屋},真实的概率分布应该是\(y^{(1)}=(1.0, 0.0, 0.0)^{\rm{T}}\)\(y^{(2)}=(0.0, 0.0, 1.0)^{\rm{T}}\)\(y^{(3)}=(0.0, 1.0, 0.0)^{\rm{T}}\),y^{(4)}=(1.0, 0.0, 0.0)^{\rm{T}}. 我们的模型输出同样会得到四个概率分布\(\hat{y}^{(1)}\)\(\hat{y}^{(2)}\)\(\hat{y}^{(3)}\)\(\hat{y}^{(4)}\),所以总的似然值应该是

\[L(\{y^{(1)}, y^{(2)}, y^{(3)}, y^{(4)}\}, \{\hat{y}^{(1)}, \hat{y}^{(2)}, \hat{y}^{(3)}, \hat{y}^{(4)}\}) = \hat{y}^{(1)}_1 \hat{y}^{(2)}_3 \hat{y}^{(3)}_1 \hat{y}^{(4)}_2\]

通过本文最后一部分内容,我们就可以乐观地在模型训练过程中通过最小化交叉熵来达到最大化似然值得目的。

为什我们不止直接计算似然值\(L(\{y^{(n)}\}, \{\hat{y}^{(n)}\})\)的最大值呢?

标准化损失(Unified Loss)

我们接着上面的似然值继续下文的叙述。

首先,对数函数式单调函数,我们知道最大化似然值就是最大化似然值得对数,也就是最小化取负值以后的似然值对数。

\[-\log{L(\{y^{(n)}\}, \{\hat{y}^{(n)}\})} = - \sum\limits_n\log{L(y^{(n)}, \hat{y}^{(n)})}\]

通过上面的讨论,我们知道\(y^{(n)}\)的似然值对数就是\(\hat{y}^{(n)}\)某个分量的对数. 实际上,是满足\(y_i^{(n)} = 1.0\)所对应的分量。所以,我们可以将第\(n\)个样本的似然值公式变化为:

\[\log{L(y^{(n)}, \hat{y}^{(n)})} = \sum\limits_iy_i^{(n)}\log\hat{y}_i^{(n)}\]

整体的似然值可以写作

\[-\log{L(\{y^{(n)}\}, \{\hat{y}^{(n)}\})} = - \sum\limits_n \sum\limits_iy_i^{(n)}\log\hat{y}_i^{(n)}\]

是不是看起来似曾相识?这就是交叉熵,将所有样本交叉熵求和的结果。

\[-\log{L(\{y^{(n)}\}, \{\hat{y}^{(n)}\})} = \sum\limits_n [-\sum\limits_iy_i^{(n)}\log\hat{y}_i^{(n)}] = \sum\limits_n H(y^{(n)}, \hat{y}^{(n)})\]

结论

当我们对于互斥的类别基于概率构建预测模型的时候,我们需要一种能够衡量预测概率\(\hat{y}\)和真实概率\(y\)差异的一种指标,通过在训练过程中减小这个指标来优化模型参数。

这篇博文中我们可以看到交叉熵是一个比较理想的候选指标。

一方面来说,最小化交叉熵能够让我们在编码符号的时候找到以尽可能少的比特数以\(\hat{y}\)表示\(y\)的信息。

另一方面,最小化交叉熵等价于最小化取负以后的似然值的对数,这样就相当于直接表示了整个模型的预测能力。