打开网易新闻 查看精彩图片

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

把 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(用户轮为空,末尾直接跟一个

)、System Template(只加一行领域指令)、WildChat Prompt(192,824 条真实用户闲聊,保守判定下只有 0.17% 与数学相关)。

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

打开网易新闻 查看精彩图片

不过,input 也不是任意一段文本都可以。如果模板在开始后立即闭合

区块,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 训练范式。