跳到主要内容

8.1 MoE:万亿参数,百亿账单

一个诱人的问题​

4.4 节的 Scaling Laws 说:参数越多,模型越强。但稠密模型有个死规矩——每个 token 都要动用全部参数。参数翻十倍,每个 token 的计算量也翻十倍,训练和推理的账单一起爆炸。

有没有办法让参数无限涨、计算量却不涨?

有。回想 3.5 节拆过的参数账本:Transformer 块里的前馈网络占了参数的大头。MoE 的主意就打在它头上——

把每层那一个前馈网络,换成一群「专家」(每个专家就是一个前馈网络)加一个「路由器」;每个 token 进来,路由器现场挑其中两位来处理,其余专家原地休息。

亲手当一次路由器看看:

🎮 动手实验
MoE:一栋楼的专家,每次只叫两位
点击句子里的任意 token:路由器(一个小网络)当场决定把它交给 8 位「专家」(各自是一个前馈网络)中的哪 2 位处理。(分发结果为教学示意)
🚦 路由器:「Python」→ 专家 4(33%)+ 专家 2(67%)
😴
专家 1
休息中
🧑‍🔬
专家 2
权重 67%
😴
专家 3
休息中
🧑‍🔬
专家 4
权重 33%
😴
专家 5
休息中
😴
专家 6
休息中
😴
专家 7
休息中
😴
专家 8
休息中
参数总量(示意)
59B
每 token 实际激活
17B
计算量相当于
一个 17B 稠密模型
🧮 账本:8 位专家各 7B + 共享部分(注意力等)3B = 总参数 59B;但每个 token 只经过 2 位专家,激活 17B——知识容量按 59B 算,算力账单按 17B 付。多点几个 token,注意不同 token 会被派给不同的专家组合。
💡 要点:MoE 把 Transformer 里的前馈网络换成一群专家 + 一个路由器。参数总量可以堆得巨大(提升「知识容量」),但每个 token 只激活其中一小部分(计算量不涨)——「万亿参数、百亿计算」就是这么来的。代价:显存仍要装下全部专家,且专家分工是训练涌现的,大多并不对应人类概念(别指望有个「Python 专家」)。

多点几个 token,注意两件事:不同 token 会被派给不同的专家组合;无论派给谁,每次干活的都只有 2 位。底部的账本就是 MoE 的全部魔法:8 位专家各 7B、共享部分 3B,参数总量 59B——但每个 token 只激活 17B。知识容量按 59B 算,算力账单按 17B 付。

收益与代价​

收益很直白:在几乎不增加计算量的前提下,把「脑容量」扩大几倍——语料里那些互不相干的知识(Python 语法、唐诗格律、法律条文)可以分散存进不同专家,不必挤在同一套参数里打架。

代价也很实在:

  • 显存不打折:计算可以只用 2 位专家,但显存必须装下全部 8 位——MoE 省算力,不省显存(回想 4.5 节的显存账本,这又是一道要切分的难题)。
  • 路由会偏心:训练中路由器容易「用熟不用生」——热门专家挤爆、冷门专家躺平退化。所以要额外加一个负载均衡损失,逼它雨露均沾(细节见深入层)。

从边缘到主流​

MoE 思想很老(1991 年就有),但在大模型时代的走红路线很清晰:2023 年 Mixtral 8×7B 开源,公开验证了「MoE 能打」;2024 年 DeepSeek-V3 做到 671B 总参数、每 token 只激活 37B——比本节实验的账本夸张得多;坊间长期传闻 GPT-4 也是 MoE 架构(传闻,未获官方证实)。到 2025 年,旗舰级开源模型已有大半采用 MoE。

这个演示在哪里不准确?

实验里的「路由」是用固定规则模拟的,真实路由器是一个训练出来的小网络。更重要的误区是「专家」这个词本身:真实 MoE 的专家分工是训练涌现的,研究者检查后发现它们大多按 token 的表层特征(标点、数字、语种)分流,而不是按「Python 专家」「唐诗专家」这样的人类概念分工——别被名字骗了。

本节要点
  • MoE 把前馈网络换成「专家群 + 路由器」,每个 token 只激活 top-2 专家。
  • 参数容量与计算成本解耦:知识按总参数算,账单按激活参数付。
  • 显存不打折(全部专家都得在卡上),路由要靠负载均衡损失防止偏心。
  • 专家分工是训练涌现的,大多不对应人类可读的概念。
📝 动手自测0/3
1. MoE 模型「671B 总参数、37B 激活」意味着什么?
2. MoE 为什么偏偏改造前馈网络,而不是注意力层?
3. 为什么 MoE 训练需要「负载均衡损失」?

延伸阅读​