本文主要针对开源资料学习整理,如有错漏欢迎评论交流~
1. 引言
理解 MoE,不妨从一个直觉说起——假设你有一家医院,来了一个病人,你希望给他最好的治疗。
模型里有很多"专家"网络,但每个 token 在推理时只激活其中少数几个参与计算。
2. 结构对比:Dense 与 MoE 的差异
要看清 MoE 与普通 Transformer 的区别,先看一个 Dense 层长什么样。一个普通 Transformer 层(Dense)长这样:


几个要点:
- Attention 依然是 Dense 的——所有 token 共享同一套注意力参数。
- 只有 FFN(MLP)部分被换成了 MoE。这是当前主流做法。
- 每个专家本身就是一个普通的 MLP(升维 → 激活 → 降维),结构并不神秘,区别只是"数量变多了"。
3. MoE 层的内部结构
一个 MoE 层可以拆成四个零件,像一条流水线:
① Router(路由 / 分诊台)
Router 是一个小线性层。它读入 token 的隐藏状态,给每个专家打一个分,然后选出分数最高的几个:
打分:z = x · W_router(一个矩阵乘法)
选 Top-K 个得分最高的专家
把这 K 个专家的得分做 softmax,得到融合权重
② Dispatch(分发 / 重新排队)
专家3 ← token0, token2
专家5 ← token1
③ Expert(专家计算)
每个专家拿到分给自己的 token,做一次普通的 MLP 前向。区别只是——模型里有几十甚至几百个这样的专家,而每个 token 只进其中几个。
④ Gather(收集 / 恢复顺序)
专家算完之后,结果还是"按专家分组"的,但模型需要"按原始 token 顺序"继续往后走。Gather 做两件事:
- 把输出恢复成原来的 token 顺序;
- 如果 Top-K > 1,按 Router 给的权重加权融合,例如 0.7 × 专家3 + 0.3 × 专家5,得到这个 token 的最终输出。
4. 关键参数:专家数与 Top-K
理解 MoE,抓住两个数字就够了——专家数与 Top-K。
Top-K 越大 | Top-K 越小 | |
表达能力 | 更强(用更多专家) | 更弱 |
计算量(FLOPs) | 越大 | 越小 |
推理速度 | 越慢 | 越快 |
Dispatch/Gather 开销 | 越大 | 越小 |
5. 计算效率分析:大容量与小计算
MoE 何以实现"大容量、小计算"?举个数。假设一个 MoE 层有 64 个专家,每个专家 500M 参数:
- 总参数 = 64 × 500M ≈ 32B
若 Top-K = 8,每个 token 实际只算 8 个专家:
- 实际计算量 ≈ 8 × 500M = 4B
命名记法
30B-A3B:代表模型总参数量约 30B,单 token 推理时激活的有效参数量约 3B。
Mixtral 8×7B:模型包含 8 个专家 FFN 模块,单个专家 FFN 的参数量规模对标稠密 7B 模型的 FFN。该模型注意力、词嵌入等主干权重全局共享、不随专家复制,因此总参不能简单用 8×7 相乘,实际全部参数合计约 47B。
6. 常见误解辨析
关于 MoE,有两个最常见的误解。
误解一:激活只有 4B,那显存是不是也只要 4B?
不是。
显存占用 ≈ 总参数量 计算量 ≈ 激活参数量
误解二:MoE 一定比同规模 Dense 更快?
不一定,这正是 MoE 最大的效率陷阱。
要分两个阶段看:
- Prefill(首字 / 大 batch)阶段:一次处理很多 token,专家的权重被大量 token 复用,算术强度高,MoE 确实因为 FLOPs 低而更快、更划算。
- 自回归解码(逐 token、小 batch)阶段:每生成一个 token 都要加载被激活专家的权重。此时瓶颈不是算力,而是显存带宽(memory-bandwidth bound)。专家权重再大,每个 token 也只用一次,算术强度极低。结果就是:解码阶段 MoE 的实际吞吐,未必优于、甚至可能低于一个同等"激活参数"规模的 Dense 模型。
7. 训练挑战:负载均衡与专家坍塌
- 经典 aux loss(Switch Transformer / GShard):直接优化"各专家被选中的比例",让其趋于均匀。
- DeepSeek 的 aux-loss-free 路由:不再用损失项去"拉平",而是在 Router 打分上加一个可学习的偏置项(bias),通过调整偏置动态引导负载均衡——既保住了效果,又避免了 aux loss 对主任务的干扰。
负载均衡是 MoE 训练中绕不开的核心设计,也是不同 MoE 模型差异最大的地方之一。
8. 实现差异:没有"标准"的 MoE
很多文档会写"已支持 XX-MoE,其他 MoE 模型需具体分析",原因在于 MoE 没有统一标准。确切地说:
MoE 是一种架构思想,而不是统一标准。
不同模型都叫 MoE,实现细节可能完全不同。主要差异点:
差异维度 | 可能的变化 |
专家数量 | 几个到几百个不等 |
Top-K | 1、2、6、8……各不相同 |
Router | Softmax / Sigmoid / 分组(group)/ 层级(hierarchical)/ 带偏置 |
负载均衡 | 经典 aux loss / aux-loss-free / 各自的 routing 算法 |
专家结构 | 普通 MLP / 共享专家 + 路由专家(shared + routed) |
Dispatch/Gather | token 排布、索引格式、padding、排序方式各异 |
Kernel | 普通 GEMM / Batched GEMM / Grouped GEMM |
多卡通信 | All-to-All 的时机、batch 划分、并行策略各不相同 |
其中**共享专家(shared expert)**是近年流行的设计:所有 token 无条件经过一个共享专家,再额外用 Router 选 Top-K 个路由专家。共享专家负责"大家都需要的通用知识",路由专家负责"专精分化",DeepSeek 系列、Qwen-MoE 都采用了这一思路。
9. 主流模型对比
为建立直观印象,下表列出几个有代表性的真实 MoE 模型(参数为公开资料近似值):
模型 | 专家数 | Top-K | 特点 |
Switch Transformer (2021) | 可达上千 | 1 | 开创性工作,激进 Top-1,单专家激活 |
GShard (2020) | 上千 | 2 | 把 MoE 推向千亿级规模训练 |
Mixtral 8x7B (2023) | 8 | 2 | 开源 MoE 引爆点,softmax 路由 |
Mixtral 8x22B (2024) | 8 | 2 | 8x7B 的放大版 |
DeepSeek-V3 (2024) | 256 路由 + 1 共享 | 8(路由) | 细粒度专家 + 共享专家 + aux-loss-free 路由 |
可以看出:同样是 MoE,从"8 个专家选 2 个"到"256 个专家选 8 个外加 1 个共享专家",差异巨大。这也是上一节"没有标准 MoE"的最好注脚。
10. 总结
- 它用总参数量换模型容量——所以很大、很重;
- 它用激活参数量控制计算量——所以算得省;
- 但它不省显存,且在解码阶段受带宽制约,并非无条件更快;
- 它的训练需要负载均衡对抗专家坍塌,实现上没有统一标准。
