目录

MoE

MoE(Mixture of Experts,混合专家模型)是一种通过多个 Expert(专家)和 Router(路由器)实现条件计算(Conditional Computation)的神经网络架构。

MoE 最早由 Robert A. Jacobs、Michael I. Jordan、Steven J. Nowlan 和 Geoffrey E. Hinton 于 1991 年提出。他们在论文 Adaptive Mixtures of Local Experts 中提出了 Mixture of Experts 的基本思想。该论文发表于 Neural Computation,作者来自 MIT 和多伦多大学等研究机构。

早期 MoE 的思想是:让多个 Expert 分别学习处理输入空间中的不同区域,再通过一个 Gating Network(门控网络)根据输入决定应该使用哪些 Expert。

现代 大语言模型 中使用的 MoE 则主要是在这一思想基础上发展出来的 Sparse MoE(稀疏混合专家模型)。2017 年,Google 的 Noam Shazeer 等人发表 Sparsely-Gated Mixture-of-Experts,将稀疏门控机制用于大规模神经网络,使模型能够拥有巨大的总参数量,同时只激活其中少数 Expert。此后,GShard、Switch Transformer、Mixtral、DeepSeek MoE 等工作进一步推动了 MoE 在大规模 Transformer 和 大语言模型 中的发展。

MoE 的核心思想可以概括为:

模型拥有很多 Expert,但每次处理一个 Token 时,只让其中少数 Expert 参与计算。

因此,MoE 可以在一定程度上将模型容量与计算量解耦。

MoE 的历史

MoE 的发展可以大致分为三个阶段。

第一阶段:1991 年,Mixture of Experts

Jacobs、Jordan、Nowlan 和 Hinton 提出了 Adaptive Mixtures of Local Experts。

其基本结构为:

输入 → Gating Network → 选择 Expert → 输出

Gating Network 根据输入决定不同 Expert 的权重,使不同 Expert 可以学习输入空间中的不同区域。

这一阶段的 MoE 主要用于模块化学习和条件计算。

第二阶段:2017 年,Sparse MoE

Shazeer 等人在 Google 发表 Sparsely-Gated Mixture-of-Experts。

这一工作的关键变化是:

不再让所有 Expert 都参与计算,而是只选择少数几个 Expert。

这使得模型可以拥有大量参数,同时避免计算量随着 Expert 数量完全同步增长。

第三阶段:大规模 Transformer 与 LLM

随着 Transformer 成为主流架构,MoE 开始被大量应用于大规模语言模型。

代表性工作包括:

* GShard:研究大规模 Transformer 和 MoE 的分布式训练。 * Switch Transformer:采用 Top-1 Routing,进一步简化 MoE 路由。 * Mixtral:将稀疏 MoE 应用于开放权重大语言模型。 * DeepSeek MoE:研究细粒度 Expert、共享 Expert 等结构。

因此,今天大语言模型中的 MoE 并不是 2017 年才出现的概念,而是1991 年提出的 Mixture of Experts 思想经过稀疏化、大规模训练和分布式系统优化之后形成的现代架构。

核心思想

传统的稠密模型(Dense Model)中,每个 Token 都需要经过模型中的主要计算模块。

例如,一个拥有 100B 参数的 Dense 模型,在处理每个 Token 时,都需要执行相应的大规模计算。

MoE 则把原本的一个 FFN 拆成多个 Expert:

输入 Token → Router → 选择 Expert → Expert 计算 → 加权合并 → 输出

例如,一个 MoE 层拥有 64 个 Expert,但 Router 对每个 Token 只选择 2 个 Expert。

那么这个 Token 就不需要经过剩余的 62 个 Expert。

因此:

总参数量可以非常大,而每个 Token 实际激活的参数量相对较小。

这是 MoE 最重要的设计思想。

Expert

Expert(专家)是 MoE 中负责实际计算的子网络。

在现代 Transformer 中,MoE 最常见的做法是将原本的 前馈神经网络(FFN)替换为多个 Expert。

普通 Transformer:

输入 → Self-Attention → FFN → 输出

MoE Transformer:

输入 → Self-Attention → Router → 多个 Expert → 输出

每个 Expert 通常都是一个独立的 FFN。

例如,一个 MoE 层可以拥有 8 个 Expert:

* Expert 1 * Expert 2 * Expert 3 * Expert 4 * Expert 5 * Expert 6 * Expert 7 * Expert 8

这些 Expert 通常具有相同或相似的网络结构,但参数不同。

在训练过程中,不同 Expert 可能逐渐形成不同的功能倾向。

不过,不能简单地把 Expert 理解成:

* Expert 1 = 数学 * Expert 2 = 英语 * Expert 3 = 编程

实际情况下,Expert 的分工通常是训练过程中自然形成的,而且未必能够被人类清晰解释。

Router

