跳到主要内容

散度

KL (Kullback-Leibler) Divergence

KL 散度又称相对熵,为信息散度(增益),是两个概率分布 P 和 Q 之间差别的非对称的度量,即度量使用基于 Q 的编码方式对 P 进行编码所需的额外 bits 数,P 表示数据的真实分布,则 Q 表示 P 的近似分布。

KL 散度性质:

  • 不对称性;
  • 为非负值,因为对数函数为凸函数;
  • 不满足三角不等式。

KL 散度局限性:

当两个分布距离很远,完全没有重叠时,KL 散度值失去意义。

单变量高斯分布概率密度:

多变量高斯分布概率密度,其中 Σ 为协方差矩阵:

JS (Jensen-Shannon) Divergence

JS 散度是基于 KL 散度的变形,度量两个概率分布的相似度,解决了 KL 散度非对称的问题,一般是对称的,取值在 0 到 1 之间。

JS 散度性质:

  • 对称性

JS 散度局限性:

当两个分布距离很远,完全没有重叠时,JS 散度为一个常数,在学习算法中也就意味着这一点的梯度为 0,即梯度消失。

TV(Total Variation)Divergence

TV 散度是另一种用于衡量概率分布之间差异的指标,定义为:

TV 散度的特点包括:

  • 对称性
  • 取值范围:其值在 0 到 1 之间,0 表示完全相同,1 表示完全不同。

TV 散度与 KL 散度的比较

特性KL 散度TV 散度
对称性非对称对称
取值范围从 0 到无穷大从 0 到 1
性质不满足三角不等式满足三角不等式
适用场景适用于信息理论和统计推断适用于概率分布的相似性评估

熵 KL 散度与交叉熵

首先用一句话进行总结:KL 散度可以被用于计算代价,而在特定情况下最小化 KL 散度等价于最小化交叉熵。而交叉熵的运算更简单,所以用交叉熵来当做代价。

KL 散度

KL 散度,有时候也叫 KL 距离,主要用来衡量两个事件或者分布之间的不同。

举个不恰当的例子:

  • 事件 A:张三今天买了 2 个土鸡蛋
  • 事件 B:李四今天买了 6 个土鸡蛋

我们定义随机变量 x:买土鸡蛋,那么事件 A 和 B 的区别是什么?

有人可能说,那就是李四多买了 4 个土鸡蛋?这个答案只能得 50 分,因为忘记了”坐标系”的问题。

换句话说,对于张三来说,李四多买了 4 个土鸡蛋。对于李四来说,张三少买了 4 个土鸡蛋。

选取的参照物不同,那么得到的结果也不同。

更严谨的说,应该是说我们对于张三和李四买土鸡蛋的期望不同,可能张三天天买 2 个土鸡蛋,而李四可能因为孩子满月昨天才买了 6 个土鸡蛋,而平时从来不买。

因此对于离散事件,我们定义 KL 散度为:

观察公式我们可以得出:

  • 如果 ,既两个事件的分布完全相同,那么 KL 散度为 0。
  • 上式减号左边部分就是事件 A 的熵。
  • 如果颠倒一下顺序(求 ),那么结果就不一样了,因此 KL 散度不具有对称性。

交叉熵

现在我们已经有 KL 散度来衡量两个分布之间的不同了,那么交叉熵是用来做什么的呢?

事实上交叉熵和 KL 散度的公式非常相近,其实就是 KL 散度的后半部分:A 和 B 的交叉熵 = A 与 B 的 KL 散度 – A 的熵。

既:

因此,交叉熵的公式为:

可以观察到,当 S(A)为常量时,交叉熵等价于 KL 散度。因此我们可以有两个发现:

  • 交叉熵和 KL 散度一样,不具有对称性。
  • 对同一件事求交叉熵实际上就是求该事件的熵

那么为什么使用交叉熵来当作代价函数呢?

首选我们定义训练模型分布 P(model) [下称为 ] 以及训练数据分布 P(training) [下称为 ]。我们需要最小化两个 两个分布之间的 KL 散度。既:

但是,当给定数据集时, 一定,KL 散度等价于交叉熵,因此问题转换为了 。因此,交叉熵可以用于计算训练模型分布与训练模型分布之间的不同。当交叉熵最低时(等于训练数据分布的熵),我们学到了“最好的模型”。


当然,完美的拟合训练数据往往意味着过拟合

从 KL 的方向看 SFT 与 RL

最近在看 RL 相关的几篇论文,发现和 KL 关联紧密,然后就深入看了下 KL,Reverse KL 与 SFT,RL 的对应关系,结合与 ChatGPT 的交互思考,整理文章如下。

