算法的故事 / 第一季第二季目录0 / 30 章已读

第二季 · 第 46 章

噪声中的希望

《算法的故事》第二季 · 第四篇:穿越噪声的信息——1948年,克劳德·香农如何重新定义通信1948年,美国新泽西州,贝尔实验室。电话网络正在连接越来越多的城市。电报沿着通信线路传递。无线电将声音送往远方。电子工程师不断尝试利用有限的线路、频带和功率,传输更多内容。但有一个问题始终存在。噪声。电流受到干扰。电压发生波动。无线信号混入不需要的能量。传输距离、信号功率和带宽,都可能影响接收质量。对于通信工程师而言,噪声仿佛是一个无法消灭的敌人。信号越微弱,它就越令人讨厌。如果我们把一段消息发送得太快,接收端也许就不能正确区分其中的符号。如果线路质量很差,某些消息可能被破坏。那么,一个困扰通信工程的根本问题出现了。存在噪声的通信线路,究竟能不能实现任意可靠的信息传输?注意,这个问题并不是问:怎样制造一条完全没有噪声的线路?而是在承认噪声存在的前提下,追问:是否仍然有办法,让接收端以极高的可靠性恢复原始消息?当时,一位在贝尔实验室工作的数学家,开始用一种不同于传统电路工程的方式研究它。他的名字叫作:克劳德·埃尔伍德·香农(Claude Elwood Shannon)。他没有从某一款具体电话设备开始。也没有把研究局限于某一种调制电路。他首先把消息、信道、噪声与接收端,变成能够用概率和数学公式描述的对象。于是,他得到了一项改变通信科学的结论。噪声确实会限制通信能力。但只要信息传输速率低于信道所允许的容量,在适当的随机信道模型下,就存在能够将消息错误概率降低到任意小的编码方法。换句话说:噪声并不意味着可靠通信在数学上不可能。真正的界限,是信道容量。1948年7月与10月,香农在《贝尔系统技术期刊》分两期发表了一篇论文:A Mathematical Theory of Communication《通信的数学理论》。第一部分发表于第379—423页。第二部分发表于第623—656页。 [Wiley Online Library][Wiley Online Library]1948年7月《The Bell System Technical Journal》中的香农原始论文。标题使用的是“A Mathematical Theory of Communication”,并非后来书籍使用的“The Mathematical Theory of Communication”。这篇论文并没有直接提供今天所使用的全部纠错编码方案。它做了一件更加基础的事情。它证明了:某种程度的可靠通信,在数学上确实可以实现。而且,它告诉工程师,这种可靠性存在怎样的理论极限。为此,香农还需要重新回答一个更加令人意外的问题。信息,到底是什么?

第一幕:一段毫无意义的电报,为什么也有信息量?

想象1948年的一名通信工程师。他需要设计一条电报线路。每天,线路会传输许多消息。有些消息很重要。例如:某座城市发生紧急事故。有些消息非常普通。例如:今天下午三点举行会议。还有一些消息,可能只是测试设备时产生的随机字符。例如:Q7A9X3M2现在请回答:哪一段消息的信息量最大?人类很容易从重要性出发判断。紧急事故的消息似乎更有价值。随机字符似乎毫无意义。但对于通信线路而言,问题并不一样。线路并不知道消息是不是一项重要命令。它需要做的,是将发送端选择的符号,尽可能正确地恢复到接收端。因此,香农刻意区分了:消息的语义价值,与通信系统需要处理的不确定性。1948年论文开篇就强调,他研究的工程问题,是怎样在另一位置重现被选中的消息;消息的意义不属于这个特定数学问题需要直接处理的内容。[Nokia Corporation | Nokia]这并不是说意义不重要。而是说:如果我们想建立适用于电话、电报、图像乃至其他通信形式的统一理论,就必须首先找到一种不依赖具体语义的信息度量。

一道选择题,拥有多少信息?

假设有两扇门。门A。门B。发送端随机选一扇门。接收端需要知道被选中了哪一扇。如果两扇门同样可能被选中,我们只需要一个二进制选择:0代表A。1代表B。因此,一次选择需要:1 bit1\text{ bit}现在增加到四扇门。我们可以使用:00011011一共两个二进制位。如果增加到八种同样可能的选择,就需要三个二进制位。
图46-1:选择数量与二进制信息量
等可能选项数需要区分的二进制位数信息量
20 或 11 bit
400 至 112 bits
8000 至 1113 bits
160000 至 11114 bits
规律很明显。如果有:NN种等可能结果,那么为了区分它们,理想化的信息量是:I=log⁡2N\boxed{I=\log_2N}例如:N=8N=8那么:I=log⁡28=3I=\log_2 8=3如果:N=1024N=1024则:I=log⁡21024=10I=\log_2 1024=10这给出了一项信息量的数学单位:比特(bit)。不过,香农并不是第一个研究这种对数式信息度量的人。为了理解他的真正贡献,我们需要将时间再向前拨动二十年。

第二幕:1928年,哈特利先问了一道重要的问题

拉尔夫·哈特利(Ralph V. L. Hartley)是贝尔实验室信息传输研究的重要先驱。香农在1948年论文开头明确引用了哈特利1928年的工作。1928年,贝尔系统技术期刊发表了一篇论文。作者:拉尔夫·V·L·哈特利。论文题目:Transmission of Information《信息的传输》。哈特利试图建立一种适用于物理通信系统的信息度量。他希望摆脱消息的心理意义与具体内容,研究通信系统如何区分不同的符号选择。他提出了一项重要思想:如果每次选择有 ss 种可能,连续作出 nn 次独立选择,那么可能的消息数量为:sns^n取对数:H=log⁡(sn)H=\log(s^n)于是:H=nlog⁡s\boxed{H=n\log s}这是后来信息论的重要先驱成果。[Wiley Online Library]

为什么一定要取对数?

假设第一段通信有:N1N_1种可能消息。第二段通信有:N2N_2种可能消息。两段独立组合以后,总可能数量为:N1N2N_1N_2如果我们希望信息量具有可加性:第一段信息量加第二段信息量,等于两段组合的信息量。那么就需要:I(N1N2)=I(N1)+I(N2)I(N_1N_2)=I(N_1)+I(N_2)而对数恰好具有:log⁡(N1N2)=log⁡N1+log⁡N2\log(N_1N_2)=\log N_1+\log N_2这便是对数在信息度量中如此自然的原因。它能够把可能性数量的乘法增长,转化为信息量的加法增长。

但是,哈特利的模型还不够

现在,假设有两个不同的信息源。第一个信息源,每次随机输出0或1,概率各为50%。第二个信息源,也输出0或1,但概率是:P(0)=0.99P(0)=0.99P(1)=0.01P(1)=0.01两者的可选符号数都为2。如果只看符号种类,似乎每次都需要1个比特。但它们真的拥有相同的不确定性吗?显然不是。对于第一个信息源,我们几乎无法预测下一位是0还是1。对于第二个信息源,猜0就有99%的机会猜对。从长期统计角度看,第二个信息源显然拥有更强的可预测性。因此,描述它所需要的平均信息量,应该能够体现这种概率结构。而这正是香农1948年理论的重要进步之一。信息量不能只考虑有多少种可能,还应该考虑每一种可能发生的概率。

还有一位同样不能忽略的先驱

香农在1948年原始论文的开头,同时提到了另一位贝尔实验室研究者:哈里·奈奎斯特(Harry Nyquist)。奈奎斯特在1924年和1928年研究过影响电报传输速度的因素。他的研究帮助工程师理解:带宽与可区分的信号状态,怎样限制通信速度。因此,香农的信息论并不是从一片空白中诞生。在他之前,奈奎斯特与哈特利已经为通信速率和信息度量建立了重要基础。香农的突破,在于进一步将:概率分布。信息的不确定性。噪声。以及可靠通信的极限。放进同一套数学理论之中。[哈佛数学系][Wiley Online Library]

