本站内容由 AI 生成,可能存在错误。如发现问题,欢迎到 GitHub Issues 反馈。

Mixture of Experts:稀疏激活的大模型架构

Mixture of Experts:稀疏激活的大模型架构

更新于 2026-04-04

Dense model 的核心矛盾:参数量和计算量线性绑定。想要更强的模型就需要更多参数,但更多参数意味着每个 token 的计算量也线性增长。

Mixture of Experts (MoE) 打破了这个绑定:参数量大,但每个 token 只激活一小部分 — 解耦参数量和计算量。

关键数字:Mixtral 8x7B 有 47B 总参数,但每个 token 只用 ~13B active 参数的计算量 — 相当于用 7B 模型的推理成本,获得接近 47B 模型的能力。

Sparse MoE 基本原理

标准 Transformer 中,每个 token 经过同一个 FFN 层。MoE 将这个 FFN 替换为 N 个并行的 expert(每个 expert 就是一个小 FFN),加上一个 router 决定每个 token 送给哪些 expert。

Dense FFN vs MoE FFNDense TransformerAttentionFFNd_model → 4·d_model → d_modelOutputTotal params ≈ Active params例: 7B params → 7B activeMoE TransformerAttentionRouterE0E1E2E3E4E5E6E7OutputTotal params >> Active params例: Mixtral 47B total → ~13B active (top-2 of 8)

每个 token 只被送到 Top-K 个 expert(通常 K=1K=1K=2K=2),输出加权求和:

y=iTopKgiEi(x),g=softmax(Wgx)y = \sum_{i \in \text{TopK}} g_i \cdot E_i(x), \quad g = \text{softmax}(W_g \cdot x)

下面的动画展示了完整的 MoE 前向流程:

Router 打分
Step 1: Token 进入 Router,对每个 Expert 打分Token xg = softmax(W_g · x)E00.05E10.12E20.35E30.08E40.22E50.03E60.11E70.04Router(小型线性层)为每个 expert 输出一个概率分数

Router 机制

Router 的设计直接决定了 MoE 的效果。主要有两种思路:

Token-Choice
Token-Choice Routing: 每个 token 选 top-K expertTokens:Experts:IlovelargemodelsE0E1E2E3每个 token 的视角出发 — 简单,但 expert 负载可能不均采用者:Mixtral (top-2), Switch Transformer (top-1), DeepSeek-V3 (top-8)

Token-choice routing(主流做法):每个 token 选 top-K expert。简单高效,但负载可能不均 — 某些 “热门” expert 被大量 token 选中,其他 expert 闲置。

Expert-choice routing:反过来,每个 expert 选 top-K token。负载天然均匀,但某些 token 可能不被任何 expert 选中而被丢弃。

实践中 token-choice 更常用:Mixtral (top-2), Switch Transformer (top-1), DeepSeek-V3 (top-8)。

Load Balancing

没有约束时,router 倾向于把大部分 token 集中到少数 expert — rich-get-richer 现象(又叫 expert collapse)。这显然不是我们想要的。

解决方案是添加 auxiliary loss,鼓励 expert 负载均匀:

Laux=αNifiPiL_{aux} = \alpha \cdot N \sum_i f_i \cdot P_i

其中 fif_i 是 expert ii 实际接收的 token 比例,PiP_i 是 router 分配给 expert ii 的平均概率。α\alpha 越大,均衡效果越强,但也可能影响模型质量(强制均匀不一定自然)。

调整下面的滑块,观察 α\alpha 对 expert 负载分布的影响:

Expert 负载分布 (α = 0.000)无 aux loss: 少数 expert 承担大部分 token(expert collapse)ideal = 12.5%E055.2%E124.8%E211.1%E35.0%E42.2%E51.0%E60.5%E70.2%L_aux = α · N · Σᵢ fᵢ · Pᵢ (fᵢ = 实际接收比例, Pᵢ = router 分配概率均值)

另一个手段是 expert capacity:限定每个 expert 每 batch 最多处理 CC 个 token,溢出的 token 走 residual 直接跳过。

DeepSeek 的创新

DeepSeek 在 MoE 上做了两个关键改进:

DeepSeek MoE: Shared Expert + Fine-Grained Routed ExpertDeepSeek-V3: 1 shared expert + 256 routed experts, top-8Token xShared Expert所有 token 必经Router (Top-8)R0R1R2R3R4R5R6R7...×256OutputShared (所有 token) — 兜底通用知识Routed (Top-K 选择) — 细粒度专业化

Shared Expert

部分 expert 所有 token 必经(不经过 routing)。这些 shared expert 负责 “兜底” — 保证基础能力(通用知识、语法、常识)不会因为 routing 分散而丢失。

Fine-Grained Expert

使用更多但更小的 expert,实现更细粒度的专业化。DeepSeek-V2 用 160 个 routed expert(对比 Mixtral 只有 8 个),每个 expert 更小但更专精。

具体配置:

  • DeepSeek-V2: 160 routed + 2 shared, top-6
  • DeepSeek-V3: 256 routed + 1 shared, top-8

Expert Parallelism

256 个 expert 放不进一张 GPU — 需要 Expert Parallelism (EP):不同 expert 分布在不同 GPU 上。

Expert Parallelism: Expert 分布在不同 GPU 上GPU 0Expert 0Expert 1Token BufferGPU 1Expert 2Expert 3Token BufferGPU 2Expert 4Expert 5Token BufferGPU 3Expert 6Expert 7Token BufferdispatchcombineAll-to-All 通信:token dispatch → expert compute → result combine每个 GPU 上的 token 需要发送到对应 expert 所在 GPU,计算完再发回

这带来了 All-to-All 通信:每个 GPU 上的 token 需要发送到对应 expert 所在的 GPU(dispatch),expert 计算完后结果再发回原 GPU(combine)。

Expert Parallelism 通常和 Tensor Parallelism (TP)、Pipeline Parallelism (PP) 组合使用:

  • TP: 切分单个 expert 的矩阵到多卡
  • EP: 不同 expert 放不同卡
  • PP: 不同 layer 放不同卡

expert 越多、GPU 越多,all-to-all 通信越重 — 这是 MoE 部署的主要挑战。

模型对比总结

主流 MoE 模型配置对比模型Total ParamsActive ParamsExpertsTop-KShared年份Switch Transformer1.6T~26B204812021Mixtral 8x7B47B~13B822024Mixtral 8x22B141B~39B822024DeepSeek-V2236B21B160622024DeepSeek-V3671B37B256812024Qwen2.5-MoE57B14B64882025