先说几个核心判断:MoE(混合专家模型)这条路,业界已经探索了多年,大家都在寻找让模型兼顾速度与效果的方法。颜水成领衔的昆仑万维2050研究院和北大袁粒团队近期推出了一个新方案——MoE++,思路很有新意,本质上是将“专家选择”从固定流程转变为动态可调节的机制。

MoE++最巧妙的地方在于,它是一个通用框架,可以直接嵌入到任何现有的MoE模型中,无需改动模型本身的结构。它的核心创新可以概括为:引入了“零计算量专家”。这一设计带来了三个直接益处:降低计算成本、提升性能、并易于部署。具体来说,每个Token现在可以使用不同数量的FFN专家,甚至可以完全跳过当前层。简单的Token少用专家,复杂的Token多用专家——算力就这样被高效地“挤压”出来。
而且,MoE++在做专家选择时,还参考了前一层的路由路径。这个想法很细致,但效果十分明显:在0.6B到7B参数规模的模型上,相比传统MoE,性能更强,专家吞吐速度提升了1.1到2.1倍。模型权重已经开源,有兴趣的可以直接尝试。
论文地址:
https://arxiv.org/abs/2410.07348
GitHub 地址:
https://github.com/SkyworkAI/MoE-plus-plus
Huggingface地址:
https://huggingface.co/Chat-UniVi/MoE-Plus-Plus-7B
图1丨MoE++与普通MoE的对比
MoE++的实现原理是什么?
当前大多数MoE方法都默认给每个Token激活固定数量的FFN专家——例如常见的Top-2路由。这种设定过于“刚性”。试想,一个逗号和一个复杂的逻辑推理词,预测难度能一样吗?显然不能。像逗号这类简单符号,一个专家都可能多余;而某些Token与当前层的专家完全不匹配时,跳过这一层反而是更明智的选择。
研究团队正是抓住这个“不匹配”点。他们设计了一组“零计算量专家”,包含三种类型:
- Zero专家:输出空向量,相当于丢弃当前输入;
- Copy专家:输入直接作为输出,相当于跳过当前层;
- Constant专家:用可训练向量替代输入,同时保留部分原始信息。
如图1所示,MoE++允许Token选择使用可变数量的FFN专家,甚至可以接受恒定量替换,或者完全跳过这一层。这种异构设计,实际上是在扩大网络组合空间,既提升了模型的拟合能力,也显著降低了计算开销。更重要的一点是,研究团队把前一层的路由分数也整合进来——让Token在选择专家时,能参考自己之前走过的路径,从而实现更稳定的分配。
团队在设计时还确立了两条原则:一是处理简单Token要高效,二是新增参数要尽量少。基于此,引入了这三种零计算量专家:
图2丨MoE++的核心组成部分
Zero专家:最直接的思路,将当前输入直接“干掉”。本质上,它可以把Top-2 MoE++层降级为Top-1,当Zero专家被激活时,输出就等于另一个专家的单独输出。对付简单Token,这就足够了。
Copy专家:输入直接变成输出,相当于跳过当前层。当Token和FFN专家匹配不佳时,这反而是最优解。
Constant专家:用可训练向量替换输入。但完全替换会导致信息丢失,因此团队添加了可训练权重矩阵来动态预测替换比例。计算开销极低,所以仍算作“零计算量”。
路由分数残差:这是关键创新之一。由于MoE++的专家类型异构化,路由器的设计变得更关键。团队提出了一种路径感知路由器,如图2(b)所示,它会把前一层的路由分数通过一个可学习的转换矩阵,合并到当前层。这样,每个Token都能感知到自己之前的选择路径,路由更稳定。
MoE++相比传统MoE有哪些优势?
算力分配更灵活。简单Token少用专家,复杂Token多用专家。结果就是:算力真正用在了刀刃上。如图3所示,实验中动词激活的FFN专家最多,名词次之,拆分后的词片激活最少。这说明MoE++能自动识别语义丰富程度,让简单Token少占资源,复杂Token得到更多关注,最终既节省计算,又提升性能。
图3丨在MoE++中不同Token所需的平均FFN专家数量
路由更稳定。通过加入前一层的路由分数残差,不同层之间建立了有效联系。从图4可以看到,路由方差明显减小,但均值和取值范围没有变化。在异构架构下,这种稳定路由至关重要。
图4丨路由分数残差对路由分数分布的影响
计算复杂度更低。从理论复杂度来看,MoE++比普通MoE具有明显优势(见下表)。
实验验证与结果
从0.6B到7B参数量的大量实验表明,MoE++全面优于传统MoE。在相同模型大小下,MoE++的专家吞吐量提升了15%到111%,同时性能更高。
现有大模型训练成本都很高,例如OpenMoE-8B/32E使用了1.1T tokens,TinyLlama-1.1B使用了3T tokens。研究人员将MoE++的预算扩展到1T tokens后发现,MoE++的性能与激活参数多2到3倍的稠密模型相当。更值得注意的是,它甚至超过了从零训练、使用更多token的OpenMoE-8B/32E。这充分证明,MoE++是一个非常有前景的LLM框架方向。
任务级专家负载分布的可视化分析
研究人员还细致地分析了MoE++在不同任务中的专家负载分布,结果很有趣:
(1) 层与层之间的专家负载存在相关性,尤其是相邻层。如果第j层激活了很多FFN专家,那么第j+1层很可能也会这样做。
(2) 浅层和最后一层的专家分配模式在不同任务中差异更大,这说明模型主要通过浅层和最终层来适配不同任务。未来可以在这些层上进行更精细的设计。
(3) 不同任务中每个Token激活的FFN专家数差异显著。但出乎意料的是,更简单的任务不一定激活更少的专家。这表明MoE++更关注Token级别的复杂性,而不是整体的任务难度。
(4) 在所有专家类型中,Zero专家被激活的次数最多,而且更简单的任务激活频率更高。这意味着Zero专家的激活水平,可能可以作为模型对任务难度判断的一个参考指标。
(5) 在所有层中,不同任务主题的专家分配显著不同——MoE++通过不同的专家分配模式,来应对不同主题的任务。这一点很具有启发意义。
