首页 > 资讯 > 清华团队再探On-Policy Distillation:数据撑死,算法饿死

清华团队再探On-Policy Distillation:数据撑死,算法饿死

机器之心 2026-09-17 06:00 2 阅读 查看原文


本文由清华大学联合中国科学院大学、东北大学、伊利诺伊大学厄巴纳 - 香槟分校、约翰霍普金斯大学等机构研究者合作完成。


把 On-Policy Distillation(在线策略蒸馏,OPD)的训练集从 17000 道题删到 1 道,会发生什么?


按常理,这道题很快就该被榨干。模型翻来覆去做同一道题,学个几十步也就该停了。


实际跑出来是另一回事:它连着涨了几百步没停。数学三个基准的平均分从 59.1 起步,300 步时到 68.5;作为对照,用全部 17000 道题训练,同一时刻是 69.8。一条数据已经恢复了 70% 以上的全数据收益。



这是 Rethinking On-Policy Distillation 系列的第二篇。第一篇问的是 OPD 为什么能 work,一个强的老师不一定总能让学生学得好。结论是思维模式得对得上,而分数更高不等于有新东西可教。


这次研究者问了一个更极端、也更本质的问题:为什么 OPD 在一条样本上,也能在几百步的训练中持续稳定提升,接近全量数据的效果?现有关于 OPD 的研究,大多关注训练目标、优化过程和师生模型之间的关系。相比之下,训练数据的规模与构成会如何影响 OPD,仍缺少分析。


研究者的回答是:OPD 是 "数据撑死" 但 "算法饿死"。



  • 论文标题:Rethinking On-Policy Distillation of Large Language Models II: One Training Example

  • 论文链接:https://huggingface.co/papers/2609.04172

  • 资源合集:https://huggingface.co/collections/Thinking-Space/one-shot-opd

  • 代码:https://github.com/Thinking-Space/One-Shot-OPD


一道题,能把模型训多远?


为了更清楚地观察训练题目如何影响 OPD,研究团队固定其余配置,只把数学训练集从 DAPO-Math-17K 缩减到一道题。  


在数学任务上,Student 从 59.1 起步。训练到 300 步时,单题设置恢复了全量 OPD 增益的 87%,同时缩小了 69% 的初始师生差距。继续训练到 1000 步,单题设置的验证分数为 68.4,全量 17k 道题为 72.1,对应的全量增益恢复比例降至 72%。  


单题设置在本文观察的 1000 步内没有追上全量训练。 300 步之后,两条曲线大致保持约 3 分的差距。换句话说,一道题可以获得全量 OPD 的大部分增益,但增加训练步数并没有消除它与全量数据之间的差距。


为了证明这个现象不是偶然发生的,研究者将这一设置用于 coding、instruction following 和 agentic tool use 三个任务中,单题训练分别缩小了 73%、66% 和 64% 的初始师生性能差距。然后同时,研究者在不同 model family 上展开实验,覆盖了 Qwen、Llama 和 OLMo 三组师生模型,One-Shot OPD 效果也依然不错。





此外,这个效果对训练题的性质几乎不敏感:用模型一次都没做对过的难题,同样能把它训上去。


在三道不同难度的数学题上,研究者也观察到了相近的训练增益。其中最难的一道题在 300 个训练步中始终没有被 Student 解出,但模型的验证表现仍然提高。调整回答长度上限和采样温度也取得了相似的训练增益。



单题实验由此留下了两个问题。第一,训练输入只有一道,为什么模型仍能获得这么多增益?第二,这些增益为什么又需要数百个训练步才能逐渐形成?前一个问题指向 rollout 提供的状态,后一个问题指向 Student 吸收 Teacher 监督的速度。


数据侧:一道题的 rollout,摸到了 71.5% 的状态空间


OPD 的学习单位不是题,是状态:题目加上已经写出来的那半截回答,构成模型下一步要面对的局面,每个局面都配着 Teacher 给的一个目标分布。因此,一道题并不只产生一份监督。在论文的默认设置中,每次更新包含 64 条 rollout。即使题目不变,一次更新也会包含许多带有监督的 token 位置。题目数记录的是输入有多少,却没有说明这些输入经过 rollout 后把模型带到了哪里。


