从事件概率到信息量:对数公式、熵与编码的底层逻辑

发布时间:2026/9/8 2:30:20
从事件概率到信息量:对数公式、熵与编码的底层逻辑 大学第一次学信息论的时候我其实被第一章就卡住了。老师上来就写了 ( I(x)-\log p(x) )然后说这个叫信息量我盯着那个对数符号想了半天也没想明白为什么信息量和事件概率之间偏偏是对数关系为什么概率小反而信息量大当时教材写得比较简略我又翻了编码理论相关章节发现后面算熵、算码长全都建立在这个看似简单的公式上如果第一步没吃透后面全在背公式。这篇内容不讲虚的就带着大家从事件概率出发一步步把信息量这个概念“逼”出来聊清楚它为什么长这样、单位从哪来、和编码理论里码长的关系是什么也把我在学习和实操中踩过的一些坑一并说出来。1. 先从直觉入手越不可能发生的事越“值钱”1.1 一条最简单的例子带你进入信息量的世界假设我现在告诉你两件事第一件今天太阳从东边升起第二件今天你买的彩票中了五百万。哪句话带来的“信息”更多答案肯定是第二句因为太阳从东边升起这件事你早就知道听完内心毫无波澜而中彩票这件事概率极低一旦发生你整个人会从椅子上弹起来。这个日常经验其实就是信息量最朴素的起点信息量的大小与我们对事件发生的预期程度有关。预期越强事件发生后的“新鲜感”越弱预期越弱事件发生后的“新鲜感”越强。在概率论的语言里预期强对应概率接近1预期弱对应概率接近0。所以可以很粗略地说信息量和事件概率成反向关系概率越大信息量越小概率越小信息量越大。这里要注意我们说的“事件”是一个已经定义好的结果比如“掷骰子得到4点”就是一个事件它的概率是 ( \frac{1}{6} )。信息量衡量的不是这件事本身重不重要而是“它发生了”这个事实给我们带来了多少新东西。彩票到底给你多少钱那是价值问题信息论不关心信息论只关心你从“不确定”到“确定”之间的落差。1.2 信息量与概率之间不是简单的反比很多人直觉上会觉得既然概率大信息量小概率小信息量大那直接定义 ( I(p)\frac{1}{p} ) 不就好了这个想法听着挺合理但实际操作一下就会发现不对劲。考虑两个独立的随机事件掷一枚硬币得到正面概率是 ( \frac{1}{2} )再从一副牌里抽到红桃A概率是 ( \frac{1}{52} )。如果信息量简单地取倒数那前者的信息量是2后者是52。现在把两个事件放在一起看“掷硬币正面同时抽到红桃A”这个联合事件发生的概率是 ( \frac{1}{2} \times \frac{1}{52} \frac{1}{104} )按倒数的定义它的信息量就是104。我们自然会觉得两个独立事件同时发生的信息量应该等于各自信息量之和也就是 ( 25254 )但104不等于54就说不通。这就是倒数的核心问题它不满足可加性。两个独立事件同时发生的概率是相乘关系但信息量应该是相加关系这样才能保持直觉上的连贯性。刚才这个反例说明信息量的函数形式不能随便拍脑袋它必须满足某种结构要求否则后面算联合事件、算信道容量的时候全都要出问题。1.3 为什么对数形式会出现在这里要同时满足“概率乘信息量加”最直接的办法就是找到一类函数能让乘法变成加法。学过高中数学的人都知道对数函数天然就有这个性质( \log(ab)\log a\log b )。所以信息量定义成 ( I(p)-\log p ) 就非常自然了。用对数之后两个独立事件的联合信息量就是各自信息量相加和直觉吻合。取负号是因为 ( p ) 在0到1之间时( \log p ) 本身是负数取负号之后信息量就是非负的越不可能发生的事件信息量越大。我自己刚开始学的时候总觉得这个对数有点“空降”直到把这个可加性的需求捋清楚才意识到它其实是被一步步逼出来的不是香农随随便便把对数写在公式里的。理解了这一层后面看到各种对数公式就不会怵了。2. 一步一个脚印从香农的三条要求推出信息量公式2.1 香农当年要求的几个“天经地义”如果你觉得上面对数只是碰巧好用那咱们再从公理化的角度重新走一遍。香农在建立信息论时对“信息量”这个函数提了几个看起来非常基本的要求基本到你会觉得这有什么好说的。第一条是信息量应该是事件概率的连续函数也就是说概率稍微变一点点信息量不应该突然跳几大格。第二条是概率越小信息量越大反过来概率越接近1信息量越接近0这对应着“必然事件不携带信息”。第三条就是前面提到的可加性两个独立事件同时发生总信息量等于各自信息量之和。这三个要求看起来平凡但组合在一起几乎把函数形式锁死了。连续性和单调性保证函数长得不奇怪可加性则把乘法结构和加法结构强行对应起来最终只剩下对数和常数倍这一族函数。所以信息量的公式不是“选出来的”而是“推出来的”。2.2 可加性如何锁定对数形式写一下推导的关键步骤。设信息量函数为 ( I(p) )根据可加性对任意两个独立事件的概率 ( p ) 和 ( q )必须有[ I(pq)I(p)I(q) ]这个函数方程的解非常经典。先定义 ( g(p)I(e^{-p}) )代进去可以得到柯西方程形式的表达式在连续性的保证下解只能是 ( I(p)-k\log p )其中 ( k ) 是某个正的常数。这里我不打算把每一步证明都写成严谨的数学题因为对大多数工程应用来说真正要紧的是理解“这个公式是被结构逼出来的”这一点。k 取不同值对应不同单位这也是我们接下来要说的。但不管 k 取多少函数形式都逃不出对数这也就解释了为什么从信息论到编码理论到处都弥漫着一股对数的味道。2.3 底数选择与单位的对应关系有了 ( I(p)-k\log p ) 之后底数怎么选就成了一个“记账单位”的问题。最常见的底数是2对应的信息量单位叫比特bit。比如一个概率为 ( \frac{1}{2} ) 的事件它的信息量就是 ( -\log_2 \frac{1}{2}1 ) 比特正好对应一个等概率的二选一。如果底数取自然常数 ( e )单位叫奈特nat在理论推导里很常见因为求导方便。如果底数取10单位叫哈特hartley早期的信息论里出现过现在用得少。单位之间只差一个常数倍就像米和英尺的关系一样本质上没有高下之分只是语境不同。有一个经常被忽略的细节比特这个单位不一定非要对应到“0和1”或“二进制位”。我们说一个事件信息量是1比特意思是“消除这个不确定性所需的二选一判断次数”。这就为后面和编码长度挂钩埋下了伏笔因为在二进制编码里每增加一个码位就多一次二选一判断码长和信息量由此建立起了直接的换算关系。2.4 边界情况概率为1时信息量为0把边界情况单独拎出来看是很有价值的。概率 ( p1 ) 时( -\log_2 1 0 )信息量是0。这对应“必然事件没有任何信息”。天气预报说“明天不会出现时间倒流”你不会觉得这是一条有价值的信息因为它必然会这样。反过来( p ) 趋近于0的时候信息量趋近于正无穷。这也很合理极小概率的极端事件一旦发生带给人的意外感极强。但这里要特别注意信息论不讨论“概率为0的事件”因为 ( \log 0 ) 没有定义实际应用里我们只讨论可能发生但概率很小的那些事件。边界情况的另一个价值是帮我们建立“信息量 不确定性的减少”这个心智模型。一个事件概率越接近1我们对它发生的确定程度越高它发生以后不确定性减少得也少反之概率越小不确定性减少得越多。从这个角度看信息量就是一个关于“风险释放”的度量。3. 单点信息量到整体熵信息量的“平均”形态3.1 自信息与信息熵的定义关系单个事件的信息量 ( I(x)-\log p(x) ) 在信息论里通常叫“自信息”它回答的是“某一个具体结果发生了带来了多少信息”。但在很多实际场景里我们关心的不是一个结果而是整个随机变量平均下来能带来多少信息。假设一个随机变量 ( X ) 有若干种可能取值每种取值的概率分别是 ( p(x_1), p(x_2), \ldots )。对每个结果的自信息求加权平均就得到信息熵[ H(X)-\sum_{x} p(x)\log p(x) ]理解这个公式有一个很直观的视角熵就是整个系统对所有可能事件信息量的期望。如果一个系统总有一些大概率事件这些事件自信息低把熵拉下来了如果有很多小概率事件每个自信息都很高熵就相应涨上去了。这里有一个初学者容易犯迷糊的点信息量是对“已经发生”的事件说的熵是对“还没发生”的随机变量说的两者一个是具体实现一个是统计期望。分清这个后面看条件熵、互信息就不会乱了。3.2 硬币和骰子的熵计算用两个例子具体算一下。先看一枚均匀硬币正面反面的概率都是 ( \frac{1}{2} )每个结果的信息量都是1比特所以熵是[ H(X)-\left(\frac{1}{2}\log_2\frac{1}{2}\frac{1}{2}\log_2\frac{1}{2}\right)1 \text{ bit} ]再看一个均匀六面骰子每个面概率都是 ( \frac{1}{6} )每个面的自信息是 ( \log_2 6\approx 2.585 ) 比特熵同样也是 ( \log_2 6 ) 比特因为六个概率相同加权平均就等于任何一个自信息。我当年第一次做题时直接在这里摔了一跤算一个非均匀分布的事件时把“概率最大的那个结果的信息量”当成了“整个系统的熵”。这两个完全不同熵要把所有结果的信息量都加权一遍。事实上只要不是等概率分布最大概率事件的自信息一定小于熵因为其他小概率事件会把熵抬高。3.3 等概率分布的熵最大信息熵有一个很重要的性质在所有可能取值的个数相同的情况下等概率分布的熵最大。这个性质在编码理论和机器学习里都经常用到。比如三个事件概率分布为 ( (\frac{1}{3},\frac{1}{3},\frac{1}{3}) ) 时熵约为1.585比特但如果概率是 ( (0.8,0.1,0.1) )算下来熵约为0.922比特明显变小了。直观上也非常好理解概率分布越“平均”系统的不确定性越大你越难猜中结果所以平均信息量就越大概率分布越“倾斜”你看到结果之前就已经大致有数了不确定性小熵自然就低。这个特性和编码理论里“等概率时需要更多比特来区分”的现象完全一致后面再展开。从数学上看这个结论可以通过Jensen不等式证明因为 ( \log ) 是上凸函数所以对任何分布都有 ( \sum p(x)\log p(x) \le \log n )等号只在所有 ( p(x) ) 相等时成立。对我们这些偏应用的人来说记住结论和它的意义往往比重演一遍证明更实用。3.4 条件熵概率改变后信息量怎么变信息量与事件概率的关系不仅仅是单点静态的还体现在概率会随着新信息改变这一点上。假设随机变量 ( X ) 和 ( Y ) 有关系在已知 ( Y ) 的某个取值后( X ) 的条件分布就会变化对应的信息量也会变化。条件熵 ( H(X|Y) ) 的定义是在所有可能的 ( Y ) 条件下对 ( X ) 的熵做加权平均。它度量的是“知道了 ( Y ) 之后( X ) 还剩多少不确定性”。如果 ( X ) 和 ( Y ) 强相关那么知道 ( Y ) 之后 ( X ) 几乎就确定了条件熵接近0如果 ( X ) 和 ( Y ) 完全独立那么条件熵就等于 ( H(X) )说明 ( Y ) 没有提供任何关于 ( X ) 的信息。条件熵是信息论里很关键的一步因为它把静态的信息量推向了动态的概率更新。现实中的通信和推理本质上都是“观察到某个事件后更新另一个事件的概率”这其实已经摸到互信息的门边了我们在第5部分再仔细说。4. 编码理论视角概率大的事件用短码概率小的事件用长码4.1 码长与信息量的等价关系信息量这个概念如果只停留在数学公式上还是有点抽象。编码理论给了它一个特别具体的落地方式码长。设想我们要给若干事件设计二进制编码也就是用一串0和1来标记每个事件。事件发生得越频繁我们希望它的码字越短这样平均下来发送的总比特数就少事件越罕见码字长一点也无妨反正它不常出现。这个朴素的思想和信息量精确地对上了( p(x) ) 越大自信息 ( -\log p(x) ) 越小码长就可以越短( p(x) ) 越小自信息越大码长就得越长。更准确地说在最优编码下每个事件的最短码长大约等于它的自信息。香农编码定理的核心结论之一就是可以设计出平均码长任意接近熵 ( H(X) ) 的编码。也就是说熵就是“表示一个随机变量所需的最少比特数”码长和信息量在这个意义上几乎是同一件事。这件事我学了两遍才真正打通因为教科书里提得比较隐晦后来自己做了一个编码实验才彻底看清它俩就是硬币的两面。4.2 香农编码的具体步骤下面给一个可以直接上手的香农编码流程它虽然不一定能拿到所有情况下的最优编码但胜在思路清晰特别适合用来理解“概率如何决定码长”。第一步把所有符号按概率从大到小排序。第二步计算每个符号的累积概率。第三步根据自信息确定码长取 ( l_i \lceil -\log_2 p(x_i)\rceil )。第四步把累积概率转换成二进制小数取前 ( l_i ) 位作为码字。举一个经典的例子四个符号的概率分别是 ( \frac{1}{2}, \frac{1}{4}, \frac{1}{8}, \frac{1}{8} )。它们的自信息分别是1比特、2比特、3比特、3比特所以码长就是1、2、3、3。按照香农编码可以得到类似0、10、110、111这样的码字平均码长是[ \frac{1}{2}\times1\frac{1}{4}\times2\frac{1}{8}\times3\frac{1}{8}\times31.75 ]而这个分布的熵正好也是 ( 1.75 ) 比特。这说明在这个例子里香农编码做到了平均码长等于熵非常理想。不是所有概率分布都能这么完美匹配但多数情况下已经很接近了。4.3 霍夫曼编码与概率排序的直觉如果只想用代码实现一个实用压缩方案霍夫曼编码通常是更常用的选择。它不显式计算自信息和码长而是通过反复合并最小概率符号来构造码树但最终结果依然处处体现着“低概率长码高概率短码”的原则。霍夫曼编码的直观之处在于它的合并过程每次把两个概率最小的节点合并成一个父节点概率相加直到所有节点都并入一棵树然后从根节点往下给每条边分配0和1。概率最小的那些符号因为合并次数多处于树比较深的位置码字就长概率大的符号留在离根近的地方码字就短。我自己在实现霍夫曼编码的时候经常用优先队列来维护概率最小的节点。这个方向在工程上非常成熟但要注意排序稳定性。如果两个节点的概率一样不同合并顺序会导致码字不同虽然平均码长可能相同但具体的码表会变。解码端必须知道当时的编码树结构否则就解不开所以很多文件压缩格式会把编码表信息一并存下来。4.4 平均码长与熵的差距冗余度实际编码中平均码长不一定刚好等于熵通常会有一些额外开销。香农编码定理给的界限是[ H(X) \le L H(X)1 ]这个小于 ( H(X)1 ) 的“1”来自向上取整操作。因为每个符号的码长都被取整到整数比特而自信息未必是整数多出来的部分就称为冗余度。如果连续编码多个符号把符号分组来处理这个冗余可以被平均掉让总码率无限接近熵这也是算术编码和区间编码能够做到接近极限的原因。理解了冗余度就能明白为什么有些看起来“不合理”的编码方式其实很合理。比如两个等概率符号熵就是1比特码长一位一位地编平均码长也就是1比特没有冗余。但如果三个等概率符号熵约1.585取整后每个符号至少2比特平均码长2比特冗余就有0.415比特。这时候把三个符号组合在一起编码就可以摊薄这个冗余平均每个符号的比特数会明显低于2向1.585靠拢。5. 概率更新中的信息量条件信息量与互信息5.1 先验分布下的信息量回到信息量与事件概率的关系另一条重要的线索是概率会随着观测更新。在收到任何观测之前一个事件 ( Xx ) 的信息量由先验概率 ( p(x) ) 决定也就是 ( -\log p(x) )。如果某个结果之前被认为几乎不可能那么它一旦真的发生了信息量就非常大。这在通信里特别常见。接收端对发送端可能发出的消息会有一个先验认知比如消息0出现的概率是0.9消息1出现的概率是0.1。收到“1”的时候接收端的惊讶程度远高于收到“0”因为这个事件携带的自信息高。注意自信息描述的是“接收端”的意外程度而不是“发送端”的努力程度。发送端可能花了一样的力气发0和发1但接收端感受到的信息量完全不同。这一段如果没理解透彻后面看信道容量和编码增益的时候就容易懵。很多人觉得信息量是消息本身的一种属性实际上它依赖的是接收端对事件概率的认知。同一个消息在一个环境下概率高信息量低在另一个环境下概率低信息量高一点都不矛盾。5.2 收到观测后的信息量变化假设随机变量 ( X ) 是我们要知道的东西( Y ) 是我们能观测到的线索。在收到 ( Yy ) 之后( X ) 的分布会从先验 ( p(x) ) 变成后验 ( p(x|y) )。此时某个结果 ( Xx ) 的信息量就变成 ( -\log p(x|y) )。关键点在于后验概率可能比先验概率大也可能比先验概率小。如果 ( y ) 让某个 ( x ) 变成了几乎确定的结果那么后验条件下的自信息就很小因为“它本来就要发生”这件事已经被观测结果剧透了。如果 ( y ) 让某个原本大概率的结果变成了小概率那么自信息反而会变大。有一种情况让很多初学者困惑观测不应该让信息变少吗这里要区分清楚。观测让不确定性减少也就是熵变小但具体到某个事件的自信息可能会变大也可能会变小。一个极端例子是你本来有九成把握认为下一条消息是A结果观测数据强烈暗示不是A而是B那B发生的自信息就非常大。观测给你带来了“反转”反转正是高信息量的体现。5.3 互信息实际上在量什么把条件熵和自信息整合起来就得到互信息[ I(X;Y)H(X)-H(X|Y) ]互信息的定义表达了一个很朴素的量观测 ( Y ) 让 ( X ) 的不确定性减少了多少。它也可以写成 ( I(X;Y)H(Y)-H(Y|X) )还等于联合分布与独立分布乘积之间的KL散度。我在自学时觉得互信息最好用的理解方式是“相关性的信息论版本”。如果 ( X ) 和 ( Y ) 独立那么 ( H(X|Y)H(X) )互信息为0意思是观测一个变量对另一个变量没有任何帮助。如果它们完全确定性地互相决定条件熵为0互信息就等于 ( H(X) )意思是知道了 ( Y ) 就等于知道了 ( X )。从概率角度看互信息是“一个事件概率的改变能带来多少信息”的全局度量。它不是看某一个结果的自信息而是把所有可能结果都考虑进来衡量整个概率分布因为观测发生了多大的变化。理解了互信息前面单点信息量、熵、条件熵就串成一条线了。6. 几个常见误区和实用心得6.1 误区一小概率事件的信息量一定大于大概率事件的信息量这个说法只有在同一个随机变量内部比较时才成立。如果在两个完全不同的场景里比较事情就变得复杂了。比如“彩票中奖”的概率是千万分之一信息量约23比特而“某地发生3级地震”如果概率是百分之一信息量约6.6比特。你不能说彩票这件事的信息量就是23比特就显得比地震更大因为两者的样本空间和背景模型都不同。更准确的说法是在一个给定的概率模型中概率越小的事件自信息越大。脱离概率模型谈自信息是没有意义的。这个问题在我们讨论“新闻价值”“广告效果”时尤其容易踩坑信息量只关乎概率不关乎语义重要程度一件事信息量高不代表它更有用或更有意义。6.2 误区二把信息量等同于“含义”或“价值”这是我最想让初学者避开的一个坑。信息论里的信息量完全建立在概率计算上不讨论一条消息的含义是什么、重不重要、有没有用。比如一串随机乱码从信息论角度可能信息量极高因为每个字符都难以预测但你读完可能觉得毫无价值。反过来一篇讲话里每一句都很容易预测信息量很低但它可能发挥着稳定人心的社会价值。信息量像是一个对“意外程度”的量化而不是对“意义深浅”的量化。理解了这一点才能明白为什么数据压缩能压到接近熵的极限——因为压缩算法不关心内容有没有意义只关心统计上的可预测性。在编码理论的语境里一段全是0的文本和一段抛硬币得到的文本前者的信息量要低得多尽管前者的“意义”在某些场合可能非常重大。6.3 误区三信息量必须取整成比特个数自信息 ( -\log_2 p ) 经常不是整数比如概率为0.3的事件信息量约为1.737比特。有些同学就觉得奇怪信息量怎么能有小数比特不是一位一位的吗关键是要把“信息量”和“码长”分开。信息量是理论上的度量可以连续取值码长是实现层面的概念因为实际编码中二进制码字的长度必须是整数。两者之间通过编码定理联系但并不是同一个东西。1.737比特的信息量意味着理论上平均需要约1.737个二进制判断实际编码时可能要取整到2比特码长多余的部分就是编码冗余。这在数值上很正常不用觉得别扭。6.4 实操心得如何让这个公式真正长在脑子里最后分享几个我后来给学生讲课时常用的经验。第一遇到任何和“不确定性”有关的工程问题先写下概率分布再算熵不要凭感觉说“这个系统的信息很大”。信息量大不大不是看数据多不多而是看概率分布有多平分布越平熵越大。第二始终记得“概率相乘信息量相加”这条线索。凡是你觉得一个式子应该把两个概率乘起来又想知道总的信息量那就取对数把乘法变成加法。这个思维习惯能帮你快速判断一个计算对不对也能帮你理解很多复杂公式的结构。第三做一两道编码题比看十页理论更有用。拿四个符号、六个符号自己设计一个分布然后分别算自信息、熵、香农码长和平均码长亲手算一遍就会明显感觉到信息量和事件概率的关系不是抽象定理而是随时能落地计算的工具。我当年就是通过这个小练习彻底把相关知识串起来的现在遇到压缩、特征选择、模型不确定性评估这类问题第一反应还是去画概率分布、算熵和互信息这套思维几乎成了本能。