ROSD:让自蒸馏去"改错",而不是去"抄答案"

上周在调一个 OPSD 训练的时候碰到个特别拧巴的现象:训练曲线在 in-domain 上越来越漂亮,loss 也在掉,但拿到 OOD 上一测——模型像换了一个人。这种"训得越多越窄"的痛感,估计做过 self-distillation 的同学都体会过。

最近这篇 ROSD(Reflective On-policy Self-Distillation)把这个问题拎出来掰开讲了一遍。它没堆什么花哨的新损失,核心就两件事:让 self-teacher 不要再盯着标准答案抄,让蒸馏只发生在"真出错的那一段"。一个工程意义上挺朴素的改造,但在 OOD 上的提升幅度大得让我看了一下午。

核心摘要

在 LLM 的强化学习后训练里,标准的 On-Policy Self-Distillation(OPSD)思路是:让 self-teacher 看到一份正确解,再用 token-level KL 把 student 往 teacher 拉。听起来是好事——dense 监督嘛。但作者发现两个隐性陷阱:第一,teacher 一旦看到 reference solution,就会把"答案路径"整套带进来,student 学到的是训练域的写作风格而不是纠错能力;第二,对整条 response 都蒸馏,会把那些原本就对的前缀也一起改掉。结果就是 in-domain 提升有限、OOD 严重退化(Qwen3-4B 在 ToolUse 训练后的 OOD 平均掉到 2.88 个点,几乎废了)。ROSD 的方案是先用一个 self-reflector 从错误 rollout 里抽出 corrective idea 和 error quote,corrective idea 喂给 teacher 当条件、error quote 在原 rollout 里定位到第一处出错的位置,蒸馏只从那个位置往后做。Qwen3-4B 在 ToolUse 上 OOD 平均拉回到 41.31 个点——同一个 setup 下的差距。这篇论文不是底层算法突破,是把"自蒸馏到底要蒸馏什么"这件事重新想了一遍,工程含金量高。

arXiv ID:2605.28014
链接:https://arxiv.org/abs/2605.28014
作者:Ziqi Zhao, Xinyu Ma, Liu Yang, Yujie Feng, Daiting Shi, Jingzhou He, Xin Xin, Zhaochun Ren, Xiao-Ming Wu
单位:The Hong Kong Polytechnic University · Baidu Inc. · Shandong University · Leiden University
日期:2026/05/27
代码:https://github.com/ZiqiZhao1/ROSD


1. 为什么 OPSD 看起来很美但用起来翻车

先把背景捋清楚。RLVR(带可验证奖励的强化学习)在数学、代码这种"答案能验证"的任务上是主流,GRPO 就是典型代表。但 GRPO 有个老问题:reward 是 response 级的,整条 rollout 共享同一个 advantage,token 之间没法区分对错——前面 5 步全对、第 6 步走偏、最后答案错了,所有 token 都被打同一个负分。

OPSD 这一系(SDPO、SDFT、OPSD 原方法等)想解决的就是这个 credit assignment 问题:让一个 self-teacher(同一份模型权重)拿着额外的 privileged context(比如标准解或者一个 successful rollout)算出 token-level 的下一步分布,再用 KL 把 student 的分布往 teacher 拉。论文里的 SDPO 是这一套的代表:

\[\mathcal{L}_{\mathrm{SDPO}}(\theta)=\sum_{t=1}^{T}\mathrm{KL}\big(\pi_{\theta}(\cdot\mid x,y_{\lt t})\,\|\,\text{stopgrad}[\pi_{\theta}(\cdot\mid x,c,y_{\lt t})]\big)\]

c 是给 teacher 的额外条件(比如一条正确 rollout)。看起来很合理——dense 监督、信号还跟当前 policy 对齐。

但作者跑了个 pilot study(Figure 1 左图)就发现不对劲:

图1:Pilot study + 三种后训练范式对比。左:在 Material 上训练,in-domain 上 SDPO 早期猛涨后掉头向下,OOD(ToolUse)几乎一路下滑;右:(a) RLVR 只给 outcome 反馈,(b) SDPO 全 response 蒸馏,(c) ROSD 只蒸馏 error quote 定位的红色 suffix