第三幕:一个喜欢造机器的年轻人,为什么最终研究起信息?

MIT早期的微分分析机(Differential Analyzer)。香农在研究生时期曾参与这一模拟计算设备的相关工作,并从此发展出对逻辑电路的研究兴趣。[IEEE Information Theory Society]克劳德·埃尔伍德·香农,1916年4月30日出生于美国密歇根州佩托斯基。他在附近的盖洛德长大。年轻时便对电子装置、机械结构和数学充满兴趣。1936年,他从密歇根大学毕业,取得电气工程与数学方面的学位。随后,他进入麻省理工学院继续深造。在那里,一项当时很特别的计算设备引起了他的兴趣。微分分析机。这种计算机并不使用现代数字处理器。它通过齿轮、轴、圆盘等机械结构,模拟求解某些微分方程。香农在设备工作过程中,接触到大量继电器与开关电路。并逐渐意识到:这些看似复杂的电气连接,也许可以用一种纯粹的数学语言加以描述。

1937年的硕士论文,先改变了电路设计

1937年,香农完成了关于继电器与开关电路的硕士论文。相关研究于1938年发表:A Symbolic Analysis of Relay and Switching Circuits《继电器与开关电路的符号分析》。论文的核心思想,是把布尔代数与开关电路对应起来。开关断开或闭合,可以对应逻辑状态。多个开关之间的串联、并联与其他组合,则可以使用逻辑表达式描述。于是,电气工程师能够借助数学方法,分析甚至简化复杂的继电器网络。[数字对象标识符][IEEE Information Theory Society]
图46-2:开关电路与布尔逻辑
ABA ∧ B串联:逻辑 AND
ABA ∨ B并联:逻辑 OR
示意图只表达对应的逻辑关系,并非完整电路原理图。核心思想是用数学表达式描述开关组合。
这项研究发生在现代信息论之前。但它们之间具有明显的思想联系。布尔代数让电路中的两种状态获得了数学表达。信息论则进一步研究:由有限符号构成的消息,如何被产生、编码和可靠传递。不过,不能把香农1938年的电路论文直接说成“已经完成了1948年的信息论”。前者研究的是逻辑与电路结构。后者研究的是信息量、通信过程和理论极限。它们是同一位研究者在不同问题上的两项重大贡献。

第二次世界大战,让通信研究更加紧迫

1940年,香农在MIT取得硕士与博士学位。1941年,他进入贝尔实验室。战争期间,他参与了与防空火力控制和秘密通信有关的研究。他在1949年发表的:Communication Theory of Secrecy Systems《保密系统的通信理论》,也与其战时保密通信研究存在重要联系。[Massachusetts Institute of Technology]但我们需要避免一种过度戏剧化的叙述:1948年的信息论并不是香农在某次战场通讯失败之后,立刻写出的解决方案。它有更长的数学与工程发展背景。涉及通信工程、概率理论、电路、统计结构以及此前数十年的研究成果。在这样的背景下,香农逐渐形成了一个不同寻常的问题意识。不管消息是声音、文字还是图像,我们能否找到一种统一的方法,衡量它包含多少可被传输的信息?而他的答案,将引出本章最重要的数学公式。

第四幕:1948年,一个公式把“不确定”变成了数字

香农熵将信息源的不确定性转化为可以计算的数学量。它衡量的是概率模型中的平均信息量,而不是消息的文学价值或社会重要性。现在,想象两枚硬币。第一枚完全公平。正面和反面各有50%的机会出现。第二枚经过特殊设计。90%的时候出现正面。10%的时候出现反面。我们连续抛掷它们。哪一枚的结果更难预测?当然是第一枚。对于第二枚,我们只要总猜正面,就能猜对90%的次数。但是,怎样用一个统一的数字表示这种差别?

一件事情越意外,带来的信息越多

假设一个事件 xx 发生的概率是:P(x)P(x)我们希望它发生时所携带的信息量,与它发生的概率有关。越容易发生,信息量应该越小。越不容易发生,信息量应该越大。一个自然的定义是:I(x)=−log⁡2P(x)\boxed{I(x)=-\log_2P(x)}这叫作自信息量(Self-Information)。例如,某事件发生的概率是:P(x)=12P(x)=\frac12那么:I(x)=−log⁡212=1I(x)=-\log_2\frac12=1信息量为1比特。如果事件发生概率是:P(x)=18P(x)=\frac18则:I(x)=3I(x)=3信息量为3比特。如果概率只有:P(x)=11024P(x)=\frac1{1024}那么:I(x)=10I(x)=10信息量为10比特。这符合我们的直觉。越罕见的结果,越能排除大量原本可能发生的其他情况。但要注意,自信息量只是一个概率意义上的数学度量。它不代表某个罕见事件必定更重要、更有价值或者更值得关注。

一枚公平硬币的平均信息量

对于公平硬币:P(0)=0.5P(0)=0.5P(1)=0.5P(1)=0.5每次结果发生时的信息量都是:1 bit1\text{ bit}因此,平均信息量为:1 bit1\text{ bit}对于那枚90%出现正面的硬币呢?正面发生时:I(0)=−log⁡20.9≈0.152I(0)=-\log_2 0.9\approx0.152反面发生时:I(1)=−log⁡20.1≈3.322I(1)=-\log_2 0.1\approx3.322反面虽然更罕见,单次出现的信息量更大,但它只占10%的概率。因此,平均信息量需要按照概率加权:H=0.9I(0)+0.1I(1)H=0.9I(0)+0.1I(1)得到:H=−0.9log⁡20.9−0.1log⁡20.1H = -0.9\log_2 0.9 -0.1\log_2 0.1最后:H≈0.469 bits\boxed{H\approx0.469\text{ bits}}所以,两枚硬币的平均信息量不同。公平硬币:H=1H=1偏置硬币:H≈0.469H\approx0.469这意味着,如果我们长期观察第二枚硬币产生的独立结果,那么这些结果在统计上具有更大的可压缩空间。

香农熵的完整定义

设随机变量:XX有:x1,x2,…,xnx_1,x_2,\ldots,x_n种可能结果。对应概率为:p1,p2,…,pnp_1,p_2,\ldots,p_n满足:∑i=1npi=1\sum_{i=1}^{n}p_i=1那么,香农定义的信息熵是:H(X)=−∑i=1npilog⁡2pi\boxed{ H(X)=-\sum_{i=1}^{n}p_i\log_2p_i }其中,概率为零的项按照极限约定记为零。这个公式,正是现代信息论最具有代表性的数学表达式之一。[Princeton University]

为什么叫作“熵”?

“熵”(Entropy)原本是热力学和统计物理中的重要概念。统计力学里的某些熵表达式,同样使用概率和对数。香农在1948年的论文中明确指出,他的信息量函数与统计力学中的熵具有相同的数学形式。但这并不意味着所有物理热力学熵,都可以直接用通信比特数替代。二者具有深刻的数学联系,也有各自不同的定义、单位和应用条件。此外,关于冯·诺依曼建议香农使用“熵”这个词的轶事,后世流传甚广;但不能把没有可靠同期记录的具体谈话,当成已经完全证实的历史现场。本章采用有原始论文支持的事实:香农使用了熵这一术语,并明确说明它与统计物理中熵表达式之间的数学联系。

一个交互实验:不确定性怎样随概率变化?

图46-3:让一枚硬币从公平变得偏置拖动滑块,改变硬币出现正面的概率。观察平均不确定性如何变化。

50%

