今天吃完午饭,看到我的某个兼容性测试因为同事提交的一个 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.00EOPD 是他们自己的方法,暂时不管,因为我对涨点没兴趣。
花里胡哨的方法一般不会流传下去,它没有揭露问题的本质复杂度。
你能看到,反向 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 散度。