Router(路由器)负责决定一个 Token 应该交给哪些 Expert。

假设输入 Token 的隐藏状态为 x。

Router 可以通过一个可学习的线性层计算每个 Expert 的分数:

s = Wᵣx

其中:

* x 是 Token 的隐藏状态。 * Wᵣ 是 Router 的参数。 * s 是各个 Expert 的路由分数。

之后可以通过 Softmax 将这些分数转换成概率。

第 i 个 Expert 的概率可以表示为:

pᵢ = exp(sᵢ) / Σⱼ exp(sⱼ)

Router 根据这些概率选择若干个 Expert。

例如:

Expert 1:0.05 Expert 2:0.62 Expert 3:0.08 Expert 4:0.25

如果使用 Top-2 Routing,就会选择 Expert 2 和 Expert 4。

最终输出可以理解为被选择 Expert 输出的加权组合:

y = Σᵢ∈TopK(x) pᵢEᵢ(x)

其中 Eᵢ 表示第 i 个 Expert。

Top-K Routing

现代 Sparse MoE 通常不会让一个 Token 同时经过所有 Expert,而是使用 Top-K Routing。

例如:

* 8 个 Expert,Top-1:每个 Token 只选择 1 个 Expert。 * 8 个 Expert,Top-2:每个 Token 选择 2 个 Expert。 * 64 个 Expert,Top-2:每个 Token 只激活 2 个 Expert。

例如一个 MoE 层有 64 个 Expert,而 Top-K 设置为 2。

那么对于每个 Token:

64 个 Expert → Router → 选择 2 个 Expert

因此只有很少一部分 Expert 实际参与计算。

这就是 Sparse MoE(稀疏 MoE) 的核心。

为什么 MoE 有用

MoE 主要解决 大语言模型 扩展过程中一个重要的问题:

如何增加模型容量,同时避免计算量按照参数量同比增加?

对于传统 Dense 模型:

参数量增加 → 每 Token 计算量增加

而对于 Sparse MoE:

总参数量增加 → 模型容量增加

同时保持 Top-K 较小:

每 Token 激活参数量可以维持在相对较低的水平。

因此可以实现:

更大的总参数量 + 相对有限的每 Token 计算量

例如,一个 MoE 模型可以拥有 1T 总参数,但每个 Token 只激活其中一部分参数。

不过需要特别注意:

总参数量 ≠ 激活参数量 ≠ 推理显存需求

MoE 虽然减少了每 Token 的计算量,但部署时通常仍需要保存全部 Expert 参数,因此模型的显存需求仍然受到总参数量影响。

MoE 与 Transformer

MoE 并不是 Transformer 的替代架构。

现代 MoE 通常是对 Transformer 内部的 FFN 部分进行修改。

普通 Transformer:

输入 → Self-Attention → FFN → 输出

MoE Transformer:

输入 → Self-Attention → MoE-FFN → 输出

因此可以理解为:

Transformer 是整体架构,而 MoE 是一种可以嵌入 Transformer 的稀疏计算机制。

现代 MoE 大语言模型 仍然可以使用 Self-Attention、残差连接、Layer Normalization 等 Transformer 组件。

稀疏激活

MoE 的关键并不是“拥有很多专家”,而是:

每次计算只激活少数专家。

例如,一个 MoE 层拥有 64 个 Expert,每个 Token 只选择 2 个。

那么从 Expert 数量来看:

2 / 64 = 3.125%

也就是说,每个 Token 只激活约 3.125% 的 Expert。

当然,这个比例不能直接等同于整个模型的“激活参数比例”,因为模型中还存在 Attention、Embedding、Normalization 等其他参数。

Expert Load Balancing

MoE 的一个重要问题是 Load Imbalance(负载不均衡)。

假设 Router 总是把大量 Token 分配给少数几个 Expert:

Token → Expert 1:大量 Token → Expert 2:大量 Token → Expert 3:很少 Token → Expert 4:几乎没有

那么就会出现:

部分 Expert 过载,而其他 Expert 空闲。

在分布式训练中,这会进一步造成 GPU 之间的计算负载不均衡。

因此 MoE 通常需要进行 Load Balancing(负载均衡)。

一种经典方法是在训练目标中加入 辅助负载均衡损失(Auxiliary Load Balancing Loss),鼓励 Router 更均匀地使用 Expert。

Capacity

为了防止某个 Expert 接收过多 Token,MoE 系统通常会设置 Expert 的 Capacity(容量)。

如果一个 Expert 接收到的 Token 数量超过其容量,就可能出现:

Token 被丢弃、重新路由,或者采用其他处理方式。

因此,实际 MoE 系统不仅仅是:

Router → Expert

还需要处理:

Router → Token Dispatch → Expert → Token Combine

这也是 MoE 在工程实现上比普通 FFN 更复杂的重要原因。

