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

先说一件挺反常识的事。

你可能觉得,让一个AI模型同时学会数学、编程和逻辑推理,应该是"技能越多越强",就像一个人多学几门手艺不会互相打架。但事实恰恰相反:当研究者试图用多个"老师"模型同时教一个"学生"模型三种能力时,学生往往学了这个、忘了那个,某个能力刚练上去,另一个能力就掉下来了。这种现象有个挺形象的名字,叫能力跷跷板。

这背后藏着一个正在被越来越多公司使用的技术,叫多教师同策略蒸馏。

多教师同策略蒸馏(MOPD)*:先用强化学习分别训练出数学、编程、推理三个专家模型作为"老师",再让一个共享的学生模型去学习这些老师的行为,最终得到一个同时具备多种能力的模型,省去了部署多个专家模型分别调用的麻烦。

这套思路听起来很美好,一个模型顶三个专家用,省钱省算力。但问题来了:三个老师同时给一个学生的大脑(也就是模型参数)打补丁,谁的补丁会盖掉谁的?这篇来自蚂蚁集团团队的论文,就是冲着这个问题去的。

核心问题:参数是共享的,方向却各不相同

要理解这个矹尬的处境,得先明白一件事:语言模型的"知识"存在参数矩阵里,学数学也好、学编程也好,本质上都是在调整这些参数。

同策略蒸馏(OPD)*:不同于传统蒸馏简单模仿老师的输出分布,OPD让学生自己先生成一段回答,再让老师针对学生实际走过的这段"路径"给出逐字打分,这样能减少训练和实际使用时的不一致。

问题的关键在于,数学老师想往一个方向调参数,编程老师想往另一个方向调,推理老师又想往第三个方向调。论文里做了个特别直观的实验:在同一个模型检查点上,画出数学、编程、推理三个任务各自"最想要"的更新方向,结果这三个箭头几乎指向完全不同的地方。

这就好比三个室友合租一套房子,每个人都想按自己的喜好重新装修客厅。数学老师想把墙刷成蓝色,编程老师想装书架,推理老师想挪沙发。如果不做任何协调,直接三个人轮流按自己的想法动手,最后客厅可能谁的风格都不完整,蓝墙被书架挡住一半,沙发挪歪了还占了刷墙的地方。如果只按时间顺序轮流装修却互不沟通,最后的结果就是普通的多任务混合训练:每个人都干了活,但成果互相抵消,谁也没达到自己想要的效果。论文里测的普通MOPD方法正是这样,训练轨迹在三个任务的联合损失地形图上来回震荡,没能稳定地往低损失的方向走。

那有没有办法既让三个人都装修,又不互相拆对方的活?论文给出的答案很巧妙:先搞清楚每个人的"改动痕迹"主要集中在哪个区域,然后后面的人动手时,绕开已经装修好的那块地方就行。

这就是PMOPD的核心思路。

PMOPD到底做了什么:把参数更新的"痕迹"记下来,绕着走

论文首先发现了一个关键的几何规律:模型在学习某个任务的过程中,参数的累积变化会迅速collapse到一个低维的子空间里,而且这个子空间在训练早期就基本稳定了。

低维子空间*:想象参数空间是一个几百万维的巨大房间,但某个任务真正用到的"改动方向"可能只集中在其中十几个维度上,这十几个维度构成的小范围就是子空间。

论文用具体数字验证了这一点:只训练了20%的数据量后提取出的子空间,跟训练结束后的最终子空间,平均相似度已经达到0.62。这说明一个任务真正"在意"的参数改动方向,很早就定型了,后面大部分时间只是在这个方向上继续深挖,而不是到处乱跑。

更有意思的是不同任务之间子空间的重叠程度。论文测出数学、编程、推理三个任务两两之间的子空间相似度,只有0.133到0.151之间,几乎互不相关。

这个数字意味着什么?意味着三个任务真正需要调整的参数方向,大部分是彼此独立的,只有一小部分会打架。这就给了研究者一个思路:不需要把整个参数空间都锁死,只需要精确识别出那一小块会打架的区域,然后在训练后面的任务时,把这块区域的更新量给"扣掉"。

