秋招八股之信息论
秋招八股系列的前置篇:如何定义和计算信息量。
1. 信息量
生活中我们常听到某个人讲话“很有信息量”,或者说一本书“信息量很大”“信息量很少”,但信息到底是什么?一个视频、一句话的信息,又该怎么衡量?有没有一种定量的方法,能给出一个客观、可计算的数字?
1948 年,香农(Claude Elwood Shannon)在著名论文 A Mathematical Theory of Communication 中提出了信息量的定义,第一次回答了这个问题。
香农的定义是:一条信息的信息量,就是把这条信息无损地编码成二进制所需要的最短长度。也可以简单理解成:需要用多少个“是或否”的问题,才能唯一确定答案。这个长度用比特(bit)度量,1 比特就是一个二进制位。bit 这个词由统计学家 John Tukey 于 1947 年提出,香农在论文中致谢并沿用了这个词。
不过要先弄清楚,信息量在度量什么。它和一条信息所消除的不确定性直接相关:一件事越不确定,把它搞清楚所需的信息就越多;反过来,如果某件事已经相对确定,所需要的信息量就更少。比如,预测一年后的今天是否下雨,需要的信息量可能比预测明天是否下雨更多。这也是为什么“需要多少个是非问题”是一种很直观的理解:事情越不确定,需要问的问题就越多。
举两个小例子:一枚硬币落下后是正面还是反面,信息量是 1 比特;从 8 个数字里选出一个,信息量是 3 比特。一般地,如果一件事有 $n$ 种等可能的结果,要确定究竟是哪一种,信息量就是:
\[I = \log_2 n\]8 个数字是 $\log_2 8 = 3$,从 32 支球队中猜冠军是 $\log_2 32 = 5$。之所以恰好是对数,是因为信息量需要可加:把“32 选 1”拆成“先 4 选 1,再 8 选 1”,两次信息量相加,正好等于一次 32 选 1;而概率之间是相乘的($1/4 \times 1/8 = 1/32$),对数恰好能把乘法变成加法。
知道了这个算法,很多事情的信息量都能估算出来。
抽扑克牌
一副 54 张的牌,猜中抽出来的是哪一张,信息量是 $\log_2 54 \approx 5.7$ 比特。但如果问的是“整副牌的顺序是什么”,那就是另一个问题:54! 种排列,约 237 比特,是前者的四十多倍。可见,信息量永远是相对于“要回答哪个问题”而言的。
买双色球
红球 33 选 6、蓝球 16 选 1,头奖有 1772 万种可能,相当于碰上了一次 $\log_2 17721088 \approx 24$ 比特的巧合。用 24 比特换几百万元奖金,从信息的角度看实在划算得离谱。
三阶魔方
大约有 $4.3 \times 10^{16}$ 种状态,约等于 $2^{65}$。要在一堆打乱的状态中确定某一个特定状态,需要大约 65 比特。一位顶尖的盲拧选手在戴上眼罩前只有几秒钟观察时间,他这几秒读进大脑的信息,平均下来不过每秒 12 比特左右。
再把尺度放大一些:
- 一本书:一本 50 万字的中文书约含 250 万比特,也就是约 0.3 MB。按人的阅读速度算,读完大约要花二十多个小时。
- 一张照片:一张 1200 万像素的手机照片,不压缩时约为 $1200\text{万} \times 24$ 比特,约 36 MB;压成 JPEG 后约为 3 MB,即 2400 万比特。随手拍的一张照片,信息量就抵得上十本这样的书。
- 一部电影:两小时的视频,按 5 Mbps 的码率计算约为 36 Gbit,折合 4.5 GB,相当于一万四千本这样的书。
- 一台计算机:家用千兆网卡每秒传输 10 亿比特;一块现代 GPU 的显存带宽能达到每秒 27 万亿比特;骨干网的一根光纤每秒可以传输几十万亿比特。
Zheng 和 Meister 在 2024 年的一篇论文中汇总了近百年来关于人类行为速度的测量:英文打字大约每秒 10 比特,说话大约每秒 39 比特,而人眼视网膜上 600 万个视锥细胞每秒传递的信息加起来超过 10 亿比特。
输入端是汪洋大海,输出端只有涓涓细流——大脑真正做的,就是从海量感觉信息里“淘”出极少的一点。按每秒 10 比特、80 年不眠不休地计算,一个人一辈子说出、写下的信息总共约 3 GB,差不多就是一部电影的体积。
需要说明的是,10 比特指的是可观察的行为输出,并不代表大脑内部的运算总量。大脑内部神经活动的信息量要高出好几个数量级,只是绝大部分都没有转化为行为。
2. 信息熵和冗余度
刚才计算的都是 $n$ 种结果等概率的情况,此时信息量就是 $\log_2 n$。如果 $n$ 种结果的概率并不相同,分别是 $p_1$ 到 $p_n$,算法就要从“数一数有多少种可能”改成“按概率加权平均”——这就是信息熵:
\[H(X) = -\sum_i p_i \log_2 p_i\]它的意思是:每种结果各自携带 $-\log_2 p_i$ 的信息量——概率越小,这个值越大——再用它自身的概率 $p_i$ 作为权重,最后加总。等概率时,每个 $p_i$ 都等于 $1/n$,代入后正好退化成 $\log_2 n$。
这样,我们就可以估算汉字的信息量。
常用汉字的信息熵
同一个汉字的信息量,可以用三种粗细不同的算法估算:
- 等概率:假设 7000 个汉字真的等概率出现,每个字相当于一次 $\log_2 7000 \approx 12.9$ 比特的选择。
-
不等概率:汉字的频率很不均等——前 10% 的字(约 700 个)覆盖了 95% 以上的常用文本。假设这 700 个字内部等概率、剩下 6300 个字内部也等概率,两类的单字概率分别是 $0.95/700$ 和 $0.05/6300$:
\[H = 0.95 \times \log_2(700/0.95) + 0.05 \times \log_2(6300/0.05) \approx 9.9\ \text{bits}\] - 考虑上下文关联:根据吴军老师的估计,把字与字之间的关联也计算在内后,每个汉字平均只剩 5 比特左右。
英文字母的信息熵
英文也可以这样计算。不过英文计算的是字母,不是单词:汉字和字母是各自书写系统中天然的最小书写单位,香农对英文的估计也正是按字母进行的。
- 等概率:26 个字母等概率出现时,每个字母相当于一次 $\log_2 26 \approx 4.7$ 比特的选择。
-
不等概率:字母频率也不均等——e 占 12.7%,z 只占 0.07%。按覆盖率切成两组,前 19 个高频字母共占 96.3%,剩下 7 个占 3.7%:
\[H = 0.963 \times \log_2(19/0.963) + 0.037 \times \log_2(7/0.037) \approx 4.42\ \text{bits}\] - 香农的估计:1951 年,香农通过让人预测下一个字母,估计出每个字母平均只剩 1 比特左右。
把两次计算摆在一起,结论就很清楚:中文一个字约 5 比特,英文一个字母约 1 比特。
但在现代计算机存储中,我们约定一个英文字母占 1 个字节,即 8 比特(ASCII);一个汉字在 GBK 编码中通常占 2 个字节,即 16 比特。一个符号的存储空间和它实际携带的信息量并不完全一致,这个差额就是冗余度:
\[\text{冗余度} = 1 - \frac{\text{信息量}}{\text{占用比特数}}\]假如有一本 50 万字的书,按一个字 5 比特计算,实际信息量为 $50\text{万} \times 5 = 250\text{万}$ 比特。
- 全量存储:每个字需要 2 字节,也就是 $50\text{万} \times 2 = 100\text{万}$ 字节,约为 1 MB。
- 理想无损压缩:实际信息量为 250 万比特,换算后只需要 $250\text{万} \div 8 = 31.25\text{万}$ 字节,约为 312.5 KB。
- 冗余度:$1 - 312.5/1000 = 68.75\%$。这意味着 800 万比特的存储中,只有约 250 万比特是真正的信息;好的压缩算法所做的,就是找出这些信息并用更短的编码表示。
类似地,只看 1 个汉字或 1 个字母:
- 英文:$1 - 1/8 = 87.5\%$
- 中文:$1 - 5/16 = 68.75\%$
每存下 1 比特信息,英文平均需要付出 8 比特的存储代价,中文则约为 $16/5 = 3.2$ 比特。在这个简化估算下,中文的存储效率大约是英文的 2.5 倍。
3. 最大熵原理
在建模时,我们常常希望遵守最大熵原则:保留所有不确定的可能性,不对未知部分添加额外的主观假设。
以一个六面骰子为例,假如我们要建模每个面朝上的概率,建模原则是让信息熵最大:
\[\hat{p} = \arg\max_p H(p)\]在没有任何额外信息时,应该选择六面等概率、各为 $1/6$ 的假设。此时熵最大,为 2.585 比特,这也是最自然、最合理的假设。
如果人为假定点数 6 出现的概率为 $1/2$,其余点数均分剩下的概率,计算会发现熵下降为 2.161 比特,因此不采用这种没有证据支持的假设。在更复杂、无法凭直觉得出合理起点的情况下,最大熵原理保证了假设的干净:在当前已知信息下,尽可能保留全部可能性。
4. 条件熵
前面计算汉字和字母的信息熵时,使用的是单个符号自身的频率,默认前后出现的符号互不影响。但现实中,更多的事情会互相关联:上文出现“水果”时,下文出现“苹果”的概率会高于“书本”。这就引出了条件熵。
定义很简单:在已知 $Y$ 的条件下,$X$ 还剩下多少不确定性,写作 $H(X\mid Y)$。做法是对 $Y$ 的每一种取值,分别计算 $X$ 在该条件下的熵,再按 $Y$ 各自的概率加权平均:
\[H(X\mid Y) = -\sum_y P(y)\sum_x P(x\mid y)\log_2 P(x\mid y)\]它也可以从其他量中拆解出来:
\[H(X\mid Y) = H(X,Y) - H(Y)\]$X$ 和 $Y$ 合起来的不确定性,减去 $Y$ 自身的那一部分,剩下的就是“知道 $Y$ 以后,$X$ 还剩多少不确定性”。
这里有一个有趣的观察:
\[H(X\mid Y) \leq H(X)\]多知道一个 $Y$,只会让 $X$ 的不确定性下降或保持不变,不会反过来变大。等号什么时候成立?正是 $X$ 与 $Y$ 相互独立的时候——如果 $Y$ 没有告诉我们任何关于 $X$ 的信息,条件熵自然就等于原来的熵。
这个写法可以继续扩展。已知 $Y$ 和 $Z$ 两个条件时,$X$ 的熵记作 $H(X\mid Y,Z)$,同样满足:
\[H(X\mid Y,Z) \leq H(X\mid Y) \leq H(X)\]条件给得越多,剩下的不确定性越少。
5. 互信息
前面提到,$H(X\mid Y) = H(X)$ 意味着 $X$ 与 $Y$ 毫无关系;而当等号不成立时,意味着 $Y$ 的确为 $X$ 提供了信息。我们把这部分信息称为互信息:
\[I(X;Y) = H(X) - H(X\mid Y)\]换一个角度写,就是把 $X$ 和 $Y$ 的联合分布,和“假设两者彼此独立时的分布”进行比较:
\[I(X;Y) = \sum_x \sum_y P(x,y)\log_2 \frac{P(x,y)}{P(x)P(y)}\]两个方向是等价的:$I(X;Y)=I(Y;X)$。从 $Y$ 中能读出的 $X$ 的信息,和从 $X$ 中能读出的 $Y$ 的信息一样多。
互信息的取值范围是 0 到 $\min(H(X),H(Y))$。 下限在 $X$ 与 $Y$ 相互独立时取到;上限在 $X$ 能被 $Y$ 完全确定时取到。此时 $Y$ 已经将 $X$ 的不确定性全部消除,即 $H(X\mid Y)=0$,因此 $I(X;Y)=H(X)$。
所以,“完全相关”时互信息能取到多高,取决于 $X$ 本身携带多少信息,可能是 2 比特,也可能是 65 比特。如果希望将其归一化到 0 和 1 之间,可以除以 $\sqrt{H(X)H(Y)}$,得到归一化互信息(NMI)。这是另行定义的量,不是互信息本身。
互信息在自然语言处理中的一个重要场景是消减歧义。“苹果”到底指水果还是公司?如果有足够的语料,我们可以计算 $P(X)$、$P(Y)$ 和 $P(X,Y)$,找到与苹果公司互信息较高的词,如“手机”“科技”;同样也能找到与水果苹果互信息较高的词。面对新的文本,只需观察“苹果”前后出现的是哪一类词,就可以辅助判断它表示哪种语义。
6. 相对熵
互信息衡量的是两个变量之间共享的信息;相对熵衡量的是两个分布之间的差异。它更常见的名字是 KL 散度(Kullback–Leibler divergence):
\[D_{\mathrm{KL}}(P\parallel Q) = \sum_x P(x)\log_2 \frac{P(x)}{Q(x)}\]需要知道的是:
- 它是分布之间的量。 $P$ 和 $Q$ 必须是同一个取值空间上的概率分布或概率密度函数,而且凡是 $P(x)>0$ 的地方,都必须有 $Q(x)>0$。如果某处 $Q(x)=0$ 而 $P(x)>0$,式子中会出现除以 0,散度变为无穷大。
- 两个完全相同的分布,相对熵为 0。 每一项都变为 $\log_2 1=0$。这一点和互信息正好相反:把 $X$ 和自身代入互信息,得到的是 $I(X;X)=H(X)$,一般不为 0。两者问的不是同一个问题:相对熵问“这两个分布相差多远”,自己和自己当然相差为 0;互信息问“你身上的信息有多少也存在于对方身上”,$X$ 和自身的信息完全重合,重合量就是 $H(X)$。
- 相对熵越大,两个分布的差异越大。 它恒不为负,即 $D_{\mathrm{KL}}(P\parallel Q)\geq 0$,这就是吉布斯不等式。
- KL 散度不对称。 $D_{\mathrm{KL}}(P\parallel Q)\neq D_{\mathrm{KL}}(Q\parallel P)$,这是它与互信息最大的区别。
如果需要一个对称的量,可以先将两个分布平均,得到 $M=(P+Q)/2$,再让 $P$、$Q$ 分别和 $M$ 计算散度并取平均,得到 JS 散度:
\[D_{\mathrm{JS}}(P\parallel Q) = \frac{1}{2}D_{\mathrm{KL}}(P\parallel M) + \frac{1}{2}D_{\mathrm{KL}}(Q\parallel M)\]其中 $M=(P+Q)/2$。JS 散度是对称的,以 2 为底时取值在 0 到 1 比特之间,因此当我们需要一个更接近“距离”的描述时,使用它往往比 KL 散度更直观。
KL 散度也是大模型训练中的常客。最直接的一处就藏在语言模型的损失函数中:交叉熵损失可以拆成“真实数据自身的熵”加上一个 KL 散度:
\[H(P,Q) = H(P) + D_{\mathrm{KL}}(P\parallel Q)\]也就是说,最小化交叉熵等价于最小化模型分布与真实分布之间的 KL 散度。$H(P)$ 是数据本身的熵,与模型参数无关,因此不改变优化方向,只决定损失函数下限的位置。训练时如果标签是 one-hot,$H(P)=0$,损失函数本身就是这个散度。
同一思路也用在其他地方:知识蒸馏让学生网络的输出分布逼近教师网络的输出分布,使用的就是这个散度;RLHF 的 PPO 阶段则会在奖励中加入 $D_{\mathrm{KL}}(\pi_\theta\parallel\pi_{\mathrm{ref}})$,把新策略约束在原始模型附近,避免它为了提高奖励而偏离正常的语言分布。
参考文献
- 吴军:《数学之美》(第二版),人民邮电出版社,2014,附录 A:信息论基本概念。
- C. E. Shannon. A Mathematical Theory of Communication. Bell System Technical Journal, 1948.
- C. E. Shannon. Prediction and Entropy of Printed English. Bell System Technical Journal, 1951.
- J. Zheng and M. Meister. The Unbearable Slowness of Being: Why Do We Live at 10 Bits/s?. Neuron, 2024.