自蒸馏的反馈偏差
OPSD 如何给出反馈
OPSD(on-policy self-distillation)把反馈拆到每个词上。训练时句子由学生模型自己生成,老师是学生的一个副本,区别只在于老师额外看到标准答案或完整解法。
具体流程:
-
学生看题目 $x$,逐词生成轨迹 $y$。
-
老师副本看同一题目和学生已写前缀 $y_{<t}$,旁边附上解法 $c$;老师参数不回传梯度,随学生同步更新。
-
在每个位置对比学生分布与老师分布,用反向 KL 散度衡量差距。
-
累加所有位置的差距,更新学生参数;老师副本同步成新学生,进入下一轮。
损失函数为:
$$\mathcal{L}{\mathrm{OPSD}} = \mathbb{E}{(x,c)\sim D,; y\sim q_\theta(\cdot\mid x)} \left[ \sum_{t=1}^{|y|} D_{\mathrm{KL}}!\left( q_\theta(\cdot\mid x, y_{<t}) ,|, \bar q(\cdot\mid x, c, y_{<t}) \right) \right]$$
和 RLVR 对照:RLVR 一条轨迹只给一个二元奖励,对错之间等价于 1 bit 反馈;OPSD 在每个词位置拿到教师的下一词分布,逐词信号密度上限为 $\log_2 |V|$ bits,$|V|$ 为词表大小。
反馈的偏差
理想的逐词反馈,应当按一个词对最终答对概率的边际贡献加权:
$$p^{*}(y_t \mid x, y_{<t}) = q(y_t \mid x, y_{<t}) \cdot \frac{V_q(x, y_{\le t})}{V_q(x, y_{<t})}$$
其中 $V_q(\cdot)$ 是从前缀出发最终答对的概率。权重随这个词把答对概率往前推了多少而调整,不影响结果的词不该被强推。
实际的 OPSD 老师做不到这一点。它看过答案,不需要检查、回溯、犹豫,逐词分歧主要落在措辞和表达习惯上。原文里的典型情况是:“But"“Wait"“Hmm” 这类自查词被老师持续压下去;$24 - 2 \cdot 3$ 和 $24 - 6$ 数学等价,老师却认为前者概率更低。逐词分歧记为:
$$s_t = \log q(y_t \mid x, y_{<t}) - \log \bar q(y_t \mid x, c, y_{<t})$$
也就是说,老师衡量的是"这个词像不像一个已经知道答案的人会说的话”,而不是"这一步有没有让题目更接近做对”。犹豫和自查有时本身就是推理过程的一部分,被压掉之后,模型逐渐不再自我检查,答案外面裹上一大段套话。
偏差还有一层循环来源:师生是同一个模型,老师的表达习惯被学生学走,学生再变成下一代老师,偏向在循环里反复放大。弱模型本身推理不足,被老师拽一把尚有收益;模型越强,这种与正确性无关的偏向越容易把表现往下带。
参考文献
Kirkby, M, Psenka, M, & O’Neill, C. (2026). The bias of on-policy self-distillation (Research No. 006). Base Labs. https://labs.baseten.co/articles/the-bias-of-on-policy-self-distillation