具体怎么扣?论文设计了一套流程。先用截断的奇异值分解(一种从一大堆数据里挑出最重要的几个方向的数学方法)从每个任务训练完之后的参数变化量里,提取出top-16个最重要的方向,组成一个"记忆库"。学习下一个任务时,先算出普通的梯度(模型往哪个方向调整参数的原始信号),再把这个梯度里跟记忆库方向重合的部分砍掉,只留下跟记忆库垂直的部分去更新参数。

这里有一个特别值得展开的细节:为什么不能只处理梯度,还要处理优化器更新的结果?

这涉及到一个叫Adafactor的优化器。

Adafactor*:一种节省显存的自适应学习率优化算法,它会对参数的每个维度分别调整学习步子的大小,常用于训练大规模语言模型。

问题在于,Adafactor这类自适应优化器会对梯度的每个元素做独立的缩放。原本已经被"扣掉"打架方向的梯度,经过这么一缩放,方向又可能被悄悄转回到之前被禁止的那个区域里。

这就好比你精心把客厅里跟别人装修方案冲突的部分标记出来不去动,但工人在实际施工时,因为工具的角度问题,手一抖又碰到了那个区域。如果不做二次检查,前面的标记就白费了。所以PMOPD在梯度投影之后,还要对Adafactor算出来的实际更新量再做一次投影,确保最终真正写入参数的改动,依然跟记忆库保持垂直。

这套双重投影的设计,让论文的消融实验结果很清楚地呈现出来。在Qwen2.5-7B上,完全不做投影时三个任务的平均分是63.85,只做梯度投影能提到66.22,尤其是推理和编程任务提升明显;再加上优化器更新投影后进一步提高到66.97。两步加起来比不做任何投影高出3.12分。

任务顺序也有讲究:谁先谁后是有科学道理的

光有投影机制还不够,论文还发现了一个容易被忽略的问题:三个任务的学习顺序会显著影响最终效果。

三个任务排列组合一共有六种顺序,论文全部跑了一遍做对比。结果显示,编程→推理→数学这个顺序拿到了最高平均分65.81,而推理→数学→编程只有62.84,两者差了将近3分。

为什么顺序会有这么大影响?这跟PMOPD的保护机制本身有关。一旦某个任务的更新方向被写进了记忆库,后面所有任务的梯度都要在这个方向上"让路"。如果先保护的任务本身跟其他任务冲突特别大,后面的任务就要被迫让出更多空间,腾挪的代价就更高。反过来,如果先写进记忆库的任务跟别的任务冲突比较小,后面任务需要绕开的区域就少,训练效率自然更高。

这就像团队开会排议程。如果先讨论一个跟所有议题都密切相关、容易引发争议的话题,后面讨论其他议题时,大家会一直惦记着刚才那个话题定下的框框,反而束手束脚。但如果先讨论一个相对独立、不太会波及别的议题的话题,把它定下来后,后面讨论者能腾出的空间就更大,整体效率更高。如果不管顺序随便排,议程效率就完全靠运气。

为了不用每次都跑六种排列组合去试(这在任务更多时会指数级增长),论文设计了一个轻量级的探针方法,提前算出每个任务跟其他任务的平均无向冲突分数,分数低的排在前面。

用这套探针,论文只用60个样本一折,跑了十折测试,结果全部十折都一致地测出编程的冲突分数最低(28.04%),推理次之(35.75%),数学最高(36.97%),排序结果跟穷举试出来的最优顺序完全吻合。这说明不用真的跑完整训练,提前用小样本探一探,就能大致判断出该按什么顺序训练。

循环次数:既要让子空间站得住,又不能拖太久才回头看

除了任务顺序,论文还发现了另一个隐藏的调参维度:训练要分成几个循环来做。

所谓循环,就是把编程→推理→数学这个顺序当作一轮,重复跑几轮。论文测试了1、2、4、5、8、10轮不同的循环次数,固定总训练数据量不变。

结果出现了一个不是线性的规律:平均分从1轮的65.81,涨到4轮的66.97达到最高点,然后再往上加到10轮反而跌到65.37。

这个非单调的现象要怎么解释?论文引入了另一个诊断指标叫子空间一致性,就是比较同一个任务在不同轮次里提取出来的子空间到底像不像。测出来的规律跟平均分几乎完全同步:2轮时一致性0.487,4轮时飙到最高0.525,之后一路下滑到10轮的0.424。

