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 层由两部分组成:
- 路由器 / 门控网络(Router / Gating):一个小的线性层,为每个 token 计算各专家的得分,选出 Top-K 个专家。
- 专家(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 都激活,用于学习通用基础知识,避免每个路由专家都重复学习公共能力,从而让路由专家更专注于专业化分工。