图 1:左侧 pilot study 显示 SDPO 训着训着 in-domain 不稳定还会掉,OOD 直接退化;右侧三个面板对比了 RLVR / 标准 OPSD / ROSD 的监督方式——绿色是合法前缀、红色是错误后的 suffix,ROSD 的核心是只在红色那段做蒸馏

我第一次看到这个图的时候有点愣。一个号称"提供 dense 监督"的方法,怎么会跑着跑着 in-domain 都开始下滑?作者给的诊断挺到位:

问题一:teacher 条件给了"标准答案",学的就是答案的风格。SDPO 的 c 通常是一条 verified solution。teacher 拿到这个再算分布,本质上是在告诉 student"按这个路径走"。但训练域的 reference solution 有它自己的表述习惯、领域专有词、思考链格式——这些跟"如何修正错误"没关系,是噪声。student 内化的是这套训练域风格,换到 OOD 直接掉链子。

问题二:full-response 蒸馏会覆盖已经对的前缀。一个错误 rollout,错误往往是局部的——可能就是中间某一步符号搞反了。但 SDPO 不管这个,整条 response 都拉向 teacher。前面那些原本合法的推理步骤,被强行往 reference 风格挪。这就解释了为什么训得越久 OOD 反而越差:模型在系统性地把自己原本的推理多样性磨平

说实话,这个诊断我是真服。它把"dense 监督一定好"这个常被默认的假设撕开了——dense 不等于 informative,关键是 dense 在哪里、dense 成什么样子。


2. ROSD 的两个改造:让 teacher 看错误、让蒸馏只盯错误段

图2:ROSD 整体流程示意——左侧 RLVR 只看最终 reward,中间 OPSD 用整份 reference 全程蒸馏,右侧 ROSD 抽出 corrective idea + error quote,teacher 看的是 idea,蒸馏只盖在 quote 之后的 suffix

图 2:把三种方法摆在一起看,差别一目了然——ROSD 把"答案"换成"反思",把"全句蒸馏"换成"错误后蒸馏"

ROSD 的整套机制可以总结为两步走:

2.1 Error-Focused Self-Reflection:换一种 teacher 条件

对每个问题 x,policy 采样 G 条 rollout,按最终答案对错切成 \(\mathcal{Y}^{+}(x)\)\(\mathcal{Y}^{-}(x)\)

对错误 rollout \(y^{-}\):从同一组里挑最短的正确 rollout \(y^{*}\) 作为对照(最短是为了鼓励反思偏向高效推理路径),喂给 self-reflector:

\[(e, q) \sim \pi_{\theta}(\cdot \mid x, y^{*}, y^{-})\]

reflector 输出两段东西,e 是 corrective idea("为什么错了、应该怎么修"的自然语言解释),q 是 error quote(从错误 rollout 里精确抠出第一处出错的子串)。

对正确 rollout \(y^{+}\):reflector 不直接复用整条 rollout,而是总结"为什么这条推理是有效的":

\[e \sim \pi_{\theta}(\cdot \mid x, y^{+})\]

这一步挺有意思。看到这个设计我的第一反应是:作者其实在做一件事——把 teacher 的输入从「答案模板」换成「思路抽象」。模板会带训练域风格,思路抽象会更接近"任务无关的纠错知识"。这个直觉跟我在做工业项目时摸到过的一个经验一致:让模型学"怎么想"比让它学"具体写法"要泛化得多。

值得注意的是,self-reflector 复用 student 的同一份模型权重,不增加模型存储——这点很务实。

2.2 Quote-Localized Self-Distillation:只盯错误段

光换 teacher 条件还不够。第二刀更狠:直接拿 q 在原 rollout 里定位错误起点:

\[k = \mathrm{Locate}(q, y^{-})\]

然后构造一个 mask,把前缀 mask 掉:

\[m_t = \begin{cases} 0, & t \lt k, \\ 1, & t \geq k. \end{cases}\]

最终的损失变成:

\[\mathcal{L}_{\mathrm{ROSD}}(\theta)=\sum_{t=1}^{T} m_t\,\mathrm{KL}\big(\pi_{\theta}(\cdot\mid x,y_{\lt t})\,\|\,\text{stopgrad}[\pi_{\theta}(\cdot\mid x,e,y_{\lt t})]\big)\]