为了描述状态的覆盖范围,研究者定义了 “状态覆盖率”(state coverage):把全量 OPD 访问过的状态汇成参考池、切成 200 个簇。一个训练设置访问到的簇数,占这 200 个参考簇的比例,就是它的状态覆盖率。


结果是一道题就摸到了全量状态空间的大部分,而且大半在最初几十步就摸完了。100 步时已覆盖 65.9% 的参考状态簇,到 300 步 时达到 71.5%;后 200 步新增的覆盖为 5.6 个百分点。重复从同一道题采样仍会产生新状态,但新增速度会逐渐放缓。



状态覆盖与验证表现同时提高,只能说明二者相关。研究者随后从 rollout 响应轨迹侧和 query 题目侧分别做了控制实验。


在 rollout 侧,研究者让初始 Student 对同一道题生成 64 条固定轨迹,再分别保留其中 1 条、4 条、16 条或全部 64 条,重复填满相同大小的训练 batch。随着保留的轨迹增加,验证准确率从 0.606 逐步提高到 0.666。


在题目侧,研究者从不同语义簇中选取代表性题目,构造 1 道、4 道和 16 道题的训练集。状态覆盖率分别为 71.5%、79.8% 和 98.9%;在相同训练预算下,16 道题的验证结果与全量数据基本相当。



题目数量相同,多样性仍可能不同。论文进一步比较了两组各含 16 道题的数据:一组从 16 个语义簇中各取一道,另一组全部来自同一个语义簇。前一组在状态覆盖率和验证表现上都更高;后一组的覆盖率在训练前 100 步左右达到约 76.8% 后便基本不再增长。



这些实验指向了同一个解释:在 OPD 中,一道题目的价值,很大程度上取决于它能否把 Student 带到此前没有访问过的状态。单题的输入数量虽少,反复 rollout 产生的状态却不少。加入语义上更分散的题目,还可以继续扩大状态覆盖。在本文的数学实验中,16 道从不同语义簇选出的题将状态覆盖率提高到 98.9%,并在相同训练预算下取得了与全量数据基本相当的验证结果。换句话说,在这一设置下,把整套 DAPO-Math-17K 都投入训练,并没有比这 16 道多样化题目带来进一步可见的收益。相对于当前训练能够利用的监督,数据已经撑死。


算法侧:喂多少题对吸收率几乎没有影响


状态覆盖描述有哪些监督可以使用,但不能说明 Student 使用这些监督的速度。既然一道题能提供这么多信息,为什么仍然需要几百步来消化?为此,论文进一步定义了两个训练动态指标,分别描述 “吃到哪了” 和 “吃得多快”。“距离 d” 是在 Student 当前访问的位置上,Teacher 与 Student 对实际生成 token 所给 log 概率之差的绝对值均值,用来描述二者还相差多少。“吸收率 v” 表示一次更新吃掉了剩余距离的多大比例。


第一个观察是:学生一直在进步,但越来越慢。 “距离” 整个 run 都在下降,模型从没卡住。下降的是吸收率,这也是为什么一个 run 需要几百步而不是几十步。


第二个观察才是重点:这条下滑曲线跟训练集大小几乎没关系。 1 题、4 题、16 题、全量 17k 题,四个 run 到 300 步各自吃掉了自身距离的 78% 到 84%。


一道题既不会让对齐变慢,也不会让它变快。这表明,对齐的节奏并不主要由训练题目的数量决定。



一种可能的解释是,on-policy 训练不断生成新状态,模型需要持续适应变化中的数据。为此,研究者增加了一个固定轨迹对照:始终复用初始 Student 生成的 64 条 rollout,不再从当前模型采样新状态。  



即使训练状态保持不变,验证表现仍在约 200 步内持续提高。这说明,持续产生新状态并不是长训练曲线的唯一原因;Student 对已有状态上监督的利用本身也需要多次更新。


那么,吸收速度持续下降,吸收速度持续下降, 会不会只是因为学习率不合适? 研究者在四倍范围内测试了 三个学习率。提高学习率会让模型用更少的训练步走过相近的对齐过程;但将横轴按照学习率重新缩放后,三条师生距离曲线基本重合。换句话说,在本文测试的范围内,学习率改变了对齐过程的时间尺度,却没有改变吸收速度随训练下降的整体形态。


