只用一条数据训练,模型居然能连涨几百步?这篇论文说 On-Policy 蒸馏一直是"数据过剩、算法饥饿"
你有没有想过一个问题:现在各家旗舰模型的后训练都在用 On-Policy 蒸馏(OPD)——Qwen3、MiMo、GLM-5、DeepSeek-V4、Kimi K3 全在名单上——但从来没人认真研究过,这套方法到底需要多少训练数据?
上周刷到清华 THUNLP 的这篇 Rethinking On-Policy Distillation II(arXiv:2609.04172),说实话看完我有点恍惚。他们干了一件特别狠的事:只拿一条 query 训练 OPD,结果模型连续涨了几百步,最后追回了全量数据训练收益的大部分。
这不对劲。一条 query 反复训练,按常理几步就该过拟合、该饱和、该崩。但它没有。
这篇论文就是来解释这个反常现象的,给出的答案我提炼成一句话:OPD 是数据过剩(data-overfed)但算法饥饿(algorithm-starved)的——数据侧一条 query 就能覆盖全量训练 71.5% 的状态空间,瓶颈根本不在数据;真正拖后腿的是算法侧,学生模型吸收教师监督的速率一直在衰减,而且衰减节奏跟你用一条数据还是一万七千条数据几乎一模一样。
这个结论对做后训练数据工程的人来说,冲击力不小。
📖 论文信息
- 标题:Rethinking On-Policy Distillation of Large Language Models II: One Training Example
- 作者:Zixuan Fu、Bingxiang He(Project Lead)、Yuxin Zuo、Haohuan Huang、Jinqian Zhang、Ruhang Xiao、Cheng Qian、Qinyu Luo、Huan-ang Gao、Yudong Wang、Zhiyuan Liu、Ning Ding、Chaojun Xiao(后两位为通讯作者)
- 机构:清华大学、中国科学院大学、东北大学、UIUC、约翰霍普金斯大学
- 链接:https://arxiv.org/abs/2609.04172
- 代码:https://github.com/Thinking-Space/One-Shot-OPD
🎯 背景:OPD 和 RLVR 到底差在哪
先把 OPV 的训练形式摆出来。On-Policy 蒸馏的核心是:学生自己采样 rollout,教师在学生实际访问到的每个前缀状态上给出完整的下一个 token 分布。用公式写就是在访问到的状态 \(s_i=(x, y_{<i})\) 上最小化逐 token 的 KL:
实践里用一个逐 token 的 advantage 来估计:
跟 RLVR(带可验证奖励的强化学习)对比,差别很清楚:RLVR 只在轨迹结束时给一个标量奖励(对了 +1 错了 0),OPD 在每一个 token 位置都有教师的分布级监督。一个是期末考试只给总分,一个是每道题每一步都有老师盯着改。
之前 One-Shot RLVR 那篇工作(wang2025oneshot)发现:RL 只用一条 query 也能训很久。这篇论文把同样的"极限控制实验"思路搬到 OPD 上——把数据供给压到最小,看看会发生什么。结果现象一模一样地出现了,但背后的机制完全不同。这正是这篇论文有意思的地方。

图1:论文的 teaser。左图是数学推理上 one-shot OPD 与全量数据 OPD 的验证准确率曲线,1000 步时 one-shot 追回了全量收益的 72%;右图是多教师 OPD(MOPD)的柱状对比,学生起点 43.49,one-shot 到 50.13,16-shot 到 52.95,已经超过全量数据的 52.83。
🧪 现象:一条 query 真的能打
实验设置铺得挺全。四个任务域(数学推理、代码生成、指令遵循、Agent 工具调用),三个模型家族的学生-教师配对,数学上还专门挑了难、中、易三条 query(按学生 8 次 rollout 的通过率 0/8、4/8、8/8 划分)。训练用 veRL 框架,每步 64 条 rollout,AdamW,学习率 \(10^{-6}\),采样温度 1.0。数学跑的是 top-\(k\) advantage(\(k=16\)),其他域用采样 token 版本。
数学上的主结果:one-shot OPD 在 MATH-500、AIME 2025、AMC 2023 三个基准上平均到 68.5,全量数据 OPD 是 69.8——300 步时追回了师生差距的 69%、全量 OPD 收益的 87%。训练动态也同步:top-16 token 重合率爬到全量水平,overlap advantage 趋近于零,熵差基本闭合。