注意几个工程细节:

  • 散度选的是 JSD(Jensen-Shannon Divergence),而不是默认 KL。这一点跟近期几篇 self-distillation 工作保持一致,作者没在论文里展开为什么 JSD,但我的理解是 JSD 对称、上界有限,对于 teacher/student 共享权重的自蒸馏更稳。
  • 如果 q 在原 rollout 里匹配不到(reflector 抠错了),就 fallback 到 k=0,等于退回 full-response 蒸馏。
  • 正确 rollout 没有 error quote,全程 mask 都是 1。

这两步合在一起,逻辑链非常顺:reflector 把"错在哪 + 怎么改"剥离出来 → corrective idea 让 teacher 别再被 reference 风格污染 → error quote 让蒸馏只发生在该改的地方。前缀有效性被保护、训练域风格被剥离,OOD 就有救了。

我个人挺喜欢这个 design 的一点是:它不依赖外部工具,不引入新模型,整个 reflection-localization 闭环全在 self 体系里完成。工程化部署的时候这种"零额外组件"的方案永远比"再训一个 PRM"友好。


3. 三类方法到底差在哪:一张表看清

方法 训练范式 Teacher 监督来源 评估范围
OPSD(Zhao 2026a) SFT 标准答案 In-domain
SDFT(Shenfeld 2026) SFT 标准答案 In-domain & OOD
SDPO(Hübotter 2026) RL 成功的 rollout In-domain
ROSD(本文) RL Self-reflection(idea + quote) In-domain & OOD

这张表(论文 Table 1)其实把 ROSD 的定位说得很清楚:在 RL 范式下、不依赖人工 golden 答案、且明确把 OOD 列为评估目标。前面几条线要么需要标注、要么没认真测 OOD,ROSD 是把这两件事一起处理的。


4. 实验:In-domain 拉得住,OOD 拉得回来

4.1 In-domain 主表

backbone 用 Qwen3-4B / Qwen3-8B,五个训练数据集:Material、Physics、Biology、Chemistry(来自 SciKnowEval L3 子集)+ ToolUse(ToolAlpaca)。每个数据集训完,在所有数据集上测 mean@16。Table 2 是 in-domain 主结果:

模型 方法 Material Physics Biology Chemistry ToolUse 平均
Qwen3-4B Base 62.90 60.63 31.63 42.92 58.55 51.32
GRPO 81.45 74.61 53.75 77.53 61.95 69.86
SDPO 73.60 68.52 55.38 76.93 60.66 67.02
ROSD 80.18 76.56 57.50 82.47 67.46 72.83
Qwen3-8B Base 59.71 59.06 32.75 41.28 57.72 50.10
GRPO 77.46 76.09 56.88 80.77 68.75 71.99
SDPO 78.46 76.41 61.13 80.71 65.81 72.50
ROSD 79.52 75.16 60.38 83.07 69.12 73.45

几个我觉得值得抠的点:

  • 4B 上 ROSD 平均 72.83,比 GRPO 高 2.97 个点,比 SDPO 高 5.81 个点。8B 上提升收窄到 1.46 / 0.95 个点。模型越大、提升越小——这一点其实蛮符合直觉的,更大的模型本身的 reasoning prior 更稳定,OPSD 的噪声相对没那么致命。但作者没有特别强调这一点,我得承认这是这个方法的一个潜在 ceiling。
  • GRPO 和 SDPO 的平均分几乎打平。这个细节很有意思——也就是说,标准 OPSD 那种"dense 监督带来 dense 提升"的预期,在公平比较下根本没兑现。这反过来印证了作者的诊断:dense 但 noisy 的监督和 sparse 但干净的监督,效果可能是一样的。
  • ToolUse 上的 +6.8 个点(Qwen3-4B)相对突出,跟下面 OOD 的故事会接上——ROSD 在 ToolUse 这种"格式化任务"上的稳定性明显好。

4.2 OOD 主表(这一段才是论文的高潮)

Table 3 是 OOD 结果,跑了 5 × 2 = 10 种训练配置,每种都给出在其他 4 个数据集 + AIME2024 上的平均分。我把最戏剧性的一组拎出来:Qwen3-4B 训练在 Material 上