可以总结,数据侧解释了单题训练为什么能带来较大的增益:一道题经过反复 rollout,已经可以产生较广的状态覆盖。算法侧则解释了训练为什么仍会持续数百步:随着对齐推进,每次更新能够吸收的剩余监督越来越少,而且增加题目数量没有明显改变这一趋势。这两部分共同构成了论文所说的 “数据撑死,算法饿死”。



扩展到 MOPD:每个域 16 道题,打平全量


接下来,研究者在更常见的 Multi-teacher OPD(MOPD)设置下同样进行实验,一个学生同时训多个域,每道题路由到自己域的 Teacher。结论是同样的:每个域只要十几道语义上互不相同的题,就能打平全量 MOPD。


Student 的初始平均验证分数为 43.5。300 步时,每个领域使用 1 道题是 50.1 分,增加到 16 道语义不同的题后,结果为 52.9;全量 MOPD 为 52.8,三个 Teacher 的平均结果为 55.4。



极端实验:连 “不成题的题” 也能训


顺着 “状态才是学习单位” 推下去会得到一个激进的预测:输入里的任务内容也许不是必需的。团队做了三级压力测试:空 template(用户轮为空,末尾直接跟一个 <think>)、System Template(只加一行领域指令)、WildChat Prompt(192,824 条真实用户闲聊,保守判定下只有 0.17% 与数学相关)。


三种条件都贴着真实数据的 baseline 走,而且只花了它三分之一到一半的 rollout token。 代码域上,500 步里真实数据花了 277M rollout token,空模板只花了 18M。



不过,input 也不是任意一段文本都可以。如果模板在开始后立即闭合 <think> 区块,Student 会生成很短的元层面回复,无法形成可用的训练轨迹。


因此,任务内容不是 OPD input 产生有用监督的唯一来源。input 还决定 Student 从哪里开始生成,以及 rollout 能否进入 Teacher 可以提供有效监督的状态。换句话说,评价一条 OPD input 时,除了看它提出了什么任务,也要看它能够生成什么样的状态。


最后团队把 OPD 和 RLVR 放在同一道题上做了受控对比。跑满 1000 步,OPD 的验证集涨幅是 RLVR 的两倍多,同时缩小了自己与 Teacher 差距的 72%。



不过两者的天花板是反过来的。 RLVR 不被任何 Teacher 的分布拴住,而 OPD 是被训练去匹配一个分布的。所以这不是 "OPD 比 RLVR 好",而是两件事各自受限于不同的东西:RLVR 受限于数据能提供多少结果上的差异,OPD 受限于自己吸收密集监督的速度。


结论边界与实践启示


这些实验并不意味着训练数据不重要。它们说明的是,在 OPD 中,题目数量本身未必是衡量有效监督量的合适尺度。一道题可以通过持续 rollout 产生大量不同状态,因此,即使输入题目极少,学生仍然能够获得相当丰富的训练信号。相比题目数量,更值得关注的是这些题目最终将模型带到了哪些状态,以及这些状态覆盖了多大的有效空间。


这也为数据筛选提供了一个不同的视角。模型面前摆的东西已经够多了,问题是它咽得太慢。所以在 OPD 里,评价一道训练题时,真正该问的可能不是它有多难、有多干净,而是:它能不能把 Student 带到还没有到过的地方?它带过去的那些地方,Teacher 手里是不是真的还有东西可教?这些监督,在 Student 当下的吸收速度下,几百步里真的吃得完吗?


Rethinking OPD 系列的两篇合起来,落点其实是同一个:OPD 里稠密的奖励不是免费的午餐,稀缺的从来不是供给。第一篇说的是,教得更好的 Teacher 不一定是分数更高的那个;这一篇说的是,喂得更多的数据不一定是学生此刻吃得下的那些。


「贪多嚼不烂」这句老话,在模型这里似乎也成立。这篇工作更多是 “提出问题,给出一个视角”,而不是 “给答案”。我们觉得 state 这个视角比 OPD 本身要宽,它可能也适用于其他 on-policy 训练范式。


图片


© THE END 

转载请联系本公众号获得授权

投稿或寻求报道:liyazhou@jiqizhixin.com