模型架构 / 专家与路由 原理笔记进阶 4 分钟阅读 查看源文件 ↗

MoE:专家选择与负载均衡#

本页内容6 个部分

1. 基本原理#

标准 Transformer 中,每个 token 经过同一个 FFN(dense model,所有参数全部激活)。MoE(Mixture of Experts)的核心思想:用 N 个专家 FFN 替换单个 FFN,每个 token 只激活其中 top-k 个专家——即稀疏激活。

这带来的核心好处是:**参数量可以大幅增加,而计算量基本不变。**例如 Mixtral 8x7B 拥有 47B 参数,但每个 token 只激活约 13B 参数,推理速度接近一个 13B 的 dense 模型,效果却接近甚至超过同规模 dense 模型。

y=∑i=1Ngi⋅Ei(x),g=TopK(softmax(Wg⋅x),k)y = \sum_{i=1}^{N} g_i \cdot E_i(x), \quad g = \text{TopK}(\text{softmax}(W_g \cdot x), k)

EiE_i 是第 ii 个专家 FFN,gig_i 是 gate 网络给出的权重,未被选中的专家 gi=0g_i = 0

每个 MoE 层的计算流程:

  1. Token 表示 xx 经过 gate 网络(一个线性层 WgW_g),得到 N 个分数
  2. Softmax → 取 top-k,只保留 k 个最高分的专家
  3. 将 xx 分别送入被选中的 k 个专家 FFN,按 gate 权重加权求和

**关键洞察:**MoE 替换的是 FFN 层,而不是 Attention 层。Attention 负责 token 间的信息交流(必须全局计算),FFN 负责 token 内的特征变换(天然适合专家分工)。实际部署中,通常每隔一层或每隔两层才使用 MoE 层,其余仍使用标准 FFN。

2. Gate(路由机制)#

Gate(也叫 Router)是 MoE 的核心组件——它决定每个 token 被分配给哪些专家。

**结构:**非常简单,就是一个线性层 Wg∈Rd×NW_g \in \mathbb{R}^{d \times N},将 token 表示映射为 N 个分数,再经 softmax 得到概率分布。

Gate 计算流程:
  scores = x · W_g          (d) · (d × N) → (N)
  probs = softmax(scores)   (N) → (N) 概率分布
  top_k = TopK(probs, k)   选出 k 个最大的
  gates = renormalize(top_k) 重新归一化为权重

Top-1 vs Top-2 路由:

Top-1 路由(Switch Transformer)

每个 token 只激活 1 个专家。计算最省,但每个 token 只有一个专家"视角",表达能力受限。

优势:每个 token 只分配给一个专家,路由和通信较简单;实际成本还取决于专家布局、容量与通信实现。

Top-2 路由(GShard、Mixtral)

每个 token 激活 2 个专家并加权组合。相比同尺寸专家的 top-1,专家 FFN 计算约翻倍;相对 dense 的成本和精度取决于比较基线。

目前主流方案。Mixtral 8x7B 用 8 个专家、top-2 路由,每层为每个 token 选择 2 个 FFN 专家。“8×7B”不是每个 FFN 有 7B 参数;全模型约 47B 参数、每 token 约 13B 激活参数。

3. Load Balancing(负载均衡)#

**问题:**如果没有约束,gate 网络很快会学到"把所有 token 都发给少数几个效果最好的专家"——这就是 expert collapse(专家坍塌)。大部分专家完全闲置,MoE 退化成一个小的 dense 模型,完全失去了大参数量的优势。

解决方案:辅助负载均衡损失(auxiliary load balancing loss),在训练损失中加入一个正则项,鼓励 token 均匀分配到各专家:

Lbalance=α⋅N∑i=1Nfi⋅PiL_{\text{balance}} = \alpha \cdot N \sum_{i=1}^{N} f_i \cdot P_i

fif_i = 被路由到专家 ii 的 token 比例,PiP_i = 路由到专家 ii 的平均概率,α\alpha = 平衡系数(通常 0.01)

这里采用 Switch 的 top-1 定义,∑ifi=∑iPi=1\sum_i f_i=\sum_i P_i=1。均匀时损失为 α\alpha;训练把离散分配比例 fif_i 视作常数,通过 PiP_i 抑制过载专家。这是负载均衡的代理目标,不能把它当成“任何不均匀必然增大”的距离函数,也不能保证最终均匀;top-k 的归一化约定要另行说明。

**Expert Capacity(专家容量):**固定容量实现可能丢弃超额分配,也可采用重路由或 dropless 实现。共享专家不是容量溢出的兜底专家:DeepSeekMoE 的共享分支处理所有 token,与稀疏路由分支并行,旨在分离共享知识和专家知识。具体专家数量取决于模型配置。

4. 代表模型#

模型 年份 Expert 数 Top-k 总参数 激活参数 关键创新
Switch Transformer 2021 128 1 - - top-1 routing,扩展稀疏模型训练
GShard 2020 2048 2 600B - 首个千亿级 MoE,random top-2 routing
Mixtral 8x7B 2024 8 2 47B ~13B 开源标杆,证明 MoE 在中等规模也高效
DeepSeek-MoE 2024 64+2 shared 6 - - 细粒度专家 + 共享专家,减少冗余

🔥 面试标准回答

MoE 用 N 个专家 FFN 替换单个 FFN,每个 token 通过 gate 网络只激活 top-k 个专家(稀疏激活)。好处是参数量可以大幅增加而计算量基本不变。核心挑战是 load balancing——可用辅助损失或动态路由 bias 等方法缓解专家负载失衡;这些方法不保证严格均匀,也不意味着没有辅助损失就必然塌缩。代表模型:Mixtral 8x7B(47B 参数,13B 激活)、DeepSeek-V2/V3(细粒度专家 + 共享专家)。

参考资料#

Mixtral、Switch Transformer、DeepSeekMoE。

延伸阅读#

  • Grouped GEMM:怎样把大小不同的专家矩阵乘法组织成 GPU 工作?
  • DeepEP:MoE 专家并行如何完成 token 的 dispatch 与 combine?

相关阅读路线

理解 Transformer 与架构变体 ↗理解 MoE 的系统执行 ↗