方法 AIME2024 Biology Physics Chemistry ToolUse OOD 平均
GRPO 38.89 33.63 60.78 42.88 60.85 47.41
SDPO 4.86 28.46 30.29 40.03 54.87 31.70
ROSD 29.86 31.29 45.05 45.48 55.15 41.37

更夸张的是 Qwen3-4B 训练在 ToolUse 上

方法 AIME2024 Biology Material Physics Chemistry OOD 平均
GRPO 33.33 30.54 52.70 57.29 43.97 43.57
SDPO 11.11 0.88 1.09 0.49 0.83 2.88
ROSD 31.94 29.63 53.30 46.25 45.43 41.31

看到 SDPO 的 2.88% 我直接愣了一下。在 ToolUse 上训练完,SDPO 的 student 在 Biology / Material / Physics / Chemistry 上几乎全部归零——也就是说模型被训成了一个只会 ToolUse 格式的复读机。其他领域的推理能力被 KL loss 系统性抹平了。这是一个相当极端的 OOD 退化案例,ROSD 在同样 setup 下能拉回到 41.31%,差距 38 个点。

不过我得说一句公允的话:GRPO 在 OOD 上还是普遍最强的。论文 Limitations 也承认了这点——ROSD 比 SDPO 强很多,但还没到能压过 GRPO 的地步。所以这篇论文真正的贡献,是把 OPSD 这条线从"OOD 完全废"拉到了"OOD 跟 outcome-level RL 可比"。这个定位拎清楚之后,结论就比较平实了。

4.3 训练动态:稳得多

图3:在 Material 和 Chemistry 上的 in-domain 训练动态曲线,三条方法的 mean@16 随训练步数变化

图 3:ROSD 不仅收敛更快,在训练过程中曲线也更稳。SDPO 经常前期猛冲后期掉头,这种"自蒸馏的过拟合反噬"是这篇论文最直接的视觉证据

图4:rollout 准确率的 10 步滑动平均,Qwen3-8B 在不同训练数据集上的对比

图 4:训练时 rollout accuracy 的动态——SDPO 和 ROSD 都比 GRPO 收敛快(dense 监督的优势),但 SDPO 在 Material 后期有一个有意思的现象:rollout 准确率还在涨,test 分却掉了。这就是过拟合到自己采样路径的明确信号

我觉得 Figure 4 这个对比比 Figure 3 更值得看。rollout accuracy 涨但 test 掉——这种"训练越来越好测试越来越差"的剪刀差,是过拟合最经典的形态。SDPO 是在过拟合到"自己采样的成功路径风格",而 ROSD 因为只蒸馏 error span、idea 又是抽象的,避免了这种闭环过拟合。

4.4 消融:到底是哪一刀更管用

方法 In-domain (4B / 8B) OOD (4B / 8B)
SDPO 67.02 / 72.50 27.35 / 32.00
ROSD(完整) 72.83 / 73.45 42.46 / 45.96
⊢ w/o Reflection 67.56 / 70.50 38.85 / 45.58
⊢ w/o Localized Distillation 69.73 / 72.34 38.91 / 45.05

这个消融做得挺干净。两个变体分别去掉一个改造:

  • w/o Reflection:还用 reflector 定位错误位置(保留 localized distillation),但 teacher 的条件换回 SDPO 的"完整正确解"。In-domain 跟 SDPO 持平,OOD 比 SDPO 涨了 11+ 个点。说明仅 selective distillation 这一刀,就足以解决 OOD 退化问题
  • w/o Localized Distillation:保留 reflection 当 teacher 条件,但 loss 还是覆盖整条 response。In-domain 比 SDPO 涨 2-3 个点,OOD 也涨 11+ 个点。说明 corrective idea 这个 teacher 条件本身就能改善信号质量

两个改造各有各的 contribution,叠在一起最优。这个消融逻辑是讲得通的——错误定位主要救 OOD,teacher 条件主要拉 in-domain,两者互补不冲突。

4.5 错误定位的动态:模型在变好

图5:错误定位动态——左:error quote 匹配率随训练在 0.5 附近波动;右:归一化错误位置随训练在 Physics 上逐渐后移