如果只看公式, KL 散度很容易让人困惑。它明明长得像两个分布之间的距离, 却又不满足对称性:

方向一换, 训练行为就完全不同。

这件事放到大模型后训练里尤其关键。SFT 为什么常被理解成 Forward KL?RL / RLHF 为什么又更接近 Reverse KL?on-policy distillation 为什么和传统蒸馏不一样? 这些问题背后, 其实都在问同一件事:

期望到底是在谁的分布上取的?

也就是: 样本从哪里来?轨迹由谁产生?模型是在解释别人的答案, 还是在修正自己生成出来的答案?

先理解 KL: 方向来自”期望在哪个分布上取”

KL 散度的基本形式是:

离散情况下展开就是:

这里最容易被忽略的是

它的意思不是随便比较 , 而是:

这个分布里采样 , 然后计算 的平均值。

所以 会出现在求和式前面, 成为每个位置的权重。

这不是因为 额外被赋予了权重身份, 而是因为样本本来就是从 中来的。某个 里越常出现, 它在长期采样平均中出现得就越多, 对最终 KL 的影响也就越大。

换句话说:

谁在期望符号下面, 谁就是权重来源。

如果写的是 , 那就是在 上取期望, 重点关注 会采样到的地方。

如果写的是 , 那就是在 上取期望, 重点关注 会采样到的地方。

这就是 KL 非对称性的根源。

差异不在 本身, 而在样本来自哪个分布。


Forward KL: 目标有的, 模型别漏掉

如果我们把 看成目标分布, 把 看成模型分布, 那么:

就是 Forward KL

它问的问题是:

目标分布 会出现的地方, 模型分布 有没有覆盖到?

如果某个位置 , 但 , 那么惩罚会非常大。因为目标分布认为这个地方会出现, 但模型几乎不给概率。

所以 Forward KL 最害怕的是:

目标有, 模型没有。

这会带来一种典型训练倾向:

尽量覆盖目标分布里的所有模式。

如果目标分布里有 三种合理答案模式, Forward KL 会倾向于让模型都学到。哪怕某些模式不够优雅、不够高奖励, 只要它们在数据分布里出现过, 模型就会被推动去覆盖。

所以 Forward KL 经常被称为:

  • mode-covering
  • mass-covering

如果用检索里的直觉类比, 它更像”重召回”。

它关心的是:

别漏掉目标分布里的东西。

但这个类比只是帮助理解, 不能严格等同于分类指标里的 recall。


Reverse KL: 模型生成的, 目标要认可

反过来看 Reverse KL:

如果 是模型分布, 是目标分布, 那么这就是 Reverse KL

它问的问题变成:

模型自己会生成的地方, 目标分布 是否认可?

如果某个位置 , 但 , 那么惩罚会非常大。因为模型跑到了目标分布不支持的区域。

所以 Reverse KL 最害怕的是:

模型有, 目标不认可。

这会带来另一种训练倾向:

与其覆盖所有可能模式, 不如集中到少数更安全、更高价值、更被目标分布认可的模式上。

如果目标分布里有 三个峰, Reverse KL 可能只选择其中一个最高、最稳、最容易获得奖励的峰, 而放弃其他模式。

所以 Reverse KL 经常被称为:

  • mode-seeking
  • mode-selecting

如果用检索里的直觉类比, 它更像”重精确”。

它关心的是:

模型生成出来的东西, 尽量都要落在目标认可的区域里。


SFT 为什么更接近 Forward KL

SFT 的训练形式通常是:

给定输入 和人工标注答案 , 让模型最大化 的概率。

也就是最小化:

这里的期望是在数据分布 上取的。

也就是说:

  • 训练样本来自数据分布。
  • 答案由人类标注或已有数据提供。
  • 模型要做的是在这些答案上提高概率。

从 KL 角度看, SFT 可以近似理解为最小化:

也就是:

这里 Target 是数据分布, Model 是模型分布。

所以 SFT 的基本行为是:

数据里出现过的答案模式, 模型尽量都要学到。

它更像模仿学习。

  • 人怎么写, 我怎么学。
  • 老师给了什么答案, 我就提升这些答案的概率。
  • 数据分布覆盖了哪些表达方式, 我就尽量拟合哪些表达方式。

这也是为什么 SFT 能让模型学会格式、任务、风格、指令跟随能力, 却不一定能让模型在多个候选答案里总是选出最优的那个。

因为 SFT 的核心不是”选择最优”, 而是”拟合示范”。


RL 为什么更接近 Reverse KL

RL 的结构与 SFT 不一样。

它不是只拿人工答案让模型照着学, 而是让模型自己生成, 然后通过 reward、偏好模型、verifier 或环境反馈来评价生成结果。

