KL散度(KL Divergence)

KL 散度(Kullback-Leibler Divergence)常被粗略地说成“两个分布的差异”。这个说法方便,但也容易误导。更准确的理解是:

如果真实数据来自分布 𝑃,但我们却用分布 𝑄 的信念去编码、预测或行动,KL 散度衡量的是这份“用错模型”带来的额外代价。

因此,KL 的核心不是几何距离,而是相对于一个真实分布的后悔值。这也解释了为什么它有方向、为什么它不对称,以及为什么它会频繁出现在最大似然、语言模型训练和 RLHF/PPO 的策略约束中。

定义:在谁的世界里计算代价?

对离散分布 𝑃𝑄,KL 散度定义为:

𝐷KL(𝑃𝑄)=𝑥𝑃(𝑥)log𝑃(𝑥)𝑄(𝑥)=𝔼𝑥𝑃[log𝑃(𝑥)log𝑄(𝑥)]

读这个公式时,最重要的不是 log𝑃(𝑥)𝑄(𝑥),而是外面的期望 𝔼𝑥𝑃。它告诉我们:KL 是在 𝑃 的世界里评估 𝑄。真实会发生的样本由 𝑃 决定,𝑄 只是我们拿来解释这些样本的模型。

若用以 2 为底的对数,单位是 bit;若用自然对数,单位是 nat。深度学习里默认通常是自然对数。

如果某个事件在真实分布里有概率 𝑃(𝑥)>0,而模型分布给了 𝑄(𝑥)=0,那么 𝐷KL(𝑃𝑄) 会变成无穷大。直觉上,这意味着真实世界会发生的事,被模型判成“不可能”,这样的模型无法可靠编码或预测真实数据。

从编码长度理解 KL

信息论里,一个事件 𝑥 如果按分布 𝑄 编码,理想码长是:

𝐿𝑄(𝑥)=log𝑄(𝑥)

如果真实样本来自 𝑃,那么使用 𝑄 编码的平均码长是交叉熵:

𝐻(𝑃,𝑄)=𝔼𝑥𝑃[log𝑄(𝑥)]

如果我们知道真实分布 𝑃,最优平均码长是熵:

𝐻(𝑃)=𝔼𝑥𝑃[log𝑃(𝑥)]

两者相减:

𝐻(𝑃,𝑄)𝐻(𝑃)=𝔼𝑥𝑃[log𝑄(𝑥)+log𝑃(𝑥)]=𝐷KL(𝑃𝑄)

所以 KL 的一句话解释是:

KL 散度 = 用 𝑄 代替真实分布 𝑃 时,平均多花的信息量。

这个视角很关键,因为它把 KL 从“抽象公式”拉回了训练目标。我们训练语言模型时最小化负对数似然,本质上是在降低交叉熵;而数据分布本身的熵 𝐻(𝑃) 与模型参数无关,所以最小化交叉熵等价于最小化 𝐷KL(𝑃𝑄𝜃)

为什么 KL 不是距离?

KL 散度有两个非常重要的性质。

第一,KL 非负:

𝐷KL(𝑃𝑄)0

并且当且仅当 𝑃=𝑄 时取 0。直觉上,用真实分布 𝑃 自己来编码来自 𝑃 的样本,不会比用另一个错误分布更差。这一结论可以由 Jensen 不等式推出,常被称为 Gibbs 不等式。

第二,KL 不对称:

𝐷KL(𝑃𝑄)𝐷KL(𝑄𝑃)

这不是缺陷,而是定义本身的含义。𝐷KL(𝑃𝑄) 问的是:真实是 𝑃,却拿 𝑄 当模型,会付出多少代价?而 𝐷KL(𝑄𝑃) 问的是另一个世界:真实是 𝑄,却拿 𝑃 当模型。真实世界换了,问题当然也换了。

一个非常小的例子可以看出方向差异。假设 𝑃 认为某个事件常发生,而 𝑄 给它很低概率,则 𝐷KL(𝑃𝑄) 会很大,因为这个事件会频繁出现并不断暴露 𝑄 的错误。反过来,如果 𝑄 给某些 𝑃 很少发生的事件较高概率,𝐷KL(𝑃𝑄) 未必很大,因为这些事件在 𝑃 的采样中很少被看见。

因此 KL 不能直接当作欧式意义上的距离:它不对称,也不满足三角不等式。说“KL 距离”只是口语,严格说应叫 KL 散度。

两个方向:覆盖模式还是追逐模式?

KL 的方向会改变优化行为。设真实分布是 𝑃,模型分布是 𝑄𝜃

最小化 𝐷KL(𝑃𝑄𝜃) 时,期望在 𝑃 下取。模型最怕的是:真实世界经常出现的东西,自己却给了很低概率。因此这种方向倾向于覆盖真实分布的主要概率质量,避免漏掉真实模式。

