从信息量到 KL 散度:理解熵、交叉熵与大模型训练
KL 散度最容易卡住的地方,往往不是公式,而是“信息量”到底是什么。这篇笔记先从猜数字和天气编码出发,再把信息量、熵、交叉熵与 KL 散度串起来,最后联系大语言模型的强化学习训练。
一、信息量:一个结果有多出乎意料?
信息论中的“信息量”,不是一句话有多少字,也不是它对我们有多大价值,而是:在给定概率模型下,得知某个结果发生时,这个结果有多出乎意料。
假设某地每天只有晴天和雨天两种天气,真实概率分布为:
得知今天是晴天,大概不会惊讶;得知今天下雨了,就更出乎意料。信息论用“自信息量”描述这一点:
| 结果 | 真实概率 | 信息量 |
|---|---|---|
| 晴天 | 0.9 | bits |
| 雨天 | 0.1 | bits |
概率越小的结果,一旦发生,自信息量越大。 这里的概率必须相对于一个指定模型来理解;消息是否真实、是否有用,是另外的问题。
为什么单位是 bit?
从 1~8 中等概率选一个数字,每次只能问一个“是或否”的问题。通过合理地把候选范围二等分,最多问 3 次就能确定答案:
对应的信息量为:
| 等概率候选数量 | 确定一个结果的信息量 |
|---|---|
| 2 | 1 bit |
| 4 | 2 bits |
| 8 | 3 bits |
| 16 | 4 bits |
| 1024 | 10 bits |
1 bit 对应一次等概率二选一的结果所提供的信息。不等概率的二选一,不能简单地说每个结果都提供 1 bit。
为什么使用对数?
对数让独立事件的信息量可以相加。若两个事件相互独立,联合概率是概率的乘积,因此:
例如连续两次公平抛硬币都得到正面,概率为 ,信息量为 2 bits,恰好是两次各 1 bit 的总和。
二、信息熵:平均有多少信息量?
信息量描述一个具体结果;信息熵描述整个分布下的平均信息量:
仍以天气为例:
虽然雨天的信息量较大,但它发生得少,所以必须按真实概率加权,不能把晴天和雨天的信息量直接取算术平均。
信息熵与数据压缩有什么关系?
假设每天的天气独立同分布,并且真实分布 已知。若直接规定“0 表示晴天,1 表示雨天”,每天都需要 1 bit。
如果利用晴天频繁、雨天少见的规律,对很多天的天气一起编码,理论上平均每天的编码长度可以接近 ,即约 0.469 bit。
因此,对 100 天而言:
- 逐天使用固定 1 bit 编码:共 100 bits。
- 充分利用真实分布:理论上的期望信息量约为 bits。
46.9 bits 是理想化的期望基准,不是保证任何一段 100 天天气都能压缩到 47 bits。实际编码还受有限长度、终止和额外开销影响。单个二进制位不能拆开,但长序列的平均编码长度可以小于 1 bit/天。如果天气之间存在相关性,还应考虑联合分布或熵率,不能直接套用独立假设。
三、交叉熵:用另一个分布来编码,会花多少代价?
现在,真实天气仍服从:
但我们误以为晴天和雨天各占一半,使用的概率模型是:
按 分配的理想码长是 。但数据实际来自 ,所以计算平均代价时,必须用 加权:
这就是交叉熵。在这个例子中:
可以把两者并排记忆:
- :数据来自 ,也按 描述,得到最优的平均信息代价。
- :数据来自 ,却按 描述,得到相应的平均信息代价。
四、KL 散度:认错分布,多付了多少代价?
使用 时,平均代价约为 0.469 bit;使用 时,平均代价为 1 bit。额外开销就是:
KL 散度衡量:当数据来自 ,却使用 来描述时,平均额外付出的信息代价。
把交叉熵与熵的定义代入,就得到常见公式:
本篇讨论离散分布;遇到连续分布时,需要使用概率密度,并把求和相应地换成积分。
怎么读懂公式里的每一项?
| 部分 | 含义 |
|---|---|
| 数据实际出现的概率,也是计算平均值时的权重 | |
| 模型赋予该结果的概率 | |
| 按 而非 描述这个结果时,理想码长的差值 | |
| 对所有结果加权求和 | 得到平均额外代价 |
当概率均为正时:
- :该项为 0。
- :模型低估了该结果,该项为正。
- :模型高估了该结果,该项为负。
单项可以为负,整体 KL 散度仍然非负。 它衡量的是整个概率分布,不是某一次预测是否猜对。
为什么不直接计算概率差?
概率差本身当然可以用来构造其他差异指标。KL 的特殊之处在于,它衡量的是对数概率意义下的信息代价。
例如某个 Token 的真实概率为 0.1:
| 模型赋予的概率 | 概率的绝对差 | 该结果对 KL 的贡献 |
|---|---|---|
| 0.05 | 0.05 | bit |
| 0.001 | 0.099 | bit |
“概率低估一些”和“几乎认定不可能”带来的信息代价并不相同。上表只比较一个结果的贡献,不是完整分布的 KL 散度。
五、用同一个天气例子比较两个模型
| 天气 | 真实分布 | 模型 | 模型 |
|---|---|---|---|
| 晴天 | 0.9 | 0.8 | 0.5 |
| 雨天 | 0.1 | 0.2 | 0.5 |
模型 A 的 KL 散度:
模型 B 的 KL 散度:
模型 A 的 KL 更小,因此在这个方向的 KL 指标下,它对真实分布的描述更好。
为什么有时看到的是 0.036 和 0.368?
因为对数的底不同:
| 对数 | 单位 | 模型 A | 模型 B |
|---|---|---|---|
| bit | 约 0.0529 | 约 0.5310 | |
| 自然对数 | nat | 约 0.0367 | 约 0.3681 |
这不是结论冲突,而是单位换算。本文除上表的 nats 对照及后文训练目标外,均使用以 2 为底的对数。
六、KL 散度的三个重要性质
1. 非负性
对于离散概率分布,等号成立当且仅当两者分布相同。使用真实分布本身不会产生额外信息代价;换成其他分布,平均代价不会更低。
2. 一般不对称
与 一般不相等,因为它们的采样分布和加权方式不同。
- 前者问:数据来自 ,使用 描述,会怎样?
- 后者问:数据来自 ,使用 描述,会怎样?
“一般不相等”并不是说任意两个分布的双向 KL 都必然不同。由于不满足对称性等距离公理,KL 散度不是严格数学意义上的距离。
3. 可能等于正无穷
如果存在某个结果满足:
那么:
真实世界中可能发生的结果,被模型认定为绝不可能,就会带来无穷大的对数损失。对于 的项,按极限约定将其贡献记为 0。
七、为什么深度学习经常使用交叉熵?
回到恒等式:
当目标分布 固定时, 不随模型变化,因此:
这就是交叉熵能够用于训练概率模型的原因之一:减少交叉熵,也就在减少模型相对目标分布的 KL 散度。
在单个硬标签分类样本中,若正确类别为 ,目标分布是 one-hot,则该样本的交叉熵简化为:
模型给正确类别的概率越低,损失越大。实际训练通常采用自然对数;换底只会把这个损失乘以一个正常数,不改变该项自身的最优解。
八、在大语言模型强化学习中,KL 又约束什么?
前面把 当作真实数据分布。但 KL 本身并不要求第一个分布一定代表“真相”。在强化学习里,也可以比较当前策略与参考策略。
一个用于理解 KL 正则化的简化目标是:
这里的 KL 通常使用自然对数,以 nats 计量。
| 符号 | 含义 |
|---|---|
| 从训练数据分布中取出的提示词 | |
| 模型生成的回答 | |
| 回答获得的奖励 | |
| 当前正在训练的策略 | |
| 参考策略,常由冻结的初始模型提供 | |
| KL 惩罚的权重 |
最大化这个目标,是在两个要求之间做权衡:
- 奖励项:倾向于生成奖励更高的回答。
- KL 惩罚项:抑制当前策略相对参考策略过度偏离。
注意,这里约束的是“相对参考策略的偏离”,不必然等同于“每一次参数更新的步长”。KL 正则化也不能保证完全消除奖励投机或能力退化。
GRPO 和 DAPO 都有 KL 惩罚吗?
并不是所有大模型强化学习方法都保留这一项:原始 GRPO 目标包含相对参考策略的 KL 惩罚,可见 DeepSeekMath 论文。
DAPO 原论文第 2.3 节明确移除了 KL 惩罚,理由与其长思维链训练场景有关。不能把“使用 KL 惩罚”当成所有强化学习算法的共同要求。
上面的目标只是帮助理解的正则化形式,不是 GRPO 或 DAPO 的完整训练公式;具体算法还涉及采样、优势估计、裁剪以及 token 级损失等设计。
九、一张表串起四个概念
| 概念 | 它在问什么? | 公式 |
|---|---|---|
| 信息量 | 一个结果在 下有多意外? | |
| 信息熵 | 在 下,平均有多意外? | |
| 交叉熵 | 数据来自 ,按 描述,平均代价是多少? | |
| KL 散度 | 按 而不是 描述,平均多付多少? |
最值得记住的关系是:
信息量是一个结果的意外程度,熵是平均意外程度,交叉熵是用另一套概率描述数据的平均代价,KL 散度则是其中多付的那一部分。
在深度学习中,我们不一定真的要对数据编码。编码解释提供的是直觉,而 KL 的数学形式让我们可以直接比较、优化或约束概率分布。