图2:上排是三个数学基准的验证曲线(红实线 one-shot、蓝虚线全量、灰虚线教师),下排是三个对齐指标。注意 top-16 重合率和 overlap advantage 两条曲线,one-shot 和全量几乎重合——说明两种设置下学生走的是同一个对齐过程。
跨家族、跨域也都成立:

图3:R1-Distill-1.5B、Llama-3B-It、OLMo-7B-It-DPO 三个配对上,one-shot 都有稳定提升。终点分数分别从 77.1、28.2、70.8 涨到 85.5、40.2、82.4。Llama 那对基数低,涨得反而更猛。

图4:三个非数学域上,one-shot 分别追回了师生差距的 73%、66%、64%。
更让我意外的是鲁棒性这组消融:一条学生从来没做对过的 query(0/8 通过率),和一条几乎总能做对的 query,训练效果居然差不多。响应长度上限砍到 3k、温度压到 0.2,收益都还在。

图5:三个子图分别是难度、长度、温度消融,所有曲线最终都收敛到相近水平。说实话,"永远做不对的题也能当老师的好教材"这一点,我第一反应是怀疑,但数据就摆在这。
🔬 数据侧的解释:状态覆盖
为什么一条 query 能提供这么多监督?作者的切入角度我觉得是全文最值钱的地方:OPD 消耗的不是 query,是状态(state)。
一条 query 配 64 条 rollout,每条 rollout 几百上千个 token,每个 token 位置都是一个带教师监督的状态。一条 query 一步就能产出几万个监督状态。所以"一条数据"这个说法本身就有误导性——query 数严重低估了实际的监督量。
但光数状态数量没意义(每个 token 都是新前缀),得数状态的广度。作者定义了状态覆盖率:用教师最后一层 hidden vector 作为每个状态的"签名",把全量数据 OPD 整个训练过程访问过的状态收集起来,PCA 之后 K-means 聚成 200 个簇,然后看某个训练设置的 rollout 触达了多少比例的簇:
结果:一条 query 在 300 步内覆盖了 71.5% 的状态空间,其中 65.9% 在前 100 步就达成了。同一阶段验证准确率从 59.1 涨到 66.9(全量是 70.8)。

图6:左图灰色直方图是每个窗口新触达的簇数——绝大多数新状态是早期发现的,后面急剧递减;红色曲线是累计覆盖率。右图是同步的验证准确率。覆盖率的边际递减和准确率增速放缓是同步的。
当然,相关性不等于因果。可能训练得好的 run 只是顺便多逛了些状态。作者做了两组直接消融:
- 响应多样性(off-policy):固定同一条 query,一次性采 64 条轨迹冻住,嵌套子集只保留 1、4、16、64 条。唯一变量就是状态数。验证准确率单调上升:0.606 → 0.650 → 0.658 → 0.666。
- query 多样性(on-policy):用 BGE-M3 对 DAPO-Math-17K 做语义聚类,每簇取一个代表,构造 1/4/16-shot 阶梯。准确率 0.669 → 0.699 → 0.709,全量 0.708;覆盖率 71.5% → 79.8% → 98.9% → 100%。
16 条语义不重叠的 query,追平了 17000 条的全量数据。

