MoE:用参数量换计算效率

MoE(Mixture of Experts)的核心思想很简单:不是所有参数都需要参与每次计算。通过路由机制,只激活与当前输入最相关的"专家"子网络,在保持大参数量的同时大幅降低计算量。

基本原理

稠密模型 vs 稀疏模型

传统稠密模型:每个token经过所有参数的计算。

输入token → [Attention] → [MLP(d, d_ff)] → 输出
                         所有参数参与计算

MoE模型:MLP层被替换为多个专家MLP,路由器选择激活哪些专家。

输入token → [Attention] → [Router] → 选择Top-K专家
                         [Expert1] [Expert2] ... [ExpertN]
                              ↓ (仅K个被激活)
                         加权合并 → 输出

关键参数

  • 专家数(N):总专家数量。通常8-64个
  • 激活数(K):每个token激活的专家数。通常2-8个
  • 稀疏率:1 - K/N。如8/64的配置,稀疏率为87.5%

以DeepSeek-V3为例:256个专家,每token激活8个,总参数671B但推理时只激活37B——等效于37B模型的计算量,但拥有671B参数的知识容量。

路由机制

基础路由

最简单的路由方式:

def route(token, experts):
    # 计算token与每个专家的亲和度
    scores = softmax(W_router @ token)  # [N]
    # 选择Top-K个专家
    top_k_indices = argsort(scores)[-K:]
    top_k_scores = scores[top_k_indices]
    # 归一化
    top_k_scores /= top_k_scores.sum()
    # 加权合并
    output = sum(experts[i](token) * top_k_scores[i] 
                 for i in top_k_indices)
    return output

负载均衡问题

基础路由有一个严重问题:路由坍缩。模型倾向于总是选择少数几个"好"专家,其他专家得不到训练。

辅助损失法

添加辅助损失强制负载均衡:

L_aux = α * N * Σ(f_i * P_i)

f_i: 实际路由到专家i的token比例
P_i: 路由器对专家i的平均概率

当所有专家被均匀使用时,f_i * P_i最小(均匀分布的熵最大)。

专家级别的负载均衡

更细粒度的方法:

  • 监控每个专家的实际负载
  • 动态调整路由阈值
  • 过载专家的token溢出到次优专家

Expert Choice路由

传统路由是"token选择专家",Expert Choice反过来——“专家选择token”:

  • 每个专家根据自身容量选择最匹配的token
  • 天然保证负载均衡
  • 但处理batch内token的顺序敏感

训练挑战

训练不稳定性

MoE训练比稠密模型更容易不稳定:

  • 梯度通过路由器的方差大
  • 专家间学习速度不均匀
  • 路由的离散性导致梯度估计有偏

解决方案

  • 更低的学习率(约为稠密模型的1/2到1/4)
  • 更大的batch size
  • z-loss:惩罚路由器输出过大值
  • 逐步增加专家数量(curriculum)

通信开销

分布式训练MoE时,不同GPU负责不同专家,需要在GPU间传递token(All-to-All通信):

GPU1(Expert1-4) ←→ GPU2(Expert5-8) ←→ GPU3(Expert9-12) ...
     All-to-All通信

这成为训练的通信瓶颈。优化方向:

  • Expert Parallelism:按专家切分GPU
  • TopK All-to-All:只传递被选中的token
  • 通信计算重叠:提前开始通信

数据效率

MoE的参数利用率高,但训练数据需求更大——因为每个专家看到的数据更少。解决方案:

  • 更大batch size
  • 更长训练周期
  • 数据混合策略调整

推理优化

动态激活

推理时只加载被激活专家的参数,减少内存访问:

token → Router → [Expert2, Expert5] 
                  只加载这两个专家的权重计算

专家缓存

热门专家常驻GPU显存,冷门专家放CPU内存:

  • 用LRU策略管理专家权重缓存
  • 监控专家调用频率,动态调整缓存
  • 减少专家权重加载延迟

专家量化

对不同专家使用不同精度:

  • 高频专家:FP16(精度优先)
  • 低频专家:INT4(内存优先)
  • 根据使用频率动态调整

MoE变体

DeepMoE / DeepSeekMoE

DeepSeek的创新:

  • 细粒度专家:更多更小的专家(256个),提高路由灵活性
  • 共享专家:一些专家始终激活,处理通用信息
  • K=8, N=256:每token激活8/256

Mixtral

Mistral的MoE方案:

  • 8个专家,每token激活2个
  • 稀疏率75%
  • 架构简洁,易于部署

Switch Transformer

Google的早期工作:

  • 每token只激活1个专家(K=1)
  • 极致稀疏但表达能力受限

MoE经济学

训练成本

以671B参数的MoE为例(DeepSeek-V3):

  • 训练成本约等效于37B稠密模型的2-3倍
  • 但推理能力接近671B稠密模型

推理成本

模型总参数激活参数推理成本(相对)能力
70B稠密70B70B1x基准
8x22B MoE141B22B0.31x略高于70B
DeepSeek-V3671B37B0.53x接近671B

MoE的核心经济价值:以小参数的计算成本获得大参数的能力

总结

MoE架构正在成为大模型的主流选择——当模型规模超过百亿参数后,稠密架构的计算成本变得不可接受,而MoE提供了一条优雅的出路。2026年,从DeepSeek到Mixtral到Llama,主流开源模型几乎都采用了MoE。MoE不是简单的架构选择,而是改变大模型经济学的基础创新——让参数量增长不再被计算成本限制。