100%50%100%正面概率 p
查看 SVG 配图原件
示意图原件 46-009-ced5acca6caf.svg
46-009-ced5acca6caf.svg · 点击查看大图
正面概率

50%

二元熵

1.000 bits

两种结果等可能,不确定性达到最大值1比特。
这幅曲线告诉我们:对于一个二元信息源,当两种结果各占50%时,熵最大。当其中一种结果越来越确定时,熵逐渐减小。因此,信息熵不是在测量字符的长度。而是在测量一个概率模型中的平均不确定性。

第五幕:一旦知道信息熵,压缩的极限也开始出现

早期计算设备使用穿孔纸带、卡片和其他介质存储离散信息。怎样用更少符号表示同一消息,是通信与存储共同面对的问题。现在,我们已经能够计算一段消息源的平均不确定性。但这有什么实际用途?首先,它帮助我们回答:在不丢失原始信息的前提下,一段数据最多能够被压缩到什么程度?

如果一枚硬币始终输出0

假设某个设备每秒输出1000个二进制符号。但它永远只输出:000000000000...如果接收端事先知道这个规律,那么它并不需要每秒接收1000个原始比特,才能恢复全部输出。发送端只需要告知:从某个时间开始,输出全是0。以及必要的长度或结束条件。接收端就可以恢复对应数据。从熵的角度看,这个确定性信息源每符号的熵为:H=0H=0当然,实际文件仍然需要保存长度、格式等信息。因此,不能将熵为0直接解释为“所有现实数据文件都能压缩成零字节”。它表示在特定概率模型中,单个源符号不产生新的不确定性。

如果一枚硬币公平地输出0和1

现在,我们改用公平硬币。每次输出都独立,而且两种符号等概率。那么:H=1 bit/符号H=1\text{ bit/符号}如果连续生成1000个符号,平均不确定性就是:1000 bits1000\text{ bits}对于这种独立公平的二元消息源,不存在能够把所有可能的1000位消息都无损地压缩成少于1000位、并同时保持单射可恢复的统一编码。有些特定字符串可以很短地描述。例如:000000...000但也会存在无法在同一编码体系下得到相应压缩的其他字符串。所以,不能根据某个单独字符串看起来很有规律,就判断整个消息源必定容易压缩。

有偏置的信息源,可以做得更好

再考虑:P(0)=0.9P(0)=0.9P(1)=0.1P(1)=0.1对于独立同分布的信息源,每个符号的熵约为:H=0.469H=0.469因此,当我们处理足够长的消息序列时,理论上可以采用适当的无损编码,让平均编码长度接近:0.469 bits/原始符号0.469\text{ bits/原始符号}例如,长期传输十万个这样的原始符号,其理想压缩比特数约为:100000×0.469≈46900100000\times0.469 \approx46900这里忽略了实际编码中的有限长度、元数据及其他开销。但这个数字已经说明:原本用100000位直接表示的数据,在已知概率模型下,理论上可能只需要约46900位的平均编码长度。

香农的无噪声编码理论

对于离散无记忆信息源,香农的源编码定理告诉我们:使用足够长的分组和合适的编码方法,可以使平均每源符号编码长度任意接近源熵。反过来,在通常的无损、唯一可译编码条件下,长期平均编码率不可能低于源熵。这项结论让数据压缩首次拥有了清晰的数学极限。它不仅告诉工程师:可以压缩。还告诉工程师:在给定概率模型下,压缩究竟存在怎样的理论下界。

后来,哈夫曼给出了一种著名的具体算法

哈夫曼编码使用二叉树构造前缀码,让高概率符号获得较短码字,低概率符号获得较长码字。它属于香农信息论发展后出现的重要无损编码算法。1952年,David A. Huffman 发表:A Method for the Construction of Minimum-Redundancy Codes《构造最小冗余编码的方法》。他提出了后来以自己名字命名的哈夫曼编码。对于给定的离散符号概率,哈夫曼编码能够构造平均码长最短的二元前缀码。这与香农的压缩极限形成了很好的联系。香农告诉我们理论边界。哈夫曼则提供了一种具体的编码构造方法。但需要区分:哈夫曼编码并不是1948年香农论文中已经完整提出的算法。它于1952年才正式发表。另外,符号逐个编码的普通哈夫曼方法,平均码长可能比熵略大。如果通过分组等方法处理更长的符号序列,便可以进一步接近源熵。

但压缩还没有解决噪声问题

现在,我们获得了一项看起来很美好的成果。消息中可预测的部分,可以通过适当编码减少。于是,需要发送的比特变少了。通信效率提高。但是,真正的信道可能会破坏这些比特。如果压缩后的数据只有很少的冗余,一两个错误就可能让整个解码结果受到严重影响。这时,我们又遇到了一个与压缩方向相反的任务。为了抵抗噪声,也许需要主动加入一些冗余。这似乎十分矛盾。我们刚刚花了很长时间,想办法去除消息中的冗余。现在,却又要把冗余加回来?这正是香农理论中最精彩的地方之一。数据压缩负责去除不必要的源冗余;纠错编码则有目的地加入能够抵抗信道错误的结构化冗余。两者并不矛盾。因为它们要解决的是两个完全不同的问题。

第六幕:噪声究竟从哪里进入通信系统?

电话与电报系统中的线路、放大器和接收设备,都可能引入或受到不同形式的干扰。香农将复杂的物理通信过程抽象成可以统一研究的数学模型。回到1948年的贝尔实验室。如果我们只研究数据压缩,却不研究噪声,仍然无法解决远距离通信最棘手的问题。所以,香农还做了一件对后来通信工程极其重要的事情。他将通信系统表示成一张清晰的结构图。在原始论文第二页,可以看到著名的:Fig. 1 — Schematic diagram of a general communication system。这张图将信息源、发射机、接收机、目的地与噪声源联系在一起。[哈佛数学系]

现代化重绘:一条通信链路

图46-4:香农通信模型的教学重绘
信息源发送端信道接收端噪声源发送符号接收结果信道中的干扰可能使接收结果与发送内容不同
查看 SVG 配图原件
示意图原件 46-013-302c79a5b3f1.svg
46-013-302c79a5b3f1.svg · 点击查看大图
为适应阅读而简化的现代教学图。原始论文还明确区分了信息源、发射机、信道、接收机和目的地五个部分。
这项抽象的价值非常大。因为它让工程师不必每次都重新研究一种独特的通信系统。电话、无线电、电报和数字数据传输,虽然采用不同的物理技术,却可能具有相似的信息处理结构。发送端选择消息。发射机将消息转换成适合传输的信号。信道负责传递信号。噪声可能改变接收到的内容。接收端再试图恢复原始消息。于是,我们能够提出一个统一问题:在给定信道与噪声统计规律下,究竟能以多高的速率可靠传输消息?

一个最简单的噪声模型:比特翻转

现在,把复杂的电话线简化成一条二进制信道。发送端每次传输一个比特。它可能是:0。也可能是:1。但在传输过程中,每个比特都有一定概率发生错误。例如:发送0,接收到1。或者:发送1,接收到0。假设两种方向的翻转概率相同,都是:pp而且每次翻转彼此独立。这种模型叫作:二元对称信道(Binary Symmetric Channel,BSC)。
图46-5:二元对称信道
发送端接收端00111 − p1 − ppp实线:正确接收 虚线:比特翻转
查看 SVG 配图原件
示意图原件 46-014-91732d81d22a.svg
46-014-91732d81d22a.svg · 点击查看大图
如果:p=0p=0就表示每次都能正确接收。如果:p=0.1p=0.1就表示每个比特独立地拥有10%的翻转概率。如果:p=0.5p=0.5那么每次接收的结果,与原始发送比特之间已经失去可利用的统计区别。注意,p=0.5p=0.5 是这个模型中最关键的极端情况。对于发送0:一半机会收到0。一半机会收到1。对于发送1:也一样。这意味着,接收端单凭收到的比特,无法推断发送端原本选了什么。如果我们尝试重复发送同一个比特很多次,能否解决这个问题?在 p<0.5p<0.5 时,重复发送确实可以降低错误概率。但在 p=0.5p=0.5 时,再多的独立重复也无法恢复被完全抹掉的统计关系。这说明:我们并不能靠无限增加冗余,让任何噪声模型都获得可靠通信能力。信道本身究竟能够传递多少信息,是一个必须首先回答的问题。

