14
0
0

从信息量到 KL 散度:理解熵、交叉熵与大模型训练

2026-10-15
2026-10-15
文章摘要
|

KL 散度最容易卡住的地方,往往不是公式,而是“信息量”到底是什么。这篇笔记先从猜数字和天气编码出发,再把信息量、熵、交叉熵与 KL 散度串起来,最后联系大语言模型的强化学习训练。

一、信息量:一个结果有多出乎意料?

信息论中的“信息量”,不是一句话有多少字,也不是它对我们有多大价值,而是:在给定概率模型下,得知某个结果发生时,这个结果有多出乎意料。

假设某地每天只有晴天和雨天两种天气,真实概率分布为:

P=(0.9,  0.1)P=(0.9,\;0.1)

得知今天是晴天,大概不会惊讶;得知今天下雨了,就更出乎意料。信息论用“自信息量”描述这一点:

IP(x)=−log⁡2P(x)I_P(x)=-\log_2 P(x)
结果 真实概率 信息量
晴天 0.9 −log⁡20.9≈0.152-\log_2 0.9\approx0.152 bits
雨天 0.1 −log⁡20.1≈3.322-\log_2 0.1\approx3.322 bits

概率越小的结果,一旦发生,自信息量越大。 这里的概率必须相对于一个指定模型来理解;消息是否真实、是否有用,是另外的问题。

为什么单位是 bit?

从 1~8 中等概率选一个数字,每次只能问一个“是或否”的问题。通过合理地把候选范围二等分,最多问 3 次就能确定答案:

8⟶4⟶2⟶18\longrightarrow4\longrightarrow2\longrightarrow1

对应的信息量为:

−log⁡218=log⁡28=3 bits-\log_2\frac18=\log_2 8=3\text{ bits}
等概率候选数量 确定一个结果的信息量
2 1 bit
4 2 bits
8 3 bits
16 4 bits
1024 10 bits

1 bit 对应一次等概率二选一的结果所提供的信息。不等概率的二选一,不能简单地说每个结果都提供 1 bit。

为什么使用对数?

对数让独立事件的信息量可以相加。若两个事件相互独立,联合概率是概率的乘积,因此:

−log⁡2(P(x)P(y))=−log⁡2P(x)−log⁡2P(y)-\log_2\bigl(P(x)P(y)\bigr) =-\log_2P(x)-\log_2P(y)

例如连续两次公平抛硬币都得到正面,概率为 1/41/4,信息量为 2 bits,恰好是两次各 1 bit 的总和。

二、信息熵:平均有多少信息量?

信息量描述一个具体结果;信息熵描述整个分布下的平均信息量:

H(P)=Ex∼P[−log⁡2P(x)]=−∑xP(x)log⁡2P(x)H(P)=\mathbb E_{x\sim P}[-\log_2P(x)] =-\sum_x P(x)\log_2P(x)

仍以天气为例:

H(P)=−0.9log⁡20.9−0.1log⁡20.1≈0.469 bitsH(P)=-0.9\log_2 0.9-0.1\log_2 0.1 \approx0.469\text{ bits}

虽然雨天的信息量较大,但它发生得少,所以必须按真实概率加权,不能把晴天和雨天的信息量直接取算术平均。

信息熵与数据压缩有什么关系?

假设每天的天气独立同分布,并且真实分布 PP 已知。若直接规定“0 表示晴天,1 表示雨天”,每天都需要 1 bit。

如果利用晴天频繁、雨天少见的规律,对很多天的天气一起编码,理论上平均每天的编码长度可以接近 H(P)H(P),即约 0.469 bit。

因此,对 100 天而言:

  • 逐天使用固定 1 bit 编码:共 100 bits。
  • 充分利用真实分布:理论上的期望信息量约为 100×0.469=46.9100\times0.469=46.9 bits。

