# MoE:稀疏模型为什么越来越流行
2023 年底,Mixtral 8×7B 发布,用 8 个专家网络实现了接近 GPT-3.5 的效果,但激活参数只有 13B(8 个专家每次只激活 2 个)。
2024 年初,DeepSeek-V2 发布,用 MoE 架构做到了千亿参数、推理成本只有 GPT-4 的 1/10。
2024 年,Grok、Gemini 1.5、Claude 3 都在用 MoE 架构。
MoE(Mixture of Experts)为什么突然成为主流?
# 一、稠密模型的瓶颈:参数多≠计算多
# 1.1 FFN 占了模型一半以上的参数
回顾 Transformer Block 的结构:
输入
↓
Multi-Head Self-Attention
↓
Add & Norm
↓
FFN(维度: d_model → 4 × d_model → d_model)
↓
Add & Norm
↓
输出
2
3
4
5
6
7
8
9
10
11
FFN 的参数量远大于 Attention:
- Attention 的参数:
4 × d_model × d_model(W_Q, W_K, W_V, W_O) - FFN 的参数:
2 × d_model × 4 × d_model = 8 × d_model²
以 Llama-7B 为例(d_model=4096):
- Attention 参数:
4 × 4096 × 4096 = 67M - FFN 参数:
8 × 4096² = 134M
FFN 的参数量是 Attention 的 2 倍。
整个模型有 32 层,FFN 的总参数占比超过 60%。
# 1.2 稠密模型的问题:每个 Token 都要过所有参数
在标准 Transformer 里,每个 Token 都要经过完整的 FFN:
- 输入一个 Token,FFN 的所有参数都要参与计算
- 输入 100 个 Token,FFN 的所有参数都要计算 100 遍
但不是所有 Token 都需要同样的计算:
- 处理「我爱吃麻辣烫」,需要的是「中文语义理解」
- 处理「print("Hello")」,需要的是「代码生成」
- 处理「1+1=?」,需要的是「算术推理」
能不能让不同的 Token 走不同的 FFN 路径?
这就是 MoE 的核心思想。
# 二、MoE 的核心思想:用多个专家,每次只激活部分
# 2.1 把一个 FFN 换成 N 个专家
MoE 把标准 Transformer 的单个 FFN 替换成 N 个专家网络(Expert)+ 一个门控路由(Router)。
标准 Transformer Block:
输入 → Attention → FFN → 输出
MoE Transformer Block:
输入 → Attention → [Router + N 个 Expert] → 输出
2
3
4
5
每个 Expert 就是一个独立的 FFN,结构和标准 FFN 一样:
输入(d_model) → W1(d_model → 4 × d_model) → 激活函数 → W2(4 × d_model → d_model) → 输出
关键点:每个 Token 不走所有 Expert,只走其中 K 个(通常 K=1 或 K=2)。
# 2.2 Router 决定每个 Token 走哪些 Expert
Router 是一个简单的线性层 + Softmax:
输入:Token 的向量(d_model)
输出:N 个 Expert 的得分(Softmax 后的概率分布)
2
例如有 8 个 Expert,Router 输出:
[0.02, 0.45, 0.03, 0.38, 0.05, 0.02, 0.03, 0.02]
取得分最高的 K 个 Expert(如 Top-2:Expert-1 和 Expert-3),其他 Expert 不激活。
每个 Token 只经过 K 个 Expert 的计算,参数利用率是 K/N。
# 2.3 稀疏激活:参数多,计算少
假设模型有 8 个 Expert,每次只激活 2 个(Top-2):
- 总参数量:8 个 Expert 的参数总和
- 激活参数量:2 个 Expert 的参数(25%)
- 实际计算量:只有 2 个 Expert 在算(25%)
这就是"稀疏激活"(Sparse Activation):
- 模型参数很多(8 个 Expert)
- 每次计算只用一部分(2 个 Expert)
- 参数多≠计算多
对比稠密模型:
- 稠密模型:100% 参数都激活
- MoE 模型(8 Expert,Top-2):25% 参数激活
MoE 在相同计算量下,可以用更多参数,达到更大模型的效果。
# 三、MoE 的数据流:一个例子
假设输入句子「我爱吃麻辣烫」,经过 Attention 后,每个词得到一个向量。
现在进入 MoE 层,有 4 个 Expert,每次激活 Top-1。
# 3.1 Router 给每个 Token 打分
| Token | Expert-0 | Expert-1 | Expert-2 | Expert-3 | 选择的 Expert |
|---|---|---|---|---|---|
| 我 | 0.1 | 0.6 | 0.2 | 0.1 | Expert-1 |
| 爱 | 0.3 | 0.5 | 0.1 | 0.1 | Expert-1 |
| 吃 | 0.2 | 0.1 | 0.5 | 0.2 | Expert-2 |
| 麻辣烫 | 0.1 | 0.2 | 0.6 | 0.1 | Expert-2 |
Router 自动学会了:
- Expert-1 擅长处理抽象词(「我」「爱」)
- Expert-2 擅长处理具象词(「吃」「麻辣烫」)
# 3.2 每个 Token 只过自己选中的 Expert
「我」 → Expert-1 → 输出1
「爱」 → Expert-1 → 输出2
「吃」 → Expert-2 → 输出3
「麻辣烫」 → Expert-2 → 输出4
2
3
4
Expert-0 和 Expert-3 在这个句子里完全没被激活,参数利用率是 50%(2/4)。
# 3.3 如果是 Top-2 激活呢?
每个 Token 选得分最高的 2 个 Expert,并用加权求和:
| Token | Expert-1 权重 | Expert-2 权重 | 输出 |
|---|---|---|---|
| 我 | 0.6 | 0.2 | 0.6 × Expert-1(我) + 0.2 × Expert-2(我) |
| 爱 | 0.5 | 0.3 | 0.5 × Expert-1(爱) + 0.3 × Expert-0(爱) |
| 吃 | 0.5 | 0.2 | 0.5 × Expert-2(吃) + 0.2 × Expert-0(吃) |
| 麻辣烫 | 0.6 | 0.2 | 0.6 × Expert-2(麻辣烫) + 0.2 × Expert-1(麻辣烫) |
每个 Token 的输出是 2 个 Expert 输出的加权和,权重就是 Router 的得分。
# 四、MoE 的核心挑战:负载均衡(Load Balancing)
# 4.1 问题:Router 可能只选一个 Expert
如果不加限制,Router 可能学会了只用一个 Expert 处理所有 Token:
| Token | Expert-0 | Expert-1 | Expert-2 | Expert-3 | 选择 |
|---|---|---|---|---|---|
| 我 | 0.9 | 0.05 | 0.03 | 0.02 | Expert-0 |
| 爱 | 0.85 | 0.07 | 0.05 | 0.03 | Expert-0 |
| 吃 | 0.88 | 0.06 | 0.04 | 0.02 | Expert-0 |
| 麻辣烫 | 0.92 | 0.04 | 0.03 | 0.01 | Expert-0 |
所有 Token 都走 Expert-0,其他 Expert 闲置——这就退化成了单个 FFN,MoE 失效了。
# 4.2 解决方法:Load Balancing Loss
在训练时加一个 Load Balancing Loss,惩罚 Expert 使用不均衡的情况。
定义:
- :Expert-i 被选中的次数占比
- :所有 Token 对 Expert-i 的平均得分
Load Balancing Loss:
直觉:
- 如果 Expert-i 经常被选中( 大),但得分不高( 小),说明它在"承担不擅长的任务"
- 如果 Expert-i 很少被选中( 小),但得分很高( 大),说明 Router 没有充分利用它
加上这个 Loss,Router 会学会让每个 Expert 的负载尽量均衡。
# 4.3 其他负载均衡策略
Capacity Factor(容量因子):
- 给每个 Expert 设一个最大容量(如每个 Expert 最多处理 20% 的 Token)
- 超过容量的 Token 被丢弃或分配给其他 Expert
Expert Choice(专家主动选择):
- 传统 MoE:Token 选 Expert
- Expert Choice:Expert 选 Token(每个 Expert 选得分最高的 K 个 Token)
- 天然保证负载均衡(每个 Expert 选同样多的 Token)
# 五、MoE 的变体:Switch Transformer、Mixtral、DeepSeek-V2
# 5.1 Switch Transformer(2021,Google)
核心改动:每个 Token 只激活 Top-1(一个 Expert)。
优势:
- 推理更快(每个 Token 只过 1 个 Expert)
- 参数利用率低(N 个 Expert,只有 1/N 被激活)
效果:Switch-XXL(1.6T 参数)在很多任务上超过 GPT-3(175B 参数),但推理速度更快。
# 5.2 Mixtral 8×7B(2023,Mistral AI)
架构:
- 8 个 Expert,每个是 7B 参数的 FFN
- 每个 Token 激活 Top-2
- 总参数:56B(8 × 7B)
- 激活参数:14B(2 × 7B)
效果:
- 在 Llama-2 70B 的性能上,推理速度快 6 倍
- 成本只有 GPT-3.5 的 1/5
# 5.3 DeepSeek-V2(2024,DeepSeek)
架构:
- 64 个 Expert,每个 Token 激活 Top-6
- 总参数:236B
- 激活参数:21B
- 创新:Multi-Head Latent Attention(MHLA)+ MoE,进一步降低推理成本
效果:
- 性能接近 GPT-4
- 推理成本只有 GPT-4 的 1/10
# 5.4 Grok-1(2024,xAI)
架构:
- 8 个 Expert,每个 Token 激活 Top-2
- 总参数:314B
- 激活参数:86B
特点:
- 开源(Apache 2.0 协议)
- 训练数据包含 Twitter(现 X)的实时数据
# 六、MoE vs 稠密模型:各有什么优劣
| 稠密模型(如 Llama) | MoE 模型(如 Mixtral) | |
|---|---|---|
| 参数利用率 | 100%(所有参数都激活) | 低(如 25%,Top-2 激活 8 个中的 2 个) |
| 推理速度 | 慢(所有参数都要算) | 快(只算激活的 Expert) |
| 显存占用 | 高(所有参数都要加载) | 更高(所有 Expert 都要加载到显存) |
| 训练难度 | 简单 | 难(负载均衡、Expert 崩溃) |
| 模型容量 | 受限于计算量 | 更大(相同计算量可以用更多参数) |
| 适合场景 | 通用任务 | 长文本、多领域、推理密集任务 |
MoE 的核心优势:
- 推理快:每个 Token 只过部分 Expert
- 模型容量大:相同计算量可以用更多参数,学到更多知识
MoE 的核心劣势:
- 显存占用高:所有 Expert 都要加载到显存,即使只激活一部分
- 训练难:负载均衡、Expert 崩溃(某些 Expert 完全不被选中)
# 七、MoE 为什么是大模型的未来
# 7.1 规模定律遇到瓶颈
OpenAI 的 Scaling Law 发现:模型能力随参数量和计算量呈幂律增长。
但计算量增长有上限:
- GPT-3(175B)训练一次需要几千万美元
- GPT-4(据传 1.76T)训练一次可能上亿美元
如果要继续扩大模型,就必须降低计算量——MoE 是唯一的路。
# 7.2 推理成本是商业化的关键
ChatGPT 每天几千万用户,每次请求都要跑一遍模型。
推理成本 = 每次请求的计算量 × 请求次数
MoE 的推理成本只有稠密模型的 1/4(Top-2 激活 8 个中的 2 个)。
DeepSeek-V2 的推理成本只有 GPT-4 的 1/10,这是商业上的巨大优势。
# 7.3 多领域知识的天然表示
不同的 Expert 可以学到不同领域的知识:
- Expert-0:中文语义
- Expert-1:英语语法
- Expert-2:数学推理
- Expert-3:代码生成
这比用一个巨大的 FFN 学所有领域更高效。
# 八、MoE 的训练和推理细节
# 8.1 训练时的通信开销
MoE 的训练需要大量的跨设备通信:
- 每个 Token 的 Router 输出需要发送给所有设备
- 每个 Expert 可能在不同的 GPU 上
- Token 需要路由到对应的 GPU,计算完再传回来
这导致 MoE 的训练比稠密模型慢很多(通信开销大)。
优化方法:
- Expert 并行:把不同 Expert 放在不同 GPU 上
- Data 并行:同一个 Expert 在多个 GPU 上复制
# 8.2 推理时的显存占用
MoE 推理时所有 Expert 都要加载到显存,即使每次只激活一部分。
例如 Mixtral 8×7B:
- 总参数:56B
- 激活参数:14B
- 显存占用:按 56B 算(所有 Expert 都要加载)
这是 MoE 的最大劣势——推理时显存占用比稠密模型高。
解决方法:
- Expert 卸载:把不常用的 Expert 放在 CPU 内存,需要时再加载到 GPU
- 量化:用 INT8 或 INT4 量化 Expert,降低显存占用
# 九、总结
MoE 的核心是 稀疏激活:
- 用多个专家网络(Expert)替代单一 FFN
- 每个 Token 只激活其中 K 个 Expert
- 参数多≠计算多,在相同计算量下可以用更多参数
MoE 的核心优势:
- 推理快:每个 Token 只过部分 Expert
- 模型容量大:相同计算量可以学到更多知识
- 多领域知识的天然表示:不同 Expert 学不同领域
MoE 的核心挑战:
- 负载均衡:Router 可能只选一个 Expert,用 Load Balancing Loss 解决
- 显存占用高:所有 Expert 都要加载到显存
- 训练难:通信开销大、Expert 崩溃
为什么 MoE 是大模型的未来:
- 规模定律遇到瓶颈,必须降低计算量
- 推理成本是商业化的关键,MoE 推理成本低
- DeepSeek、Mixtral、Grok 都在用 MoE,这是主流方向
下一篇我们手撕一个极简 MoE-FFN,看看 Router 和 Expert 的代码实现。
相关文章:
- FFN 和 LayerNorm(理解标准 FFN)
- Transformer Block(理解 MoE 在 Block 里的位置)
- 手撕 MoE-FFN(下一篇,代码实现)
评论
验证登录状态...