第七幕:噪声再大,也存在一条数学边界——信道容量

1948年的香农理论将信道容量定义为一个数学极限:在给定信道模型下,能够实现可靠通信的最大信息速率。现在,我们终于抵达1948年论文最重要的核心问题。对于一条受到噪声干扰的通信信道,我们能以多高的速率传输信息?香农将这项极限称为:信道容量(Channel Capacity)。记作:C\boxed{C}但是,这个符号的含义取决于信道模型和时间单位。对于每次使用传输一个离散符号的信道,容量通常可以表示为:bits/次信道使用\text{bits/次信道使用}对于真实带宽受限的连续通信系统,则可以表示为:bits/s\text{bits/s}两者不能直接混用。

信道编码定理的惊人结论

先考虑一个固定的离散无记忆信道。假设我们希望采用:RR比特每次信道使用的编码速率。香农的有噪信道编码定理给出了一个非常深刻的分界。如果:R<C\boxed{R<C}那么,对于足够长的编码分组,存在一些编码与解码方法,可以使消息解码错误概率任意小。而如果:R>C\boxed{R>C}那么,就不可能通过无限增加分组长度,让错误概率趋于零,同时维持这个超过容量的固定速率。这就是1948年论文的重大突破之一。[哈佛数学系][MIT OpenCourseWare]请特别注意定理中的表达:存在编码方法。它并不是说:1948年,香农已经给出了适用于所有信道的简单、实用且能够达到容量的具体代码。事实上,香农在原始论文中还讨论了其证明所使用的方法,在实际编码构造方面存在不足。他证明了某些高性能编码方案必然存在,但怎样以合理的计算成本构造和解码这些方案,仍然是后来几代研究者需要解决的问题。

为什么这项结论如此出人意料?

在直觉上,人们可能认为:只要信道存在噪声,错误就无法完全避免。如果想让错误率继续降低,就必须不断重复消息。可是,重复越来越多次,实际传输速率就会不断下降。最终,似乎只有让有效速率趋近于零,才能获得极低的错误概率。香农证明:这种悲观结论并不成立。恰当设计的长分组编码,可以利用很多个信道符号共同承载信息,同时抵抗噪声。如果编码速率低于容量,错误概率可以随着分组长度增大而变得任意小。而这一过程,不要求有效传输速率趋近于零。

但“任意可靠”不等于绝对不会出错

这里必须进行一项非常严格的区分。通信理论中说:错误概率可以任意小。并不等于:任何有限长度的编码,都能够保证在随机噪声下零错误。例如,一个有正翻转概率的二元对称信道,始终存在某些极端噪声序列,可能破坏任何给定的有限编码方案。通常意义下的有噪信道编码定理,研究的是允许编码长度不断增长时,错误概率的极限。它不是对每一次具体发送,都保证永不出错的承诺。

为什么会存在容量这个数字?

我们可以用一种非常直观的方式理解。设发送端在一段时间内,能够区分大量不同的消息。每条消息都对应一个编码序列。经过噪声信道之后,接收端看到的序列可能受到干扰。因此,同一条原始消息,可能对应许多不同的接收结果。如果两个不同消息的接收结果集合相互混淆,接收端就可能解码错误。所以,编码设计的关键,在于让不同消息对应的编码序列保持足够好的可区分性。香农证明:对于某些随机信道模型,采用足够长的编码块,就能够在巨大的序列空间中安排许多彼此具有良好区分能力的消息。但可以可靠区分的消息数量,并不是无限的。它受到信道容量限制。
图46-6:容量是可靠传输速率的边界
R < C可实现任意低错误概率R > C无法任意可靠C · 信道容量
查看 SVG 配图原件
示意图原件 46-016-78db69fad7e2.svg
46-016-78db69fad7e2.svg · 点击查看大图
此图表示固定信道的渐近编码极限,而非单次发送的错误概率。容量边界处 R=CR=C 的可达性需结合具体信道及定理形式讨论。

证明背后的一个直觉:让编码序列足够不同

假设我们只想区分两条消息:A。B。发送端可以分别编码为:00000000和:11111111即使通信中有少量比特翻转,接收端仍然有机会区分它们。因为这两条序列非常不同。但如果我们还要传输一百万种不同消息,就必须在有限长度的二进制序列空间中安排大量码字。这些码字不能彼此过于接近,否则噪声可能让其中一条看起来像另一条。所以,真正的编码问题,变成了:在一个巨大的二进制空间中,怎样安排足够多、又足够容易区分的码字?这项问题与距离、概率和组合数学都具有紧密联系。也为后面几章的汉明码、里德—所罗门码和维特比算法奠定了基础。但在继续之前,我们可以先用一个最简单的信道,亲手计算它的容量。

第八幕:一条每十位错一位的线路,究竟还能传输多少信息?

二元对称信道可以用一个翻转概率描述错误机制。虽然模型简单,却能够完整展示信息熵、互信息与信道容量之间的关系。假设我们拥有一条二元对称信道。每发送一个比特,就有:p=0.1p=0.1的概率发生翻转。也就是说,平均每十次使用信道,大约有一次比特错误。这里的“一次”是统计平均,并不代表每十位必定恰好出错一位。现在,我们要回答:这条信道最多能够以多高的速率可靠传输信息?

第一步:计算噪声的不确定性

由于每个比特都有:pp的概率翻转,所以它的错误模式可以看成一个二元随机变量。这个噪声变量的熵为:H2(p)=−plog⁡2p−(1−p)log⁡2(1−p)\boxed{ H_2(p) = -p\log_2p-(1-p)\log_2(1-p) }这与第四幕中的偏置硬币完全相同。如果:p=0.1p=0.1那么:H2(0.1)=−0.1log⁡2(0.1)−0.9log⁡2(0.9)H_2(0.1) = -0.1\log_2(0.1) -0.9\log_2(0.9)所以:H2(0.1)≈0.469\boxed{H_2(0.1)\approx0.469}

第二步:发送比特与接收比特之间,还剩下多少可用信息?

设发送端输入为:XX接收端输出为:YY对于二元对称信道:Y=X⊕ZY=X\oplus Z其中:ZZ是独立的二元翻转噪声,满足:P(Z=1)=pP(Z=1)=p这里:⊕\oplus代表异或运算。如果噪声为0,接收端得到原比特。如果噪声为1,接收端得到翻转后的比特。信息论使用**互信息(Mutual Information)**衡量X与Y之间共享的统计信息。记作:I(X;Y)I(X;Y)其公式之一是:I(X;Y)=H(Y)−H(Y∣X)\boxed{I(X;Y)=H(Y)-H(Y\mid X)}其中:H(Y)H(Y)是接收结果的不确定性。H(Y∣X)H(Y\mid X)是在已经知道发送内容的条件下,接收结果仍然具有的不确定性。对于二元对称信道:H(Y∣X)=H2(p)H(Y\mid X)=H_2(p)而接收结果每次只有0和1两种可能,所以:H(Y)≤1H(Y)\le1因此:I(X;Y)≤1−H2(p)I(X;Y)\le1-H_2(p)如果发送端以等概率使用0和1,则接收端的0和1也是等概率的。此时:H(Y)=1H(Y)=1于是,互信息达到最大值。所以,这条信道的容量是:C=1−H2(p)\boxed{ C=1-H_2(p) }单位:bits/次信道使用。这就是二元对称信道的经典容量公式。

