熵、交叉熵、KL散度

熵通常用来评价随机变量的不确定性;交叉熵是评价两个概率分布之间的差异;KL散度是评价两个概率分布之间的相对熵差。

上世纪,人们用电报来传输信息,但电报里的字越多,花费的钱越多。为了节约成本,我们需要尽可能的缩短电报内容长度。

在天气预报场景中,如果我们有2种天气(好、坏),我们可以用过一位的二进制编码来表示,如果有4中天气(晴天、刮风、下雨、下雪),我们可以用2位编码来表示,即总天气数取对数$log_2N$即可。

熵与平均编码长度

如果我们知道每种天气的出现概率,那么就可以计算出编码的平均长度。
$$
L_N = p(x) * log_2{N}
$$
一般情况下,如果某种天气出现的概率是$P$,对应平均分布概率种类数为$log_2{\frac{1}{P}} = -log_2P$,因此,当这种天气的编码长度是$−log_2P$时,整个编码方案是最优的,此时最有平均编码长度为:
$$
H(P) = -\sum_iP(i)log_2P(i)
$$

  • 在这个公式里,由于被累加的情况是离散的,我们使用了求和符号。对于连续的情况,要把求和变成求积分。
  • 上述解释为理想情况下的情况,$-log_2{P}$可能不为整数,而离散种类数必须为整数,因此“编码长度”为较为抽象的概念。

最后,再对熵的公式做一个补充。一般情况下,算熵时,对数的底不是2,而是自然常数e。由换底公式
$$
log_2x = \frac{log_ex}{log_e2}
$$
可知,对数用不同的底只是差了一个常数系数而已,使用什么数为底并不影响其相对大小。在使用熵时,我们也只关心多个熵的相对大小,而不怎么会关注绝对数值。

以2为底时,熵的单位是比特。以e为底时,熵的单位是奈特(nat)。

交叉熵

假设电报员正在和气象中心商量天气的编码方式。可是,这个电报员刚来这个城市不久,不知道这里是晴天比较多,还是下雨比较多。于是,对于晴天、刮风、下雨、下雪这四种天气,他采用了最朴素的平均法,让每种天气的编码都占2位。

大概100天后,电报员统计出了每种天气的出现频率。他猛然发现,这个城市大部分时间都在下雨。如果让下雨的编码只占1位,会节省得多。于是,他连忙修改了编码的方式。

这时,他开始后悔了:“要是早点用新的编码就好了。两种方案的平均编码长度差了多少呢?”

假设真实天气的概率分布为$P$,该电报员估计的概率分布为$Q$,这种较差的编码的平均编码长度为:
$$
H(P,Q) = -\sum_iP(i)log_2Q(i)
$$
上式即为交叉熵的公式,用来评估编码方案的优劣。

交叉熵有一个很重要的性质:交叉熵一定不小于熵。熵是最优的编码长度,你估计出来的编码方案,一定不会比最优的更好。所有交叉熵的应用基本上都是利用了这一性质。

在机器学习中,我们会为分类任务使用交叉熵作为损失函数。这正是利用了交叉熵不比熵更大这一性质。模型输出的概率分布就是交叉熵公式里的$Q$,实际的概率分布(one-hot编码)就是交叉熵公式里的$P$。由于熵是0(样本的概率一定),交叉熵的值一定大于等于0。因此,交叉熵的值可以表示它和熵——最优的概率分布的信息量——之间的差距。

KL散度

用交叉熵算出旧方案的平均编码长度后,电报员打算统计一下旧编码浪费了多少编码量。既然熵是最优编码的编码长度,那么交叉熵减去熵就能反映出旧编码平均浪费了多少编码长度。这个计算过程如下:
$$
\begin{align}
D_{KL}(P||Q) &= H(P,Q) - H(P) \\
&=-\sum_iP(i)log_2Q(i) - (-\sum_iP(i)log_2P(i))\\
&= \sum_{i}P(i)log_2\frac{P(i)}{Q(i)}
\end{align}
$$
这个公式描述的量叫做相对熵,又叫做KL散度。KL散度的定义非常易懂,它只不过是交叉熵和熵的差而已,反映了一个分布与另一个分布的差异程度。最理想情况下,$P=Q$,则KL散度为0。

KL散度不是一个距离指标。从公式中能够看出,$D_{KL}(P||Q)≠ D_{KL}(Q||P)$,这个指标并不满足交换律。