一个常见的 KL 正则化 RLHF 目标可以写成:

这里最重要的是 , 也就是期望在当前模型策略 上取。

  • 模型先生成。
  • 奖励再评价。
  • 策略再更新。

进一步看, 这个目标可以等价理解成模型在靠近一个 reward 诱导出来的目标分布:

于是优化目标可以写成近似:

这就是 Reverse KL 的形式:

其中 Model 是当前策略 , Target 是由 reward 和 reference policy 共同诱导出来的理想分布

所以 RL / RLHF 的核心行为是:

模型先暴露自己的生成分布, 再根据奖励信号把概率质量推向更高价值的区域。

这和 SFT 的行为很不一样。

SFT 是:

人类答案已经在那里, 模型去拟合。

RL 是:

模型自己先生成候选, 再根据奖励筛选、强化、压缩。

因此 RL 更像”学会选”。

在多个可能答案里, 哪些更有帮助, 哪些更安全, 哪些更符合偏好, 哪些更能拿到高奖励, 模型会逐渐把概率集中到这些区域。


传统蒸馏、on-policy distillation 与 KL 方向

因为最近 on-policy distillation 比较火,此处做一点延伸思考,这也是最近在看一篇 OPD 论文时所想到的:

KL 和 Reverse KL 好像和传统蒸馏、on-policy distillation 对应上了。一个是去 target 上采样, 以 target 为轨迹标准。一个是去 model 上采样, 以 model 为轨迹标准。

这个直觉大方向是对的, 但”以 model 为轨迹标准”这句话描述不太精确。

更准确地说:

传统蒸馏 / SFT

teacher / data / target 分布上取样。

老师生成轨迹, 或者数据提供轨迹。学生在这些轨迹上学习老师的分布。这是 off-policy 于学生 的, 因为训练轨迹不是学生自己走出来的。

on-policy distillation / RL

student / model / policy 分布上取样。

学生自己生成轨迹, 把自己真实会遇到的状态、错误、偏差暴露出来。老师、奖励模型或 verifier 再对这些轨迹给反馈。这是 on-policy 于学生 的, 因为训练轨迹来自学生当前策略。

但需要注意:

model 采样, 不等于 model 是标准。

在 on-policy distillation 里, 学生生成的轨迹只是”训练发生的位置”, 不是”正确答案的来源”。

真正的标准仍然来自 teacher。

  • 学生走到哪里, 老师就在哪里给反馈。
  • 学生生成什么, 老师就在这些生成内容上给出 logits、偏好、纠错信号或奖励。

所以更准确的表达是:

  • 传统蒸馏: 老师先走, 学生学老师走过的路。
  • on-policy distillation: 学生先走, 老师在学生真实走到的位置上纠偏。
  • RL / RLHF: 模型先生成, 奖励告诉模型哪些生成更值得保留。

这样对应之后也会发现 KL 真的无处不在,与 RL 有着紧密关联。而在后两者 RL 中, model 只是轨迹来源, 不是评价标准。


支持集错配: 为什么方向会改变惩罚对象

KL 的方向之所以重要, 是因为它在支持集错配时惩罚对象完全不同。

看 Forward KL

如果 , 但 , 那么:

这说明:

目标分布认为 会出现, 但模型完全不给概率。

Forward KL 会严重惩罚这种情况。所以它怕漏掉目标模式。

但如果 , , 那么这一项是:

按照极限约定, 这一项不产生惩罚。因为 根本不会采样到这个地方。

再看 Reverse KL

如果 , 但 , 那么:

这说明:

模型会生成 , 但目标分布完全不认可。

Reverse KL 会严重惩罚这种情况。所以它怕模型跑到目标分布之外。

这就是两种 KL 行为差异的数学根源。

  • Forward KL: 怕目标有、模型没有。
  • Reverse KL: 怕模型有、目标不认。


为什么这会影响大模型后训练

理解这件事后, 就能更清楚地看 SFT 和 RL 在后训练里的分工。

SFT 主要解决的是:

  • 模型会不会按照人类示范去做。
  • 模型能不能学会任务格式。
  • 模型能不能覆盖训练数据中的回答方式。
  • 模型能不能建立基本的指令跟随能力。

所以 SFT 更像打底。

它把模型从预训练的续写器, 拉到一个能理解指令、能按格式回答、能模仿人类示范的状态。

但 SFT 的问题也很明显。

  • 如果数据里有噪声, 模型会学噪声。
  • 如果数据里有平庸答案, 模型会学平庸答案。
  • 如果数据里多种风格混杂, 模型会把这些风格都吸收进去。
  • 如果任务需要在多个答案中选优, SFT 本身不一定提供足够强的选择压力。