第三步:代入10%的错误概率

因为:H2(0.1)≈0.469H_2(0.1)\approx0.469所以:C=1−0.469C=1-0.469得到:C≈0.531 bits/次信道使用\boxed{C\approx0.531\text{ bits/次信道使用}}这意味着什么?如果我们每秒使用这条信道1000次,那么其理论可靠信息传输能力约为:1000×0.5311000\times0.531即:531 bits/s531\text{ bits/s}更准确地说,在适当的编码与大分组极限下,低于约531 bits/s 的有效信息率可以实现任意低错误概率。超过这个容量的固定速率,则不可能达到同样的渐近可靠性要求。这并不是说每秒只能发送531个物理比特。我们仍然可以每秒向信道输入1000个编码比特。但这些编码比特中,需要有一部分承担抗噪声的冗余作用。真正能够可靠传输的原始信息速率,才受到容量限制。

不同噪声概率下的容量

图46-7:二元对称信道的容量变化
翻转概率 pp二元熵 H2(p)H_2(p)容量 CC
0%01.000
1%0.0810.919
5%0.2860.714
10%0.4690.531
20%0.7220.278
30%0.8810.119
50%1.0000
容量单位为 bits/次信道使用。该表只描述独立、对称的二元翻转信道,不代表全部通信介质的通用容量。
请仔细观察最后一行。当:p=0.5p=0.5时:H2(p)=1H_2(p)=1所以:C=0\boxed{C=0}这条信道的单次接收结果,与原始发送比特之间没有可用的统计关系。即使我们反复发送同一个比特,接收端也无法从这些独立的随机输出中恢复原始信息。不过,还有一项容易忽略的数学细节。如果:p=1p=1也就是每次发送的比特都必定翻转,那么:C=1C=1因为接收端只要再翻转一次,就能完全恢复原始比特。因此,真正破坏信息的,并不是“出错概率的数字越大越可怕”。而是接收结果对发送内容究竟还保留多少可预测的统计关系。在二元对称信道里:p=0.5p=0.5才是信息完全丢失的特殊点。

第九幕:互动实验室——亲手把错误的消息救回来

纠错编码的基本思路,是让不同原始消息对应具有结构化差异的编码序列,使接收端能够利用冗余判断哪些比特可能被噪声改变。现在,我们终于可以进行一次真正的有噪通信实验。假设发送端想传输:10110010但每个发送比特,都有一定概率在传输过程中翻转。如果直接发送,某个比特一旦发生错误,接收端就可能得到错误的消息。那么,怎样增加可靠性?我们先使用一种最简单的办法。重复发送。

把一个比特发送三次

如果要发送:1我们就发送:111如果要发送:0就发送:000接收端收到三个比特后,采用多数表决。例如:111 → 1110 → 1101 → 1011 → 1只有当至少两个比特都被翻转时,才会发生解码错误。

原始错误率10%,重复三次会怎样?

设每个比特独立翻转的概率是:p=0.1p=0.1如果重复三次,解码错误有两种情况。恰好两个比特翻转。或者三个比特全部翻转。因此:Perror=(32)p2(1−p)+p3P_{\mathrm{error}} = \binom32p^2(1-p)+p^3代入:=3(0.1)2(0.9)+(0.1)3=3(0.1)^2(0.9)+(0.1)^3得到:Perror=0.028\boxed{P_{\mathrm{error}}=0.028}也就是:2.8%。原来每个比特有10%的错误概率。经过三次重复与多数表决,单个原始比特的解码错误概率下降到2.8%。如果重复五次:Perror=∑j=35(5j)pj(1−p)5−jP_{\mathrm{error}} = \sum_{j=3}^{5} \binom5j p^j(1-p)^{5-j}在 p=0.1p=0.1 时:Perror=0.00856\boxed{P_{\mathrm{error}}=0.00856}约为0.856%。可靠性确实进一步提高。但代价也很明显。原本只需要发送一个比特。现在需要发送五个编码比特。有效编码率为:R=15=0.2\boxed{R=\frac15=0.2}也就是每次信道使用,只承载0.2个原始信息比特。这比该信道的理论容量:C≈0.531C\approx0.531低得多。因此,重复码虽然容易理解,却没有高效利用全部信道容量。这也是为什么,后来需要研究更加复杂的纠错编码。

亲手观察噪声与纠错

下面可以调整信道的翻转概率。也可以选择重复次数。对于每组参数,实验会使用固定随机种子生成一段实际噪声序列。因此,我们能同时观察:本次模拟的具体错误。理论上的解码错误概率。以及该信道本身的理论容量。
图46-8:有噪信道与重复码实验室每个编码比特独立以概率 pp 翻转。重复奇数次后,接收端通过多数表决恢复原始比特。

10%

100%25%50%噪声概率 p 与信道容量 C
信道容量

0.531

bits/次使用
重复码速率

0.333

原始位/编码位
理论译码错误率

2.80%

每原始位
本次模拟发送的8位原始消息

10110010

接收端解码

10110010

发生翻转的编码比特3 / 24
解码后仍错误的原始比特0 / 8
前四位消息的编码细节
原始第1位1
1
0
1
多数表决1 (正确)
原始第2位0
0
0
1
多数表决0 (正确)
原始第3位1
1
1
1
多数表决1 (正确)
原始第4位1
1
1
1
多数表决1 (正确)
红色比特代表本次随机实验中确实发生了翻转。单次8位模拟结果可能偏离理论概率,理论错误率描述大量独立试验的统计规律。

最值得做的三个实验

第一项,把噪声概率设为10%,重复次数设为1。这时,没有真正使用纠错。理论解码错误率就是:10%10\%第二项,保持噪声概率为10%,将重复次数从1改成3,再改成5、7。你会发现:理论错误率不断降低。但编码率也不断下降。这展示了简单重复码的可靠性与效率之间的代价。第三项,将噪声概率设为50%。无论重复1次、3次、5次还是7次,理论多数表决错误概率都是:50%50\%因为接收比特已经完全无法区分原始发送内容。因此,再多的普通重复也无法恢复消失的统计联系。

这个实验为什么还不是香农定理的全部?

因为重复码只是一种特别简单的编码。它没有充分利用所有可能的长分组结构。例如,使用三重码时:R=13R=\frac13而10%翻转信道的容量约为:C=0.531C=0.531这表明,理论上仍然存在以更高有效信息率实现高度可靠通信的可能性。真正的现代纠错码,会尝试更有效地组织冗余。它们不是简单地让每个比特重复三遍。而是将整段消息中的多个比特联合编码,让接收端根据更加复杂的代数或概率关系恢复原始数据。下一章的汉明码,就是这种思想的一项经典早期成果。

第十幕:一条真正的电话线,究竟能每秒传输多少比特?

真实通信系统不仅受到符号错误概率影响,还受到信号功率、带宽和各种物理噪声限制。香农将容量理论推广到了连续通信信道。到现在为止,我们主要研究了:每次发送一个0或1。然后有一定概率发生翻转。这种模型非常适合教学。但它并不是电话、无线电和光纤通信的完整物理模型。在真实通信系统中,我们还需要考虑:信号的频率范围。信号功率。噪声功率。以及接收端对连续信号的处理方式。香农1948年论文的另一项重要成果,就是研究了这些因素怎样共同限制通信能力。

一个受到高斯白噪声干扰的通信信道

