![]()
你有没有想过这样一个场景:给一个孩子同时请了数学、编程、写作三个家教,每周固定分配两小时给每门课,雷打不动。
三个月后会发生什么?
数学家教教的内容孩子早就会了,两小时基本在浪费时间。编程刚学出点门道,正是突破瓶颈的关键期,可惜时间到了就得下课。写作才刚起步,连基础语法都没搞明白,同样只有两小时。
这不是一个假设,这正是当下大语言模型训练领域里,一个真实存在却长期被忽视的问题。
**核心问题:固定课表,浪费了谁的时间**
先说清楚背景。现在做AI大模型,一个越来越流行的做法叫"多教师蒸馏"。
**蒸馏*:这里不是化学实验室里的蒸馏,而是指让一个小模型(学生)去学习模仿一个或多个大模型(教师)的行为方式,目标是让学生模型学到教师模型的能力,同时体积更小、跑得更快。
想象你要培养一个全能型选手,但没有哪个教练是全能的。于是你找了四位专项教练:一位专教数学解题,一位专教写代码,一位专教怎么听懂并执行复杂指令,还有一位专教怎么熟练使用各种工具。你希望这个学生把四位教练的本事都学到手,最后靠一个人就能顶四个专家用。
这个思路本身没问题,业内已经有不少团队在这么干,论文里提到的MiMo-V2-Flash、DeepSeek-V4、GLM-5等都用了类似的技术路线。问题出在"怎么分配学习时间"这件事上。
目前行业里的标准做法是:训练开始之前,先定好每个领域该分多少比例的练习题,比如数学25%、代码25%、指令遵循25%、工具使用25%,然后从头到尾,雷打不动地按这个比例训练,直到训练结束。
论文的研究者做了一个很直接的实验来验证这套固定课表到底有多浪费。他们把数学、代码、指令遵循这三个领域拆开单独训练学生模型,然后观察一个叫"反向KL散度"的指标怎么随时间变化。
**反向KL散度(reverse-KL)*:可以理解成"学生和老师之间还差多远"的一个数字。这个数字越小,说明学生的回答方式越接近老师;数字趋近于零,基本就是学到位了。之所以叫"反向",是因为它是拿学生自己生成的内容去对照老师的判断,而不是反过来,这样能更真实地反映学生在实际做题时的表现,而不是死记硬背老师的答案。
结果很直观。数学领域的学习曲线,前四分之一的训练时间里断崖式下降,之后基本走平,说明学生很快就学会了,后面基本在原地踏步。代码领域下降得比较慢但一直在降,训练结束时都没看到明显收敛的迹象。指令遵循这个领域最特殊,它的绝对数值比另外两个领域高出一到两个数量级,而且到训练结束都还在持续下降,完全没有触底的意思。
三个领域,三种完全不同的节奏。
接着研究者把这三个领域放到一起,用固定的三分之一比例联合训练,再看结果。代码领域大概在第48步就进入了低KL的平稳期,数学在第96步左右达到平稳,指令遵循要等到第144步才趋于平稳。
可训练总共设计跑了256步,固定比例意味着从第48步之后,超过200步的时间里,代码领域依然拿着三分之一的训练资源,却几乎学不到新东西了。
这就是问题所在。
**固定的资源分配方式,没有考虑到每个学习任务的收敛速度天差地别这个事实。**
回到开头请家教的例子。如果数学家教发现孩子早就会了,却因为课表写死了必须上满两小时,这两小时对孩子的成长贡献几乎为零,而编程课本可以多上一小时,正好能抓住那个"刚好卡在瓶颈上"的关键突破期,结果因为课表限制,只能干巴巴地看着孩子在瓶颈期原地打转。
时间是有限的,课表定死了,浪费掉的每一分钟都回不来了。
**D3-MOPD的设计思路:把课表变成动态的**
面对这个问题,论文提出的解决方案叫D3-MOPD,全称是"面向多教师在线策略蒸馏的动态领域调度"。
这个名字听起来复杂,核心逻辑其实很简单:既然反向KL散度这个信号已经在训练过程中被计算出来了,为什么不拿它来实时调整每个领域该分配多少训练资源?
论文里有一句话我觉得说得挺到位,大意是"这个信号本来就有,只是被浪费了"。这种"废物利用"式的设计思路,某种程度上比重新发明一个全新指标更聪明,因为它不需要额外的计算成本,不需要改动核心训练逻辑,只是把已经算出来但没被充分利用的数据,重新利用了一遍。
具体怎么做的?系统里加了两个新组件。
第一个叫"离进程观察器"(off-process watcher)。
**离进程*:意思是这个监控程序是单独跑在训练主流程之外的,不会占用训练本身的计算资源,也不会拖慢训练速度,相当于一个悄悄在旁边记笔记、时不时给出建议的助教,不干扰主课老师上课。
这个观察器每隔10步就检查一次各个领域最近的反向KL走势,算出一个新的资源分配比例,写进一个状态文件里。
第二个叫"分层数据源"(stratified data source)。它负责读取观察器给出的最新比例,然后按照这个比例去组装每一批训练数据。
整个流程里,负责生成回答、负责教师打分、负责学生更新参数这几个核心步骤,统统没有被改动。改动的只有"喂给学生多少哪个领域的题"这一环。
这一点很重要。论文特意强调了这套方案"零训练开销",意思是它不会拖慢训练速度,也不会破坏现有训练流程里其他已经调好的部分,比如损失函数的具体形式、教师模型怎么训练出来的等等。你可以把它理解成给现有的生产线加了一个智能调度模块,而不是把整条生产线推倒重建。
**怎么判断一个领域"该不该多分资源"**
这是整篇论文最核心的技术设计。研究者提出,判断一个领域值不值得多投入资源,要同时看两个指标。
第一个指标叫"剩余差距"(remaining gap)。
简单说,就是当前的KL值相对于训练刚开始时的KL值,还剩下百分之多少没追上。如果一个领域当前的KL已经降到初始值的十分之一,说明大部分差距已经补上了,剩余差距就小;如果还有八成没追上,剩余差距就大。
第二个指标叫"下降速度"(descent velocity)。
意思是这个领域最近一段时间的KL值,到底是在稳定下降,还是已经趴窝不动了。这个指标专门用来区分"看起来差距很大但已经躺平不学了"和"差距大但正在快速追赶"这两种完全不同的状态。
两个指标为什么必须一起用,不能只用一个?论文给出的理由是这样的:一个领域可能剩余差距很大,但已经进入了瓶颈期,不管再喂多少题都学不动了,这时候光看"差距大"就去分配更多资源,纯属浪费。反过来,一个领域可能眼下下降速度很快,但它已经快学到头了,剩余空间本来就不多,哪怕下降速度快,能挤出来的提升空间也有限。
只有把这两个指标乘起来,才能筛选出那种"确实还有很大提升空间,而且正在积极进步"的领域,这才是真正值得多投入资源的对象。
打个比方。假设你在带一个团队冲销售业绩,有两个销售员。一个销售员的业绩离目标还差得远,但最近三个月的成交数字一直在往上爬,这种人值得给更多客户资源,因为他正在快速成长,给他更多机会能加速冲刺。另一个销售员业绩同样离目标很远,但已经连续三个月毫无起色,业绩死水一片,这时候再给他更多客户,大概率也是白白浪费掉这些商机。
如果只看"业绩差距",两个人看起来一样需要资源。只有把"业绩差距"和"最近的成长趋势"放在一起看,才能分辨出谁是真正的潜力股,谁只是暂时卡在瓶颈里出不来。
论文里对这套方法还做了一个理论证明,附在文章的附录E里。研究者假设每个领域的KL值是按指数规律衰减的(这是训练里比较常见的一种简化假设),然后推导出这个"差距乘以速度"的组合信号,近似等于"归一化之后的边际KL下降量"。
**边际下降量*:可以理解成"再多训练一点,还能挤出多少额外的进步"。这个信号越大,说明这个领域再投入训练资源,收益越明显。
这个证明的意义在于,它说明"差距乘速度"这个设计不是拍脑袋想出来的凑数公式,而是有数学依据支撑的一种近似最优分配策略。不过论文也很坦诚地指出,这个指数衰减假设不一定完全符合实际情况,好在这套方法有个"自我纠正"的机制:如果某个领域偏离了指数衰减的规律,突然进入了意外的瓶颈期,它的下降速度指标会自动趋近于零,资源分配也会随之自动减少,不需要额外的规则去兜底。
**从信号到实际比例:一套"留有余地"的转换公式**
算出了每个领域的综合信号之后,还有一步要做:把这个信号转换成一个真正能用来分配训练批次的比例数字。
论文用了一个带温度参数的softmax函数,外加一个"保底比例"设计。
**softmax*:一种常见的数学函数,作用是把一组任意大小的数字,转换成一组加起来正好等于1的比例数字,数值越大的输入,转换后占的比例也越大。
保底比例这个设计我觉得挺值得说一下。系统设定了每个领域至少能拿到10%的训练资源,哪怕这个领域的综合信号已经掉到零,系统判断它已经完全学不动了,它依然能保底拿到10%的资源份额,不会被彻底打入冷宫。
为什么要留这个保底?论文的解释是防止"灾难性遗忘"。
想象一个已经通过考试的学生,如果彻底不再接触这门课的内容,过一段时间知识会慢慢生锈,遗忘掉一部分。同理,一个已经学得差不多的领域,如果彻底断绝训练资源,之前学到的能力也可能因为长期不"复习"而慢慢退化。保留10%的最低配额,相当于让这个领域偶尔还能"复习一下",防止已经学到的本事悄悄流失。
如果没有这个保底机制会怎样?论文的实验数据显示了一个很有意思的现象:指令遵循这个领域,在训练中期一度因为下降速度放缓被大幅降低了资源分配,一路降到接近保底线附近,结果它的归一化KL值反而在这段时间从0.29爬升到了0.65,差距不但没缩小反而扩大了。好在保底机制保住了它的一线生机,后期又重新获得了资源分配,最终追了回来。
如果连这10%的保底都没有,这个领域可能就真的一去不回头了。
**批次抖动:故意加一点随机性**
论文里还提到一个细节设计,叫"批次级抖动"(batch-level jitter)。
**批次抖动*:观察器每隔10步才更新一次资源分配比例,如果这10步之间每一批训练数据的领域比例都完全一致,系统就会给这个比例加上一点随机波动,让每一批的实际比例围绕着目标比例上下轻微浮动,但长期平均下来还是等于目标比例。
这个设计初听起来有点反直觉,好不容易算出了一个精确的比例,为什么还要故意往里面掺点随机噪音?
论文的消融实验(也就是把这个设计单独去掉,看看效果会不会变差)给出了答案。去掉抖动之后,整体平均得分从62.34掉到了61.63,差了0.71分,其中掉分最明显的是两个代码类的评测,OJBench掉了2.6分,LiveCodeBench掉了1.6分。
研究者给出的解释是,对于那些已经快接近学习瓶颈的领域(比如代码),固定不变的采样比例只能带来微弱且重复的梯度信号,而随机的批次波动反而能带来一些意外的、更强的更新信号,类似给已经趴窝的引擎偶尔猛踩一脚油门,反而能把它重新推动起来。
这让我想到健身圈子里常说的"打破平台期"的做法。如果每次训练动作、重量、组数都完全一样,身体很快会适应这个固定刺激,进步速度会明显放缓。教练通常会建议偶尔换个训练方式,或者故意加大重量波动,给身体一点意料之外的刺激,反而更容易突破瓶颈。这里的批次抖动,本质上做的是同样的事情。
**实验结果:数字说话**
理论讲了不少,接下来看实际效果。
研究团队用Qwen3.6-35B-A3B作为学生模型,四个专项教师模型分别专攻数学、代码、指令遵循和工具使用,在七个评测基准上做了对比测试。
结果显示,采用固定比例的传统方法(论文里叫vanilla MOPD),最终能弥补学生和教师之间63%的能力差距。而用了D3-MOPD这套动态调度方案后,这个数字提升到了97%。
|方法|与教师差距弥补比例|达到峰值所需步数|
|传统固定比例方法|63%|143步|
|**D3-MOPD**|**97%**|**47步**|
这个97%意味着什么?意味着学生模型几乎已经把四位教师的水平都学了个七七八八,差距已经小到几乎可以忽略。而且更关键的是,D3-MOPD只用了47步就达到了传统方法需要143步才能达到的效果,速度快了大约三倍。
如果把训练步数理解成上课时间,这相当于原本要上143节课才能学到的水平,现在47节课就学到了,省下来的将近100节课的时间,完全可以拿去继续深挖那些还没学透的领域。
更让人意外的是,在七个评测基准里,D3-MOPD在三个基准上(HMMT数学竞赛、IFEval指令遵循评测、OJBench代码评测)的表现超越了对应的专项教师模型本身。而传统固定比例方法,在所有七个基准上都没能超过任何一个专项教师。
这里要澄清一下,超过教师不代表学生凭空学出了教师不具备的新本事。论文里引用了之前的研究结论,指出蒸馏这个过程本质上是在弥补已有的能力差距,而不是无中生有创造新能力。之所以能在个别指标上超过教师,是因为这几个指标本身学生和教师之间的原始差距就不算太大(比如IFEval原始差距只有5.1个百分点),稍微多学一点,归一化之后的分数就能突破1.0这个"追平教师"的分界线。
**观察四个领域资源分配的真实走势**
论文里还画了一张图,展示训练过程中四个领域实际拿到的资源比例是怎么随时间波动的,这张图很直观地印证了前面讲的所有逻辑。
代码领域的资源比例从起始的25%,一路稳步下降到大约15%,因为它是四个领域里收敛最快的,系统很早就判断它"学得差不多了",持续把资源往外挪。
省下来的资源最先流向了数学领域,数学在训练进行到60到127步这段时间里,资源比例一度冲到接近50%,因为这段时间的综合信号显示,数学是当时剩余差距最大、同时下降速度也最快的领域。
等数学在127步左右也进入平稳期之后,资源又开始转向指令遵循和工具使用这两个领域,它们的比例在150步之后分别冲到55%和50%左右,因为这两个领域本身收敛得最慢,后期依然有很大的提升空间。
这整个过程,论文里用了一个词来形容,叫"隐性课程"(implicit curriculum)。
**隐性课程*:意思是这套调度系统并没有被明确编程告诉"先学什么再学什么",但通过实时追踪每个领域的学习状态,自动形成了一套类似人类教学中常见的、循序渐进的课程安排,先集中攻克进步空间大的领域,等这个领域学到位了再转向下一个。
这一点其实挺有启发性的。人类老师带学生时,会凭经验判断"这个知识点孩子已经掌握了,该往下一个进度走了",这种判断力本身是一种隐性的教学智慧,很难写成一条条明确的规则。而D3-MOPD做的事情,某种程度上是把这种"凭经验判断学习进度"的直觉,转化成了一套可以自动运行、可以量化的机制。
**它在更大模型和更小模型上都成立吗**
论文做了一个额外的验证,把学生模型换成参数量小得多的Qwen3.5-4B,重新跑了一遍完整实验。
结果显示,在4B这个更小的模型规模上,D3-MOPD依然全面超过传统固定比例方法,七个基准全部胜出,涨幅从0.9分到4.1分不等。归一化得分方面,D3-MOPD达到了1.01,略微超过了教师团队的综合水平,传统方法只有0.86。
在收敛速度上,D3-MOPD比传统方法提前40步达到最佳平均表现,相当于节省了25%的训练步数。
这个结果说明,这套动态调度思路不是只在某个特定模型规模上凑巧管用的偏方,它背后的逻辑,不同领域收敛速度天然存在差异这件事,在大模型和小模型上都同样存在,所以这套方法在不同规模上都能起作用。
**消融实验:拆开看每个部件到底有没有用**
论文还做了详细的拆解实验,把"差距信号""速度信号""批次抖动""平滑窗口"这几个设计元素分别单独去掉,看看效果分别会掉多少。
|变体|说明|最佳平均分|
|传统固定比例|作为基准对照|61.36|
|去掉速度信号|只用剩余差距判断|61.41|
|去掉差距信号|只用下降速度判断|61.46|
|去掉批次抖动|η设为0|61.63|
|去掉平滑窗口|R设为1(单窗口)|62.17|
|**完整版D3-MOPD**|所有设计都保留|**62.34**|
有几个细节值得多说两句。
只用剩余差距这一个信号的变体,在训练早期第127步就达到了峰值,之后就开始走下坡路。原因是这个变体只能看到"当前差距还剩多少",看不出这个差距是不是还在持续缩小,所以一旦某个领域的KL数值降到一定程度,系统就误判它"够了",过早地减少了资源投入。
只用下降速度这一个信号的变体则完全相反,它要一直跑到第255步(也就是训练结束的最后一步)才达到峰值,而且过程中出现了明显的资源分配大幅震荡。因为训练刚开始的时候,所有领域下降速度都很快,单看速度根本分不出高低,系统只能靠后期速度出现明显分化之后才勉强分辨,这也导致了它整体收敛得特别慢。
这两个对照实验其实印证了前面反复强调的一个观点:单独一个指标各有各的盲区,只有两个信号结合起来,才能又快又准地找到真正值得投入资源的领域。
**写在后面**
读完这篇论文,最触动我的其实不是D3-MOPD本身的技术细节,而是它切入问题的角度。
很多AI训练领域的改进思路,倾向于往模型架构里加更复杂的组件,或者设计更精巧的损失函数。而这篇论文选择的路径完全不同,它没有碰任何核心训练逻辑,只是盯着一个训练过程中本来就存在、却被大家习惯性忽略的信号,反向KL散度,重新利用了一遍。
这让我想到一个更普遍的现象:很多低垫脚的改进机会,往往不在于发明新工具,而在于把手头已经有的工具用对地方。反向KL散度这个数字,业内所有做蒸馏的团队都在算,只是大家把它当成了单纯的损失函数输入,没人想到把它拿出来当调度信号用。
另一个值得琢磨的地方是那个"保底比例"的设计。10%听起来是个很随意的数字,但它背后其实包含了一种谨慎:不完全相信自己的判断系统百分百正确,给已经"判了死刑"的领域留一条活路。这种对自身系统局限性的清醒认知,某种程度上比精巧的算法设计更难得。
论文里也留了一个没细说的问题:如果领域数量从4个扩展到几十个甚至上百个会怎样?论文里提到"预期收益会随着领域数量增加而增长",但没有给出实际验证。这个假设听起来合理,但真到了几十个领域同时竞争有限训练资源的时候,会不会出现某种意想不到的资源抢夺或震荡现象,这大概是留给后续研究者的一个有意思的坑。
Q&A
Q1:D3-MOPD是什么?
A:D3-MOPD是一种给多教师蒸馏训练用的动态资源调度方法,它利用训练过程中本来就会算出来的反向KL散度信号,实时判断每个学习领域的剩余差距和进步速度,动态调整各领域该分配多少训练资源,而不是像传统方法那样从头到尾固定一个比例不变。
Q2:D3-MOPD相比传统固定比例的方法效果好在哪?
A:在论文的实验里,传统固定比例方法只能弥补学生模型和教师模型之间63%的能力差距,而D3-MOPD能弥补97%,并且达到同样效果只需要传统方法大约三分之一的训练步数,同时在部分评测基准上还超过了专项教师模型本身。
Q3:D3-MOPD需要改动模型的训练代码吗?
A:不需要。这套方法只改动了数据加载这一个环节,增加了一个独立运行的监控程序去调整训练数据的领域配比,模型生成回答、教师打分、参数更新这些核心训练流程完全没有被改动,也不会拖慢训练速度。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.