ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

信息量与概率:从自信息公式到熵编码的完整解析

信息量与概率:从自信息公式到熵编码的完整解析 信息论与编码理论这门学科表面上看是在研究“怎么把数据压缩得更小”“怎么在噪声里传得更准”但如果往根上刨几乎所有结论都逃不开一个问题一个消息到底值多少信息而这个“值多少”的度量恰恰是从事件概率开始的。我在带学生做信息论课程设计时遇到过不少人把自信息公式背得滚瓜烂熟但一遇到“为什么概率乘在一起、信息量却能相加”“为什么等概率时熵最大”这类问题就卡壳。本质上他们缺的不是公式而是没把信息量和事件概率之间那层对应关系真正在脑子里过一遍。这篇文章打算把那层关系拆成几步来讲。先从直观感受出发解释为什么小概率事件让人更“惊讶”然后用三条公理把对数公式为什么必然出现推出来接着从单个事件过渡到平均信息量也就是熵再分析概率变化对信息量数值的敏感度最后落脚到编码长度上看看“小概率事件需要更多比特”是怎么落实到霍夫曼编码这类实际方案里的。走完这一整条线信息量这个概念就不再是一个需要死记的定义了。1. 从生活直觉出发为什么越意外的事件携带的信息越多1.1 两个场景天气预报中的体感差异先做一个小实验。假设你生活在一个夏天经常下雨的城市某天早晨打开天气App看到两条消息。场景A“今天白天晴气温30摄氏度。”场景B“今天午后有短时强降雨概率40%。”哪条消息会让你停下来仔细看绝大多数人会是B。因为晴天在你所在的季节里太常见几乎是默认状态而“40%概率的午后强降雨”意味着你要带伞、要调整出行安排、可能要换一条通勤路线。这里的“调整行动”“注意力被吸引”说白了就是这条消息改变了你脑子里对未来的判断。这个现象在生活里到处都是。一个句子如果每个字你都能预测出来听到它的“信息感受”几乎为零一个情节的反转却会让人久久回味。信息论把这种感受提炼为一个术语惊讶度。惊讶度越高说明消息对你的认知修正越大携带的信息量就越大。于是第一层对应关系出来了事件发生的概率越低事件一旦发生时给人的惊讶越大信息量越高。注意这里面有个关键动作——事件必须“真的发生了”才有信息。一个低概率事件如果只是被预测、没有发生那它只会影响你的先验判断并不会产生一条真正意义上的消息。1.2 从“惊讶感”到“信息量”的第一次抽象不过“惊讶”终究是一种主观心理感受不能直接拿来当定理用。要让信息量变得可量化、可计算必须给它一套运算规则而且这套规则要和我们关于概率的认知保持一致。想一想我们平时是怎么累积信息的。看一条新闻得到一个信息再看另一条完全独立的新闻又得到一个信息两条合在一起总的信息量应当等于二者之和。这在几何里也一样一段长度是一米另一段长度是两米接在一起总长三米。信息量的累加应该是线性的、可加的不能说你看了两条新闻反而信息量变少。这个“可加性”约束非常强。它直接排除了许多看起来很自然的备选答案。比如有人会说信息量干脆定义成概率的倒数 1/p 行不行概率越小倒数越大方向是对的。但两个独立事件同时发生的概率是 pq如果拿 1/p 当信息量联合信息量就是 1/(pq)而各自信息量之和是 1/p 1/q两者显然不相等。所以 1/p 作为信息量定义是失败的。这个观察把问题收窄了我们需要找一个函数它把“概率相乘”映射成“信息相加”。下一节把它和其他几条基本要求放在一起看看它们会把信息量函数逼到哪个形状上。2. 三个公理如何锁定对数公式2.1 非负性、单调性与可加性要定义一个函数 I(p) 来描述概率为 p 的事件的信息量这个函数必须满足下面几条基本规则。第一非负性。I(p) ≥ 0 对任意 p ∈ (0,1] 成立。信息量是“认知被修正程度”的度量接收消息不该让我们的不确定性不降反升所以不能是负的。这个要求听起来平淡但它排除了很多奇怪的形式。第二单调性。如果 p₁ p₂那么 I(p₁) I(p₂)。概率越小的事件一旦发生越让人意外信息量越大。这条把“惊讶感”直接写进了数学是整个定义与直觉挂钩的关键。第三可加性。两个相互独立的事件同时被观察到信息量等于各自信息量之和I(pq) I(p) I(q)。这条初看很数学化背后的道理很朴素独立事件之间没有任何互相预测关系你不能根据其中一个的结果猜到另一个所以它们合在一起带来的总信息量就是两段单独信息量的简单相加。这三条合在一起足以把 I(p) 的形式逼到一个小范围内。2.2 从函数方程到 -log(p)现在的问题是满足上述三条规则的函数长什么样结论是唯一的I(p) -c · log_a(p)其中 c 0a 1 是常数。原因在于满足 I(pq) I(p) I(q) 这种“乘积变求和”关系的连续函数在数学上只有对数函数或它的常数倍。而套上单调性和非负性以后前面的负号是必然的log(p) 在 p 1 时是负数必须加负号才能保证非负同时 log(p) 随 p 增大而增大取负号后变成递减函数恰好满足“概率越小信息量越大”的单调性要求。我在课堂上喜欢用一个简短推导来帮学生加深记忆。令 φ(p) I(p)假设 φ 连续且满足 φ(pq) φ(p) φ(q)。把 p 写成 e^t则 φ(e^t) 满足 F(st) F(s) F(t)。这个函数方程在连续条件下唯一非平凡解是 F(t) kt于是 φ(p) k·ln(p)再取负号即可。整个过程不复杂但能把“为什么偏偏是对数”这件事钉得很牢。对数还有一个额外的好处它在数学上非常“温和”可导、可积、可以求期望做各种优化时性质极好。如果信息量定义成别的函数整个熵、互信息、信道容量的推导都不会这么干净。2.3 底数的选择与信息单位对数底数 a 的选择本质上只是“单位制”。最常用的是 a2信息量单位为比特ae 时单位为纳特a10 时单位为哈特。三者只是刻度不同衡量的是同一个东西换算关系就是常数倍数。做信息论相关计算时我强烈建议全程统一切换为 log₂因为比特与二进制编码里的“一位”直接对应尤其是后面计算平均码长、信道容量时用 log₂ 可以无缝衔接。如果中途混入自然对数最后的数值对不上号排查起来非常麻烦。至此定义可以写完整了。对于概率为 p(x) 的离散事件 x它的自信息定义为I(x) -log₂(p(x)) 比特这个式子看着简单但它同时编码了三层意思概率越小信息量越大、确定性事件信息量为零、独立事件的信息量可以直接相加。这就是整个信息论大厦的第一块地基。3. 从单个事件走向平均熵的引入3.1 为什么不能只看单一事件自信息回答的问题是“某个具体事件发生时它带来多少信息”。但实际通信之前你并不知道到来的到底是哪个符号。如果信道左边发送的符号是 0 或 1每次通信只能观测到其中一个单看某一次的自信息没有太大意义。你真正关心的是这个信源整体上有多不确定平均下来每条消息到底携带几个比特这就需要按概率对自信息做加权平均。设离散随机变量 X 的取值集合为 {x₁, …, xₙ}概率分布为 {p₁, …, pₙ}则平均信息量——也就是熵——定义为H(X) -Σ pᵢ · log₂(pᵢ) 比特/符号熵这个名称借自热力学克劳德·香农当初也是犹豫了很久才采用这个名字因为它的数学结构跟热力学里的熵太相似了。在信息论中熵刻画的是一个概率分布的不确定性熵越大你对下一个符号会是什么越没底熵越小你越能提前猜到结果。均匀分布熵最大单点分布熵为零。3.2 二元熵函数形状、对称与最大值最简单的熵模型是二元分布X 取两个值概率分别为 p 和 1-p。这时熵函数写成H(p) -p·log₂(p) - (1-p)·log₂(1-p)这个函数在通信教科书里出现频率极高建议一定要亲手画一次图像。它在 p 0.5 处取得最大值 1 比特曲线关于 p 0.5 对称两端 H(0) H(1) 0。对称性的直观意思是把两个符号的概率互换系统的整体不确定性不变。好比一枚硬币无论哪一面朝上的概率是 0.7只要你不知道下一次是哪一面不确定性就是一样的。这条性质提醒我们信息论处理的是统计结构和符号的语义标签无关。“下雨”和“不下雨”的概率对调熵完全不变。为什么均匀分布熵最大直观上概率全挤在一起时你总会猜测那个高概率符号会出现而且猜对的概率很大不确定性就小概率摊平之后任何猜测都接近瞎猜不确定性被拉满。数学上可以用 Jensen 不等式证明对任意分布 pH(X) ≤ log₂(n)等号当且仅当所有 pᵢ 相等时成立。这个不等式是信息论里少数几个需要熟记的基石结论之一。3.3 条件熵与互信息把概率关系推向多变量单变量熵解决的是“X 本身有多不确定”但真实系统里变量之间往往互相影响。前一天的天气会影响后一天的天气某个传感器读数会关联到设备状态。要量化这种关联对信息量的影响需要引入条件熵和互信息。条件熵的定义是H(X|Y) -Σ p(x,y)·log₂(p(x|y))注意这里的结构用联合概率 p(x,y) 加权对条件概率 p(x|y) 取对数。这非常自然地延续了“概率越小信息量越大”的思想。如果给定 Y 之后某个 x 出现的条件概率很大说明结果已经比较确定那么 log₂(p(x|y)) 得到的“剩余信息量”就小反之如果条件概率依然很小说明变量间没有建立起可靠的预测关系观测 Y 并没有替对方省掉多少不确定性。基于条件熵可以定义互信息I(X;Y) H(X) - H(X|Y)它回答的问题是“观测到 Y 之后X 的不确定性下降了多少”。这个下降量就是 X 与 Y 之间信息关联的度量。把它展开可以得到对称形式I(X;Y) Σ p(x,y)·log₂[p(x,y) / (p(x)p(y))]这里的比值是关键。如果 X 和 Y 独立p(x,y) p(x)p(y)比值是 1对数取值为零互信息也为零如果联合分布偏离独立假设比值大于 1 的部分对应的是“观测到这个联合事件时额外的惊讶感”把这些量加起来就是互信息。信息量与概率的关系就这样从单变量延伸到了联合分布。3.4 一次完整的手算案例联合概率表怎么算理论讲完还是建议亲手算一轮否则容易“看着都懂、上手就错”。下面用一个二元变量联合分布把自信息、熵、联合熵、条件熵、互信息全部计算一遍。设 X 和 Y 的联合分布如下。联合概率 p(x,y)Y0Y1P(X)X00.40.10.5X10.20.30.5P(Y)0.60.41.0先看边缘概率。P(X0)0.5、P(X1)0.5所以 X 是均匀分布熵 H(X) 1 比特。Y 的边缘概率是 0.6 和 0.4熵为H(Y) -0.6·log₂(0.6) - 0.4·log₂(0.4) ≈ 0.971 比特各联合事件的自信息按 -log₂(p(x,y)) 计算事件 (0,0) 的概率是 0.4自信息约 1.322 比特(0,1) 的概率是 0.1自信息约 3.322 比特(1,0) 的概率是 0.2自信息约 2.322 比特(1,1) 的概率是 0.3自信息约 1.737 比特。把这些自信息按联合概率加权平均得到联合熵H(X,Y) 0.4·1.322 0.1·3.322 0.2·2.322 0.3·1.737 ≈ 1.846 比特条件熵可以用链条法则 H(X|Y) H(X,Y) - H(Y) 来算得到约 0.875 比特。于是互信息I(X;Y) H(X) - H(X|Y) ≈ 1 - 0.875 0.125 比特这意味着观测 Y 只能把 X 的不确定性从 1 比特降到 0.875 比特降低幅度很小因为 X 和 Y 虽然不独立但关联并不强。如果把联合分布改成对角集中比如 p(0,0)p(1,1)0.5 其余为 0那么 H(X|Y)0、互信息变成 1 比特知道 Y 后 X 就完全确定了。这个对照案例建议每次学条件熵时都自己推一遍。4. 概率变化对信息量的敏感度边界与导数视角4.1 三个极端值p1、p0.5、p→0自信息函数 I(p) -log₂(p) 在定义域 (0,1] 上是平滑递减的但三个特殊点值得单独拎出来理解。p1 时信息量为 0。必然事件发生时你的认知没有任何修正当然没有信息。比如一条消息说“地球围绕太阳转”你不会有任何意外感它提供的自信息严格为零。p0.5 时信息量为 1 比特。这是二元等概率情形的标准单元也是二进制编码里一个比特的基本含义。“抛一枚公平硬币结果是正面”这个事件的自信息就是 1 比特因为你需要 1 个二进制位才能消除这个不确定性。p 趋近于 0 时信息量趋于正无穷。完全不可能的事件一旦发生认知会被彻底颠覆理论上信息量无限大。但在实际系统里p0 的事件通常会被移出样本空间因为“不可能事件发生”本身是逻辑矛盾不应进入正常通信模型。真实信源里也不会安排概率为零的符号否则它永远不会被观测到安排了也浪费。4.2 导数分析低概率区间的放大效应很多初学者以为信息量只是“概率的倒数取对数”对概率变化的敏感度处处相同。实际远非如此。对 I(p) 求导dI/dp -1/(p·ln2)导数的绝对值 |dI/dp| 是概率 p 的减函数也就是说概率越小信息量对概率的变化越敏感。看几个具体数值就清楚了。概率 p自信息 I(p)导数绝对值0.51.000 比特2.8850.13.322 比特14.430.016.644 比特144.30.0019.966 比特1443概率从 0.5 变到 0.4信息量只从 1 比特增加到约 1.322 比特概率从 0.1 变到 0.09信息量从约 3.322 比特增加到约 3.474 比特。两者概率绝对变化都是 0.1但低概率区间的信息量变化更剧烈。换句话说越靠近 0 的区域微小的概率误差就能造成信息量估计上的可观偏差。4.3 对实际编码设计的启示这个敏感度的不对称性在工程上有明确影响。设计压缩编码时高频符号出现次数多概率统计得比较准码长分配接近最优低频符号出现次数少概率估计方差大这时信息量计算容易偏。如果某个低频事件的真实概率被低估一个数量级理论上需要的码长会凭空多出好几个比特压缩率自然受影响。因此实际做熵编码时低频符号的概率估计往往要引入平滑机制。拉普拉斯平滑是最简单的一种给所有计数加一个小的先验常数避免样本里出现零概率或极小概率导致的码长爆炸。稍微复杂一些的还有 Kneser-Ney 平滑在语言模型里用得很普遍。做机器学习的人如果了解这一点也会明白为什么分类任务里长尾类别特别难处理它们落在小概率区域概率估计的一点波动会被信息量口径放大损失函数对它们会更敏感。5. 编码视角信息量如何换算成比特长度5.1 平均码长与熵的对应聊信息量最后一定会落到编码一个事件到底需要多少个比特来记录这里有一条很漂亮的桥接关系在最优编码下单个符号的码长应当接近它的自信息 -log₂(p)而整个信源的平均码长下界恰好是熵 H(X)。这个结论由香农第一定理无失真信源编码定理保证。它说的是任何唯一可译的二进制码其平均码长 L 满足 L ≥ H(X)并且存在一种编码方案能使平均码长任意接近 H(X)。换句话说熵就是无损压缩的理论极限。你用再聪明的算法也不可能把平均码长压到熵以下还不损失信息。这个定理在直觉上正是“小概率事件需要更多比特”的必然结果。自信息大的符号编码时就需要更多位去区分它自信息小的符号则可以用短码来节省平均长度。编码长度和信息量的这种对应关系是整个信源编码领域最核心的直觉。5.2 一个霍夫曼编码的完整验证霍夫曼编码是验证“信息量对应码长”最直观的工具。我拿一个四符号信源来演示。符号概率 p自信息 -log₂(p)A0.51 比特B0.252 比特C0.1253 比特D0.1253 比特先算熵H 0.5·1 0.25·2 0.125·3 0.125·3 1.75 比特用霍夫曼算法构造编码树可以得到一组最优前缀码A 编成 0B 编成 10C 编成 110D 编成 111。频率高的符号码长短频率低的符号码长长。平均码长为L 0.5·1 0.25·2 0.125·3 0.125·3 1.75 比特恰好等于熵。这个例子里概率都是 2 的负整数次幂所以能精确触达理论下界。现实中信源概率往往不是这种规整形状霍夫曼码的平均码长会略高于熵但不会超过 H1 比特。把这张表拿来做校验很有意思A 的概率是 0.5自信息是 1 比特编码长度也恰好是 1 位C 的概率是 0.125自信息是 3 比特编码长度是 3 位。码长和自信息完全吻合。这种“信息量 ↔ 码长”的双向对应比单纯背公式可靠得多。5.3 等概率符号视角为什么信息量恰好是比特数再补一个反向视角。假设一个信源有 n 个等概率符号每个符号概率为 1/n。要给这 n 个符号做二进制编号至少需要 ceil(log₂ n) 位平均也需要约 log₂ n 位。而每个符号的自信息-log₂(1/n) log₂(n)数值上恰好等于需要的位数。这说明“等概率情形下每个符号要花几个比特表示”和“这个事件携带多少信息量”是同一件事的两种表述。如果信息量定义不用对数这个对应关系就会崩塌。很多同学是在学完编码之后再回头重新理解了自信息公式往往会有一种“原来如此”的顿悟。香农当年正是从实际的比特计数需求出发才确定了信息量的对数定义这个历史顺序本身就说明编码视角对于理解信息论核心概念的重要性。6. 常见误区与自查技巧6.1 误区一高概率事件“没有信息”概率接近 1 的事件自信息趋近于 0但注意“趋近于 0”和“严格为 0”之间的差别。真正严格为 0 的只有 p1 的必然事件。对于概率 0.99 的事件自信息大约是 0.0145 比特很小但不是零。实际系统里高概率事件极少承载用于纠正认知的信息但这不等于它们没有价值。通信协议里的确认帧、控制信号里的同步字段都是高概率出现的单次带来的信息量确实很小可它们一旦缺失就可能意味着链路异常。信息量小与信息不重要是两码事要把这两个维度分开。6.2 误区二信息量等于重要性还有一种常见误解既然信息量衡量“这件事有多大信息”那信息量大的事件一定更重要。现实常常相反。某条冷门新闻概率极低、信息量极大但它对大多数人的生活没有任何实际影响而“今天是工作日”概率很高、信息量很小却可能决定你一整天的安排。信息量定义的是“认知被修正的程度”和事件的效用、价值、影响力无关。这既是信息论的边界也是它的纯粹之处——只研究统计结构不掺入价值判断。做信息系统设计时这种“去语义化”的衡量恰恰是必要的因为它让信息度量变得可计算、可比较。6.3 误区三概率乘积与信息量加法的混淆初学阶段最常出的问题是拿到两个独立事件后直接把概率乘起来说“整体信息量是多少”。正确做法是先用概率公式算出联合概率 p(x,y)再取 -log₂ 得到联合信息量。由于对数性质-log₂(p(x)·p(y)) -log₂(p(x)) - log₂(p(y))独立事件的联合信息量恰好等于各自信息量之和。这里的“乘法转加法”是由对数完成的不是靠直觉硬凑。很多题解跳步直接写“因为独立所以信息量相加”容易让人误以为信息量天生就该相加实际每一步都应该回到对数的性质上去验证。6.4 计算检查与信息论实践心得最后整理几条这些年频繁用到的检查方法和操作心得。第一统一底数。整道题最好全程用 log₂涉及概率计算时也要保持口径一致。混用自然对数和常用对数结果会差一个常数倍对答案时非常容易懵。第二善用边界校验。自信息永远大于等于 0概率越大自信息越小熵的范围是 [0, log₂(n)]等概率取最大值单点分布取 0条件熵不会超过无条件熵互信息不小于 0且不超过 min(H(X), H(Y))。只要算出一个违反这些边界的结果第一反应应该是公式套错或概率表算错而不是怀疑理论本身。第三多画图。二元熵函数曲线、自信息曲线、互信息的相对位置这些图能帮助建立几何直觉。我自己做编码算法调试时遇到信息量相关的不合理结果第一件事永远是把概率分布和熵值画出来看一眼往往问题一眼就能定位。第四用编码实验做双向校验。把自信息和霍夫曼码长放在同一张表里对照如果两者差得太多说明概率估计或者编码构造出了问题。这种“信息量 ↔ 码长”的互相验证比单方向计算可靠得多。我在实际做文本压缩和通信仿真时几乎每个环节都在依赖这组关系估计事件概率、计算信息量、分配码长。把“小概率事件信息量大、需要长码”这条主线想透后面学条件熵、信道容量、率失真理论都会顺畅很多。把上面 3.4 节的手算案例和 5.2 节的霍夫曼编码各推一遍这两步做完信息量和概率之间的关系基本就真正焊死在脑子里了。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进