
你有没有想过,一个号称拥有百亿参数的超大模型,实际上每次回答问题时,可能只用到了其中很小一部分?
这听起来有点反直觉。我们总以为模型越大越聪明,参数越多算得越准。但现实是,像混合专家模型这样的架构,恰恰是靠"偷懒"才做到既聪明又省电的。
混合专家模型*:一种神经网络架构,把原本一个超大的前馈网络拆成很多个小的"专家"子网络,每次只激活其中几个来处理当前的输入,而不是全部用上。
这就好比一家医院不可能让每个病人都看遍所有科室的医生。你发烧了,分诊台会把你送到内科,不会浪费心脏外科专家的时间。混合专家模型的"路由器"就是这个分诊台,它负责判断每个词该交给哪几个专家处理。Switch Transformer和GShard这些早期系统都是靠这套机制,让模型总参数量涨上去,但每次实际计算量基本不变。
问题来了:分诊台也会犯错。
**路由器不是神,它的判断基于概率打分,而不是绝对正确的医疗诊断。**
当路由器判断失误,或者为了让各个专家都忙起来、不出现有的专家闲得发霉、有的专家累到爆的情况,它会人为地把一些病人送到不那么对口的科室。这时候问题就浮现了:那些偶尔被选中、但平时很少接单的专家,因为训练数据不够、梯度更新不够频繁,水平往往比不上那些长期当红的"主力专家"。
于是出现了一个很尴尬的局面:模型整体利用率看起来很均衡,但一旦路由走了"非最优但说得过去"的那条路,病人就可能被不够格的医生接诊了。这篇论文把这个问题点得很清楚:之前大家只在乎"流量分配均不均",却没人真正关心"每个专家接诊的时候到底靠不靠谱"。
这是一个被长期忽视的裂缝
一直以来,解决专家负载不均衡的办法,基本思路都是加一个"均衡惩罚"。你让某个专家接的单特别多,就扣它的分,逼着路由器把活儿分散开。GShard用的是一种KL散度式的辅助损失,Switch Transformer干脆简化成只选一个专家来降低复杂度,后来还有BASE Layers、Expert-Choice路由等各种变体,核心思路都没变:想办法让流量更均匀。
辅助损失*:训练过程中额外加的一个惩罚项,专门用来约束路由分配的均匀程度,和模型本身要学的任务损失是分开的两件事。
但你细想一下,均匀分配流量,和每个专家都训练得足够好,根本是两件事。
这就好比一个连锁餐厅为了"公平",强行把客流平均分配到每家分店,哪怕某家分店的厨师经验明显不足。客流均衡了,但那家分店做出来的菜可能还是不行。如果不解决厨师本身的训练问题,光靠调度客流,顾客迟早会在某次"随机被分配"到那家店时吃到难吃的菜。
更麻烦的是,专家专精本来是混合专家模型的优点,你希望某个专家特别擅长处理代码,另一个特别擅长处理诗歌。如果强行把所有流量都拉向均匀,反而会抹掉这种有益的分化。这就是论文提出DRMoET的出发点:均衡和稳健其实是两件可能互相打架的事,得找一个不以牺牲专精为代价、同时还能让"冷门路径"更靠谱的办法。
DRMoET:把每个专家当成一个"风险小组"
论文提出的方法叫做分布鲁棒混合专家训练(DRMoET)。
分布鲁棒优化*:一种不追求"平均表现最好",而是追求"最坏情况也不能太差"的优化思路。传统的训练是把所有样本的损失平均起来降到最低,分布鲁棒优化则会额外关注那些损失特别高、表现特别差的子群体,想办法把它们也拉上来。
这个思路最早不是用在混合专家模型上的。像Group DRO这种方法,通常用在性别、地域这种人为划分好的群体上,比如模型在女性用户和男性用户上的表现差距。但DRMoET的聪明之处在于,它把每一层里被路由选中的专家,当成了一个个"内生性的风险小组"。这些小组不是人工预先定义的,而是随着训练过程、随着路由器实时产生的。
具体怎么做?论文设计了一套流程,核心是三步。
第一步是算清楚每个专家到底该为哪部分损失"背锅"。一个词被路由到某个专家,这个专家处理完之后产生了多大的激活、路由概率给了多少权重,这些信息被组合成一个叫做"激活加权信用"的指标,用来衡量这个专家对当前这个词的损失到底有多大责任。
激活加权信用*:结合了路由概率大小和专家输出激活强度两个因素算出来的一个权重,用来决定某个专家对某次损失该承担多少责任,这个权重本身不参与反向传播,只是作为一个固定系数使用。
第二步是用指数滑动平均来追踪每个专家的历史表现,避免某一个批次的随机波动把统计数据带偏。
指数滑动平均*:一种统计平滑手段,新数据进来时不是完全替换旧数据,而是按一定比例混合新旧数据,这样可以避免单次异常值造成剧烈波动。
第三步,也是最关键的一步,是用一个熵正则化的softmax规则,动态调整每一层里不同专家被"重视"的程度。损失越高的专家,会被赋予更高的权重,这个权重会反过来放大该专家对总损失的贡献,让梯度更新对它更"狠"一些。
这里有一个很值得琢磨的技术细节。论文特别强调,他们实际实现的更新公式是在概率空间上做softmax,不是在对数空间上做乘法式更新。这两者看起来很接近,但数学性质完全不同。论文在附录里专门证明了,概率空间的这个版本其实等价于在一个加了熵正则项和二范数正则项的目标函数上做"镜像上升",这保证了整个优化过程有严格的收敛性保证,不是拍脑袋设计的经验公式。
如果不这样设计会怎样?论文给出的理论分析指出,这种正则化版本的目标函数和真正"硬性"的最坏专家目标函数之间,误差被严格控制在Llog E除以η这个范围内(L是层数,E是专家数,η是步长参数)。这意味着DRMoET不是在无原则地瞎调权重,而是在用一个数学上可控的近似,去逼近"真正该优先解决最坏情况"这个理想目标。
整个过程不需要改动路由器本身,也不需要新增额外的前向计算,只是在已有的损失基础上做了一次重新加权。论文测算过,这套机制带来的额外计算量,相比专家前馈网络本身的计算量,是一个非常小的比例,几乎可以忽略。
两个规模的实测:数字说话
理论听起来挺美,但真正说服人的还是实验数据。
论文在两个规模上做了从零开始的预训练实验,分别是2.9亿参数激活、总共7.46亿参数的小模型,和17亿参数激活、总共103亿参数的大模型。训练数据用的是DataComp-LM语料库,小模型训练了大约335亿个token,大模型训练了约670亿个token。
在7个下游任务上(包括ARC科学推理、HellaSwag常识推理、PIQA物理常识、WinoGrande代词消解、SciQ科学问答、ReCoRD阅读理解),大模型规模下,标准的FLAME-MoE基线七项任务平均分是0.6625,而业界常用的"无辅助损失平衡"方法只拿到0.6431,反而更差。DRMoET用η=0.01这个参数设置,把平均分拉到了0.6767。
这个提升幅度大概是多少?从0.6625到0.6767,绝对提升1.42个百分点,相对提升2.14%。
| 规模 | 方法 | 七任务平均分 |
|---|---|---|
| 103亿参数(67B tokens) | FLAME-MoE基线 | 0.6625 |
| 103亿参数(67B tokens) | 无辅助损失平衡 | 0.6431 |
| 103亿参数(67B tokens) | **DRMoET(η=0.01)** | **0.6767** |
| 7.46亿参数(33.5B tokens) | FLAME-MoE基线 | 0.5403 |
| 7.46亿参数(33.5B tokens) | **DRMoET(η=0.001)** | **0.5523** |
小模型规模下,同样的趋势也成立,DRMoET的最优配置把平均分从0.5403提到了0.5523。
数字背后,到底发生了什么
光看下游任务分数提升,还不足以说明问题的本质。论文接着做了一系列"显微镜式"的分析,专门去验证DRMoET是不是真的在解决"路由不靠谱"这个核心问题,而不是碰巧蒙对了。
第一个分析是专家损失分布。研究者在收敛后测量了每个专家各自的损失水平,结果显示DRMoET把最差专家的损失降低了2.05%,同时平均损失几乎没变(只变化了0.05%)。损失的标准差和变异系数都下降了超过8%。
这组数字说明了一件挺重要的事:DRMoET不是靠"降低整体难度"来拿分,而是专门把那些特别差的专家拉上来,同时没有让表现好的专家变差。这正是分布鲁棒优化想要达到的效果,不是让所有人都变得平庸,而是把短板补上。
第二个分析更直接,叫"强制中位k错误路由探针"。这个实验设计得很巧妙:研究者故意把每个词原本该走的"最优专家组合"换成"中等排名的专家组合",模拟路由器判断失误时的真实场景,然后测量这种人为制造的错误路由会导致多大的损失上升。
结果显示,基线模型在正常路由下损失是3.187,强制错误路由后飙升到7.249,相当于损失翻了2.27倍。而DRMoET训练出来的模型,正常路由损失是3.182(几乎一样),错误路由后的损失是7.071,翻了2.22倍。
这个差距看起来不大,但它恰恰验证了论文最核心的主张:当路由器判断失误、把词送到了"说得过去但不是最优"的专家手里时,DRMoET训练出的模型受到的伤害要小4.3%。
这就像两家医院都遇到了分诊失误,病人被送到了不太对口的科室。普通医院的那个科室医生水平确实不够,耽误病情会很严重。而经过特殊培训的医院,哪怕是"非对口"科室的医生,也接受过足够的交叉训练,起码能先稳住病人情况,不至于让一次分诊失误酿成大祸。如果没有这种交叉培训,每一次路由失误都是一次实打实的事故,而不是可以被缓冲的小插曲。
第三个分析是按专家的使用频率,把所有专家分成高、中、低三档,再单独看每一档在DRMoET训练下的表现变化。结果发现,中档专家(既不是最热门也不是最冷门的那批)改善最明显,提升了0.7%。这和论文的核心逻辑吻合:路由器出错的时候,最容易被"误送"过去的往往就是这些中间档的专家,DRMoET恰好是在加强这部分。
研究者还专门测试了模型在从未见过的六个基准数据集上(4.2M token的分布外样本)的表现,结果发现损失的离散程度(标准差、变异系数)都明显降低,说明这种稳健性不只局限于训练数据内部,在陌生场景下依然有效。
专精会不会被牺牲掉?
一个很自然的担心是:如果强行让冷门专家也变得靠谱,会不会把原本应该很专一的专家搞得"四不像"?
论文专门做了功能专精度的测量,用了四个指标。最大选择性衡量每个专家在哪个领域被选中的比例最高;选择性边际衡量专家对首选领域和次选领域的区分度有多大;能力优势衡量专家在自己擅长领域表现到底比其他领域好多少;互信息衡量专家选择和功能领域之间关联的紧密程度。
结果是,这四个指标在DRMoET训练下全部提升,其中能力优势这一项提升了30.2%,互信息提升了12.9%。
这说明DRMoET没有把专家都拉成一模一样的"万能工具人",反而让专家在自己擅长的领域里表现得更突出了。这个结果其实有点出乎意料,因为直觉上让冷门路径更靠谱,似乎应该是以牺牲专精为代价的,但实验数据给出了相反的答案。
计算开销和真实训练速度
一个很现实的问题是:这套额外的"风险小组"机制,会不会把训练拖慢?
论文给出了理论上的复杂度分析,额外引入的计算量相对于专家前馈网络本身的计算量,大致是1除以前馈网络宽度这个量级,意味着在实际工程中几乎可以忽略不计。
实测数据也验证了这一点。在相同硬件和软件环境下,DRMoET每GPU的算力吞吐达到67.19 TFLOP/s,比基线的64.17 TFLOP/s还略高了4.7%;单次迭代耗时从6460毫秒降到6166毫秒,减少了4.6%;吞吐的波动标准差也从1.81降到0.93,波动幅度缩小了一半。
论文作者很谨慎地指出,这个"更快"的结果更可能是减少了训练过程中的随机抖动,而不是说这个方法本身在算法层面有加速效果。但至少可以确认一件事:这种稳健性的提升,不是靠牺牲训练效率换来的。
两个办法要不要一起用
一个值得追问的问题是:DRMoET是不是可以替代传统的负载均衡损失?
论文做了一个对照实验,在小模型规模下去掉标准的负载均衡损失,只保留DRMoET,结果七任务平均分是0.5448,比标准FLAME-MoE基线的0.5403要高,但比DRMoET加上负载均衡损失一起用的0.5523还是差了一截。
这说明两者解决的是不同的矛盾。负载均衡损失解决的是"有没有专家完全闲着没人用"的问题,而DRMoET解决的是"被选中的专家靠不靠谱"的问题。一个专家如果几乎没有流量,DRMoET的风险加权机制根本没有足够的观测数据去判断它好不好。两者得配合着用,才是目前看来最稳的组合。
Q&A
Q1:DRMoET和传统的负载均衡方法有什么区别?
A:传统负载均衡只关注专家接收的流量是否均匀,而DRMoET关注的是被选中的专家表现是否靠谱。即使流量分配很均匀,表现差的专家被选中时依然会拖累模型,DRMoET专门针对这个问题进行优化。
Q2:DRMoET会不会让所有专家都变得差异不大,失去专精能力?
A:不会。论文的实验显示DRMoET训练后,专家的功能专精度指标反而全面提升,比如能力优势提升30.2%,互信息提升12.9%,说明专家在自己擅长的领域表现更突出了,而不是被拉成千篇一律。
Q3:DRMoET会增加训练成本或拖慢训练速度吗?
A:几乎不会。实测显示DRMoET每GPU吞吐量反而提高了4.7%,单次迭代耗时降低了4.6%,额外计算开销在理论上也非常小,接近可以忽略的量级。
好文章,需要你的鼓励
RGPO用"临时脚手架"破解大模型强化学习的奖励稀疏难题:先让模型独立解题,失败则分段放出标准解法引导重写,仅采纳经验证更优的答案。难题测试准确率从0跃至99.5%,语言模型平均分高出最强基线5.0分。
论文提出用MoE模型的路由器输出作为跨语言对齐目标,通过持续预训练对翻译句对施加路由KL散度损失,在不改变分词和架构的前提下让隐藏表示更接近,并在四个开源MoE模型、七种语言上验证了下游任务性能的一致提升。
DiffGate提出难度门控的教师指导机制,让验证器决定何时需要教师介入,仅对失败且困难的轨迹提供有界教师指导,结合GRPO强化学习,在数学与代码任务上显著提升解题覆盖率与跨领域迁移能力。
研究者用固定不变的16位二进制编码替代传统可训练词嵌入表,在17亿参数规模模型上训练1000亿token,证明模型仍可获得实质语言能力,揭示输入表并非必需,但性能略逊于可学习方案。