假设信道能够使用的带宽为:BB赫兹。发送端信号的平均功率为:SS而带宽内的噪声平均功率为:NN如果噪声符合加性高斯白噪声模型(AWGN),并且满足相应的平均功率与带宽假设,那么经典信道容量公式是:C=Blog⁡2(1+SN)\boxed{ C=B\log_2\left(1+\frac SN\right) }其中:CC的单位是:bits/s\text{bits/s}这项公式通常称为:香农—哈特利容量公式(Shannon–Hartley Formula)。在香农1948年的原始论文中,可以找到其白热噪声信道容量分析,并在相关条件下给出相应的数学表达。[哈佛数学系]

为什么带宽越大,容量通常越高?

假设:SN\frac SN保持不变。那么:C=Blog⁡2(1+SN)C=B\log_2\left(1+\frac SN\right)表明容量与带宽B成正比。如果带宽翻倍,而信噪比保持不变,那么容量也会翻倍。这是因为:在相同信噪比条件下,更大的带宽提供了更多可以承载独立信号变化的自由度。但要注意:现实系统扩大带宽以后,总噪声功率也可能增加。因此,不能无条件认为:只要扩大带宽两倍,实际容量就一定精确翻倍。是否保持同一信噪比,是公式比较时的重要前提。

信号功率越大,收益却不是线性增加

现在固定带宽。让信号功率增加。公式中出现的是:log⁡2(1+SN)\log_2\left(1+\frac SN\right)这是一个对数函数。所以,增加信号功率确实能够提高容量。但收益并不是线性的。例如,信噪比从:SN=1\frac SN=1增加到:SN=3\frac SN=3每赫兹容量从:log⁡2(2)=1\log_2(2)=1增加到:log⁡2(4)=2\log_2(4)=2bits/s/Hz。但如果信噪比已经达到100,再将它提高到102,容量改善就相对有限。这说明,在功率、带宽与噪声之间,通信系统存在非常明确的数学权衡。

一个具体的电话带宽例子

假设某条理想化通信信道的带宽是:B=3000 HzB=3000\text{ Hz}信噪比是:SN=1000\frac SN=1000也就是:30 dB30\text{ dB}因为:10log⁡10(1000)=3010\log_{10}(1000)=30代入:C=3000log⁡2(1001)C=3000\log_2(1001)得到:C≈29902 bits/s\boxed{C\approx29902\text{ bits/s}}约为:29.9 kbit/s29.9\text{ kbit/s}这意味着,在相应理想化高斯信道模型下,以3000 Hz带宽、30 dB信噪比进行通信,信道容量约为29.9 kbit/s。它并不表示任何一条真实电话线都一定只能达到这个速度。因为真实系统可能采用不同的频率范围、信号模型、噪声特性、多载波技术,或者其他工程条件。这个例子只是展示,如何使用公式从带宽与信噪比推导通信极限。

这项公式为什么具有如此长期的影响?

图46-9:通信资源之间的基本关系
带宽 BB决定信道能够利用的频率范围;在固定信噪比下,扩大带宽可提高理论容量。

信号功率 SS提高信号功率可以改善信噪比,但容量随信噪比呈对数增长。

噪声功率 NN在其他条件不变时,噪声越强,可实现的可靠通信速率上界越低。

C=Blog⁡2(1+SN)C=B\log_2\left(1+\frac{S}{N}\right)
它将三个工程师每天都需要面对的物理量:带宽。信号功率。噪声功率。连接成一个清晰的理论界限。从此,通信工程师不必只依靠试验结果判断某种传输速度是否合理。他们还可以先使用数学公式,估计在指定信道模型下究竟存在怎样的容量上限。但要再次强调:容量定理并不直接替我们设计出实际达到这个极限的调制器与纠错码。它先规定了理论上能够做到什么。至于怎样在有限计算资源、有限延迟、真实硬件和实际噪声下尽可能接近这个极限,仍然需要大量工程研究。

第十一幕:从一段消息到整个互联网——信息论留下的三项不同任务

现代数字通信系统需要同时处理数据表示、压缩、纠错、信号传输与协议管理。信息论提供基础极限,实际系统则依靠多层算法和工程机制共同工作。今天,当我们通过互联网发送一张照片时,整个过程远比1948年的电话线更加复杂。一张图片可能首先被编码成像素数据。然后使用图像压缩算法减少数据量。再经过分组、协议封装和可能的加密处理。如果它通过无线网络传输,还可能采用调制与信道纠错编码。接收端将对应过程逆向执行,最后恢复用户看到的图像。整个系统可能包含很多层。但香农的理论,让我们能够清楚区分其中几项根本不同的任务。

第一项任务:压缩

问题是:一段消息中,有多少统计上可以预测的信息?我们能否用更少的比特表示它?在无损压缩中,我们希望完整恢复原始数据。对于允许失真的语音、图像和视频,也可以使用有损压缩。香农在1948年论文中已经讨论了在允许一定保真度条件下的信息传输问题。后来,率失真理论进一步系统研究了:如果允许一定程度的失真,表示消息至少需要多高的信息速率?这里的关键数学对象是:信息源的统计特性。以及允许的失真标准。

第二项任务:纠错

问题是:即使部分传输符号发生错误,接收端能否恢复原来的消息?这通常需要加入有目的的编码冗余。最简单的重复码就是一个例子。后来的汉明码、BCH码、里德—所罗门码、卷积码、Turbo码、LDPC码与Polar码,则提供了不同的数学结构与工程取舍。这些编码并不是同一时代、同一研究者一次性发明的。它们跨越了数十年的研究历史。其中有些强调纠错能力与简单硬件实现。有些强调接近信道容量。还有些特别适合处理成片错误、长分组或特定通信场景。

第三项任务:通信容量

问题是:在已经给定噪声统计规律和物理限制的信道上,最高能够以多大速率可靠传输信息?这项问题首先研究理论边界。例如二元对称信道:C=1−H2(p)C=1-H_2(p)或者在相应假设下的高斯白噪声信道:C=Blog⁡2(1+SN)C=B\log_2\left(1+\frac SN\right)实际编码、调制、均衡与接收算法,会努力在有限复杂度和延迟条件下逼近这些容量。
图46-10:压缩、纠错和容量不是同一个问题
研究方向核心问题关键数学概念
源编码能压缩多少?信息熵
信道编码怎样抵抗错误?冗余、码距、译码
信道容量可靠速率的极限?互信息与容量

还有一个很容易混淆的问题:纠错不等于加密

通信系统还有一项重要目标:防止未授权者读取消息内容。这属于密码学与信息安全领域。纠错编码与加密算法可能都表现为“把原始数据变成另一串比特”。但它们的目标不同。纠错编码希望:即使传输内容受到随机损坏,接收端仍然能够恢复消息。加密算法希望:在相应密钥和安全假设下,未授权者无法获得消息内容。所以,加密并不天然提供纠错能力。纠错码也不天然提供保密性。香农本人在1949年发表的密码学研究,为保密通信理论作出了重要贡献。但它与1948年信息论中的信道编码定理,研究的是不同的安全或可靠性目标。

一个并非人人都会想到的现实因素:延迟

假设香农定理告诉我们:只要分组足够长,就可以把错误概率降低到任意小。那么,为什么不把整个互联网一天的数据都凑成一个巨大的分组,然后统一编码?因为现实系统不能只考虑理论速率与错误概率。它还必须考虑:等待时间。计算时间。存储需求。硬件复杂度。数据包长度。以及交互响应速度。例如:一项实时语音通话,不能为了接近理论容量而等待几十分钟再解码。一台工业机器人,也可能要求通信和控制在毫秒级完成。因此,实际系统需要在:传输速率。错误概率。编码延迟。解码复杂度。以及功耗之间进行权衡。这便是香农理论与工程实现之间的关系。它告诉我们真正的极限在哪里。但到达或逼近这个极限,需要面对大量现实约束。