最小化 𝐷KL(𝑄𝜃𝑃) 时,期望在 𝑄𝜃 下取。模型最怕的是:自己生成了某些东西,但这些东西在 𝑃 下概率很低。因此这种方向倾向于避免生成低真实概率区域,有时会表现为更保守、更“追逐单一高峰”的行为。

这一区分在生成模型中尤其重要。前向 KL(𝑃𝑄)更像“别漏掉真实数据”;反向 KL(𝑄𝑃)更像“别生成不像真的东西”。两者都合理,但它们优化的是不同风险。

在机器学习中:交叉熵背后的 KL

监督学习中常见的交叉熵损失:

ℒ︀(𝜃)=𝔼(𝑥,𝑦)𝑃data[log𝑄𝜃(𝑦|𝑥)]

可以拆成:

𝐻(𝑃data,𝑄𝜃)=𝐻(𝑃data)+𝐷KL(𝑃data𝑄𝜃)

由于 𝐻(𝑃data) 不依赖模型参数,训练模型最小化交叉熵,就是在让 𝑄𝜃 靠近数据分布 𝑃data。这就是最大似然估计与 KL 最小化之间的联系。

语言模型也是同一件事。预训练时,我们用语料中的下一个 token 作为来自数据分布的样本,最小化:

log𝑝𝜃(𝑥𝑡|𝑥<𝑡)

它不是在逐字“背诵文本”,而是在学习一个条件分布,使其尽量减少对真实文本分布的编码代价。

在 RLHF/PPO 中:KL 是策略的护栏

在 RLHF 里,模型不再只模仿数据分布,而是被奖励模型推动去生成更高分的回答。问题是:如果只最大化奖励,模型可能会学会利用奖励模型的漏洞,生成形式上讨好奖励模型、但语言质量或真实性变差的输出。

因此 PPO/RLHF 通常加入一个参考模型 𝜋ref,并优化类似下面的目标:

max𝜃𝔼𝑦𝜋𝜃(.|𝑥)[𝑅(𝑥,𝑦)𝛽log𝜋𝜃(𝑦|𝑥)𝜋ref(𝑦|𝑥)]

𝑦𝜋𝜃 取期望后,第二项就是:

𝛽𝐷KL(𝜋𝜃(.|𝑥)𝜋ref(.|𝑥))

它的作用不是让模型永远等于参考模型,而是给策略变化定价:想偏离参考模型可以,但必须用足够高的奖励收益来支付这份偏离成本。

在 token 级实现中,常见做法是对生成序列的每一步加入近似惩罚:

𝑟𝑡KL=𝛽log𝜋𝜃(𝑦𝑡|𝑥,𝑦<𝑡)𝜋ref(𝑦𝑡|𝑥,𝑦<𝑡)

如果当前策略把某个 token 的概率抬得远高于参考模型,log𝜋𝜃𝜋ref 为正,奖励会被扣掉。反过来,如果当前策略比参考模型更少选择某个 token,这一项可能为负,从而得到正的“反惩罚”。实际工程里通常还会监控整段回复的平均 KL,并用自适应 𝛽 控制更新强度。

PPO 的 clipped objective 限制的是当前策略相对采样时旧策略 𝜋old 的一步更新幅度;RLHF 中的 KL 惩罚限制的是训练中策略相对参考模型 𝜋ref 的长期漂移。两者不是一回事。

为什么不用 L2 距离?

概率分布的差异不是普通向量差异。把概率从 0.001 改到 0.01,绝对差只有 0.009,但相对概率放大了 10 倍;把 0.5 改到 0.509,绝对差同样是 0.009,语义却完全不同。

KL 使用的是对数比值:

log𝑃(𝑥)𝑄(𝑥)

因此它天然关心“相对信念变化”。这与语言模型很契合:token 概率往往跨越多个数量级,一个低概率 token 被突然抬高,可能比一个高概率 token 的微小线性变化更值得警惕。

常见误区

在 RLHF 中,若持续增大 KL 系数 𝛽,最可能出现什么现象?

总结

KL 散度的内核可以压缩成一句话:它衡量的是在真实分布 𝑃 下,用另一个分布 𝑄 解释样本时多付出的信息代价

从这个核心出发,很多性质会自然浮现:KL 非负,因为真实分布自身给出最优编码;KL 不对称,因为“真实是谁”改变了问题;交叉熵训练等价于最小化数据分布到模型分布的 KL;RLHF 中的 KL 惩罚则是在奖励优化和参考模型约束之间建立价格机制。

理解 KL,不要只记公式。要记住它背后的问题:我正在用哪个分布解释哪个分布,而这种解释错在哪里?