Day 33 · 2026.07.25

编码与纠错

Coding & Error Correction — 如何让消息在必然出错的世界里安然抵达
"能否在一条会出错的信道上实现任意可靠的通信?" 1948 年,Shannon 的答案是:能——且有确切的价钱。

信道容量与 Shannon 极限

Channel Capacity & the Shannon Limit · 噪声世界里的一道悬崖
Information Theory
直觉版

信道会出错,最朴素的对策是重复:每比特发三遍,多数表决——错误率降了,速率却掉到 1/3;要更可靠就发五遍七遍,「几乎不出错」似乎必须让速率趋于 0

Shannon 说错了。每条信道有一个确定的数 $C$(容量):只要速率 $R<C$,就存在编码让错误率任意接近 0 而速率不必下降;一旦 $R>C$ 则再聪明的编码也注定失败。快与准不是跷跷板,是一道悬崖。秘诀在别逐个比特加固、要整块地编:把长消息整体映射成高维空间里的一个点,点与点隔得够远,噪声推偏它也依然离原点最近。

速率 R 错误率 R = C 可以做到任意可靠 注定失败 0
容量是一道相变阈值:崖左侧误差可压至任意小,右侧怎么编码都不行。
$$C=\max_{p(x)} I(X;Y)\qquad\text{二元对称信道:}\;C=1-H(p)$$
正式定义

$I(X;Y)$ 是输入 $X$ 与输出 $Y$ 的互信息——收到 $Y$ 后,关于 $X$ 的不确定性减少了多少(比特)。容量 $C$ 是它在所有输入分布 $p(x)$ 上的最大值:把信道用到极致,一次最多能搬多少比特。对每比特以概率 $p$ 翻转的信道,$C=1-H(p)$,其中 $H(p)=-p\log_2 p-(1-p)\log_2(1-p)$ 是噪声自身的熵——噪声吞掉的份额,正好从满带宽 1 里扣掉

为什么美

美在证明方式的离奇。Shannon 没有构造任何一个好码,他证的是:从所有码里随机抓一个,平均表现就已足够好,故好码必然存在——用随机性证明确定性对象的存在,这是「概率方法」最震撼的一次亮相。更深的美在「阈值」这个形状:直觉预期一条平滑的权衡曲线,数学却给出锐利的相变。可靠通信原来和水的沸腾一样,是一种相变现象。

应用

这条极限是通信业的坐标原点:一切编码方案都用「距 Shannon 极限还差几分贝」打分。Turbo 码首次逼近到 0.5 dB 以内,LDPC 码如今坐镇 5G 数据信道与 SSD 控制器。AI 一侧,率失真理论是变分自编码器与「信息瓶颈」的数学母体:训练一个表示,就是在有限容量下决定保留哪些比特

一句话精华:可靠性不必拿速率去换——每条信道都有确定的额度,额度以内近乎完美,以外必然崩溃。
思考题:Shannon 证明好码「几乎处处存在」,随手一抓即是;人类却花了四十五年才造出能实际解码的。「存在」与「可构造」之间这道鸿沟,还有哪些同样刺眼的例子?

Hamming 码与球堆积

Hamming Codes & Sphere Packing · 在超立方体上把点摆开
Algebraic Coding
直觉版

把每个 7 位串看成 7 维立方体的一个顶点(共 128 个),噪声翻转一位就是沿棱走一步。纠错于是成了几何问题:挑一批顶点当「合法词」,两两至少相距 3 步——这样每个合法词「一步之内」的顶点围成一个小球,球球互不相交,被翻了一位的串必落在唯一一个球里。

Hamming 的构造更叫绝:7 位中留 3 位做校验,各覆盖一组特定位置;三次校验的成败写成三位二进制数,这个数直接就是出错位置的编号——校验结果自己报出了错误的门牌号。

距离 ≥ 3 ⟹ 半径 1 的球互不相交 ⟹ 单错必可归位
纠错码就是离散空间里的球堆积:合法码字是球心,噪声是半径。
$$s=H\mathbf{r}\pmod 2,\qquad 2^{k}\cdot\!\!\sum_{i=0}^{t}\binom{n}{i}\le 2^{n}$$
正式定义

$[n,k,d]$ 线性码把 $k$ 位信息编成 $n$ 位,任意两码字至少相差 $d$ 位(最小汉明距离),可纠 $t=\lfloor (d-1)/2\rfloor$ 个错;Hamming(7,4) 即 $[7,4,3]$。校验矩阵 $H$ 的各列恰是全部 7 个非零三位向量;收到 $\mathbf r$ 后算症状 $s=H\mathbf r$:$s=0$ 无错,否则 $s$ 作为二进制数就是出错列的下标。Hamming 界则说:$2^k$ 个球、每球 $\sum_{i\le t}\binom{n}{i}$ 个点,总和不能超过整个空间。

