KL散度(KL Divergence)
KL 散度(Kullback-Leibler Divergence)常被粗略地说成“两个分布的差异”。这个说法方便,但也容易误导。更准确的理解是:
如果真实数据来自分布 ,但我们却用分布 的信念去编码、预测或行动,KL 散度衡量的是这份“用错模型”带来的额外代价。
因此,KL 的核心不是几何距离,而是相对于一个真实分布的后悔值。这也解释了为什么它有方向、为什么它不对称,以及为什么它会频繁出现在最大似然、语言模型训练和 RLHF/PPO 的策略约束中。
定义:在谁的世界里计算代价?
对离散分布 和 ,KL 散度定义为:
读这个公式时,最重要的不是 ,而是外面的期望 。它告诉我们:KL 是在 的世界里评估 。真实会发生的样本由 决定, 只是我们拿来解释这些样本的模型。
若用以 2 为底的对数,单位是 bit;若用自然对数,单位是 nat。深度学习里默认通常是自然对数。
如果某个事件在真实分布里有概率 ,而模型分布给了 ,那么 会变成无穷大。直觉上,这意味着真实世界会发生的事,被模型判成“不可能”,这样的模型无法可靠编码或预测真实数据。
从编码长度理解 KL
信息论里,一个事件 如果按分布 编码,理想码长是:
如果真实样本来自 ,那么使用 编码的平均码长是交叉熵:
如果我们知道真实分布 ,最优平均码长是熵:
两者相减:
所以 KL 的一句话解释是:
KL 散度 = 用 代替真实分布 时,平均多花的信息量。
这个视角很关键,因为它把 KL 从“抽象公式”拉回了训练目标。我们训练语言模型时最小化负对数似然,本质上是在降低交叉熵;而数据分布本身的熵 与模型参数无关,所以最小化交叉熵等价于最小化 。
为什么 KL 不是距离?
KL 散度有两个非常重要的性质。
第一,KL 非负:
并且当且仅当 时取 0。直觉上,用真实分布 自己来编码来自 的样本,不会比用另一个错误分布更差。这一结论可以由 Jensen 不等式推出,常被称为 Gibbs 不等式。
第二,KL 不对称:
这不是缺陷,而是定义本身的含义。 问的是:真实是 ,却拿 当模型,会付出多少代价?而 问的是另一个世界:真实是 ,却拿 当模型。真实世界换了,问题当然也换了。
一个非常小的例子可以看出方向差异。假设 认为某个事件常发生,而 给它很低概率,则 会很大,因为这个事件会频繁出现并不断暴露 的错误。反过来,如果 给某些 很少发生的事件较高概率, 未必很大,因为这些事件在 的采样中很少被看见。
因此 KL 不能直接当作欧式意义上的距离:它不对称,也不满足三角不等式。说“KL 距离”只是口语,严格说应叫 KL 散度。
两个方向:覆盖模式还是追逐模式?
KL 的方向会改变优化行为。设真实分布是 ,模型分布是 。
最小化 时,期望在 下取。模型最怕的是:真实世界经常出现的东西,自己却给了很低概率。因此这种方向倾向于覆盖真实分布的主要概率质量,避免漏掉真实模式。
最小化 时,期望在 下取。模型最怕的是:自己生成了某些东西,但这些东西在 下概率很低。因此这种方向倾向于避免生成低真实概率区域,有时会表现为更保守、更“追逐单一高峰”的行为。
这一区分在生成模型中尤其重要。前向 KL()更像“别漏掉真实数据”;反向 KL()更像“别生成不像真的东西”。两者都合理,但它们优化的是不同风险。
在机器学习中:交叉熵背后的 KL
监督学习中常见的交叉熵损失:
可以拆成:
由于 不依赖模型参数,训练模型最小化交叉熵,就是在让 靠近数据分布 。这就是最大似然估计与 KL 最小化之间的联系。
语言模型也是同一件事。预训练时,我们用语料中的下一个 token 作为来自数据分布的样本,最小化:
它不是在逐字“背诵文本”,而是在学习一个条件分布,使其尽量减少对真实文本分布的编码代价。
在 RLHF/PPO 中:KL 是策略的护栏
在 RLHF 里,模型不再只模仿数据分布,而是被奖励模型推动去生成更高分的回答。问题是:如果只最大化奖励,模型可能会学会利用奖励模型的漏洞,生成形式上讨好奖励模型、但语言质量或真实性变差的输出。
因此 PPO/RLHF 通常加入一个参考模型 ,并优化类似下面的目标:
对 取期望后,第二项就是:
它的作用不是让模型永远等于参考模型,而是给策略变化定价:想偏离参考模型可以,但必须用足够高的奖励收益来支付这份偏离成本。
在 token 级实现中,常见做法是对生成序列的每一步加入近似惩罚:
如果当前策略把某个 token 的概率抬得远高于参考模型, 为正,奖励会被扣掉。反过来,如果当前策略比参考模型更少选择某个 token,这一项可能为负,从而得到正的“反惩罚”。实际工程里通常还会监控整段回复的平均 KL,并用自适应 控制更新强度。
PPO 的 clipped objective 限制的是当前策略相对采样时旧策略 的一步更新幅度;RLHF 中的 KL 惩罚限制的是训练中策略相对参考模型 的长期漂移。两者不是一回事。
为什么不用 L2 距离?
概率分布的差异不是普通向量差异。把概率从 改到 ,绝对差只有 ,但相对概率放大了 10 倍;把 改到 ,绝对差同样是 ,语义却完全不同。
KL 使用的是对数比值:
因此它天然关心“相对信念变化”。这与语言模型很契合:token 概率往往跨越多个数量级,一个低概率 token 被突然抬高,可能比一个高概率 token 的微小线性变化更值得警惕。
常见误区
- 误区一:KL 衡量两个分布的绝对距离。 实际上 KL 有方向,问的是“用谁解释谁”的代价。
- 误区二:KL 越小,生成质量一定越好。 KL 小只说明模型没有偏离参考分布太远,不代表回答更正确或更有帮助。
- 误区三:RLHF 的 KL 惩罚越强越稳定。 惩罚过强会把模型锁在参考模型附近,奖励模型的信号无法发挥作用;惩罚过弱又容易 reward hacking。
- 误区四:单个样本上的 就是完整 KL。 它只是当前采样 token 的 KL 贡献;完整 KL 需要对整个分布取期望。
总结
KL 散度的内核可以压缩成一句话:它衡量的是在真实分布 下,用另一个分布 解释样本时多付出的信息代价。
从这个核心出发,很多性质会自然浮现:KL 非负,因为真实分布自身给出最优编码;KL 不对称,因为“真实是谁”改变了问题;交叉熵训练等价于最小化数据分布到模型分布的 KL;RLHF 中的 KL 惩罚则是在奖励优化和参考模型约束之间建立价格机制。
理解 KL,不要只记公式。要记住它背后的问题:我正在用哪个分布解释哪个分布,而这种解释错在哪里?