图7:左 panel 是 off-policy 轨迹数消融,中右两个 panel 是 on-policy 的 query 数阶梯。16-shot 的准确率 0.709 和覆盖率 0.989 双双追平全量。附录还有两个控制实验:同样 16 条 query,来自 16 个语义簇比来自 1 个簇效果好得多;而固定 query 集的训练顺序不影响结果。
你想想看,这背后的推论是什么:数据的价值不在于"这道题是什么",而在于"这道题把学生带到了状态空间的哪些区域"。一条新 query 值不值钱,取决于它能不能触达之前没覆盖到的状态簇。
⚙️ 算法侧的解释:吸收速率持续衰减
数据侧说清了"为什么一条 query 提升这么多",但还有另一半问题:为什么能连涨几百步还不饱和?
作者定义了两个量。一个是距离 \(d_t\),学生访问位置上师生 log-prob 差距的平均绝对值;另一个是吸收速率 \(v_t\),一步更新能吸收掉剩余距离的比例:
然后追踪 1、4、16、全量四种训练集规模下的这两条曲线。

图8:左图是归一化后的剩余距离(对数纵轴),右图是吸收速率。关键观察有两个:一是距离全程在降,学生从没卡住;二是右图四条曲线几乎重叠——不管用 1 条还是 1.7 万条 query,吸收速率的衰减节奏一模一样。到 300 步,四个 run 各自消掉了第 30 步距离的 78% 到 84%。
等等,这个发现其实挺反直觉的。数据量差四个数量级,"消化速度"居然一样?这说明训练节奏是 OPD 算法本身的属性,不是训练集的属性。一条 query 提供的监督远没被榨干,是学生吸收得太慢,速率限制卡在了优化器那一侧。
还有一个更狠的消融:把训练状态完全冻住(off-policy,反复用初始学生采的 64 条轨迹),run 依然稳定涨了约 200 步才停。也就是说,连"新鲜状态持续供给"都不是训练能持续几百步的原因——固定的一堆状态,也得花几百步才能吸收完。

图9:off-policy(红虚线)准确率稳步涨到 200 步左右才停,对齐指标的爬升同样以百步计。on-policy 最终略高,但差距不大。新鲜状态买的是终点高度的些许提升,不是训练时长。
到这里,"data-overfed but algorithm-starved" 这个判断就完整了:数据侧一条 query 已经供应了大半个状态空间,算法侧的吸收速率却在不停衰减,而且对数据规模不敏感。瓶颈明明白白在算法。
🧩 延伸一:多教师 OPD 下结论依然成立
现在的前沿后训练流水线 often 是多教师 OPD(MOPD)——一个学生同时学多个域,每条 query 路由给对应域的教师。作者用 R1-Distill-1.5B 学生 + 数学/代码/指令遵循三个域教师做了验证。
数字很干净:全量 MOPD 把平均准确率从 43.5 拉到 52.8(对比三个域分开跑全量 OPD 的 53.8,只差 1 个点);one-shot MOPD 到 50.1;每域 16 条语义多样的 query 到 52.9,是全量 MOPD 收益的 101%。分域看,数学 93%、代码 136%、指令遵循 109%。

图10:六个 panel 分别是平均准确率、MATH-500、AMC 2023、AIME 2025、LCB v6、Multi-IF。紫色方块线(16-shot)全程贴着蓝色虚线(全量),红圆点线(one-shot)稳定落后但也一直在涨。
🧨 延伸二:连"题目内容"都可以不要
这是全文最让我坐直的一段。既然输入的价值在于"把学生引向可被教师监督的状态区域",那输入里不写题目行不行?
作者试了几种"内容空洞"的输入:一个以 <think> 结尾的空用户轮次、加一句简单系统提示的模板、以及 WildChat 里跟数学代码基本无关的通用对话 query(启发式标注只有 0.17% 跟数学相关、2.63% 跟代码相关)。
结果:这些没有题目的输入,训练效果居然跟真题目差不多——真实训练集把三基准平均从 59.1 拉到 69.8,几种 content-light 输入都能用三分之一到一半的 rollout token 量达到同等水平。显式的域内容对最终成绩的影响只有 1 个点左右。