MoE 的通信问题

MoE 在大规模训练中的一个重要工程挑战是通信成本。

如果不同 Expert 被部署在不同 GPU 上,那么 Router 选择 Expert 后,需要把 Token 发送到对应 GPU。

典型过程是:

Token → Router → All-to-All 通信 → Expert → All-to-All 通信 → Token 重组

其中 All-to-All 通信可能成为整个训练系统的性能瓶颈。

因此 MoE 不只是一个模型结构问题,同时也是一个重要的分布式训练和系统优化问题。

MoE 的训练

MoE 通常通过 反向传播 和 梯度下降进行训练。

训练过程可以简单理解为:

输入 Token → Router 选择 Expert → Expert 计算 → 得到 Loss → 反向传播 → 更新 Router 和 Expert

相比普通 Dense 模型,MoE 的训练需要额外考虑:

* Router 的学习。 * Expert 的负载均衡。 * Token Dispatch。 * Expert Capacity。 * GPU 之间的通信。 * 路由导致的训练稳定性问题。

Sparse MoE 与 Dense MoE

需要区分 Dense MoE 和 Sparse MoE。

Dense MoE

所有 Expert 都参与计算。

Sparse MoE

每个 Token 只选择少数 Expert。

现代大语言模型中通常所说的 MoE,主要指 Sparse MoE。

如果所有 Expert 都参与计算,那么 MoE 最重要的计算优势就基本不存在了。

MoE 在大语言模型中的应用

MoE 已经成为现代 大语言模型 扩展模型容量的重要路线之一。

典型思路是:

增加 Expert 数量 → 增加总参数量 → 保持较小的 Top-K → 控制每 Token 计算量

因此,相比单纯扩大 Dense Transformer,MoE 可以在相近的计算预算下获得更大的模型容量。

代表性的 MoE 模型和研究包括:

* GShard * Switch Transformer * Mixtral * DeepSeek MoE * DeepSeek-V2 * DeepSeek-V3

MoE 的优点

* 高参数容量:可以拥有非常大的总参数量。 * 稀疏计算:每个 Token 只激活少数 Expert。 * 计算效率:在合理设计下,可以用相对有限的计算量获得更大的模型容量。 * 条件计算:模型可以根据不同输入动态选择计算路径。 * 适合规模扩展:适合构建超大规模模型。

MoE 的缺点

* 训练复杂度更高:需要额外处理 Router 和负载均衡。 * 通信成本高:分布式训练中可能需要大量 All-to-All 通信。 * 显存需求高:虽然每个 Token 只激活部分 Expert,但通常仍需要保存全部 Expert 参数。 * 负载不均衡:Router 可能导致部分 Expert 过载。 * 训练稳定性问题:路由机制增加了优化难度。 * 硬件利用率问题:Expert 分配不均时可能导致 GPU 利用率下降。

MoE 与模型参数量

讨论 MoE 模型时,需要区分两个重要概念。

总参数量(Total Parameters)

所有 Expert 以及模型其他部分的参数总和。

激活参数量(Active Parameters)

处理一个 Token 时实际参与计算的参数量。

例如:

总参数量:1T 激活参数量:100B

这并不意味着模型只有 100B 参数,而是意味着单个 Token 的计算主要使用约 100B 参数。

因此,在比较 MoE 模型时,只比较总参数量是不够的,还应该关注:

总参数量 + 激活参数量 + 每 Token FLOPs

MoE 的核心意义

MoE 最重要的意义可以概括为:

把模型容量和计算量部分解耦。

传统 Dense 模型扩大参数量时,计算量通常也会同步增长。

MoE 则通过 条件计算,让模型根据输入动态决定:

这一次计算应该使用哪些参数。

因此,MoE 本质上是一种条件计算架构。

它的重要性并不只是“把一个模型拆成很多专家”,而是让神经网络具备了动态选择计算路径的能力。

这也是 MoE 能够支持超大规模 大语言模型 的重要原因。

相关条目

* Transformer * 大语言模型 * 前馈神经网络 * 条件计算 * 稀疏激活 * Switch Transformer * Mixtral * DeepSeek MoE

参考资料

* Jacobs, R. A., Jordan, M. I., Nowlan, S. J. & Hinton, G. E.,Adaptive Mixtures of Local Experts,Neural Computation,1991。 * Shazeer, N. et al.,Sparsely-Gated Mixture-of-Experts,2017。 * Lepikhin, D. et al.,GShard: Scaling Giant Models with Conditional Computation and Automatic Sharding,2020。 * Fedus, W., Zoph, B. & Shazeer, N.,Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity,2021。 * Jiang, A. Q. et al.,Mixtral of Experts,2024。 * Adaptive Mixtures of Local Experts * Sparsely-Gated Mixture-of-Experts * GShard * Switch Transformers * Mixtral of Experts