香农公式在数据压缩中的角色
压缩的理论下界从哪来?为什么熵是模型的属性而不是数据的属性?以及——为什么压缩和预测在数学上是同一件事。
先澄清一件事,因为这里有个很常见的混淆。
中文教材里说「香农公式」,严格来说指的是香农-哈特利定理:
那个管的是信道——一条线路每秒最多能可靠传输多少比特。它跟压缩没有直接关系。
真正统治数据压缩的,是香农信息论的另一半:信息熵,以及建立在它之上的香农第一定理(无失真信源编码定理)。两者是同一套理论的两条腿——一条管「能压多小」(信源编码),一条管「能传多快」(信道编码)。
下面讲的是前者。
001把概率翻译成比特
整套理论的起点是一个很朴素的直觉:越不可能发生的事,发生了才越有信息量。
「明天太阳升起」几乎不含信息,因为你早就知道了;「明天下红雨」信息量巨大,因为它推翻了你原本的预期。香农把这个直觉写成了自信息:
为什么偏偏是对数?因为它是唯一能同时满足两个要求的函数:信息量随概率单调递减,且独立事件的信息量可以相加。两个独立事件的联合概率是 p₁p₂,而我们希望信息量是 I₁ + I₂——只有对数能把乘法变成加法。
熵就是自信息的期望值:把每个符号的「意外程度」按它出现的频率加权平均。
010香农第一定理:压缩的地板
这才是熵和压缩真正的连接点。定理说:对任意无损编码方案,平均码长 L 满足
而且存在编码使得 L < H(X) + 1;对符号分块编码之后,可以任意逼近 H(X)。
这条定理的性质很特别——它是个不可能定理。它不告诉你怎么压缩,它告诉你「不管你多聪明,都压不过这条线」。
任何声称能无损压缩任意数据的算法都是错的。鸽巢原理也能给出同样的结论:如果某些输入被压短了,必然有另一些输入被撑长了。
上面那条曲线现在有了第二重含义:−log₂ p(x) 不只是「信息量」,它同时是这个符号的理想码长。概率 1/2 的符号配 1 bit,概率 1/8 的配 3 bit。而熵,就是理想码长的加权平均。
011一个刚好压到极限的例子
设信源有四个符号,概率分别是 A = 0.5,B = 0.25,C = 0.125,D = 0.125。先算熵:
再用霍夫曼编码构造码树——每次把概率最小的两个节点合并,一路合到根:
| 符号 | 概率 p | 码字 | 码长 L | p × L |
|---|---|---|---|---|
| A | 0.500 | 0 | 1 | 0.500 |
| B | 0.250 | 10 | 2 | 0.500 |
| C | 0.125 | 110 | 3 | 0.375 |
| D | 0.125 | 111 | 3 | 0.375 |
| 平均码长 | 1.750 |
平均码长 1.75 bit,恰好等于熵。定长编码需要 2 bit/符号,所以压到了 87.5%——而且一个比特都省不下来了。这就是「达到香农极限」的字面含义。
100霍夫曼的天花板
如果概率不那么凑巧呢?
比如某个符号 p = 0.9,理想码长是 −log₂ 0.9 ≈ 0.152 bit。但霍夫曼只能给它整整 1 bit,因为一个码字最少占一个比特。这个取整损失最坏可达每符号 1 bit,在概率高度倾斜时非常致命。
突破口是放弃「一符号对应一码字」这个前提:
- 算术编码把整条消息映射成 [0, 1) 区间里的一个小数。符号不再各占整数比特,可以逼近熵到任意精度。
- ANS(非对称数系)用整数状态机达到类似的效率,但速度快得多——zstd 用的就是它。
这两者基本把「已知概率分布时」的问题彻底解决了。剩下的所有空间,都在别处。
101熵不是数据的属性
这是我认为最容易被误解、也最有意思的一点。
H(X) 里的 p(x) 从哪来?从你的概率模型来。同一段数据,换一个模型,算出的熵就完全不同。所以严格讲——
熵是「数据 + 模型」这一对的属性,不是数据本身的属性。
香农 1951 年那篇《Prediction and Entropy of Printed English》做的正是这件事:用越来越强的模型,去估计同一种数据的熵。
同一批英文文本,什么都没变,只是换了预测它的模型,可压缩的下界就从 4.75 一路掉到了 0.8。地板本身在下沉。
110压缩即预测
上面那张图其实解释了现代压缩器的全部架构。任何无损压缩器都可以拆成两半:
熵编码那一半,在 1970 年代就基本做完了——算术编码已经逼近理论极限,后来的改进主要是速度而非压缩率。
所以 gzip、zstd、xz、PNG 之间的差距,几乎全部来自模型那一半:LZ77 的滑动窗口、上下文混合、PPM 的高阶上下文,本质上都是在想办法把 p(x) 估得更准。
顺着这条线,一个乍看很怪的结论就变得自然了:
压缩和预测在数学上是同一件事。
一个能把英文压到 0.8 bit/字符的东西,等价于一个能很好预测下一个字符的语言模型;反过来,任何语言模型都可以直接当无损压缩器用——把它输出的概率分布喂给算术编码器就行。
这也是「压缩即智能」那类说法背后的技术依据:要把某样东西压得更短,你必须更好地理解它的规律。压缩率成了对建模质量的一种可度量的检验。
111边界:这条定理只管无损
H(X) 是无损压缩的下界。但 JPEG、MP3、H.264 都压到了远低于熵的比特率——它们并没有违反定理,而是换了一条赛道:允许失真。
这块归香农的率失真理论管,用 R(D) 函数描述:给定可容忍的失真 D,最少需要多少比特率 R。当 D → 0 时 R(D) → H(X),两条理论在这里干净地接上。
–整幅图景
回到开头那个澄清。可以这样收束:香农把通信拆成了几个彼此独立的问题,并给每一个都划了一条不可逾越的线。
| 问题 | 定理 | 极限 | 回答什么 |
|---|---|---|---|
| 信源编码 | 第一定理 | H(X) | 数据最少能用多少比特表示 |
| 信道编码 | 第二定理 | C = B log₂(1+S/N) | 一条信道每秒最多能可靠传多少比特 |
| 有损压缩 | 率失真 | R(D) | 容忍失真 D 时的最低比特率 |
而这三条线有个共同点:它们都不告诉你怎么做,只告诉你做不到什么。
压缩工程七十年的全部进展,本质上是在把实际码率往 H(X) 这条地板上压。而由于 H 取决于模型,这条地板本身还在随着建模能力的提升不断下沉——今天的神经压缩器已经踩到了香农当年为人类估出的那条线之下。