卷 I · 惊CH 04深度 4/24

熵不是「混乱」,是「你还欠多少个问题」

「熵 = 无序」这个说法流传太广,坏处也太大。清掉它之后,会掉出一个意外的赠品:你会明白为什么高斯分布无处不在,以及为什么该在「不知道」的时候选那个熵最大的假设。

最大熵原理为什么是高斯接热力学

▷ 先猜一下

两个八面骰子,各面概率不同。甲的分布看起来乱七八糟(17%、3%、22%、9%、14%、6%、19%、11%),乙的看起来整整齐齐(12%、12%、13%、12%、13%、12%、13%、13%)。哪个熵更高?

A 甲(更乱)B 乙(更整齐)C 差不多

先把这个词还回去

「熵是混乱程度」这个说法,来自热力学科普,而且在热力学里它也只是个粗糙的比方。搬到信息论里之后,它会让你在四个地方犯错,所以值得花一整章清掉。

先看事实:

拿最后两档对比一下。「看起来很乱」的那个分布,熵是 2.812;「看起来很整齐」的那个,熵是 2.999。整齐的那个更高。

为什么?因为熵量的根本不是「图好不好看」。它量的是:

◆ 熵的三种等价读法(一个都不是「混乱」)
  1. 下一次抽出来的结果有多难猜。越接近均匀越难猜,熵越高。
  2. 要确定结果,平均还欠几个是非问题。这是最实用的一种读法。
  3. 把这个结果写下来,平均最少要花几个比特。这是压缩视角。

三种读法完全等价。它们说的都是「你离知道答案还差多远」,而不是「这堆东西看起来有多乱」。

「看起来很整齐」的那个分布之所以熵高,正是因为它八个面几乎一样可能——你没有任何偏好可以利用,只能老老实实二分。而「看起来很乱」的那个虽然图形参差,但它确实有偏好(22% 那一面比 3% 那一面常见七倍),而偏好就是可以利用的东西

✗ 「熵 = 混乱」会让你在这四个地方犯错
一、「我的数据看起来很随机,所以熵很高,压不动。」 看起来随机不等于概率均匀。第 9 章那段日志「看起来」很乱,其实压到了四分之一。 二、「加密之后文件变乱了,所以加密增加了信息。」 加密不改变信息量(可逆变换不改变熵),它只是把可预测的结构藏起来了——藏到「没有密钥的人看来是均匀的」这个程度。密钥持有者看到的熵一点没变。 三、「熵增定律说宇宙越来越乱,所以信息在减少。」 两个「熵」在这里被混用了。热力学熵增,说的是宏观态对应的微观态数目在增加,也就是「你要指定当前的微观状态,需要的比特数在增加」。信息量是在增加的,不是减少。 四、「白噪声熵最大,所以白噪声信息量最大。」 这句话在信息论内部完全正确,而它正是很多人接受不了信息论的地方。第 13 章会正面处理它:「信息量」和「有意思」是两回事,而后者需要另一个完全不同的量。

最大熵:一个用来做决定的原理

既然熵在均匀的时候最大,那么反过来问:如果我只知道一点点东西,应该假设什么分布?

杰恩斯(E. T. Jaynes)1957 年给的答案是:选在你已知的约束下熵最大的那个。

这条原则叫最大熵原理,它的正当性一句话就能说清:

◆ 最大熵原理 = 「不要偷偷假设你不知道的东西」

如果你选了一个熵不是最大的分布,就意味着你在某个地方引入了一条「更可能」的偏好。而那条偏好不在你已知的约束里——它是你自己加的。

熵最大的那个分布,是唯一一个「只包含你说的约束,不多不少」的分布。

这条原则最漂亮的地方,是它能推出那些你以为要死记的分布:

你只知道熵最大的分布所以它出现在
有 n 种结果,别的什么都不知道均匀分布掷骰子、随机数、密钥
取值在 [0, ∞),均值是 μ指数分布等待时间、放射性衰变、故障间隔
取值在整条实轴,均值 μ、方差 σ²高斯分布到处都是
取值是非负整数,均值 λ泊松分布单位时间内的事件数
能量的均值固定玻尔兹曼分布整个统计力学

为什么高斯分布到处都是

标准答案是中心极限定理:很多独立随机量加起来趋向高斯。这个答案对,但它只解释了「加法产生高斯」。

最大熵给的是另一个更根本的答案,而且顺手解释了中心极限定理为什么成立:

∑ 高斯 = 「只知道均值和方差」时的诚实假设

在所有均值为 μ、方差为 σ² 的实值分布里,高斯分布的熵最大,而且这个最大值有闭式:

H(高斯) = ½ log₂(2πe σ²)      单位:比特

# 注意它只依赖 σ,不依赖 μ。
# 平移一个分布不改变它的熵——这很合理:换个坐标原点不会让你更懂它。

所以「假设它是高斯的」这句话的准确含义是:「我只掌握了它的均值和方差,除此之外我不打算假设任何东西。」

这也解释了中心极限定理为什么成立:把独立随机量加起来,加法会抹掉除了均值和方差之外的所有细节(高阶矩被稀释了)。而当只剩均值和方差时,熵最大的形状就是高斯——所以极限只能是它。

换句话说:中心极限定理是「熵在加法下单调上升,直到顶到最大熵那个形状为止」。