46.9 bits 是理想化的期望基准,不是保证任何一段 100 天天气都能压缩到 47 bits。实际编码还受有限长度、终止和额外开销影响。单个二进制位不能拆开,但长序列的平均编码长度可以小于 1 bit/天。如果天气之间存在相关性,还应考虑联合分布或熵率,不能直接套用独立假设。

三、交叉熵:用另一个分布来编码,会花多少代价?

现在,真实天气仍服从:

P=(0.9,  0.1)P=(0.9,\;0.1)

但我们误以为晴天和雨天各占一半,使用的概率模型是:

Q=(0.5,  0.5)Q=(0.5,\;0.5)

按 QQ 分配的理想码长是 −log⁡2Q(x)-\log_2Q(x)。但数据实际来自 PP,所以计算平均代价时,必须用 PP 加权:

H(P,Q)=Ex∼P[−log⁡2Q(x)]=−∑xP(x)log⁡2Q(x)H(P,Q)=\mathbb E_{x\sim P}[-\log_2Q(x)] =-\sum_xP(x)\log_2Q(x)

这就是交叉熵。在这个例子中:

H(P,Q)=−0.9log⁡20.5−0.1log⁡20.5=1 bitH(P,Q)=-0.9\log_2 0.5-0.1\log_2 0.5 =1\text{ bit}

可以把两者并排记忆:

  • H(P)H(P):数据来自 PP,也按 PP 描述,得到最优的平均信息代价。
  • H(P,Q)H(P,Q):数据来自 PP,却按 QQ 描述,得到相应的平均信息代价。

四、KL 散度:认错分布,多付了多少代价?

使用 PP 时,平均代价约为 0.469 bit;使用 QQ 时,平均代价为 1 bit。额外开销就是:

DKL(P∥Q)=H(P,Q)−H(P)=1−0.469≈0.531 bitsD_{\mathrm{KL}}(P\|Q)=H(P,Q)-H(P) =1-0.469\approx0.531\text{ bits}

KL 散度衡量:当数据来自 PP,却使用 QQ 来描述时,平均额外付出的信息代价。

把交叉熵与熵的定义代入,就得到常见公式:

DKL(P∥Q)=−∑xP(x)log⁡2Q(x)+∑xP(x)log⁡2P(x)=∑xP(x)log⁡2P(x)Q(x)=Ex∼P[log⁡2P(x)Q(x)]\begin{aligned} D_{\mathrm{KL}}(P\|Q) &=-\sum_xP(x)\log_2Q(x)+\sum_xP(x)\log_2P(x)\\ &=\sum_xP(x)\log_2\frac{P(x)}{Q(x)}\\ &=\mathbb E_{x\sim P}\left[\log_2\frac{P(x)}{Q(x)}\right] \end{aligned}

本篇讨论离散分布;遇到连续分布时,需要使用概率密度,并把求和相应地换成积分。

怎么读懂公式里的每一项?

部分 含义
P(x)P(x) 数据实际出现的概率,也是计算平均值时的权重
Q(x)Q(x) 模型赋予该结果的概率
log⁡2(P(x)/Q(x))\log_2(P(x)/Q(x)) 按 QQ 而非 PP 描述这个结果时,理想码长的差值
对所有结果加权求和 得到平均额外代价

当概率均为正时:

  • P(x)=Q(x)P(x)=Q(x):该项为 0。
  • P(x)>Q(x)P(x)>Q(x):模型低估了该结果,该项为正。
  • P(x)<Q(x)P(x)<Q(x):模型高估了该结果,该项为负。

单项可以为负,整体 KL 散度仍然非负。 它衡量的是整个概率分布,不是某一次预测是否猜对。

为什么不直接计算概率差?

概率差本身当然可以用来构造其他差异指标。KL 的特殊之处在于,它衡量的是对数概率意义下的信息代价。

例如某个 Token 的真实概率为 0.1:

模型赋予的概率 概率的绝对差 该结果对 KL 的贡献
0.05 0.05 0.1log⁡2(0.1/0.05)=0.10.1\log_2(0.1/0.05)=0.1 bit
0.001 0.099 0.1log⁡2(0.1/0.001)≈0.6640.1\log_2(0.1/0.001)\approx0.664 bit

