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 是这一套的代表:
c 是给 teacher 的额外条件(比如一条正确 rollout)。看起来很合理——dense 监督、信号还跟当前 policy 对齐。
但作者跑了个 pilot study(Figure 1 左图)就发现不对劲:

图 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 把"答案"换成"反思",把"全句蒸馏"换成"错误后蒸馏"
ROSD 的整套机制可以总结为两步走:
2.1 Error-Focused Self-Reflection:换一种 teacher 条件
对每个问题 x,policy 采样 G 条 rollout,按最终答案对错切成 \(\mathcal{Y}^{+}(x)\) 和 \(\mathcal{Y}^{-}(x)\)。
对错误 rollout \(y^{-}\):从同一组里挑最短的正确 rollout \(y^{*}\) 作为对照(最短是为了鼓励反思偏向高效推理路径),喂给 self-reflector:
reflector 输出两段东西,e 是 corrective idea("为什么错了、应该怎么修"的自然语言解释),q 是 error quote(从错误 rollout 里精确抠出第一处出错的子串)。
对正确 rollout \(y^{+}\):reflector 不直接复用整条 rollout,而是总结"为什么这条推理是有效的":
这一步挺有意思。看到这个设计我的第一反应是:作者其实在做一件事——把 teacher 的输入从「答案模板」换成「思路抽象」。模板会带训练域风格,思路抽象会更接近"任务无关的纠错知识"。这个直觉跟我在做工业项目时摸到过的一个经验一致:让模型学"怎么想"比让它学"具体写法"要泛化得多。
值得注意的是,self-reflector 复用 student 的同一份模型权重,不增加模型存储——这点很务实。
2.2 Quote-Localized Self-Distillation:只盯错误段
光换 teacher 条件还不够。第二刀更狠:直接拿 q 在原 rollout 里定位错误起点:
然后构造一个 mask,把前缀 mask 掉:
最终的损失变成:
注意几个工程细节:
- 散度选的是 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:ROSD 不仅收敛更快,在训练过程中曲线也更稳。SDPO 经常前期猛冲后期掉头,这种"自蒸馏的过拟合反噬"是这篇论文最直接的视觉证据

图 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:左图说明 reflector 抠出的 error quote 大约一半能成功在原 rollout 里精确匹配(剩下的 fallback 到 full-response 蒸馏),8B 略好于 4B;右图更有意思——错误位置随训练慢慢往后挪,说明模型在"前面越来越对,错越来越靠后"
右图那个"normalized error position 单调上移"的现象给了我一个意外的启发:如果你的训练后期错误普遍偏后,那么 full-response 蒸馏的危害其实是逐步加重的——因为前面已经对的部分越来越多,每一次整段蒸馏都在更大比例地"破坏对的内容"。这反过来佐证了 localized distillation 在长训练里越来越重要。
5. 我的判断:值不值得抄回去
先说结论:这套 design 我会抄进自己的 RL 后训练 pipeline 里去试。理由:
- 零额外组件。reflector / teacher / student 共享同一份权重,没有引入新的模型、新的奖励器、新的标注流程。这种"轻改造"在生产环境里是最容易落地的。
- OOD 提升幅度大。从 SDPO 的几乎不可用(部分场景 < 5%)拉回到能用(40+%),这种跨阶的提升不是 +1 +2 个点的小修小补。
- 可解释性强。error quote 是人类可读的字符串,corrective idea 是自然语言反思——出问题的时候 debug 直接看就行,不像 PRM 那种黑盒打分。
但我也要泼几盆冷水:
- 8B 上提升收窄。In-domain 平均只比 SDPO 高 0.95 个点,比 GRPO 高 1.46。如果你用的是 30B+ 的模型,需要重新评估这个方法的边际收益。
- OOD 还没赢 GRPO。论文 Limitations 里写得很坦诚:ROSD 把 OPSD 拉到了能跟 GRPO 一个量级的水平,但没真正超过 outcome-level RL。如果你的核心诉求就是 OOD 鲁棒,先用 GRPO 仍然是更稳的选择,ROSD 是给你"既要 dense 监督又不想 OOD 崩"的折中方案。
- reflector 匹配率只有 50 个百分点左右。也就是说一半的样本会 fallback 到 full-response 蒸馏。这部分样本本质上还在用 SDPO 的方式训。匹配率能不能再往上提,是这个方法的工程瓶颈。
- 依赖 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 前沿,关注我