大模型蒸馏损失函数到底选正向 KL 还是反向 KL

前言

今天吃完午饭,看到我的某个兼容性测试因为同事提交的一个 PR 而爆炸了让我心态微微爆炸。细细一看,是增加了 MOPD 的支持导致数据加载器行为超出设计预期了,我便简单了解了一下 MOPD 的损失函数设计。

发现这里面涉及到了正向 KL 散度和反向 KL 散度的问题,这回到了很早之前写的一篇博客的内容:从信息论重新深入理解交叉熵损失。

所以时隔几年,再次记录一下。

问题背景

先简单写一下模型蒸馏(Model Distillation)的问题背景。

假设我们给定一组输入 prompt $x\sim\mathcal D$,记它的输出序列为 $y=(y_1,\ldots,yT)$。我们要训练的模型,也就是策略网络,记作 $\pi\theta(y\mid x)$,根据常识,显然有

$$

\pi_\theta(y\mid x)

\prod{t=1}^{T} \pi\theta(yt\mid x,y{}) $$ 但是我们的模型太弱了,或者想要变得更小一些。这时候就需要一些更强的模型充当 teacher,假设我们现在在编程,医疗,法律等等场景中都有对应的强模型,我们记这些模型为:

$$ \pi_{\phi_d}(y | x) $$ 其中 $\phi_d$ 就代表第 $d$ 个领域。

模型蒸馏就是要找到一种算法 $\mathcal A$,使得可以很好让我们需要训练的学生模型 $\pi\theta$ 在某些或者全部场景中都更加靠近教师模型 $\pi{\phi_d}$。

MOPD 这篇文章的思路就是,先让学生模型自己先 rollout 拿轨迹:

$$ y\sim\pi_\theta(\cdot\mid x) $$ 然后拿这个轨迹路由到对应领域的教师模型上:

$$ d = r(x) $$ 这个 r 就是判断当前提示词问的问题属于哪个领域场景。送到对应教师模型后,就走一遍教师模型的前向,算出这条轨迹上每一个 token 的概率,然后做 SFT,让学生模型在这些 token 上的概率要尽可能往教师模型去靠拢,从而构建出 MOPD 的损失函数:

$$

\mathcal L_{\mathrm{MOPD}}(\theta)

\mathbb E{x\sim\mathcal D} \mathbb E{y\sim\pi\theta(\cdot\mid x)} \left[ \frac1T \sum{t=1}^{T} D{\mathrm{KL}} \left( \pi\theta(\cdot\mid x,y{}) \middle| \pi{\phi{r(x)}}(\cdot\mid x,y{}) \right) \right]\

$$疑惑 1:为什么是让学生模型 rollout?

看完这篇文章后,我觉得思路很自然,但是仍然有几个技术层面的疑惑,第一个就是为什么采样 rollout 的策略网络是用的学生模型而不是教师模型。两者的性能差异如何?

MOPD 这篇文章解释地比较清楚了,因为最终推理时学生面对的是自己的历史输出:

$$ yt \sim \pi{\text{student}}(\cdot | x, y_{}) $$ 这里的状态还是采样自学生自己的状态空间,而不是教师模型的,所以 rollout 的采样应该让学生自己来。这个也是非常符合直觉的,直觉上,学生学习新本领,就应该代入自己的视角而不是自己厉害的老师的。

所以这个疑惑算是解除了。

疑惑 2:为什么损失函数是反向 KL 散度?

我注意到最终的损失函数本质上是一个反向 KL 散度,这让我立刻联想到了我之前的这篇文章里对正向和反向 KL 散度对训练结果异同的讨论:从信息论重新深入理解交叉熵损失。结论也比较明确:正向 KL 散度是 mode cover 的,这种训练方法会尽可能兼顾目标分布的各种特殊情况;反向 KL 散度是 mode seeking 的,它倾向于找到目标分布中模点最为显著的那部分去拟合。不过在实验中,这两者并没有显著差异。

所以我在想,这类蒸馏任务中,正向和反向 KL 散度会对结果有什么影响吗,ChatGPT 帮我找到了这篇论文:ntropy-Aware On-Policy Distillation of Language Models,ICML 2026。

这篇论文用了 fkl 和 rlk(正向 kl 和反向 kl 简称)跑了 opd 的实验,得到了下表的结果:

方法Math500 Avg@8Math500 Pass@8AMC23 Avg@8AMC23 Pass@8OPD-FKL67.2085.0038.4467.50OPD-RKL67.7684.8039.0670.00EOPD68.7387.6041.8875.00

EOPD 是他们自己的方法,暂时不管,因为我对涨点没兴趣。

花里胡哨的方法一般不会流传下去,它没有揭露问题的本质复杂度。

你能看到,反向 KL 在大部分数据上分数更高一些。其实仔细一想,这也是合理的。因为反向 KL 倾向于 mode seeking,如下图,$Q(x)$ 相当于我们这边的 $\pi\theta$,$P(x)$ 相当于我们这边的 $\pi\phi$:

图片图片

而一个强模型在很多场景下的输出 logits 的熵相对而言都是比较低的。比如:

$$ p_{\text{teacher}}=(0.95, 0.03, 0.02) $$ 这种情况就很符合反向 KL 的 mode seeking 的特性,就能比较学到 teacher 的特性。

你问我强模型高熵了怎么办?

还能怎么办。

换一个更强的模型呗。

结论

OPD 默认选择反向 KL 散度。