这背后藏着一个两头受限的权衡。如果循环次数太多,每个任务分到的训练数据块就变短,累积的参数变化量还没稳定就被切断去做下一个任务了,提取出来的子空间自然不够可靠。但如果循环次数太少,每个任务连续训练的时间段拉得太长,同一个任务反复学习时,模型自身的轨迹会漂移得比较远,前后两次估计出来的子空间也会出现偏差。

这就像写日记的频率选择。天天写一句流水账,内容太碎,回头看根本看不出这段时间自己经历了什么有意义的变化。但如果一年才写一次,中间发生的事情太多太杂,写出来的东西也很难抓住重点,记忆已经模糊变形。四五天写一次可能刚好,既有足够的内容沉淀出规律,又不会因为拖得太久而失真。四轮循环刚好踩在这个平衡点上,短到足够及时回顾各个任务,长到足够让每次的子空间估计站得住脚。

实验结果:全面开花,不是拆东墙补西墙

论文在两个不同的模型家族上验证了这套方法,Qwen2.5-7B和Llama-3.1-8B。

在Qwen2.5-7B上,普通MOPD方法能拿到平均64.43分,而PMOPD拿到66.97分,涨了2.54分。更关键的是这个涨分不是靠某一项暴涨、另一项掉分换来的,数学、推理、编程三项全都涨了,分别涨了2.22、1.72、3.67分。

在Llama-3.1-8B上同样的趋势重复出现,PMOPD平均41.04分,比普通MOPD的38.95分高出2.09分,三项能力也全部提升。

论文还对比了另外几种方法,包括简单的参数平均合并、按批次混合任务数据的变体、以及另一篇同期工作Open-MOPD提出的能力平衡方法。这些方法里表现最好的批次混合变体也只能拿到64.83分,跟PMOPD的66.97分还有2.14分的差距。这说明单纯靠调整数据混合顺序或比例,是没办法真正解决任务之间的方向性冲突的,得靠精确识别并绕开冲突方向的几何手段才行。

写在后面

读到这篇论文时,让我印象最深的其实不是最终的分数提升,而是那张三任务箭头图。看到数学、编程、推理三个任务在同一个检查点上指向几乎完全不同的方向,我才真正理解为什么"多任务学习就是简单叠加"这个直觉是错的。这三个箭头不是稍微偏一点,而是方向性上几乎没什么关联,这解释了为什么简单混合数据训练效果总是不稳定,不是数据配比没调好,是根本没处理方向冲突这件事。

另一个让我觉得挺妙的细节是关于Adafactor优化器那个"梯度被投影后又被转回去"的问题。这提醒我一件更普遍的事:在深度学习系统里,任何一个环节的"聪明优化",都可能悄悄破坏另一个环节做的保护措施。自适应学习率本来是件好事,能让训练更快更稳,但它跟子空间保护机制放在一起时,反而成了漏洞。这种跨模块的隐性副作用,恐怕在很多复杂系统设计里都值得多想一层。

论文里那个用60个样本就能预测任务冲突排序的轻量探针,也让我想起做产品决策时常见的困境:想知道一个方案好不好,得先跑一遍完整流程才知道,成本太高。这篇论文示范了一种思路,用一个便宜的代理指标去提前预判,虽然不完美,但至少能避免盲目试错。这个思路或许能用在很多别的场景里,先想清楚有没有一个成本更低、信号方向差不多的替代测量。

还没解决的问题是,这套方法目前只测了三个任务,如果任务数量增加到十个二十个,任务之间的排列组合会指数级爆炸,那个轻量探针能不能扛得住这种规模,论文里没有给出答案。

Q&A

Q1:PMOPD是什么?

A:PMOPD是一种改进的多教师同策略蒸馏方法,通过记录不同任务在参数空间中的更新方向,并在训练新任务时把梯度和优化器更新中跟已保护方向冲突的部分去除,从而减少多任务训练中的能力跷跷板现象。

Q2:PMOPD相比普通MOPD效果提升有多少?

A:在Qwen2.5-7B上平均分提升2.54分,在Llama-3.1-8B上提升2.09分,而且数学、编程、推理三项能力全部同步提升,不存在拆东墙补西墙的情况。

Q3:为什么多教师蒸馏训练中会出现能力跷跷板?

A:因为不同任务在共享参数空间中偏好的更新方向差异很大,论文测得数学、编程、推理三任务的更新子空间相似度只有0.13到0.15左右,几乎互不相关,改进一个任务容易覆盖或干扰另一个任务已学到的能力。