从 Bit 到 AGI第三章:信息(Information)

信息熵是什么

从 Bit 到 AGI · 第三章:信息(Information) · 信息熵是什么

作者 David更新于 第 37 篇(共 186 篇)

上一篇定义了单条消息的自信息 I(x)=−log⁡2p(x)I(x) = -\log_2 p(x)。现实中我们更常问:「平均来说,一次观测能带来多少信息?」 比如抛 1000 次硬币,总惊喜是多少、平均每次多少?答案就是信息熵——压缩、通信、GPT 训练损失的理论基石。

直觉:平均惊喜有多大

你订阅了一个每日天气推送:

  • 90% 的日子写「晴」
  • 10% 的日子写「暴雨」

大多数日子推送内容乏味(概率高 → 自信息低),偶尔一条暴雨预警让你立刻查航班(概率低 → 自信息高)。熵就是把这两种情况的自信息按出现频率加权平均,得到一个「典型日子」的惊喜水平。

熵高 = 结果难猜、平均惊喜大;熵低 = 结果单调、几乎每次一样。

定义:香农熵

离散随机变量 XX 取值 x1,x2,…x_1, x_2, \ldots 的概率为 p(x)p(x),熵定义为:

H(X)=−∑xp(x)log⁡2p(x)=E[I(X)]H(X) = -\sum_x p(x) \log_2 p(x) = \mathbb{E}[I(X)]

即自信息的期望值,单位仍是 bit。

等价写法(自然对数,单位 nat):

H(X)=−∑xp(x)ln⁡p(x)H(X) = -\sum_x p(x) \ln p(x)

换算:1 nat≈1.443 bit1 \text{ nat} \approx 1.443 \text{ bit}。机器学习论文常用 nat,通信领域常用 bit;差一个常数因子,本质相同。

不要和热力学熵混淆。符号都是 HH,但信息熵衡量不确定性,热力学熵衡量微观状态数;二者数学形式相似(玻尔兹曼与香农互相致敬),物理含义不同。

例子一:硬币熵的数值

硬币类型P(正)P(\text{正})HH(bit)计算
公平0.51.000−0.5log⁡20.5−0.5log⁡20.5-0.5\log_2 0.5 - 0.5\log_2 0.5
轻微偏(0.6/0.4)0.60.971略低于公平
严重偏(0.99/0.01)0.990.081几乎没惊喜
两面都是正面1.00完全确定

公平硬币熵 = 1 bit,这是二元分布能达到的最大值。任何偏离公平都会降低熵。

例子二:英文字母熵

若 26 个字母等概率出现:

H=log⁡226≈4.70 bit/字母H = \log_2 26 \approx 4.70 \text{ bit/字母}

真实英文里 e 远多于 z,字母频率不均匀,单字母熵约 4.0 bit。考虑前后字母关联(bigram)后,每字母有效熵降到约 1.0–1.5 bit——说明字母序列有大量可预测结构,后面压缩和 GPT 都利用这一点。

量化:熵的边界与意义

最大值:nn 个等可能结果,Hmax⁡=log⁡2nH_{\max} = \log_2 n。

最小值:结果唯一确定时 H=0H = 0。

条件熵 H(X∣Y)H(X \mid Y):已知 YY 后 XX 还剩多少不确定性。后面互信息、GPT 上下文预测都依赖它。

对 GPT 而言,词表大小 ∣V∣|V| 约 50,000–100,000。若每个 Token 完全随机等概率:

Hmax⁡=log⁡2∣V∣≈16–17 bit/TokenH_{\max} = \log_2 |V| \approx 16 \text{–} 17 \text{ bit/Token}

真实语言远非随机:给定上文「今天天气」,下一个 Token 可能是「很」「不」「真」等,概率集中在少数候选上。实测大模型在英文上的每 Token 熵约 2–4 bit(随模型和领域变化)——比随机猜测低了一个数量级,说明语言高度可预测。

动手试一试

import math
from collections import Counter

def entropy(probs: list[float]) -> float:
    """给定概率列表(不必归一化),返回熵(bit)。"""
    total = sum(probs)
    h = 0.0
    for p in probs:
        p = p / total
        if p > 0:
            h -= p * math.log2(p)
    return h

# 公平硬币
print(f"公平硬币: {entropy([0.5, 0.5]):.3f} bit")

# 偏置硬币
print(f"0.99/0.01 硬币: {entropy([0.99, 0.01]):.3f} bit")

# 从一段英文估计字母熵(仅小写 a-z)
text = """
the quick brown fox jumps over the lazy dog
""" * 50
counts = Counter(c for c in text.lower() if "a" <= c <= "z")
probs = list(counts.values())
print(f"英文字母熵(此样本): {entropy(probs):.2f} bit/字母")
print(f"理论均匀上界: {math.log2(26):.2f} bit/字母")

样本越大、越接近真实英文,估计越稳——但仍高于考虑上下文后的 1–1.5 bit/字符(单字母模型看不到搭配规律)。

量化:微分熵与连续变量(预告)

离散熵用于 Token、字符;图像像素、音频采样是连续值,对应微分熵 h(X)=−∫f(x)log⁡f(x) dxh(X) = -\int f(x)\log f(x)\,dx。高斯噪声 N(0,σ2)N(0,\sigma^2) 的微分熵 12log⁡(2πeσ2)\frac{1}{2}\log(2\pi e \sigma^2) bit——方差越大,不确定性越高。第一章讲过音频量化:16 bit PCM 把连续波形离散化,量化步长决定有效熵与失真之间的权衡。LLM 主要处理离散 Token,但多模态模型(图文)会在离散与连续交界处再次遇到熵——第七章以后还会用到。

最大熵原理:在已知约束(如均值、方差固定)下,熵最大的分布往往是最「保守」的假设。指数族、Softmax 输出都与最大熵有关——GPT 输出层 Softmax 是在 ∣V∣|V| 个类上取熵最大的指数形式分布,再靠训练把参数拉向语料 pp。

联合熵与链式法则(后文互信息、条件熵会反复用到):

H(X,Y)=H(X)+H(Y∣X)=∑x,y−p(x,y)log⁡2p(x,y)H(X,Y) = H(X) + H(Y \mid X) = \sum_{x,y} -p(x,y)\log_2 p(x,y)

对 Token 序列,H(X1,…,XT)=∑tH(Xt∣X<t)H(X_1,\ldots,X_T) = \sum_t H(X_t \mid X_{<t})。整句熵 = 逐步条件熵之和——语言建模正是在逐步降低每一项。

常见误区

误区纠正
「熵越大越好」对通信而言,高熵意味着难压缩、难预测;对安全随机数而言,高熵才是目标
「熵 = 文件字节数」字节数是表示长度;熵是概率分布的属性,与编码方式无关
「GPT 输出熵越低越好」太低 → 重复无聊;太高 → 胡言乱语;好文本在合理的不确定性范围内

小结

  • 熵 H(X)=−∑p(x)log⁡2p(x)H(X) = -\sum p(x)\log_2 p(x) 是平均自信息,衡量随机变量的典型不确定性。
  • 公平硬币 H=1H = 1 bit;确定事件 H=0H = 0;nn 等可能结果 H≤log⁡2nH \le \log_2 n。
  • 英文字母序列考虑上下文后约 1–1.5 bit/字符;GPT 每 Token 约 2–4 bit——语言远非随机。
  • 熵是压缩、交叉熵损失和预测的统一语言。

下一篇回答:既然熵告诉我们「最少需要多少 bit」,压缩文件时到底去掉了什么?

本页目录