第十二幕:1949年,一本书让信息论走出贝尔实验室

1949年,香农与沃伦·韦弗的著作《The Mathematical Theory of Communication》由伊利诺伊大学出版社出版。与1948年的原始论文相比,书名多了定冠词“The”,并收录韦弗的解释性文章。[NCBI]1948年的原始论文,主要面对熟悉数学、概率与通信工程的读者。但它的意义,很快超出了贝尔实验室和专业工程领域。1949年,伊利诺伊大学出版社出版了一本著作:The Mathematical Theory of Communication《通信的数学理论》。作者署名:Claude E. Shannon。Warren Weaver。这里有一项重要的历史区别。1948年原始论文的作者是香农。1949年的书籍则收录了香农的论文,以及沃伦·韦弗关于信息论的解释性文章。因此,不能把韦弗误写成1948年论文的共同作者。[NCBI]

“bit”这个词,究竟是谁提出的?

今天,我们每天都在使用:bit。byte。kilobit。megabit。gigabit。但在1948年,信息科学的这套术语还没有像今天一样普及。香农在原始论文第一页特别说明:如果使用以2为底的对数,那么信息单位可以叫作二进制数字,简称:bit。并且,他明确记载,这个简短术语是由:John W. Tukey(约翰·图基)建议使用的。所以,更准确的历史说法是:香农在其1948年的经典论文中采用并推广了bit作为信息单位;原论文将这一名称的建议归于图基。不应该简单地说:“bit这个词完全由香农一个人创造。”[哈佛数学系]

一位伟大的数学家,也是一位喜欢玩具的发明者

香农骑着高轮自行车的历史照片。他以独轮车、杂耍和各种机械装置而闻名,研究生涯中也始终保持着动手制作机器的兴趣。香农并不是一个只会在纸上推导公式的人。他还喜欢各种机械装置。他曾制作杂耍机器。研究下棋程序。以及能够在迷宫中寻找路线的机电老鼠 Theseus。麻省理工学院在2001年的纪念文章中,专门提到他的这些发明。[Massachusetts Institute of Technology]这又与我们前一篇的机器人搜索故事形成了有趣联系。香农不仅帮助计算机理解信息。他也十分热衷于研究机器怎样表现出某种学习和解决问题的能力。不过,这些个人爱好并不能被直接写成他1948年信息论公式的灵感来源。真实历史里的香农,是一位同时擅长抽象数学和动手实验的研究者。这两种能力,在他的科学工作中长期并存。

信息论的扩展,远远超出了电话线

香农研究的信息量与概率结构,后来进入很多领域。数据压缩。纠错编码。密码学。统计推断。机器学习。以及对复杂信息源的数学研究。但这里依然需要遵守他的原始理论边界。香农熵描述的是概率分布中的平均不确定性。它并不能单独说明:一段话是不是正确。一篇文章是不是有价值。一段回答是否符合用户意图。或者一个人工智能系统是否真正理解了某项知识。我们可以利用信息论研究通信、编码与概率结构。但不能因为一个现象涉及“信息”,就认为只要计算熵,便能解释所有意义与智能问题。这是香农留给后来研究者的一项重要提醒。先把问题定义清楚,再让数学公式回答这个问题。

第十三幕:Python实验——从香农熵到纠错概率

使用 Python 可以直接模拟二元对称信道,并将实际译码错误率与概率公式比较,验证简单重复码如何牺牲传输速率来改善可靠性。最后,我们将整章的关键公式整理成一份可以独立运行的 Python 程序。它会计算:二元信息熵。二元对称信道容量。重复码的理论解码错误率。以及随机模拟得到的实际错误频率。只需要 Python 标准库,不依赖第三方软件包。
python

import math
import random


def binary_entropy(p):
    """二元随机变量的香农熵,单位bits。"""

    if not 0 <= p <= 1:
        raise ValueError("p必须位于[0,1]")

    if p == 0 or p == 1:
        return 0.0

    return (
        -p * math.log2(p)
        -(1-p) * math.log2(1-p)
    )


def bsc_capacity(p):
    """
    二元对称信道容量。

    单位:bits / channel use
    """
    return 1 - binary_entropy(p)


