Skip to content

MoE 混合专家模型

MoE(Mixture of Experts)是当前大模型「以稀疏激活换取大容量」的主流路线,Mixtral、DeepSeek-V3、Qwen-MoE、GPT-4(传闻)都采用了它。也是近两年面试的高频新考点。

什么是 MoE?

MoE 的核心思想是:用很多个「专家」(Expert)替换 Transformer 里的 FFN(前馈网络),但每个 token 只激活其中少数几个专家。

  • 总参数量(容量)很大:例如 64 个专家。
  • 单次激活的参数(计算量)很小:例如每个 token 只走 2 个专家。

这样就实现了「大容量、低单次计算成本」——模型记得多,但每次推理/训练只算一小部分。这是 Dense(稠密)模型做不到的:Dense 模型每个 token 都要过全部参数。

一个 MoE 层由两部分组成:

  1. 路由器 / 门控网络(Router / Gating):一个小的线性层,为每个 token 计算各专家的得分,选出 Top-K 个专家。
  2. 专家(Experts):若干个结构相同的 FFN,token 只送进被选中的专家,输出按门控权重加权求和。

$$y = \sum_{i \in \text{TopK}} g_i \cdot E_i(x),\quad g = \text{softmax}(\text{TopK}(W_g \cdot x))$$

为什么 MoE 能省成本?

以 Mixtral 8x7B 为例:总参数约 47B,但每个 token 只激活约 13B(2 个专家)。所以它的推理计算量接近 13B 模型,效果却接近 47B 模型。

注意「8x7B」≠ 56B:只有 FFN 被复制成 8 份,Attention 等是共享的,所以总参数是 47B 而非 56B。

对比维度Dense 模型MoE 模型
总参数= 激活参数远大于激活参数
单 token 计算量全部参数只算 Top-K 专家
显存占用小(参数少)大(所有专家都要加载进显存)
训练难度稳定需处理负载均衡、训练不稳定
性价比一般同等计算量下效果更好

核心挑战:负载均衡(Load Balancing)

如果不加约束,路由器会倾向于总把 token 送给少数几个「受欢迎」的专家,导致:

  • 少数专家过载、其余专家几乎没被训练(专家坍缩);
  • GPU 之间负载不均,拖慢整体(专家通常分布在不同卡上)。

常见解法:

  • 辅助损失(Auxiliary Loss):额外加一个损失项,惩罚负载不均,鼓励 token 均匀分配到各专家。
  • 专家容量(Capacity Factor):给每个专家设一个处理上限,超出的 token 被丢弃(token dropping)或走残差直接跳过。
  • DeepSeek 的无辅助损失均衡:DeepSeek-V3 用「为每个专家加可学习的偏置项动态调节路由」的方式做负载均衡,避免辅助损失损害主任务效果。

主流 MoE 设计

  • Switch Transformer(Google):Top-1 路由(每个 token 只走 1 个专家),简化设计、降低通信。
  • Mixtral(Mistral):8 个专家、Top-2 路由,开源 MoE 的代表作。
  • DeepSeekMoE细粒度专家 + 共享专家——把专家切得更细(更多但更小的专家)以增强专业化,同时设置始终激活的「共享专家」捕捉通用知识。
  • Qwen-MoE / GLM-MoE:国产开源 MoE 代表。

高频追问

Q:MoE 和 Dense 模型,推理时谁更省显存? Dense 更省显存。MoE 虽然单次只激活少数专家,但所有专家的参数都必须加载进显存,所以 MoE 是「省计算、费显存」。这也是 MoE 部署成本不低的原因。

Q:MoE 为什么训练不稳定? 路由是离散的 Top-K 选择(不可导),且容易负载不均、专家坍缩,需要辅助损失、容量限制、合适的初始化和较小学习率来稳定。

Q:每个 token 激活几个专家?为什么不全激活? 通常 Top-1 或 Top-2。全激活就退化成 Dense,失去了稀疏带来的计算优势;只激活少数专家才能在固定算力下放大模型容量。

Q:MoE 的「专家」学到的是不同领域知识吗? 不完全是。专家更多是按 token 级别的统计模式分工(如某些专家偏标点、偏数字、偏特定语法),并不能简单解释为「数学专家」「法律专家」,可解释性较弱。

Q:共享专家(Shared Expert)有什么用? DeepSeekMoE 让部分专家对所有 token 都激活,用于学习通用基础知识,避免每个路由专家都重复学习公共能力,从而让路由专家更专注于专业化分工。

基于 MIT 许可发布