图11:左图按训练步数、中图按累计 rollout token 数看验证准确率,几条线几乎缠在一起。右图 actor 熵很有意思:WildChat 的熵显著更高(输出更杂),但照样能训。
当然作者自己也踩了刹车:这不等于"内容普遍无用"。一个立刻闭合 <think> 块的脚手架会直接坍缩成没法训的元回复。准确的读法是:内容不是有用信号的唯一来源,输入同时是个"状态发生器"。
坦率的讲,这个实验我觉得是全文最 provocative 的部分,也是最容易被误读的部分。它否定的不是"数据质量重要",而是"数据质量 = 题目质量"这个等式。
⚔️ 延伸三:和 one-shot RLVR 的正面对比
同一个中难度 query,one-shot OPD vs one-shot RLVR(GRPO),控制 batch 和预算。
1000 步下来,OPD 闭合了 72% 的师生差距,验证收益是 RLVR 的两倍多。机制上的解释很漂亮:RLVR 的信号来自轨迹结果的变化,一旦这条 query 被稳定做对,组内 rollout 几乎全对,GRPO 的 advantage 归零,信号枯竭——你能从训练准确率曲线看到它早早顶到 90%+ 平台期,熵也塌了。OPD 不依赖结果变化,题做对了之后局部的师生分布差距还在,信号就还在。

图12:左图验证准确率,OPD(蓝)一路涨到 0.69 附近,RLVR(红)在 0.63 徘徊;中图训练准确率,RLVR 很快饱和——信号没了;右图熵,RLVR 塌到 0.3 以下,OPD 稳在 0.6。
不过要注意天花板不对称:RLVR 不被教师分布绑死,理论上能超过教师;OPD 的目标是逼近教师,上限就是教师。这是两条路线的本质 trade-off。
🤔 我的判断
这篇论文值钱的地方,我排个序:
第一,状态覆盖这个视角。 把"数据价值"从 query 层面拽到状态层面,给了数据工程一个可操作的新坐标——以后选数据问的不是"收多少题",而是"这些题把学生引向哪些状态区域、那里有没有教师监督"。16 条语义多样 query 追平 17K 全量这个数,对预算紧张的团队是实打实的省钱信号。
第二,"algorithm-starved"这个诊断。 它把 OPD 改进的焦点从数据侧挪到了步数效率侧:一批 rollout 能不能在 trust region 约束下复用几个 epoch?能不能按 token 还携带多少教师信号来加权?这些 future work 方向都很具体。
但也要泼几盆冷水:
- 状态覆盖率是个相对指标。 它是相对"全量数据 OPD 访问的空间"测的,而且每个簇等权重——一个被访问一万次、监督信号早已榨干的簇,和一个只摸过一次的簇,在这个指标里一样。它能解释现象,但离"不跑全量就能预估覆盖率"还有距离,作者自己也承认。
- 规模可疑。 全部实验都是 1.5B 到 7B 的小模型,师生差距都不算大。前沿模型上"16 条追平全量"是否成立,完全未知。小模型蒸馏的容错空间本来就大。
- 模板/WildChat 实验容易被过度解读。 "空输入也能训"成立的前提是有一个和任务域对齐的教师。换个大域不匹配的教师,我猜结论会塌。论文没做这个消融,算是个缺口。
跟同期工作比,这是 Rethinking OPD 系列的第二篇(第一篇偏算法机制),这篇把数据维度补齐了。它谈不上底层突破——状态覆盖是测量工具而非新方法——但它改变了我对 OPD 数据工程优先级的判断。这种"改变你怎么想问题"的论文,我觉得比多刷两个点的论文值钱。
📝 收尾
如果你在做后训练数据工程,这篇论文的直接启发是:别再纠结题目数量了,先想清楚你的 query 把学生带到了哪些状态区域,教师在那里能不能给出信号。如果你在做 OPD 算法本身,真正的金矿在吸收速率那一侧——为什么每一步只能消化剩余差距的固定比例,而且越消化越慢?这个问题论文没有回答,但它把问题指出来了。
觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我