MoE 混合专家论文演进
混合专家(Mixture of Experts, MoE)通过稀疏激活机制,在不增加推理计算量的前提下大幅扩展模型参数,是大语言模型架构创新的核心方向,从 Switch Transformer 到 Mixtral 再到 DeepSeek-MoE,持续推动着规模效率的边界。
MoE 基本原理
MoE 的核心思想是:不同输入激活不同的专家子网络,实现条件计算:
python
import torch
import torch.nn as nn
import torch.nn.functional as F
class MoELayer(nn.Module):
"""混合专家层"""
def __init__(self, d_model, num_experts=8, top_k=2):
super().__init__()
self.num_experts = num_experts
self.top_k = top_k
# 门控网络
self.gate = nn.Linear(d_model, num_experts, bias=False)
# 专家网络(每个专家是一个 FFN)
self.experts = nn.ModuleList([
nn.Sequential(
nn.Linear(d_model, d_model * 4),
nn.GELU(),
nn.Linear(d_model * 4, d_model)
) for _ in range(num_experts)
])
def forward(self, x):
B, T, D = x.shape
x_flat = x.view(-1, D)
# 计算门控分数
gate_logits = self.gate(x_flat) # [B*T, num_experts]
gate_scores = F.softmax(gate_logits, dim=-1)
# 选择 Top-K 专家
top_k_scores, top_k_indices = gate_scores.topk(self.top_k, dim=-1)
top_k_scores = top_k_scores / top_k_scores.sum(dim=-1, keepdim=True)
# 稀疏计算
output = torch.zeros_like(x_flat)
for k in range(self.top_k):
expert_idx = top_k_indices[:, k]
for e in range(self.num_experts):
mask = (expert_idx == e)
if mask.any():
expert_input = x_flat[mask]
expert_output = self.experts[e](expert_input)
output[mask] += top_k_scores[mask, k].unsqueeze(-1) * expert_output
return output.view(B, T, D)论文演进路线
第一代:经典 MoE
- Adaptive Mixtures of Local Experts (1991):Jacobs 等人提出 MoE 原始概念
- Sparsely-Gated MoE (2017):Shazeer 等人将 MoE 应用于 LSTM
第二代:Transformer + MoE
- Switch Transformer (2021):Google 提出 Top-1 路由,简化 MoE
- GShard (2020):跨设备 MoE 并行训练策略
- GLaM (2022):仅 FFN 层使用 MoE,降低训练成本
第三代:开源 MoE 大模型
- Mixtral 8x7B (2023):Mistral 的开源 MoE 模型,性能媲美 Llama-2 70B
- DeepSeek-MoE (2024):细粒度专家分割 + 共享专家
- Qwen-MoE:阿里的 MoE 实现
Switch Transformer 的简化
Switch Transformer 将 Top-K 路由简化为 Top-1(每个 Token 仅路由到 1 个专家),大幅降低了通信开销和实现复杂度。虽然理论上不如 Top-2 信息丰富,但实际效果相当。
关键技术挑战
负载均衡
MoE 的核心挑战是确保专家负载均衡,避免少数专家过载:
- 辅助损失:添加负载均衡损失项,惩罚不均匀分布
- 容量因子:限制每个专家处理的 Token 数量
- 专家选择路由:由专家选择 Token 而非 Token 选择专家
通信优化
分布式 MoE 训练的通信开销是主要瓶颈:
- All-to-All 通信:Token 需要发送到不同设备的专家
- 专家并行:将不同专家放在不同设备上
- 通信-计算重叠:通信与计算流水线化
DeepSeek-MoE 创新
DeepSeek-MoE 提出了两项重要创新:
- 细粒度专家分割:将大专家拆分为更多小专家,提升路由灵活性
- 共享专家:保留部分专家处理通用知识,减少冗余