MoE(Mixture of Experts,专家混合模型)是一种通过稀疏激活实现模型容量扩展的神经网络架构设计范式。其核心思想是将模型分解为多个"专家"子网络,在每次推理时仅激活其中一部分,从而在不显著增加计算成本的前提下大幅提升模型的参数容量。这一架构在大语言模型时代得到了广泛应用,代表性工作包括 Switch Transformer、GLaM、Mixtral 8x7B 以及 DeepSeek 系列的 MoE 架构。
传统的稠密(Dense)大语言模型在扩展时面临一个根本矛盾:模型参数量越大,表达能力越强,但计算成本也线性增长。MoE 通过条件计算(Conditional Computation)打破了这一瓶颈——模型总参数可以非常大(如万亿级别),但每次推理只使用其中的一小部分。
从概念上讲,MoE 层包含 个独立的"专家"网络和一个门控(Gating/Router)网络。输入 token 经过门控网络,被路由到 个专家(通常 或 ),只有被选中的专家参与计算。这种"稀疏激活"机制使得 MoE 模型在计算效率上接近一个 (单专家参数量)的小模型,而在表达能力上接近一个 (单专家参数量)的大模型。
稀疏激活是 MoE 区别于稠密模型的根本特征。设一个 MoE 层有 个专家 ,每个专家是一个前馈网络(通常是 MLP/FFN)。对于输入 token ,门控网络 计算一个概率分布,选择 top- 个专家:
其中 将向量 中除了最大的 个值外的所有值设为 ,使 softmax 后这些位置为 0。该层的输出为被选专家的加权和:
由于 中只有 个非零值,实际计算量仅为 个专家的前向传播,而非 个。
MoE 的动机可以归纳为以下三点:
门控网络是 MoE 的核心组件,负责决定每个 token 应该由哪些专家处理。常见的门控策略包括:
经典 Shazeer 等人(2017)提出的 top- 门控:
其中 如果 在 top- 中,否则为 。
Switch Transformer(Fedus et al., 2021)使用了 的简化版本,称为 Top-1 门控,也称为 Switch Routing。这一简化极大地简化了负载均衡和专家容量管理,同时保持了不错的性能。
GShard(Lepikhin et al., 2020)和早期的 MoE 论文通常使用 :
Mixtral 8x7B 采用了 Top-2 门控,每个 token 激活 2 个专家。
Ramachandran 等人(2023)提出的 Soft MoE 用"软"分配替代了离散的 token-to-expert 分配:每个专家维护 个"槽位"(slot),token 以加权平均的方式分配到各槽位。这种方法避免了离散路由带来的负载均衡难题。
MoE 面临的核心工程挑战之一:门控网络可能倾向于将几乎所有 token 路由到少数几个专家,导致这些专家过载而其他专家闲置。负载均衡的目标是让 token 在各专家之间均匀分布。
最常用的方法是引入负载均衡辅助损失。Switch Transformer 的版本是:
其中 是被路由到专家 的 token 占比, 是门控网络分配给专家 的平均概率, 是损失权重(通常取 量级)。该损失鼓励每个专家收到相似数量的 token。
DeepSeek 在其 MoE 架构中引入了更精细的负载均衡策略:
专家容量限制了每个专家最多能处理的 token 数量。设 为 batch 中的总 token 数, 为专家数, 为容量因子(capacity factor),则每个专家的容量为:
当 时,理想均匀分布下每个专家恰好处理 个 token。实际中 通常设为 1.25 左右以允许一定的不均衡。超出容量的 token 会被丢弃或走残差连接(drop path)。较低的 值减少计算浪费,但可能丢弃过多 token;较高的 值保留更多信息但计算更昂贵。
MoE 中的专家通常是以下两种类型之一:
FFN 专家:前馈网络(MLP),一般使用 SwiGLU 或 GEGLU 激活函数,扩展为 的隐藏维度。在 Transformer 中,MoE 替代了 FFN 子层,而 Attention 子层保持稠密。
Attention 专家:尝试将 MoE 应用于 Attention 的变体,但较为少见。
DeepSeek-V2 提出了"细粒度专家"的概念——将专家数量增加到极大规模(如 DeepSeek-V2 有 160+ 专家),但每个专家的参数量减小。这种方法允许更灵活的路由和更高的激活稀疏度。
在 DeepSeek-V2/V3 的设计中,除了细粒度路由专家外,还包含独立的"共享专家"——所有 token 都会经过共享专家处理,确保基本表示能力的稳定。这种设计兼顾了共享知识和专业化知识。
这是最早将 MoE 引入深度学习的重要工作。作者在 LSTM 中应用稀疏门控 MoE,展示了将模型容量扩展到数千亿参数的可能性。主要贡献包括:
Google 将 MoE 思想应用到 Transformer 架构中,提出 GShard 系统。主要贡献:
GShard MoE 层的分布式计算流程:
输入 tokens → 门控网络 → 分组/路由 → All-to-All 通信
↓
各设备上的专家计算
↓
All-to-All 通信 → 合并输出
这是 MoE 领域最具影响力的工作之一,Google 将其扩展到万亿参数规模。
核心创新:
关键成果:
在相同 FLOPs 预算下,Switch Transformer 比 T5-Large 在训练速度上快 7 倍,同时在 SuperGLUE 等基准上取得相当的精度。在 30 种任务中有 29 种达到或超过 T5-Large 的性能。
GLaM(Generalist Language Model)是 Google 训练的包含 1.2T 参数(其中 64 个专家)的 MoE 模型。核心贡献在于:
这是将 MoE 落地到实际产品的里程碑式工作。Mixtral 8x7B 包含 8 个 7B 参数专家,但每次推理仅激活 2 个。
关键特性:
Mixtral 8x7B 证明了一个简洁的结论:MoE 架构在以稠密模型 1/4 的计算成本下,可以达到接近 5 倍参数稠密模型的性能。
DeepSeek 在 MoE 架构上做出了一系列重要创新:
DeepSeek-V3 MoE 架构概览:
输入 → [Transformer Layers × 67]
│
├── Layer MHA (Multi-Head Attention) ← 稠密
│
├── MoE FFN Layer:
│ 输入 → 门控网络 → Top-2 选专家
│ ├── 共享专家(所有 token 必过)
│ └── 2/256 路由专家(按 token 选择)
│
└── RMS Norm + Residual
| 模型 | 组织 | 总参数 | 激活参数 | 专家数 | 激活专家数 |
|---|---|---|---|---|---|
| Switch Transformer | 1.6T | ~1.2B/1.5B | 2048 | 1 | |
| GLaM | 1.2T | 96.6B | 64 | 2 | |
| Mixtral 8x7B | Mistral | 47B | 13B | 8 | 2 |
| Mixtral 8x22B | Mistral | 141B | 39B | 8 | 2 |
| DeepSeek-V2 | DeepSeek | 236B | 21B | ~160+ | 6-8 |
| DeepSeek-V3 | DeepSeek | 671B | 37B | 257 | 9 |
| Qwen2-MoE | Alibaba | ~14B | ~2.7B | - | - |
| DBRX | Databricks | 132B | 36B | 16 | 4 |
| JetMoE | MIT/CMU | 8B | 2B | - | - |
MoE 的分布式训练面临独特的挑战:门控后的 token 需要从原始 GPU 被发送到专家所在的 GPU,这一通信模式被称为 All-to-All。
在专家并行(Expert Parallelism)中,不同专家被放置在不同 GPU 上。token 分配流程如下:
Step 1: 每个 GPU 上的 token 经门控选择
Step 2: 根据选择结果,token 通过 All-to-All 发送到目标 GPU
Step 3: 目标 GPU 上的专家处理 token
Step 4: 处理结果通过 All-to-All 返回原始 GPU
这种方法的通信复杂度与 batch size 和专家数成正比,是大规模 MoE 训练的主要瓶颈之一。
DeepSeek-V3 对其分布式训练架构做了多项优化:
除了辅助损失外,还有多种策略用于改善 MoE 的负载均衡:
当某个专家接收的 tokens 超过其容量时,超额 tokens 的处理策略:
MoE 推理时,如果所有专家都需要加载到显存,对显存的要求会非常高。常用优化策略:
MoE 可以与其他稀疏机制组合使用:
| 维度 | 稠密模型 | MoE 模型 |
|---|---|---|
| 总参数 | ||
| 激活参数 | ||
| 前向 FLOPs | ||
| 显存需求 | (全加载时) | |
| 训练速度 | 基准 | 2-7× 更快(相同质量目标) |
| 推理延迟 | 基准 | 相近激活参数大小 |
| 微调稳定性 | 稳定 | 需额外注意负载均衡 |
| 可解释性 | 一般 | 可通过专家路由 pattern 分析 |
从经验上看,在相同的训练 FLOPs 预算下,MoE 模型通常可以达到比稠密模型更高的质量;或者说,在达到相同质量的前提下,MoE 模型所需的训练成本仅为稠密模型的 1/3 到 1/7。
import torch
import torch.nn as nn
import torch.nn.functional as F
class MoELayer(nn.Module):
def __init__(self, d_model, d_ff, num_experts, top_k=2, capacity_factor=1.25):
super().__init__()
self.num_experts = num_experts
self.top_k = top_k
self.capacity_factor = capacity_factor
# 门控网络
self.gate = nn.Linear(d_model, num_experts, bias=False)
# 专家网络(通常使用 SwiGLU FFN)
self.experts = nn.ModuleList([
nn.Sequential(
nn.Linear(d_model, d_ff * 2, bias=False), # SwiGLU 需要 2× 的中间维度
) for _ in range(num_experts)
])
# 输出投影(每个专家一个)
self.output_proj = nn.ModuleList([
nn.Linear(d_ff, d_model, bias=False) for _ in range(num_experts)
])
def forward(self, x):
# x: (batch, seq_len, d_model)
batch_size, seq_len, d_model = x.shape
x_flat = x.view(-1, d_model) # (batch*seq_len, d_model)
# 门控计算
gate_logits = self.gate(x_flat) # (total_tokens, num_experts)
gate_probs = F.softmax(gate_logits, dim=-1)
# Top-k 专家选择
top_k_vals, top_k_indices = torch.topk(gate_probs, self.top_k, dim=-1)
# 简化:直接取 top-k 专家的加权和
# 实际中需要处理专家容量、load balancing 等
weighted_output = torch.zeros_like(x_flat)
for expert_idx in range(self.num_experts):
# 找到选择了该专家的 tokens
mask = (top_k_indices == expert_idx).any(dim=-1)
if not mask.any():
continue
selected_tokens = x_flat[mask]
# 获取对应权重
expert_mask = top_k_indices == expert_idx
weights = top_k_vals[expert_mask]
# 专家前向(SwiGLU 激活)
hidden = self.experts[expert_idx](selected_tokens)
# SwiGLU: hidden = activated × gate
hidden_act = F.silu(hidden[:, :hidden.shape[-1]//2])
hidden_gate = hidden[:, hidden.shape[-1]//2:]
hidden_out = hidden_act * hidden_gate
# 输出投影
expert_out = self.output_proj[expert_idx](hidden_out)
# 加权合并
weighted_output[mask] += weights.unsqueeze(-1) * expert_out
return weighted_output.view(batch_size, seq_len, d_model)
注意:以上是一个简化实现,省略了专家容量管理、负载均衡损失和分布式通信等关键工程组件。实际生产环境的 MoE 实现要复杂得多。
MoE 架构从 Shazeer 2017 年的初步探索到 Switch Transformer 的突破,再到 DeepSeek-V3 展示的世界级能力,已经在理论和实践上都证明了其巨大价值。当前,MoE 面临的挑战正从"能否工作"转向"如何更好工作":
可以预见,在未来几年内,大多数顶级大语言模型都将采用某种形式的 MoE 或稀疏化设计。MoE 已被证明是通往超大规模 AI 模型最务实的技术路线之一。
此页面为 AI 知识体系 的一部分。
参考资料:
- Shazeer et al. (2017). Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layer
- Lepikhin et al. (2020). GShard: Scaling Giant Models with Conditional Computation and Automatic Sharding
- Fedus et al. (2021). Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity
- Du et al. (2021). GLaM: Efficient Scaling of Language Models with Mixture-of-Experts
- Jiang et al. (2024). Mixtral of Experts
- DeepSeek-AI (2024). DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model
- DeepSeek-AI (2024). DeepSeek-V3 Technical Report