交叉熵与 KL 散度:大模型训练里最常见的两个量
交叉熵衡量“按模型的概率分布编码真实答案要花多少代价”;KL 散度衡量“模型分布偏离参考分布多少”。它们的区别决定了它们在训练中的不同角色。
从语言模型预训练,到知识蒸馏、PPO 和 DPO,交叉熵与 KL 散度反复出现。很多公式看起来不同,底层问题却高度一致:我们有一个目标分布,模型给出一个预测分布,两者相差多少?
从分类任务开始
以词表分类为例。真实下一个 token 是 y,模型给每个 token 预测概率 pθ(token | context)。训练时最常用的损失是:
L = -log pθ(y | context)
如果模型给正确 token 的概率是 0.9,损失很小;若只给 0.01,损失很大。把一个 batch 中所有 token 的损失平均,就是语言模型常见的 cross-entropy loss。
真实标签也可以写成 one-hot 分布 q:正确 token 概率为 1,其他为 0。于是交叉熵为:
H(q, p) = -Σᵢ qᵢ log pᵢ
由于 one-hot 分布只有正确位置非零,这个式子自然退化成负对数似然。交叉熵因此不是神秘的新目标,它就是“让正确答案概率更高”的可微表达。
KL 散度在比较什么
KL 散度定义为:
D_KL(q || p) = Σᵢ qᵢ log(qᵢ / pᵢ)
它描述使用 p 近似 q 时的额外信息代价。关键性质有两个:
- KL 总是非负,且仅当两个分布相同才为零;
- KL 不对称,
D_KL(q || p)与D_KL(p || q)不是一回事。
交叉熵和 KL 的关系是:
H(q, p) = H(q) + D_KL(q || p)
当目标分布 q 固定时,H(q) 是常数。所以最小化交叉熵,等价于最小化目标分布到模型分布的 KL 散度。这就是为什么监督学习里常直接用交叉熵:它的实现和解释更直接。
为什么对齐训练中会额外出现 KL
在偏好优化或强化学习对齐中,目标不只是让模型偏向高奖励回答,还要避免它为了奖励偏离原始模型过远。此时经常加入相对于参考策略 π_ref 的 KL 惩罚:
reward - β · D_KL(πθ || π_ref)
它的作用类似一根安全绳:模型可以学新偏好,但每一步偏离要付出代价。没有这种约束时,模型可能学会投机性地最大化奖励,却损害原有的语言能力、多样性或安全边界。
注意方向:D_KL(πθ || π_ref) 惩罚的是当前模型把概率放到参考模型认为不太可能的位置;改变 KL 的方向会改变优化偏好。这是阅读对齐算法公式时必须确认的细节。
三个常见误解
1. 交叉熵越低,用户体验一定越好
不一定。交叉熵通常衡量 token 级预测,与事实性、帮助性、格式遵循或任务完成率有关但不等价。训练和产品评测需要分层设计。
2. KL 越小越好
也不一定。若目标是让模型学到新行为,KL 为零意味着它根本没有变化。关键是选择合理的约束强度 β,在能力迁移与稳定性之间平衡。
3. KL 可以当作距离
KL 能衡量分布差异,却不是数学上的距离:它不对称,也不满足三角不等式。写分析和实现时不要把它当作普通欧氏距离理解。
小结
交叉熵关注模型是否把概率给到了目标答案;KL 散度关注模型分布相对某个参考分布偏移了多少。前者是预训练和监督微调的基本语言,后者则在蒸馏、分布匹配和模型对齐中提供约束。读懂两者的关系,会让许多大模型训练公式突然变得简单。