这个视角有实际用处。下次你看到一个模型「假设误差是高斯的」,你可以准确地问一句:是我们真的验证过误差是高斯的,还是我们只知道它的方差、于是选了最诚实的那个假设?两种情况下这个假设的可信度完全不同,而后者其实更常见。

▸ 在现实里:/dev/random 里那个「熵」,就是这一章的熵

Linux 内核维护一个「熵池」,从鼠标移动的时间间隔、中断到达的抖动、磁盘寻道延迟这些 地方收集不可预测性,用来给 /dev/random/dev/urandom 播种。

它估的正是这一章的量,而不是「这些数据看起来有多乱」。 内核关心的是一件很具体的事:一个知道你机器型号、知道当前时间、 看过你所有公开输出的攻击者,要猜多少次才能猜中这个种子。这就是熵的第二种读法。

这里有一个流传很广、但在现代内核上已经不成立的说法:

  • 旧说法:/dev/random 会因为熵池耗尽而阻塞,所以要装 haveged 之类的东西喂熵。」
  • 现在:Linux 5.6 之后,/dev/random 只在启动早期 尚未完成初始播种时阻塞;一旦播种完成就不再阻塞,行为和 /dev/urandom 基本一致。

为什么可以不阻塞?因为播种之后用的是密码学安全伪随机数生成器: 它从几百比特的真熵出发,可以拉出任意长的序列,而在计算上不可区分于真随机

注意这里熵的行为和直觉不一样:拉出更多输出,并不会「消耗」熵—— 种子的熵一直是那些比特,攻击者要猜的还是那些比特。「熵被用掉了」这个说法, 把「信息量」当成了一种会被消耗的流体。它不是。

真正要紧的是另一件事:启动早期熵不够。刚开机的嵌入式设备、 刚创建的云虚拟机,可能还没攒够那几百比特——而在那个窗口里生成的密钥是危险的。 这就是为什么虚拟化平台会提供 virtio-rng,现代 CPU 会提供 RDRAND 指令。

第一次照面:物理里的那个熵

玻尔兹曼墓碑上刻着一个公式:

S = k · log W

# S = 热力学熵
# W = 这个宏观状态对应多少种微观状态
# k = 玻尔兹曼常数 = 1.380649 × 10⁻²³ J/K

把它和香农的熵放在一起看:

玻尔兹曼:  S = k · ln W          # W 种微观态等可能
香农:      H = log₂ n            # n 种结果等可能

# 同一个式子。差别只有两处:
#   1. 底数不同(ln vs log₂)—— 换算常数 ln2
#   2. 前面乘了一个 k —— 它的单位是 焦耳/开尔文
◆ 那个 k 是干什么用的

玻尔兹曼常数不是物理常数,是一个单位换算因子。

它把「比特」换算成「焦耳每开尔文」。之所以需要它,纯粹是历史原因:温度这个量在人们知道它其实是分子动能之前就已经有单位了(开尔文),所以后来必须硬塞一个常数把两套单位接起来。

如果人类是先发现统计力学再定义温度的,我们会直接用能量做温度的单位,k 就等于 1,热力学熵和信息熵会是同一个数,连换算都不用。

所以「热力学熵」和「信息熵」不是「相似」,不是「类比」,是同一个量的两套单位——就像英里和公里。

这件事有一个可以拿去做实验的后果,而且真的被做了:擦掉一个比特,必须散掉至少 k·T·ln2 焦耳的热。在室温下是 2.871 泽普托焦耳。这个数第 22 章会算给你看,而且它在 2012 年被实验测出来过。

✎ 术语正名:熵、负熵、信息

你可能见过「信息是负熵」这个说法(薛定谔《生命是什么》里那个)。它容易造成误会,说清楚一点:

  • 是「还欠多少比特」,是一个状态的性质。
  • 获得信息是熵下降的过程。所以「一条消息带来 3 比特信息」= 「听完之后我的熵降了 3 比特」。
  • 「负熵」这个词在薛定谔那里指的是「生命体从环境吸取有序性」,它是个热力学说法,不是信息论术语。信息论里不需要这个词——直接说「熵减少了多少」就行。

另外提醒一句:熵可以是负的,但只在连续分布里。离散分布的熵永远 ≥ 0;连续分布的微分熵可以为负(因为它依赖你选的单位)。这本书基本只用离散熵,遇到连续的地方会单独说明。

◇ 结账
B:乙(看起来整齐的那个)熵更高,2.999 vs 2.812

而且乙已经几乎顶到八种结果的上限 3.000 了。

如果你选了 A,那说明「熵 = 混乱」这个词确实在你脑子里生了根——这不怪你,几乎所有科普都是这么讲的。但从这一章起,请把它换成另一句:

熵 = 你离知道答案还差几个是非问题。

这一章的一句话

熵不是混乱,是「还欠多少个问题」。而在你只知道一点点的时候,选熵最大的那个假设——因为那是唯一一个不偷偷夹带私货的假设。

卷 I 到此结束。你现在手上有一把尺子:给定一个概率分布,你能算出「最少要花多少比特」。

卷 II 要做的事只有一件:把那个「最少」真的做出来。下一章先证明一件让人扫兴但至关重要的事——万能压缩器不存在,而且证明只要三行。证完之后你会明白,所有压缩算法本质上都是同一种赌注,区别只在赌什么。