Lecture Guide · Block 1 / 3

压缩的极限

来源:Reinventing Entropy, Compression & Intelligence Part 1 主题:前缀码、Huffman 编码与压缩下界 预计阅读:12 分钟

文本压缩有没有不可逾越的极限?这个问题至少可以追溯到 1940 年代克劳德·香农的开创性工作。为了回答它,香农发展出的数学不仅开启了信息论,也意外地成为现代机器学习的基石。我们先从一个更简单的场景入手:向遥远卫星上的机器人发送移动指令。这个例子包含了压缩极限的全部核心思想。

目录 Contents

3 blocks in total

一、机器人指令的例子

想象我们向一颗遥远卫星上的机器人发送移动指令。每步只能有四个选择:上、下、左、右。由于地形或任务原因,这些指令并非均匀分布:

比特从地球传到卫星很慢、很贵,因此我们想用尽可能短的比特串来编码这些指令。面对这个问题,三位同学给出了三种不同层次的回答。

二、固定长度 vs 变长编码

第一位同学采用最直接的方案:四个指令,每个都用 2 个比特。

00 → 上  01 → 下  10 → 左  11 → 右

这种固定长度编码简单、易解码,但完全没利用「向上更常见」这一事实。平均每个指令仍然是 2 比特。

第二位同学提出变长编码:常见指令用短码,罕见指令用长码。她建议:

0  → 上
10 → 下
110 → 左
111 → 右

计算平均码长:

1/2 × 1 + 1/4 × 2 + 1/8 × 3 + 1/8 × 3 = 1.75 bits

比固定长度的 2 比特更短。这里的技巧是把节省下来的比特花在更常见的指令上,而为罕见指令多花的比特对平均值影响很小。

三、前缀码约束

一旦允许不同指令使用不同长度的比特串,接收端必须知道「在哪里划清界限」。前缀码(prefix-free code)的关键约束是:

任何码字都不能是另一个码字的前缀。
为什么前缀码能无歧义解码?

以上述编码为例。机器人读到一个比特流:

1 0 0 1 1 0 0 1 1 1 ...

第一个比特若是 0,那它一定是「上」,因为没有任何其他码字以 0 开头。若是 1,则还无法确定,可能是「下」「左」「右」中的任意一个;继续读下一位:

  • 读到 10,即可判定为「下」,因为没有码字以 10 开头后又接别的比特;
  • 读到 110,判定为「左」;
  • 读到 111,判定为「右」。

之所以能这样读,是因为没有一个码字是另一个码字的开头。例如,如果新增一个指令用 100,就会产生冲突:读到 10 时,无法判断这是完整的「下」,还是「100」的开头。

四、完美压缩像随机噪声

第三位同学走得更远。她没有关心具体编码规则,而是问:完美压缩应该具有什么性质?

她的洞察是:压缩后的比特流应当与随机噪声不可区分。所谓随机噪声,是指每个比特为 0 或 1 的概率各为 50%,且彼此独立。

这个乍看奇怪的主张其实很深刻。如果压缩后的比特还存在可被预测的规律,那就说明我们还可以进一步压缩它。只有当没有任何规律可循时,才到达了极限。而在上述机器人例子中,第二位同学的编码恰好满足这一点:第一位是 0 的概率为 1/2,否则继续按条件概率读取,后续每一位也都像抛硬币一样不确定。

熵 H = 1.750 bits · 平均码长 ≈ 1.750 bits
50%
25%
12.5%
12.5%
上 ↑ 下 ↓ 左 ← 右 →
图 1:可交互 Huffman 前缀码树。左侧为概率分布,右侧为按 Huffman 算法生成的无前缀码树,拖动滑块可实时观察熵与平均码长的变化。
本块小结:压缩的极限由概率分布决定。Huffman 编码在给定单符号分布下给出最优的整数前缀码,而 H 则刻画了无损压缩每个符号所需的最小平均比特数。当分布极不均匀时,变长编码能显著优于固定长度编码;而当分布接近均匀时,固定长度编码反而已经接近最优。