从编码到信息熵与交叉熵再到 KL 散度:一步一步直观理解!
很多人第一次接触 信息熵、交叉熵、KL 散度 这些概念时,都会被绕来绕去的公式劝退。
一会儿说交叉熵可以用来衡量两个概率分布的距离,一会儿又说 KL 散度也能用来衡量两个概率分布的距离。
到底是怎么回事?
实际上,你不知道的是这三者其实都源自一个非常朴素的问题:
我们该如何用尽量少的 0和1,把世界中的信息记录下来?
熵 $H(P)$: 在真实世界分布 $P$ 下,任何编码方式都绕不过去的理论长期平均最小代价;
交叉熵 $H(P,Q)$: 当真实世界是 $P$,但你按照近似分布 $Q$ 来理解或编码世界时,所付出的长期平均代价;
散度 $D_{KL}(P \| Q)$ :因为你用错了分布,多付了多少代价。
本文不从公式出发,而是从一个具体、可计算的“编码”例子出发,循序渐进地带着大家一个一个弄懂上面这些概念。
1.问题起点:如何给事件做编码?#
假设你是一名侦探,正在监视对面住宅里的犯罪嫌疑人。
你的任务是每天早、中和晚各使用望远镜观看一次,然后记录下犯罪嫌疑人当时正在做的事情。
现在,已知犯罪嫌疑人每天都会固定做3件事情,且每件事各自发生的概率如下表所示:
| 事件 | 概率 |
|---|---|
| 睡觉(A) | 0.7 |
| 吃饭(B) | 0.2 |
| 打豆豆(C) | 0.1 |
作为侦探,你最终需要完成的任务是每天晚上12点准时将你当天记录下来的信息通过电报传送出去。
由于电报发送字符长度的限制,所以你必须使用尽可能短的比特位来表示当天所观察到的事件情况,但是编码的前提是信息必须能被唯一解码(不能有歧义)。
此时,聪明的你想到用两位二进制码的编码方式来表示上面3种情况,即:A 用 00 表示,B 用 01 表示,C 用 10 表示。
例如,某一天发出的信息可能是 000010,则表示上午观察的时候在睡觉(A),中午观察的时候在睡觉(A),晚上观察的时候在打豆豆(C)。
这样,我们就完成了对这一事件的编码工作。
2. 你的编码够短吗?#
虽然聪明的你通过两位二进制编码的方法准确无误地将信息给传达了出来,但是有人说这不是最短的编码方式。
这时你赶紧去问对方还有什么样更短的编码方式,结果得到的回答是:“我也不知道,但我只知道你的方式一定不是最短的!”
此时有两个问题:
① 他怎么知道还有更短的编码方式?
② 你的编码方式离最优编码方式还有多大的差距?
当我们弄清楚这两个问题以后, 信息熵、交叉熵和 KL 散度之间的区别也就清楚了。
话说他又是怎么知道的呢?
原来有这样一种方法,它能够根据每种情况出现的概率计算得到理论最优平均编码长度,这就是信息熵!
信息熵(Entropy) 定义为
$$ H(P) = -\sum_x p(x)\log_2 p(x)\tag{1} $$其中 $-\log_2 p(x)$ 表示随机变量 $X$ 当它取到某个具体值 $x$ 时的自信息,换句话说 $-\log_2 p(x)$ 度量的是“这次事件 $x$ 有多意外”,需要多少比特才能“说清楚这件事发生了”。
例如:
情况 ① :你觉得明天下雨概率是 90%,结果真的下雨了。你的反应是:
“嗯,早就料到了。”
那么这个时候的信息代价就很小。
情况 ②:你觉得明天下雨概率只有 1%,结果真的下雨了。你的反应是:
“什么?这都能碰上?怎么会这样!”
那么这个时候信息代价就是巨大的,因为需要极大的信息量来描述它,即我要用一个更长的二进制编码,才能把这个事实传达给你。
因此可以看出:越罕见的事件(发生概率越小) → 信息量越大,即自信息越大;越常见的事件 → 信息量越小,即自信息越小。
所以,信息熵的一个等价定义是随机变量自信息(Self-information)的期望值。
An equivalent definition of entropy is the expected value of the self-information of a variable [1].
直白点就是,自信息度量“这次有多意外”(包含多少信息流),信息熵度量“平均一次有多意外”。
再切换到上面编码这一场景中那就是,一个事件发生的概率越低,也就意味着其本身的自信息越大,也就意味着需要更多的比特位来进行编码,而信息熵衡量的自然就是编码这个随机变量所需要的平均比特长度。
进一步,对当前概率分布计算
$$ \begin{aligned} H(P) &= -(0.7\log_2 0.7 + 0.2\log_2 0.2 + 0.1\log_2 0.1) \\[2ex] &\approx 1.156\ \text{bit} \end{aligned}\tag{2} $$这意味着:**任何合法的二进制编码,其平均长度都不可能低于 1.156 bit,**也就是说只能趋近于它。
那上面的编码方式其平均编码长度该如何计算呢?
平均编码长度的定义是
$$ \mathbb{E}[\ell] = \sum_x p(x)\,\ell(x)\tag{3} $$其中 $\ell(x)$ 表示编码一个事件所用到编码长度。
代入上面的概率
$$ \mathbb{E}[\ell] = 0.7\times2 + 0.2\times2 + 0.1\times2 = 2.0\ \text{bit}\tag{4} $$这就说明的确还可能存在着一种更优的编码范式,因为此时 $\mathbb{E}[\ell] = 2.0 > 1.156$。
那更优的编码方式是什么呢?
答案就是:A 用 0 来表示,B 用 10 来表示,C 用 11 来表示。
这样,上面的 AAC 三个事件就从编码 000010 变成了0011,此时的平均编码长度为
$$ \mathbb{E}[\ell] = 0.7\times1 + 0.2\times2 + 0.1\times2 = 1.3\ \text{bit}\tag{5} $$并且这还是最短的编码方式,因为我们只能用整数位的比特来表示,例如不存在比特位长度为 0.5 的情况。
此时有人可能会说:A 用 0 来表示,B 用 1 来表示,C 用 11 来表示 会更短。
但是这样真的行吗?留给大家思考,评论区可留言讨论。
3.如果不知道概率怎么办?#
现在有一个问题想问大家,为什么上面是事件 A 用1个比特位表示,而不是事件 B 或 C ?
对,就是因为事件 A 出现的概率最高(频繁),所以才用最短的比特位来表示,这样得到的平均编码长度才是更短的。
换句话说,事件出现的概率越高,就越应该采用最短的比特位表示,这样才能更接近理论最优平均编码长度。
那现在问题来了,假如你不知道每个事件发生的概率怎么办?
例如你通过某个预测模型,计算得到上面 A、B、C 这三件事情发生的概率是 0.3、0.5、0.2 ,并以此作为你以为的真实概率分布对事件进行编码。
但是你也清楚预测模型的结果与真实概率肯定有偏差,那当你在知道真实分布以后如何衡量以预测概率进行编码时的平均编码长度呢?
那这个时候就要轮到交叉熵(Cross Entropy ) 出场了。
交叉熵的定义为
$$ H(P,Q) = -\sum_x p(x)\log_2 q(x)\tag{6} $$其中 $P$ 表示真实的分布, $Q$ 表示近似分布(注意,两者的位置不能交换,即没有对称性)。
举个例子。
假如真实分布 $P$:标准答案(你考前不知道)
模型分布 $Q$:你写的答案 / 你的理解
样本:试卷上的题目(按标准答案出的)
你在考试时:不知道标准答案(不知道 P),所以只能根据自己的理解作答(用 Q)
但考试结束后:阅卷老师知道标准答案(知道 P),可以计算你每道题平均错了多少分,那么交叉熵就是老师给你算的平均扣分。
因此,根据式(6)可得,如果采用近似分布 $Q$ 去做编码,那么此时的平均编码长度为
$$ \begin{aligned} H(P,Q) &= -(0.7\log_2 0.3 + 0.2\log_2 0.5 + 0.1\log_2 0.2) \\[2ex] &\approx 1.65\ \text{bit} \end{aligned}\tag{7} $$可以看出,由于并没有使用真实的分布 $P$ , 所以其平均编码长度要大于式 (5) 中的结果。
因此,最小化 $H(P,Q)$ 的意义便是让使用近似分布 $Q$ 的平均编码长度趋于真实分布 $P$ 对应的理论最优编码长度,间接的也相当于是让 分布 $Q$ 近似于 $P$。
所以,这也是为什么在神经网络分类任务中会使用交叉熵来衡两个分布的相似程度,并以此为目标函数来优化网络。
需要注意的是,虽然式(2)中说的 $P$ 是真实分布,但是实际情况中可能我们依旧不知道 $P$ 是什么,但是可以根据采样得到的样本标签来计算,例如 one-hot 或 soft label 等。
4. 错误的代价#
现在我们已经知道了在已知真实分布 $P$ 的情况下的理论最优编码长度,以及当使用近似分布 $Q$ 进行编码后的平均编码长度。
那现在问题来了,当时使用 $Q$ 进行编码的时候,我们到底多付出了多少的代价?
怎么算?
自然是用 $Q$ 进行编码后的平均编码长度减去理论最优编码长度,即
$$ H(P, Q) - H(P)\tag{8} $$你们有看错,就是这么简单。
这就是这篇文章要介绍的最后一个概念——KL散度( Kullback–Leibler, KL divergence ),也叫做相对熵 [2]。
In mathematical statistics, the Kullback–Leibler (KL) divergence (also called relative entropy and I-divergence), denoted $D_{\text{KL}}(P\parallel Q)$, is a type of statistical distance: a measure of how much an approximating probability distribution $Q$ is different from a true probability distribution $P$.
也就是说,熵是你能做到的极限,交叉熵是你现在的表现,而 KL 散度则是你欠下的账。
进一步,由式(8)可得
$$ \begin{aligned} D_{KL}(P \| Q) &= H(P, Q) - H(P)\\[2ex] &=\left[-\sum_x p(x)\log_2 q(x)\right]-\left[-\sum_x p(x)\log_2 p(x)\right]\\[2ex] &=\sum_x p(x)\log_2 p(x)-\sum_x p(x)\log_2 q(x)\\[2ex] &=\sum_x\left[ p(x)\log_2 p(x)-p(x)\log_2 q(x)\right]\\[2ex] &=\sum_x p(x)\log_2 \frac{p(x)}{q(x)} \end{aligned} \tag{9} $$同时,根据式(9)可知,由于 $H(P)$ 是常数,所以从性质上来看 $D_{KL}(P \| Q)$ 和 $H(P, Q)$ 是等价的,即 KL 散度和交叉熵两者之间是互为等价。
到此,我们就把信息熵、交叉熵和KL散度这几个概念给介绍完了。
5. 总结#
一句话总结就是:信息熵表示真实分布下的平均信息代价;交叉熵表示用模型分布去编码真实分布时的长期平均代价;KL散度表示交叉熵比信息熵多付出的额外代价,也就是“离最优编码还差多少”。
形象一点就是:你脑子里有一个故事的构想,信息熵就像你用最合适的语言讲故事需要的最少字数;交叉熵是你用不太熟悉的语言讲同样的故事需要的字数;KL散度就是因为语言不熟,多说的冗余字数。
[1] https://en.wikipedia.org/wiki/Entropy_(information_theory)
[2] https://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence