外观
MoE 稀疏专家模型
混合专家(Mixture-of-Experts, MoE)是一种稀疏激活架构:把 Transformer 的前馈网络层替换为一组"专家"子网络,由一个路由器(router)为每个 token 只挑选少数几个专家计算。 结果是"总参数量很大、但每个 token 实际激活的参数很少"——用接近小模型的计算成本,获得大模型的容量。从 Mixtral 到 DeepSeek-V3,MoE 已是超大规模模型的默认选择之一。
一句话定位:MoE = 用"路由稀疏"打破"参数量与计算量强绑定"的架构,让模型"总参数很多、每次只用一小撮"。 它与Transformer 架构详解中的 FFN 直接对应,也与规模法则中"参数量决定损失"的规律发生有趣的相互作用。
一、动机:参数量与计算量的解耦
稠密(dense)模型有一个天然约束:每个 token 都要经过全部参数。于是:
text
稠密模型:参数量 N → 每个 token 的 FLOPs ≈ O(N)
想更聪明(更多参数)→ 每个 token 更贵 → 训练/推理成本线性涨
MoE 模型:参数量 N(如 671B),但每个 token 只激活 k 个专家(如 8/256)
→ 每个 token 的 FLOPs ≈ O(N_act),N_act ≪ N
用大量"休眠参数"扩充容量,用少量"激活参数"控制成本关键洞察:语言模型的能力与总参数规模强相关(这是规模法则的结论),而训练/推理成本只取决于激活参数。MoE 正是利用这一差异——把"容量"和"成本"解耦。代价是:全部专家权重必须驻留内存/显存,内存成本仍按总参数计算。
二、结构:路由器 + 专家 FFN
MoE 不替换注意力层,只替换每个 Transformer 块中的 FFN。设每个块有 E 个专家(每个专家是一个独立的小型 FFN),对输入 x:
text
路由(gate):对每个 token 计算 E 个专家上的得分
g_i(x) = softmax(W_r · x)_i,W_r 是路由权重矩阵 [E × d_model]
Top-k 稀疏选择:
TopK(g(x), k) 选出得分最高的 k 个专家(k 常取 1 或 2)
加权聚合输出:
h(x) = Σ_{i ∈ TopK} g_i(x) · FFN_i(x)
(一个专家 = 一个标准 FFN:W2·σ(W1·x),见 Transformer 的 FFN 小节)python
# Top-2 路由的 PyTorch 风格伪代码(示意)
def moe_ffn(x, experts, router, k=2):
# x: [n, d];experts: E 个 FFN;router: 线性层
scores = router(x) # [n, E] 专家打分
weights = torch.softmax(scores, dim=-1)
top_w, top_idx = weights.topk(k, dim=-1) # 每个 token 的 top-2 专家
out = torch.zeros_like(x)
for i in range(n): # 逐 token 路由(真实实现按专家分组批处理)
for j in range(k):
out[i] += top_w[i, j] * experts[top_idx[i, j]](x[i])
return out现代实现会做分组路由(把选择同一专家的 token 攒成 batch)来提升矩阵运算效率,而非逐 token 循环。
为什么是"专家"不是"分区"
直觉上 MoE 像是把模型分成几个"专科模型",路由器负责"分诊"。研究表明专家确实会出现一定的专业分化(有的偏语法、有的偏代码、有的偏数学),但分化并不彻底——更多时候专家表现为"可组合的功能块"。路由是软加权而非硬切分,token 通常被多个专家共同处理。
路由器的设计空间
"路由器怎么选"本身有多个自由维度,直接影响能力与工程复杂度:
| 设计维度 | 常见选项 | 权衡 |
|---|---|---|
| 每 token 选几个专家(Top-k) | k=1(Switch)~ k=8(DeepSeek-V3) | k 大表达强、计算与通信也大 |
| 路由打分方式 | softmax vs sigmoid(DeepSeek-V3 用 sigmoid 便于无偏估计) | 与负载均衡机制配套 |
| Token Choice vs Expert Choice | token 选专家 vs 专家选 token | Expert Choice 天然均衡,但可能让部分 token 无人处理 |
| 是否加共享专家 | 加一组永远激活的专家 | 提高利用率,代价是部分 token 仍要过共享专家 |
| 路由深度 | 只在 FFN 层路由 vs 全模块路由 | FFN 层路由是主流,训练更稳 |
这些维度互相耦合,实际设计几乎都要做小规模消融验证,而非照搬某一家的配置。
三、负载均衡:稀疏路由的核心工程问题
Top-k 路由的天然倾向是塌缩(collapse):少数几个专家得分总最高,其他专家饿死,稀疏化名存实亡。所有 MoE 系统都要解决"专家使用率均衡":
| 方法 | 思路 | 代表 |
|---|---|---|
| 辅助负载均衡损失(aux loss) | 在主损失上叠加一项"鼓励均匀路由"的惩罚 | Switch Transformer、GShard |
| Expert Choice(专家选 token) | 反客为主:专家主动挑选负荷最高的 token,从源头保证均衡 | Expert Choice (2022) |
| 无辅助损失均衡 | 用动态偏置(bias)调整路由分数,在训练中在线校准 | DeepSeek-V3 |
text
Switch Transformer 的负载均衡损失(示意):
L_aux = α · E · Σ_{e=1}^{E} f_e · P_e
f_e = 专家 e 被路由到的 token 比例(负载)
P_e = 所有 token 给专家 e 的 softmax 概率之和(路由概率)
两者都接近 1/E 时损失最小 → 鼓励"负载"与"概率"同时均匀
α 通常取很小值(如 0.01),避免干扰主任务损失负载均衡是 MoE 训练"稳定性"的头号课题:均衡过松 → 专家饿死;均衡过紧 → 限制表达(强制均匀路由牺牲了"让最合适的专家处理")。 最优解介于两者之间,由超参控制。
值得区分"塌缩"的两种形态:完全塌缩(几乎所有 token 都路由到同一个专家,其余专家彻底闲置)与部分偏科(少数专家长期高负载、多数低负载)。前者通常由初始化/学习率不当引发,后者则是数据分布的自然结果。诊断方法很直接:训练中记录每个专家的 token 计数直方图——若分布高度偏斜,先查辅助损失权重与路由初始化,而不是盲目加大负载均衡惩罚。
负载不均衡的另一面
训练时负载均衡保护训练稳定;但推理时同样的不均衡会导致"少数专家排队、整批 token 等待最慢的专家"——所以推理侧的专家负载监控与调度同样重要。
MoE 的训练调参要点
- 初始化:路由权重用小标准差初始化,避免初始阶段就把 token 集中到少数专家;
- 学习率:MoE 训练对 LR 更敏感,峰值 LR 通常低于同规模 dense(常用一半以下);
- 辅助损失权重 α:0.001~0.1 量级,α 过大压制主任务表达、过小专家饿死,用"专家 token 计数方差"做监控再调;
- 专家容量:路由时若某专家被分配超过容量上限,多余 token 会走残差旁路(或丢弃),容量比例(capacity factor)是训练与推理都要设对的参数。
四、里程碑:从 GShard 到 DeepSeek-V3
| 时间 | 模型/系统 | 关键贡献 | 规模 |
|---|---|---|---|
| 2020 | GShard(Google) | 首个把 MoE 规模化用于翻译的 Transformer 系统,Top-2 门控 + 通信设计 | 600B 稀疏 |
| 2021 | Switch Transformer(Google) | Top-1 简化路由,引入负载均衡损失,验证稳定大规模训练 | 万亿参数级(实验) |
| 2021 | GLaM(Google) | 1.2T 总参数、约 97B 激活,训练成本约 GPT-3 的 1/3,性能相当或更好 | 1.2T 总 |
| 2023.12 | Mixtral 8x7B(Mistral) | 开源 MoE 破圈:8 个 7B 专家、Top-2、总约 47B、激活约 13B,性能追平 Llama 2 70B 而成本低得多 | 47B 总/13B 激活 |
| 2024 | Qwen1.5-MoE / Qwen2.5-MoE | 中文生态 MoE 落地,更小的激活规模(A2.7B/A3B 级别) | 数十 B 总/数 B 激活 |
| 2024.12 | DeepSeek-V3 | 细粒度专家 + 共享专家 + 无辅助损失均衡,671B 总/37B 激活,训练成本显著低于同规模稠密模型 | 671B 总/37B 激活 |
**激活参数与总参数的比值(稀疏率)**是衡量 MoE 性价比的第一指标:Mixtral 8x7B 约 47B/13B(约 1:3.6),GLaM 约 1.2T/97B(约 1:12),DeepSeek-V3 约 671B/37B(约 1:18)。比值越大,"容量/成本"的杠杆越强,但对路由与负载均衡的稳定性要求也越高(上表数字来自各家技术报告与官方博客,个别为估计值,精确规格以官方发布为准)。
DeepSeek-V3 的配置值得细看
DeepSeek-V3 代表了当前 MoE 设计的成熟形态:
text
- 细粒度专家(fine-grained experts):把专家切得更小更多(256 个路由专家),
组合更灵活,激活的"拼图"更贴近需求
- 共享专家(shared experts):少数几个专家永远激活(处理通用模式),
路由专家专注差异化 → 提升利用率与稳定性
- 无辅助损失负载均衡:不用 aux loss 惩罚,改为在线估计负载偏置
(有偏估计 → 无偏估计迭代)来平衡,训练更稳、性能略高
- 多头潜在注意力(MLA)压缩 KV Cache:长上下文的显存负担也大幅下降MoE 的完整家族谱系与各家训练技巧见 MoE 与超大规模模型。
五、MoE vs Dense 对比
| 维度 | Dense | MoE |
|---|---|---|
| 总参数量 | = 激活参数量 | ≫ 激活参数量(如 671B vs 37B) |
| 每 token 计算量 | 与总参数成正比 | 只随激活参数 |
| 同等 FLOPs 下容量 | 小 | 大 → 同等成本下通常更强 |
| 内存/显存 | 按激活参数 | 按总参数(全部专家都要驻留) |
| 训练稳定性 | 相对简单 | 需负载均衡、易出路由塌缩 |
| 推理批处理 | 简单 | 小 batch 利用率低、专家调度复杂 |
| 长上下文 | KV Cache 为主 | KV Cache + 专家权重双内存压力 |
| 代表 | GPT、Llama、Qwen(dense) | Mixtral、DeepSeek-V3、GLaM |
为什么说 MoE 是"规模法则的放大器"
Chinchilla 说"能力 ≈ 参数与数据的函数";MoE 让"总参数"(决定能力)与"激活参数"(决定成本)脱钩,等于把规模的收益曲线整体向"更便宜"平移。这也是为什么 2024 年后主流超大模型几乎都转向 MoE——但小规模场景(<10B 激活)dense 常常仍是更优解,因为路由与通信开销占比变大。
六、专家并行与通信
MoE 天然需要专家并行(Expert Parallelism, EP):把不同专家放在不同 GPU/节点上,token 被路由后需要"跨设备搬家":
text
数据流(示意):
1. 每张 GPU 处理自己的 token,路由器打分 → 选出每个 token 的目标专家
2. All-to-All 通信:把 token 发给持有对应专家的 GPU(Token Dispatch)
3. 各 GPU 在本地专家上计算 FFN
4. 反向 All-to-All:把结果送回原 GPU(Token Combine)
5. 与注意力层的张量并行/数据并行衔接
关键工程问题:
- All-to-All 通信量大,通信-计算重叠(overlap)决定训练效率
- 专家在节点内的分布要考虑网络拓扑(NVLink vs 跨节点)
- 路由稀疏 → 各专家负载不均 → 影响流水线与吞吐
- 主流框架(DeepSpeed、Megatron-LM、vLLM)均内置 MoE 支持MoE 的分布式训练细节与框架选型见框架与工具选型。
七、推理部署挑战
MoE 推理的收益(FLOPs 低)与代价(内存大)并存,部署要点:
| 挑战 | 说明 | 应对 |
|---|---|---|
| 显存按总参数 | 全部专家权重必须驻留;大 MoE 常单卡放不下 | 多卡张量/专家并行、模型并行 |
| 小批量利用率低 | batch 小 → 每个专家吃到的 token 太少,矩阵算不满 | 动态批处理、持续批(continuous batching) |
| 专家负载不均 | 热门专家成为"慢 token"的瓶颈 | 负载均衡路由、按负载调度 |
| 权重量化 | 量化后专家权重稀疏性是否保留、质量损失如何 | INT4/INT8 专家级量化 |
| 专家缓存/卸载 | 把不常用专家卸载到 CPU/磁盘,推理时按需加载 | 专家 offloading、缓存策略 |
| KV Cache 叠加 | 长上下文时 KV Cache 与专家权重争抢显存 | 压缩 KV(如 MLA)、分页注意力 |
工程化的吞吐/显存评估与部署示例见部署与服务化。
记住 MoE 的三笔账
① 计算账:激活稀疏,省 FLOPs;② 内存账:总参数全驻留,内存压力与 dense 无异甚至更大;③ 工程账:路由、负载均衡、通信、调度引入了全新的复杂性。选 MoE 还是 Dense,先算这三笔账,而不是看"参数量大就高级"。
八、权衡与边界
- 性价比随规模上升:模型越大、MoE 优势越明显;小模型上路由开销占比高,收益有限。
- 微调与对齐难度:MoE 的微调(尤其参数高效微调)有额外注意事项(各专家梯度不同、路由可能漂移),详见微调:SFT 与参数高效微调。
- 隐私/监管:超大规模 MoE 训练成本高企,主要玩家集中于少数大厂与研究机构。
- 与 GPU 生态的适配:稀疏计算对现有稠密矩阵内核并不天然友好,不少优化靠自定义内核实现。
- 评估口径要清晰:比较 MoE 与 dense 时必须同时标注"总参数/激活参数"与对应的成本,否则"参数量更大所以更强"的对比很容易误导选型。
- 生态成熟度在快速上升:vLLM/SGLang 等推理框架、DeepSpeed/Megatron 等训练框架都已内建 MoE 支持,工程门槛正在降低,但"懂路由与负载均衡原理"仍然是调优的硬门槛。
MoE 的未来方向
三个值得关注的趋势:多模态 MoE(把视觉/音频也纳入专家路由,让不同模态共享稀疏计算)、训练-推理一致的稀疏化(在推理侧也做结构化剪枝/专家合并,缩小"训练时大 MoE、部署时小 dense"的差距)、可学习的路由(用强化学习或端到端学习代替启发式门控)。MoE 的"稀疏化"思路也在向注意力、KV Cache 等组件渗透——"激活什么就只算什么"正成为大模型系统的通用原则。
一句话选型
- 要最大能力、预算充足、有工程团队 → 大 MoE(数百 B 总参数);
- 要低成本部署、高并发 → 中规模 dense 或小激活 MoE;
- 还在验证产品方向 → 直接用成熟 API 与开源 dense,先跑通再谈规模;
- 所有 MoE 决策前:先算激活参数、总参数、内存三笔账。
一句话总结
MoE 用"路由器挑专家"把 FFN 变成稀疏的:总参数多、激活参数少、容量大、算得动。它让"更大"不必等比例地"更贵",代价是内存、负载均衡与系统工程的全面复杂度——是"规模法则"在架构侧的完美补充。
延伸阅读
- Transformer 架构详解——MoE 替换的那一层:FFN 与注意力
- 规模法则——MoE 如何平移规模的收益曲线
- MoE 与超大规模模型——从 GShard 到 DeepSeek-V3 的完整谱系
- 部署与服务化——MoE 推理的显存与调度工程
- 推理基础:自回归与采样——自回归解码与批处理下的 MoE 特性
- 主流模型档案——MoE 与 dense 模型的规格总表
参考资料
- Lepikhin et al. GShard: Scaling Giant Models with Conditional Computation and Automatic Sharding(2020) —— MoE 规模化翻译的里程碑
- Fedus et al. Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity(2021) —— Top-1 路由与负载均衡损失
- Du et al. GLaM: Efficient Scaling of Language Models with Mixture-of-Experts(2021) —— 1.2T 参数 MoE 实证
- Jiang et al. Mixtral of Experts(2023) —— 开源 MoE 的代表论文
- DeepSeek-AI. DeepSeek-V3 Technical Report(2024) —— 细粒度专家 + 无辅助损失均衡
- Zhou et al. Mixture-of-Experts with Expert Choice Routing(2022) —— Expert Choice 均衡方案
- Mistral AI. Mixtral of Experts 官方博客(2023) —— Mixtral 发布公告与基准