“概率低估一些”和“几乎认定不可能”带来的信息代价并不相同。上表只比较一个结果的贡献,不是完整分布的 KL 散度。

五、用同一个天气例子比较两个模型

天气 真实分布 PP 模型 QAQ_A 模型 QBQ_B
晴天 0.9 0.8 0.5
雨天 0.1 0.2 0.5

模型 A 的 KL 散度:

DKL(P∥QA)=0.9log⁡20.90.8+0.1log⁡20.10.2≈0.0529 bitsD_{\mathrm{KL}}(P\|Q_A) =0.9\log_2\frac{0.9}{0.8}+0.1\log_2\frac{0.1}{0.2} \approx0.0529\text{ bits}

模型 B 的 KL 散度:

DKL(P∥QB)=0.9log⁡20.90.5+0.1log⁡20.10.5≈0.5310 bitsD_{\mathrm{KL}}(P\|Q_B) =0.9\log_2\frac{0.9}{0.5}+0.1\log_2\frac{0.1}{0.5} \approx0.5310\text{ bits}

模型 A 的 KL 更小,因此在这个方向的 KL 指标下,它对真实分布的描述更好。

为什么有时看到的是 0.036 和 0.368?

因为对数的底不同:

对数 单位 模型 A 模型 B
log⁡2\log_2 bit 约 0.0529 约 0.5310
自然对数 ln⁡\ln nat 约 0.0367 约 0.3681
DKL(bits)=DKL(nats)ln⁡2D_{\mathrm{KL}}^{(\mathrm{bits})} =\frac{D_{\mathrm{KL}}^{(\mathrm{nats})}}{\ln 2}

这不是结论冲突,而是单位换算。本文除上表的 nats 对照及后文训练目标外,均使用以 2 为底的对数。

六、KL 散度的三个重要性质

1. 非负性

DKL(P∥Q)≥0D_{\mathrm{KL}}(P\|Q)\ge0

对于离散概率分布,等号成立当且仅当两者分布相同。使用真实分布本身不会产生额外信息代价;换成其他分布,平均代价不会更低。

2. 一般不对称

DKL(P∥Q)D_{\mathrm{KL}}(P\|Q) 与 DKL(Q∥P)D_{\mathrm{KL}}(Q\|P) 一般不相等,因为它们的采样分布和加权方式不同。

  • 前者问:数据来自 PP,使用 QQ 描述,会怎样?
  • 后者问:数据来自 QQ,使用 PP 描述,会怎样?

“一般不相等”并不是说任意两个分布的双向 KL 都必然不同。由于不满足对称性等距离公理,KL 散度不是严格数学意义上的距离。

3. 可能等于正无穷

如果存在某个结果满足:

P(x)>0,Q(x)=0P(x)>0,\qquad Q(x)=0

那么:

DKL(P∥Q)=+∞D_{\mathrm{KL}}(P\|Q)=+\infty

真实世界中可能发生的结果,被模型认定为绝不可能,就会带来无穷大的对数损失。对于 P(x)=0P(x)=0 的项,按极限约定将其贡献记为 0。

七、为什么深度学习经常使用交叉熵?

回到恒等式:

H(P,Q)=H(P)+DKL(P∥Q)H(P,Q)=H(P)+D_{\mathrm{KL}}(P\|Q)

当目标分布 PP 固定时,H(P)H(P) 不随模型变化,因此:

min⁡QH(P,Q)  ⟺  min⁡QDKL(P∥Q)\min_Q H(P,Q) \iff\min_Q D_{\mathrm{KL}}(P\|Q)

这就是交叉熵能够用于训练概率模型的原因之一:减少交叉熵,也就在减少模型相对目标分布的 KL 散度。

在单个硬标签分类样本中,若正确类别为 yy,目标分布是 one-hot,则该样本的交叉熵简化为:

