文本压缩有没有不可逾越的极限?这个问题至少可以追溯到 1940 年代克劳德·香农的开创性工作。为了回答它,香农发展出的数学不仅开启了信息论,也意外地成为现代机器学习的基石。我们先从一个更简单的场景入手:向遥远卫星上的机器人发送移动指令。这个例子包含了压缩极限的全部核心思想。
机器人指令、前缀码、Huffman 编码与压缩极限。
信息定义 -log₂(p)、熵的面积解释、香农无噪声编码定理。
语言建模、条件概率链式法则、交叉熵损失、压缩⇔智能。
想象我们向一颗遥远卫星上的机器人发送移动指令。每步只能有四个选择:上、下、左、右。由于地形或任务原因,这些指令并非均匀分布:
比特从地球传到卫星很慢、很贵,因此我们想用尽可能短的比特串来编码这些指令。面对这个问题,三位同学给出了三种不同层次的回答。
第一位同学采用最直接的方案:四个指令,每个都用 2 个比特。
这种固定长度编码简单、易解码,但完全没利用「向上更常见」这一事实。平均每个指令仍然是 2 比特。
第二位同学提出变长编码:常见指令用短码,罕见指令用长码。她建议:
计算平均码长:
比固定长度的 2 比特更短。这里的技巧是把节省下来的比特花在更常见的指令上,而为罕见指令多花的比特对平均值影响很小。
一旦允许不同指令使用不同长度的比特串,接收端必须知道「在哪里划清界限」。前缀码(prefix-free code)的关键约束是:
以上述编码为例。机器人读到一个比特流:
第一个比特若是 0,那它一定是「上」,因为没有任何其他码字以 0 开头。若是 1,则还无法确定,可能是「下」「左」「右」中的任意一个;继续读下一位:
10,即可判定为「下」,因为没有码字以 10 开头后又接别的比特;110,判定为「左」;111,判定为「右」。之所以能这样读,是因为没有一个码字是另一个码字的开头。例如,如果新增一个指令用 100,就会产生冲突:读到 10 时,无法判断这是完整的「下」,还是「100」的开头。
第三位同学走得更远。她没有关心具体编码规则,而是问:完美压缩应该具有什么性质?
她的洞察是:压缩后的比特流应当与随机噪声不可区分。所谓随机噪声,是指每个比特为 0 或 1 的概率各为 50%,且彼此独立。
这个乍看奇怪的主张其实很深刻。如果压缩后的比特还存在可被预测的规律,那就说明我们还可以进一步压缩它。只有当没有任何规律可循时,才到达了极限。而在上述机器人例子中,第二位同学的编码恰好满足这一点:第一位是 0 的概率为 1/2,否则继续按条件概率读取,后续每一位也都像抛硬币一样不确定。