为什么美

把数字代进去:$2^4\times(1+7)=128=2^7$。不等式取到了等号——128 个顶点被 16 个小球严丝合缝铺满,无一遗漏、无一重叠。这叫完美码:离散版的 Kepler 堆积问题,答案不是「约 74%」而是精确的 100%。这类宝石极稀少:二元情形只有 Hamming 族与两个 Golay 码,1973 年被证明再无其他。

应用

1947 年,Hamming 的周末批处理作业总因一位错误被贝尔实验室的机器丢弃,他愤而追问:「机器既然能发现错误,为什么不能改正它?」——整个纠错码学科由此而生。今天服务器的 ECC 内存用的是 SECDED(纠一位、检两位),宇宙射线击中 DRAM 造成的比特翻转就在这里被无声修好。

一句话精华:纠错就是在离散空间里把点摆得足够远——Hamming 码把球摆得刚好铺满,一个空隙不剩。
思考题:完美码稀有,因为球的体积 $\sum\binom{n}{i}$ 极少整除 $2^n$;「刚好铺满」不可能时只能接受浪费。这种「逼近最优却达不到」,是编码独有还是所有优化的常态?

Reed–Solomon 码

Reed–Solomon Codes · 两点定一线,多给几点就防丢
Finite Fields
直觉版

两点确定一条直线。若我要传的信息就是某条直线的两个系数——那我不发系数,而在直线上取 5 个点发出去;丢掉三个也无妨,剩下任意两点就能还原它。冗余不是把消息抄几遍,而是把消息「过采样」。

一般地:$k$ 个数据符号当作 $k-1$ 次多项式的系数,在 $n$ 个点上求值发出去,收到任意 $k$ 个即可插值还原。若某个值被篡改而非丢失,它会「偏离曲线」而格外扎眼——纠一个错因此比补一个空缺贵一倍:先花冗余找出谁在说谎,再花冗余把它改对。

被篡改 → 离开曲线 k 个数据点 n−k 个冗余点
消息即多项式,发出去的是它在若干点上的取值:丢点可插值补回,坏点因偏离曲线而暴露。
$$m(x)=m_0+m_1x+\cdots+m_{k-1}x^{k-1}\;\longmapsto\;\big(m(\alpha^0),\dots,m(\alpha^{n-1})\big)$$
正式定义

取有限域 $\mathrm{GF}(2^8)$——恰好 256 个元素、加减乘除俱全的「字节世界」,$\alpha$ 是其生成元。$k$ 个消息字节作多项式 $m(x)$ 的系数,在 $n\le 255$ 个点求值即得码字。参数 $[n,k,n-k+1]$:最小距离恰是 $n-k+1$,可纠 $t=\lfloor (n-k)/2\rfloor$ 个错误符号,或补 $n-k$ 个已知位置的丢失。

为什么美

那个 $n-k+1$ 不是巧妙构造出来的,而是一个初等代数事实的直接推论:两个不同的 $k-1$ 次多项式最多在 $k-1$ 个点上相等,故两码字至少在 $n-k+1$ 个位置不同——而 Singleton 界说任何码的距离都不超过这个数,Reed–Solomon 正顶在天花板上。更美的是视角的转换:Hamming 靠几何摆位置,Reed–Solomon 靠代数保距离。换一副眼镜,最优性就从「精心搜索的结果」变成「定理的顺带推论」。

应用

CD 上一道划痕会连坏几千个比特,但 RS 以字节为符号,一个字节全坏也只算一个错——再加上交织把连续损伤打散到不同码块,2.4 毫米的划痕仍能完整播放。更切身的是分布式存储的纠删码:HDFS、Ceph、S3 用 RS(10,4) 取代三副本,容忍任意 4 块盘同时故障,存储开销却从 200% 降到 40%。云存储的成本曲线,是被一条多项式压下来的。

一句话精华:把消息看成多项式、冗余看成多取几个点,最优的纠错距离便不必设计——它是代数定理的推论。
思考题:纠删码用 40% 的额外空间换来四盘容错,三副本却要 200%。既然如此,为什么工业界仍在热数据上大量使用副本?(提示:一块盘坏了,「修复」要读多少数据?)

二维码:理论落在一张纸上