RL / RLHF 主要解决的是:

  • 模型在多个可能答案中, 能不能更偏向高质量答案。
  • 模型能不能减少明显不符合偏好的输出。
  • 模型能不能把概率质量集中到更安全、更有用、更符合人类偏好的区域。
  • 模型能不能从”会做”进一步走向”更会选”。

所以 RL 更像偏好对齐和行为压缩。

它不是简单扩充能力, 而是在已有能力空间里改变概率分布, 把更好的行为提上来, 把低奖励行为压下去。

这也是为什么可以说:

SFT 让模型学会做。 RL 让模型更会选。

更细一点说:

  • SFT 学的是 demonstration, RL 优化的是 preference / reward。
  • SFT 追求覆盖, RL 追求选择。
  • SFT 更像 imitation, RL 更像 optimization。


不是 RL 都简单等同于 Reverse KL

这里还需要加一个边界。

“RL 对应 Reverse KL”这句话不是说所有传统 RL 天然都是 Reverse KL。

相对更准确的说法是:

在 KL-regularized RLHF、最大熵 RL、带 reference policy 的策略优化框架中, RL 目标可以被改写或理解成对某个 reward-induced target distribution 的 Reverse KL 最小化。

也就是:

可以对应到:

其中:

这时说 RL 更接近 Reverse KL 是准确的。

但如果是一般传统 RL, 只写成最大化累计奖励:

那它当然也是在当前策略上采样轨迹, 但不一定天然就是 Reverse KL 形式。只有当你引入熵正则、KL 正则、reference policy 或 reward-induced distribution 的解释时, Reverse KL 的结构才会显现出来。

同样, on-policy distillation 也不能简单说一定就是 Reverse KL。

因为有些方法虽然轨迹来自 student, 但在每个 student-generated context 上, 仍然可能用 teacher-to-student 的 token-level KL:

这种情况下, 它的”状态分布”是 on-policy 的, 但”动作分布上的 KL 方向”未必是 Reverse KL。

所以要区分两层:

第一层: 轨迹从哪里来?

如果轨迹来自 student / model, 那它是 on-policy。

第二层: KL 方向怎么写?

如果是 , 才是 Reverse KL。

如果是 , 仍然是 Forward KL, 只是发生在 student 访问到的状态上。

这个区分很重要。否则容易把 “on-policy” 误解成 “必然 reverse KL”。

更准确的表达是:

  • on-policy 描述的是采样轨迹来自谁。
  • Forward / Reverse KL 描述的是分布比较的方向。 两者虽然相关, 但不是同一个概念。

KL 方向形成的统一理解

现在可以把整条线串起来。

KL 不是一个普通距离, 而是一个有方向的信息代价。

方向来自:

期望在哪个分布上取。

Forward KL

  • 样本来自 Target。
  • 模型要解释 Target。
  • 目标有的, 模型别漏。
  • 行为倾向是 mode-covering。

对应到 SFT / 传统蒸馏, 就是人类数据或老师输出作为学习轨迹, 模型去拟合。

Reverse KL

  • 样本来自 Model。
  • 目标要评价 Model。
  • 模型生成的, 目标要认可。
  • 行为倾向是 mode-seeking。

对应到 KL 正则化 RL / RLHF, 就是模型自己生成, 再由奖励或目标分布筛选, 把概率集中到高奖励区域。

传统蒸馏与 on-policy distillation 的差别也可以从这里理解。

  • 传统蒸馏: teacher 生成, student 学。训练暴露的是 teacher 的轨迹。
  • on-policy distillation: student 生成, teacher 评。训练暴露的是 student 自己会走到的轨迹。

对应一句话总结:

不是谁更像”真理”, 而是谁在采样, 谁在评价。

SFT / 传统蒸馏里, target 提供样本, model 负责拟合。 RL / on-policy 类方法里, model 提供样本, target / teacher / reward 负责评价。

这也就是从 KL 方向理解 SFT、RL 和 on-policy distillation 的关键。


结语

零零散散的思考了一堆,对 KL 和 Reverse KL 似乎也有了更深入的理解,用比较通俗的话来做下收尾。

Forward KL 更像(模仿 chatgpt-稳稳接住你):

目标分布说:“我会出现的地方, 你都要接住。”

Reverse KL 更像:

目标分布说:“你自己想去的地方, 必须是我认可的地方。”

SFT 更像:

人怎么写, 我怎么学。

RL 更像:

我先生成, 再让奖励告诉我哪里更好。

on-policy distillation 更像:

学生先暴露自己的轨迹, 老师再针对这些轨迹给与细致反馈。

关键不是公式长得多复杂, 而是那一个小小的期望符号:

谁在这里, 谁就定义了训练看见的世界。