我最早注意到 MoE 这个词,是因为一个很矛盾的现象:Mixtral 8x7B 的官方模型卡写着总参数量 47B,但实测推理速度却接近 13B 模型。这怎么可能?如果每个参数都在工作,参数越多,计算量应该越大,速度应该越慢。除非——有一部分参数在偷懒。

MoE(Mixture of Experts,专家混合)就是让一部分参数“偷懒”的技术。但这里的“偷懒”不是随机跳过,而是由路由器决定:每个输入 token,只让少数专家参与计算。
稠密模型:每个 token 都要惊动所有参数
在传统的稠密模型里,参数和计算量是绑死的。你有一个 175B 参数的 GPT-3,那么每生成一个 token,这 175B 个参数全部要参与一次前向计算。就像一家公司,无论业务大小,全体员工都得开会,每个人都得发言。
这种设计的优点是很简单,训练和推理都容易预测。缺点是成本随着参数量线性增长。模型想变聪明,就要加参数,加参数就要加算力。这也是为什么 GPT-3 的训练费用高得离谱。
MoE 的招数:让模型学会“点菜”
MoE 的思路其实很朴素:把一个大型前馈网络拆成很多个小网络,每个小网络叫一个“专家”。然后训练一个路由器,让它学会根据输入内容,只挑最相关的几个专家来干活。
以 Mixtral 8x7B 为例,它把 Transformer 的前馈层替换成了 8 个专家,每个 token 只激活其中 2 个。所以总参数是 47B,但实际参与计算的只有约 13B。这 13B 就是常说的“活跃参数”。
你可以把它想象成一家大型咨询公司。公司有几百个顾问,但每个客户项目只需要派两三个人去现场。老板(路由器)负责判断这个项目该派谁,而没被派到的人继续待命。
路由器的决策过程:先打分,再抽签
路由器本身是一个很小的神经网络。它接收当前 token 的表示向量,输出一个 8 维的概率分布(假设有 8 个专家),然后取概率最高的 2 个专家执行前向计算。这个过程叫 top-k 路由,k 通常取 2。
具体步骤大致是:
- 把 token 的隐向量送入路由器网络,得到每个专家的分数。
- 给分数加上一点训练时用的噪声,目的是让模型在早期不锁定单一专家。
- 取 top-2 的专家,把 token 发给它们。
- 把两个专家的输出加权合并,权重就是路由器的分数。
看起来像一个动态规划,但本质上它只是一个可微的稀疏选择。因为路由器是连续输出分数的,所以梯度可以传回去。
MoE 只稀疏化前馈层,注意力层仍是共享的
有一个细节值得单独说:MoE 并不是把整个 Transformer 都拆成专家。通常只把每个 block 里的前馈网络(FFN)替换成专家混合,注意力层依然是所有 token 共享的稠密层。原因很简单:FFN 占了模型大约三分之二的参数,是绝对的大头,而且它对每个 token 独立计算,适合拆开。注意力层则要让 token 之间两两交互,拆成专家反而会切断上下文信息的流通。
所以 Mixtral 8x7B 的命名容易让人误会,好像真有 8 个 7B 参数的专家。实际上,每个专家只有不到 2 亿参数,真正的大头是 32 层 × 每层 8 个专家的累积。总参数 47B,但每个 token 只过其中 2 个专家,所以活跃参数约 13B。
专家并不是你想象的那种“科任老师”
我最早以为 MoE 的专家会像人类团队一样分工:一个专家负责数学,另一个负责写作,还有一个负责代码。后来看了研究才发现,路由出的专家并没有这么强的语义标签。你很难说清某个专家到底“擅长什么”,它更像是模型内部隐式形成的一组可复用的计算路径。
有研究分析过训练后的专家输入,发现有些专家确实会偏向某些 token 类型,但也有很多重叠。专家之间更像是一组基础函数的组合,而不是互斥的学科。
这意味着什么?意味着 MoE 的“稀疏”更多是计算层面的优化,而不是知识层面的分工。你不需要去理解每个专家在做什么,只需要相信路由器的选择。
算力省了,但显存一个都跑不掉
这是 MoE 最容易让人误解的地方。很多人以为,既然每个 token 只激活 13B 参数,那推理时是不是只要加载 13B 就够了?不是。因为路由器是动态决定的,你无法预知下一个 token 会去哪个专家。所以在推理时,所有专家都必须待在显存里待命。
这就是为什么 Mixtral 8x7B 在 FP16 下需要约 94GB 显存,虽然它每 token 只算 13B 参数。MoE 省的是计算(FLOPs),不是显存。如果你的瓶颈是显存,MoE 并不能帮你省。
这也是为什么 MoE 模型通常需要多 GPU 部署,或者配合量化。比如 Mixtral 量化到 8bit 后显存需求会减半,但依然高于同尺寸活跃参数的稠密模型。
一张表看清两种模型的本质区别
| 维度 | 稠密模型 | MoE 稀疏模型 |
|---|---|---|
| 总参数量 | 所有参数都在推理时使用 | 总参数很大,但每个 token 只用一部分 |
| 活跃参数 | 等于总参数 | 远小于总参数(如 Mixtral 的 13B/47B) |
| 计算成本 | 随总参数线性增长 | 只随活跃参数增长 |
| 显存占用 | 与总参数成正比 | 同样与总参数成正比(不省显存) |
| 路由机制 | 无 | 路由器决定每个 token 使用哪些专家 |
| 训练难度 | 相对简单 | 需要处理负载均衡、通信开销 |
| 微调难度 | 成熟稳定 | 路由可能不稳定,量化更复杂 |
MoE 的代价:训练更难,微调更苦
MoE 最核心的训练难题是负载均衡。如果路由器把所有 token 都派给同一个专家,其他专家就变成了摆设,模型退化成一个小稠密模型,效果会崩。所以训练时通常会加一个辅助损失,惩罚那些“太受欢迎”的专家。
但辅助损失本身是一把双刃剑。惩罚太轻,负载不均衡;惩罚太重,路由会失去区分度,每个 token 都随机选专家。Switch Transformer 论文里就用了很大的篇幅讨论这个问题。
分布式训练是另一个痛点。在多 GPU 训练时,专家会分散在不同的设备上,token 被路由到某个专家,就得把激活值从当前设备传到那个设备。这种通信开销会随专家数量增加而急剧上升。所以 MoE 大规模训练通常需要特殊的并行策略,比如 GShard 提出的 Expert Parallelism。
还有一个容易被忽略的点:训练时一个 batch 里有成百上千个 token,虽然单个 token 只激活 2 个专家,但整个 batch 几乎会让所有专家都工作。所以 MoE 在训练阶段的计算量节省不如推理阶段明显。真正的收益在于推理时 batch 通常很小(甚至 1),这时候稀疏性的优势才完全体现。
从 Switch 到 Mixtral:MoE 的演进路线
MoE 不是新东西。2017 年,Google Brain 的 Shazeer 等人 就把 MoE 引入 LSTM,展示了稀疏条件计算的潜力。2021 年,Google 的 Switch Transformer 用 top-1 路由把模型规模推到 1.6T 参数,并且用更简单的路由策略降低了训练成本。
2022 年,Google 的 GLaM 在 1.2T 总参数量下,只激活 97B 参数,就用远低于 GPT-3 的训练能耗达到了更好的效果。到了 2024 年,Mistral 发布的 Mixtral 8x7B 让 MoE 真正走进普通开发者的视野——它开源,而且消费级硬件可量化运行。
Google 在 Switch Transformer 论文中写道:“We propose Switch Transformer, a scalable and simple sparse model that reduces the communication and computation costs of MoE while achieving the same or better performance than a dense model with the same compute budget.” 用中文说就是:用相同的计算预算,稀疏模型可以达到比稠密模型更好或相当的效果。
为什么说 MoE 不是并行计算?
并行计算是把一个大任务拆给多个处理器同时做,每个处理器都在工作。MoE 是每个 token 只让少数专家干活,其他专家闲着。这不是并行,而是稀疏选择。
MoE 和集成学习有什么区别?
集成学习是训练多个模型,推理时把结果平均。MoE 是训练多个专家子网络,推理时由路由器动态选择,并且整个系统是端到端联合训练的。路由不是投票,而是加权组合。
MoE 模型能微调吗?
能,但比稠密模型更脆弱。因为路由器的行为可能随着微调数据分布改变而剧烈变化,导致某些专家过拟合。实践中通常要用更小的学习率,或者冻结部分参数。
所以,MoE 是未来的方向吗?
我觉得要冷静看待。MoE 最大的价值,是在总参数量不变的前提下,用更少的计算量换取更强的能力。换句话说,它是一个“性价比”优化方案。
但它的短板也很明显:显存需求高、训练复杂、微调困难。如果你的场景是单卡推理或垂直领域微调,一个同规模稠密模型可能更省心。如果目标是百亿级以上的大模型,MoE 几乎是绕不开的选择。
说到底,“不是所有参数都在同时工作”这句话既像是优点,也像是一种妥协。它说明我们还没有能力让所有参数在每次推理中都高效协作,所以只能用路由来降低冗余。未来的模型或许会走向更动态的架构,让参数在需要的时候才被激活。但至少现在,MoE 是通往更大规模模型最现实的一条路。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/278.html