QR Codes · 抽象代数的一次公开演出
Applied Coding
直觉版

二维码是前三个概念的工程合体。三角上的大方块是定位图案——手机先找到它们便知码的方向与透视,于是斜着扫、倒着扫都认得。数据沿 Z 字形路径填进方格,再套一层 Reed–Solomon 校验;纠错分四级,最高的 H 级冗余约 30%——这正是为何正中央压一个 logo 仍扫得出:被遮住的区域,数学上等同于一道划痕。

还有一步易被忽略却精妙:掩码。数据可能凑巧出现大片纯黑纯白,甚至误撞出酷似定位图案的花纹。于是编码器试遍 8 种花纹与数据异或,挑出黑白最均匀的那个——用可逆的伪随机打散不祥的规律

◼ 定位图案 → 方向与透视 ▨ 数据 + RS 校验(GF(256)) ⊕ 掩码 → 打散大片同色 ↯ 交织 → 分摊突发损伤
一张二维码里同时住着有限域算术、纠错几何与伪随机化。
$$g(x)=\prod_{i=0}^{2t-1}\!\left(x-\alpha^{i}\right),\qquad c(x)=x^{2t}m(x)-\big[x^{2t}m(x)\bmod g(x)\big]$$
正式定义

实际的 RS 编码用系统形式:消息多项式 $m(x)$ 左移 $2t$ 位后除以生成多项式 $g(x)$,余数作为校验符号接在消息之后,于是码字 $c(x)$ 恰被 $g(x)$ 整除——即它在 $\alpha^0,\dots,\alpha^{2t-1}$ 上取值全为零。解码时代入这些点:结果不为零即有错,而这几个非零值编织成的方程组能解出错在哪、错了多少

为什么美

美在抽象的落地距离。有限域是伽罗瓦二十岁前构想的东西,当年纯为回答「五次方程为何无根式解」;两个世纪后它在你手机镜头前每天运行几十亿次——一件为理解「不可能」而造的工具,最终被用来对抗咖啡渍。

还有一重结构之美:二维码的三层防御彼此正交——定位图案、RS、掩码各守一个失效维度、互不干扰。好工程与好数学同构:把耦合的问题拆成正交的子问题。

应用

移动支付、登机牌、商品溯源都跑在这套上;工业界的 Data Matrix 码用同样的 RS 内核,激光刻在金属零件上,经切削液与高温仍可读。1994 年原昌宏发明它本为追踪汽车零件,电装公司放弃专利收费才有今天的普及。

一句话精华:二维码把伽罗瓦的抽象代数印在纸上——用一层看不见的多项式,换一张污损后仍可读的图。
思考题:二维码的三层防御各守一种失效模式。回看你熟悉的系统——它的冗余是「正交分层」的,还是几层都在防同一件事,而真正的失效无人看守?

深入思考

DNA 的遗传密码,是一种纠错码吗?
不严格是,但确实被噪声塑造过。64 个密码子映射到 20 种氨基酸,冗余集中在第三位——第三位突变往往不改变氨基酸;且相似的密码子多编码性质相近的氨基酸,即便错义突变,功能损伤也偏小。这不是「检错纠错」,而是「让错误的代价变小」。演化没有解码器,它只能让码字间的语义距离与突变距离对齐——这恰是嵌入空间的理想性质。
纠删码省一半以上空间,为什么热数据仍用三副本?
因为存储开销不是唯一成本,修复带宽才是隐形杀手。三副本坏一块盘,只需从另一副本拷贝等量数据;RS(10,4) 坏一块盘,却要读其余 10 块的全部数据才能重算出丢失的那块。这催生了局部可修复码(LRC):在全局校验之外再加几组局部校验,让常见的单盘故障只需读少数几块。存储开销、容错度、修复代价构成一个无法同时取优的三维权衡,恰似 CAP。
神经网络的表示,可以看作一种编码吗?
这个类比比想象中锋利。分布式表示天然是「码」:语义摊在高维向量的各个方向上,少数维度受扰不改变类别——这正是最小距离足够大。而对抗样本恰恰说明距离不够大:某些方向上肉眼不可见的扰动就跨越了决策边界。于是「对抗鲁棒性」可重述为「扩大表示空间的最小距离」,随机平滑等防御做的确实是球堆积式论证。反过来更有意思:Shannon 说维度越高、随机点越彼此远离,深度学习的经验却是高维里对抗方向更多同一个高维几何,对可靠通信是祝福,对鲁棒分类却成了诅咒——差别只在噪声是随机的,还是被对手挑选的。