def repetition_error(p, n):
    """
    n次重复码的多数表决解码错误概率。

    n必须是正奇数。
    """

    if n < 1 or n % 2 == 0:
        raise ValueError("重复次数必须是正奇数")

    return sum(
        math.comb(n, k)
        * p**k
        * (1-p)**(n-k)
        for k in range(n//2 + 1, n+1)
    )


def simulate_repetition(p, n, trials=50000, seed=42):
    """
    模拟二元对称信道和n次重复码。

    每个编码比特独立翻转。
    """

    rng = random.Random(seed)

    errors = 0

    for _ in range(trials):
        original = rng.randint(0, 1)

        received = []

        for _ in range(n):
            noise = int(rng.random() < p)
            received.append(original ^ noise)

        ones = sum(received)

        decoded = int(ones > n//2)

        if decoded != original:
            errors += 1

    return errors / trials


p = 0.10

print("比特翻转概率:", p)

print(
    "噪声熵:",
    round(binary_entropy(p), 6)
)

print(
    "BSC容量:",
    round(bsc_capacity(p), 6)
)

print()

print("次数  编码率   理论错误率   模拟错误率")

for n in [1, 3, 5, 7]:
    theoretical = repetition_error(p, n)

    experimental = simulate_repetition(
        p, n, trials=50000, seed=42
    )

    print(
        f"{n:>3}   "
        f"{1/n:.4f}    "
        f"{theoretical:.6f}    "
        f"{experimental:.6f}"
    )


# 数学正确性检查
assert abs(binary_entropy(0.5) - 1) < 1e-12

assert abs(bsc_capacity(0.5)) < 1e-12

assert abs(repetition_error(0.1, 3) - 0.028) < 1e-12

assert abs(repetition_error(0.1, 5) - 0.00856) < 1e-12
理论部分应该得到:
重复次数编码率理论解码错误率
11.000010.000%
30.33332.800%
50.20000.856%
70.14290.2728%
模拟值会接近理论值。但不会保证完全相同。因为实际模拟只进行了有限次数的随机试验。如果将:
python
trials=50000
增加到:
python
trials=1000000
通常会获得更接近理论概率的估计。不过,模拟值不一定在每次增加样本数量后都单调地更接近理论值。这是随机抽样本身的正常性质。

为什么这段代码值得亲手运行?

因为它把本章最重要的两个概念联系了起来。第一个是:C=1−H2(p)\boxed{C=1-H_2(p)}它描述给定二元对称信道的理论容量。第二个是:Perror=∑k=(n+1)/2n(nk)pk(1−p)n−k\boxed{ P_{\mathrm{error}} = \sum_{k=(n+1)/2}^{n} \binom nkp^k(1-p)^{n-k} }它描述一种具体重复码的实际纠错能力。二者的作用并不相同。容量公式告诉我们:这条信道理论上最多能够可靠传输多少信息。重复码公式告诉我们:这项具体编码方案究竟能够将错误概率降低多少。当我们把两者放在一起比较,就会发现:简单重复码确实能够纠错,但距离香农给出的容量极限还有很大空间。这便是后续纠错编码研究的真正动力。

尾声:1948年,噪声第一次失去了绝对的统治权

让我们重新回到1948年。在那个年代,通信工程师已经非常熟悉噪声。他们知道,信号可能受到干扰。知道增加发射功率可以改善某些通信条件。也知道带宽会限制能够传输的信息。奈奎斯特与哈特利等研究者,已经为通信速度和信息测量建立了重要基础。但是,还缺少一套完整的数学理论,来统一回答:信息源到底产生多少信息?这些信息最多能够压缩到什么程度?噪声信道究竟能够可靠传输多少信息?以及:有没有某种原则性的方法,让可靠性不再完全依赖提高信号功率或降低传输速率?香农的1948年论文,给出了其中许多问题的根本答案。他首先把信息与概率联系起来。通过信息熵:H(X)=−∑ipilog⁡2pi\boxed{ H(X)=-\sum_i p_i\log_2p_i }我们终于能够量化一组消息选择的平均不确定性。随后,他研究数据的统计冗余。让通信工程师理解:为什么某些消息可以压缩,而另一些消息不能无限压缩。然后,他将噪声引入通信模型。不再把噪声仅仅看作一种需要尽可能消灭的物理干扰。而是把它当作一种可以使用概率描述的信道特性。于是,一项更加惊人的结论出现了。存在噪声,并不意味着可靠通信只能以趋近于零的速率进行。在给定信道模型下,只要有效信息传输率低于信道容量,并允许足够长的编码块,就可能将错误概率降低到任意小。这个结论改变了通信系统研究的目标。工程师不再只是盲目尝试:怎样让噪声再小一些?他们还可以追问:当前信道的理论容量是多少?我们采用的编码方案离容量还有多远?能不能设计一种更加高效的纠错码?需要付出怎样的计算成本和延迟?

一篇论文,没有结束全部问题,却打开了整个领域

香农在1948年并没有一次性解决全部编码工程难题。他没有提供后来所有的纠错码。也没有直接设计出完整的互联网。更没有证明现实中任何有限设备都能够无条件达到理论容量。但是,他完成了一件更加基础的事情。他证明了存在一个可以被严格研究的通信极限。这就像我们在第40章看到的近似算法理论。当研究者能够证明某种解的质量边界时,算法设计不再只是经验性尝试。又像第44章的A*。当启发式函数拥有可采纳性和一致性等数学条件时,方向感不再只是直觉。香农的信息论同样如此。它没有把噪声从世界中消除。却用数学证明:噪声究竟能把通信限制到什么程度。以及在这项限制之内,可靠性可以达到怎样的水平。

如果没有纠错编码,现代数字世界会怎样?

想象今天的数据中心。手机网络。卫星通信。无线耳机。光纤网络。以及各种存储设备。它们面对的物理介质完全不同。错误产生的原因也各不相同。但是,它们经常需要处理一个共同的问题。怎样在信息可能被破坏的情况下,恢复原来想要保存或传递的内容?这便是纠错编码长期存在的重要原因。从1948年之后,数学家和工程师开始发展许多具体方法。1950年,理查德·汉明发表了研究错误检测与纠正的重要论文。1960年,欧文·里德与古斯塔夫·所罗门提出了后来广泛应用的纠错编码。1967年,安德鲁·维特比发展了著名的概率解码算法。这些成果,并不是香农一个人的后续工作。它们是另一批研究者沿着信息论所建立的问题框架,继续探索具体算法的历史。而我们下一章的主角,就来自这条研究道路的早期。

一项看起来矛盾的思想

本章最值得记住的,或许是信息论里一对看似相反的操作。对于原始消息:我们希望去除不必要的冗余。让它尽可能简洁。对于受到噪声干扰的信道:我们却可能需要主动增加新的冗余。让消息拥有抵抗错误的能力。看起来是先删除,又添加。但实际上,这体现了两种不同的数学目标。压缩,是为了不浪费表达信息的能力。纠错,是为了不让噪声破坏信息的可恢复性。优秀的通信系统,会尝试同时处理这两项任务。而香农所建立的理论,让我们第一次能够系统地研究二者的极限。从此,通信不再只是让一个信号从甲地抵达乙地。它还意味着:把原本无法预测的信息,以可验证的可靠性,跨越一条并不完美的信道。这是1948年信息论留给世界的伟大思想。我们无法保证世界没有噪声,但可以通过数学与编码,让可靠的信息仍然穿越噪声。

历史档案:从1928年的信息测量,到1948年的通信理论

1928年 · 哈特利的信息度量R. V. L. Hartley — Transmission of Information《Bell System Technical Journal》第7卷第3期,第535—563页。用于核查香农之前已经存在的对数式信息量思想。

1938年 · 布尔代数与开关电路C. E. Shannon — A Symbolic Analysis of Relay and Switching Circuits核查香农早期将逻辑代数应用于继电器电路的研究,以及它与后来的信息论之间的历史区别。

1948年7月 · 原始论文第一部分A Mathematical Theory of Communication — July 1948《Bell System Technical Journal》第27卷第3期,第379—423页。原始文献之一,包含信息量定义、通信模型及相关定理。

1948年10月 · 原始论文第二部分A Mathematical Theory of Communication — October 1948《Bell System Technical Journal》第27卷第4期,第623—656页。与7月部分共同构成1948年的完整经典论文。

1948年论文 · 大学保存的校正重印版Claude Shannon — A Mathematical Theory of Communication(完整重印版)可以直接阅读信息熵、噪声信道编码定理及高斯信道容量公式。特别值得阅读第1—2页的通信模型、第22页的有噪信道定理,以及第43页的容量公式。

1949年 · 香农与韦弗的著作The Mathematical Theory of Communication — Library Record用于核查1949年出版的书籍与1948年原始论文在书名、署名和内容上的区别。

1952年 · 哈夫曼的具体编码算法David A. Huffman — A Method for the Construction of Minimum-Redundancy Codes用于区分香农1948年的源编码理论与哈夫曼1952年发表的最小冗余前缀编码构造算法。

现代教学与历史传记MIT OpenCourseWare — Information and EntropyIEEE Information Theory Society — Claude E. Shannon用于交叉核查香农的教育和贝尔实验室经历,以及现代信息熵与信道容量理论的教学解释。
本章的历史时间、论文与理论成果均根据相应文献核查。开篇关于贝尔实验室工程师面对噪声的场景,是根据时代背景组织的文学性教学叙述,不代表1948年曾发生某次具有逐字记录的特定讨论。本章中的硬币、8位消息、二元对称信道、重复码、互动实验和Python程序,属于现代教学设计。信道容量与任意可靠通信的结论均依赖特定信道模型及足够长分组的渐近条件,不代表任意有限硬件或有限时间能够保证零错误。
下一章预告 · 第47章

《一个错误也不能放过:汉明码的诞生》

1940年代末,美国贝尔实验室。一名研究人员正在使用早期计算机进行计算。这些机器依靠穿孔卡片、继电器和其他电子设备运行。但数据在存储或处理过程中,可能出现错误。某些错误可以被机器检测出来。计算却无法自动恢复正确结果。这让研究人员十分不满。既然机器能够发现自己出错,为什么不能进一步判断究竟是哪一位发生了错误?如果只增加少量校验位,能不能让计算机自动修复某个错误?一位数学家开始认真研究这个问题。他的名字是理查德·韦斯利·汉明(Richard Wesley Hamming)。1950年,他发表了纠错编码史上的一篇经典论文。而他提出的思想,后来被称为:汉明码(Hamming Code)。下一章,我们将从贝尔实验室早期计算机的错误检测需求出发,追踪汉明如何利用二进制校验位置与码字之间的距离,构造能够检测和纠正错误的编码。我们还将亲手实现著名的:(7,4) 汉明码\boxed{(7,4)\text{ 汉明码}}让四个原始信息比特,变成七个编码比特。然后,在其中人为翻转一位。观察接收端怎样只根据校验结果,找到错误所在的位置,并将它修复。香农证明了可靠通信可以做到;汉明将向我们展示,一种具体的纠错算法究竟怎样工作。
——《算法的故事》第二季 · 第46章 完

本章配图