# 信息熵是什么

> 从 Bit 到 AGI · 第三章：信息（Information） · 信息熵是什么

- 作者：David（道雾轩）
- 专栏：从 Bit 到 AGI（https://daiw.org/manual/bit-to-agi.md）
- 最后更新：2026-07-09
- 原文：https://daiw.org/manual/bit-to-agi/03-information/what-is-entropy
- 转载与引用：请注明出处并附原文链接（https://daiw.org/about/copyright）

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

## 直觉：平均惊喜有多大

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

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

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

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

## 定义：香农熵

离散随机变量 $X$ 取值 $x_1, x_2, \ldots$ 的概率为 $p(x)$，**熵**定义为：

$$
H(X) = -\sum_x p(x) \log_2 p(x) = \mathbb{E}[I(X)]
$$

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

等价写法（自然对数，单位 nat）：

$$
H(X) = -\sum_x p(x) \ln p(x)
$$

换算：$1 \text{ nat} \approx 1.443 \text{ bit}$。机器学习论文常用 nat，通信领域常用 bit；差一个常数因子，本质相同。

<Callout type="warn">
  不要和热力学熵混淆。符号都是 $H$，但**信息熵**衡量不确定性，**热力学熵**衡量微观状态数；二者数学形式相似（玻尔兹曼与香农互相致敬），物理含义不同。
</Callout>

## 例子一：硬币熵的数值

| 硬币类型 | $P(\text{正})$ | $H$（bit） | 计算 |
| -------- | -------------- | ---------- | ---- |
| 公平 | 0.5 | **1.000** | $-0.5\log_2 0.5 - 0.5\log_2 0.5$ |
| 轻微偏（0.6/0.4） | 0.6 | **0.971** | 略低于公平 |
| 严重偏（0.99/0.01） | 0.99 | **0.081** | 几乎没惊喜 |
| 两面都是正面 | 1.0 | **0** | 完全确定 |

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

## 例子二：英文字母熵

若 26 个字母**等概率**出现：

$$
H = \log_2 26 \approx 4.70 \text{ bit/字母}
$$

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

## 量化：熵的边界与意义

**最大值**：$n$ 个等可能结果，$H_{\max} = \log_2 n$。

**最小值**：结果唯一确定时 $H = 0$。

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

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

$$
H_{\max} = \log_2 |V| \approx 16 \text{–} 17 \text{ bit/Token}
$$

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

## 动手试一试

```python
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) = -\int f(x)\log f(x)\,dx$。高斯噪声 $N(0,\sigma^2)$ 的微分熵 $\frac{1}{2}\log(2\pi e \sigma^2)$ bit——方差越大，不确定性越高。第一章讲过音频量化：16 bit PCM 把连续波形离散化，量化步长决定**有效熵**与失真之间的权衡。LLM 主要处理离散 Token，但多模态模型（图文）会在离散与连续交界处再次遇到熵——第七章以后还会用到。

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

**联合熵与链式法则**（后文互信息、条件熵会反复用到）：

$$
H(X,Y) = H(X) + H(Y \mid X) = \sum_{x,y} -p(x,y)\log_2 p(x,y)
$$

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

## 常见误区

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

## 小结

- **熵** $H(X) = -\sum p(x)\log_2 p(x)$ 是平均自信息，衡量随机变量的**典型不确定性**。
- 公平硬币 $H = 1$ bit；确定事件 $H = 0$；$n$ 等可能结果 $H \le \log_2 n$。
- 英文字母序列考虑上下文后约 **1–1.5 bit/字符**；GPT 每 Token 约 **2–4 bit**——语言远非随机。
- 熵是[压缩](https://daiw.org/manual/bit-to-agi/03-information/compression-removes-redundancy)、[交叉熵损失](https://daiw.org/manual/bit-to-agi/03-information/cross-entropy)和[预测](https://daiw.org/manual/bit-to-agi/03-information/why-gpt-predicts-next-token)的统一语言。

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