L=−log⁡2Q(y)L=-\log_2Q(y)

模型给正确类别的概率越低,损失越大。实际训练通常采用自然对数;换底只会把这个损失乘以一个正常数,不改变该项自身的最优解。

八、在大语言模型强化学习中,KL 又约束什么?

前面把 PP 当作真实数据分布。但 KL 本身并不要求第一个分布一定代表“真相”。在强化学习里,也可以比较当前策略与参考策略。

一个用于理解 KL 正则化的简化目标是:

J(θ)=Eq∼D[Eo∼πθ(⋅∣q)[R(q,o)]−βDKL(πθ(⋅∣q)∥πref(⋅∣q))]J(\theta)=\mathbb E_{q\sim\mathcal D} \left[ \mathbb E_{o\sim\pi_\theta(\cdot\mid q)}[R(q,o)] -\beta D_{\mathrm{KL}}\bigl( \pi_\theta(\cdot\mid q)\|\pi_{\mathrm{ref}}(\cdot\mid q) \bigr) \right]

这里的 KL 通常使用自然对数,以 nats 计量。

符号 含义
q∼Dq\sim\mathcal D 从训练数据分布中取出的提示词
oo 模型生成的回答
R(q,o)R(q,o) 回答获得的奖励
πθ\pi_\theta 当前正在训练的策略
πref\pi_{\mathrm{ref}} 参考策略,常由冻结的初始模型提供
β\beta KL 惩罚的权重

最大化这个目标,是在两个要求之间做权衡:

  • 奖励项:倾向于生成奖励更高的回答。
  • KL 惩罚项:抑制当前策略相对参考策略过度偏离。

注意,这里约束的是“相对参考策略的偏离”,不必然等同于“每一次参数更新的步长”。KL 正则化也不能保证完全消除奖励投机或能力退化。

GRPO 和 DAPO 都有 KL 惩罚吗?

并不是所有大模型强化学习方法都保留这一项:原始 GRPO 目标包含相对参考策略的 KL 惩罚,可见 DeepSeekMath 论文。

DAPO 原论文第 2.3 节明确移除了 KL 惩罚,理由与其长思维链训练场景有关。不能把“使用 KL 惩罚”当成所有强化学习算法的共同要求。

上面的目标只是帮助理解的正则化形式,不是 GRPO 或 DAPO 的完整训练公式;具体算法还涉及采样、优势估计、裁剪以及 token 级损失等设计。

九、一张表串起四个概念

概念 它在问什么? 公式
信息量 一个结果在 PP 下有多意外? IP(x)=−log⁡2P(x)I_P(x)=-\log_2P(x)
信息熵 在 PP 下,平均有多意外? H(P)=EP[−log⁡2P(x)]H(P)=\mathbb E_P[-\log_2P(x)]
交叉熵 数据来自 PP,按 QQ 描述,平均代价是多少? H(P,Q)=EP[−log⁡2Q(x)]H(P,Q)=\mathbb E_P[-\log_2Q(x)]
KL 散度 按 QQ 而不是 PP 描述,平均多付多少? DKL(P∥Q)=H(P,Q)−H(P)D_{\mathrm{KL}}(P\|Q)=H(P,Q)-H(P)

最值得记住的关系是:

H(P,Q)⏟使用 Q 的平均代价=H(P)⏟真实分布自身的平均代价+DKL(P∥Q)⏟额外代价\underbrace{H(P,Q)}_{\text{使用 Q 的平均代价}} =\underbrace{H(P)}_{\text{真实分布自身的平均代价}} +\underbrace{D_{\mathrm{KL}}(P\|Q)}_{\text{额外代价}}

信息量是一个结果的意外程度,熵是平均意外程度,交叉熵是用另一套概率描述数据的平均代价,KL 散度则是其中多付的那一部分。

在深度学习中,我们不一定真的要对数据编码。编码解释提供的是直觉,而 KL 的数学形式让我们可以直接比较、优化或约束概率分布。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或者给予支持!

评论