图 5:左图说明 reflector 抠出的 error quote 大约一半能成功在原 rollout 里精确匹配(剩下的 fallback 到 full-response 蒸馏),8B 略好于 4B;右图更有意思——错误位置随训练慢慢往后挪,说明模型在"前面越来越对,错越来越靠后"

右图那个"normalized error position 单调上移"的现象给了我一个意外的启发:如果你的训练后期错误普遍偏后,那么 full-response 蒸馏的危害其实是逐步加重的——因为前面已经对的部分越来越多,每一次整段蒸馏都在更大比例地"破坏对的内容"。这反过来佐证了 localized distillation 在长训练里越来越重要。


5. 我的判断:值不值得抄回去

先说结论:这套 design 我会抄进自己的 RL 后训练 pipeline 里去试。理由:

  1. 零额外组件。reflector / teacher / student 共享同一份权重,没有引入新的模型、新的奖励器、新的标注流程。这种"轻改造"在生产环境里是最容易落地的。
  2. OOD 提升幅度大。从 SDPO 的几乎不可用(部分场景 < 5%)拉回到能用(40+%),这种跨阶的提升不是 +1 +2 个点的小修小补。
  3. 可解释性强。error quote 是人类可读的字符串,corrective idea 是自然语言反思——出问题的时候 debug 直接看就行,不像 PRM 那种黑盒打分。

但我也要泼几盆冷水:

  1. 8B 上提升收窄。In-domain 平均只比 SDPO 高 0.95 个点,比 GRPO 高 1.46。如果你用的是 30B+ 的模型,需要重新评估这个方法的边际收益。
  2. OOD 还没赢 GRPO。论文 Limitations 里写得很坦诚:ROSD 把 OPSD 拉到了能跟 GRPO 一个量级的水平,但没真正超过 outcome-level RL。如果你的核心诉求就是 OOD 鲁棒,先用 GRPO 仍然是更稳的选择,ROSD 是给你"既要 dense 监督又不想 OOD 崩"的折中方案。
  3. reflector 匹配率只有 50 个百分点左右。也就是说一半的样本会 fallback 到 full-response 蒸馏。这部分样本本质上还在用 SDPO 的方式训。匹配率能不能再往上提,是这个方法的工程瓶颈。
  4. 依赖 self-reflector 的能力。Qwen3-4B 的 reflector 能力相对弱,如果 backbone 更小(1B 级),reflector 抽 error quote 的能力会严重下降,整套 pipeline 的可用性存疑。

工程启发

如果你正在做 RL 后训练、并且观察到了以下现象,这篇论文值得仔细读:

  • 用 SDPO / SDFT / 类似 OPSD 方法,in-domain 训练曲线后期开始下滑
  • OOD 性能在跨大领域时崩盘(比如训科学 QA 测数学)。
  • 你的 student 输出"看起来越来越像训练集",多样性在丢失。

可以直接借鉴的两件事:

  • 不要把整份 reference solution 作为 teacher 条件。如果一定要给 teacher 额外信息,让 reflector 先抽一个抽象的 corrective idea,而不是塞具体答案。
  • 不要对整条 response 做 token-level KL。哪怕你不用 reflector 定位,也可以加个简单的启发式(比如只对错误答案附近的 tokens 做蒸馏),先看看 OOD 有没有改善。

行业判断

我觉得这一类「selective supervision」的思路,未来一两年会是 RL 后训练的一个明显方向。outcome-level RL 太稀疏、full-response distillation 太污染,中间这块"局部 token 级 dense 监督"的设计空间还没被充分探索。ROSD 是其中一个具体实例,做的是"reflection + quote"这种可解释路径;后面我相信还会出基于 attention rollout、基于 RM 局部打分等其他变体。这个方向的核心命题是同一个:dense 监督要对,不能对着错的目标 dense


最后再说一句。这篇论文我读完最大的感受不是它的方法多巧,而是它把"自蒸馏到底应该蒸馏什么"这个根本问题重新摆到桌面上了。当大家都在调参、堆 trick、加 KL constraint 的时候,作者退一步问了一句:teacher 看到的信息,是不是从一开始就错了?

这种"问对问题"的论文,比"答对题"的论文更耐看。


觉得有启发的话,欢迎点赞、在看、转发。跟进最新 AI 前沿,关注我