专栏算法工具链【大模型】MoE(专家混合模型)简介

【大模型】MoE(专家混合模型)简介

no_name2026-07-19
55
0

本文主要针对开源资料学习整理,如有错漏欢迎评论交流~

1. 引言

理解 MoE,不妨从一个直觉说起——假设你有一家医院,来了一个病人,你希望给他最好的治疗。

一种做法是:养一个全能医生,什么病都他一个人看。这个医生必须精通所有科室,能力极强,但每次看诊都要把全部知识过一遍,非常累,看得也慢。
另一种做法是:养一百个专科医生,再配一个分诊台。病人来了,分诊台判断他该看哪几个科室,然后只让对应的专科医生出手。
第二种,就是 MoE(Mixture of Experts,专家混合) 的核心思想:

模型里有很多"专家"网络,但每个 token 在推理时只激活其中少数几个参与计算。

这带来一个诱人的结果——模型可以很大(容量大),但每次计算很省(算得少)。这正是当下大模型(Mixtral、DeepSeek-V3、Qwen-MoE 等)普遍采用 MoE 的原因。

2. 结构对比:Dense 与 MoE 的差异

要看清 MoE 与普通 Transformer 的区别,先看一个 Dense 层长什么样。一个普通 Transformer 层(Dense)长这样:

每一层只有一个 MLP,所有 token 都穿过同一个 MLP,每个 token 都要计算 MLP 的全部参数。模型越大,MLP 越大,每个 token 都要付全部代价。
MoE 做的事,就是把那个 MLP 拆成很多个专家

几个要点:

  • Attention 依然是 Dense 的——所有 token 共享同一套注意力参数。
  • 只有 FFN(MLP)部分被换成了 MoE。这是当前主流做法。
  • 每个专家本身就是一个普通的 MLP(升维 → 激活 → 降维),结构并不神秘,区别只是"数量变多了"。

3. MoE 层的内部结构

一个 MoE 层可以拆成四个零件,像一条流水线:

① Router(路由 / 分诊台)

Router 是一个小线性层。它读入 token 的隐藏状态,给每个专家打一个分,然后选出分数最高的几个:

  • 打分:z = x · W_router(一个矩阵乘法)

  • 选 Top-K 个得分最高的专家

  • 把这 K 个专家的得分做 softmax,得到融合权重

Router 的全部职责就一句话:决定这个 token 该交给哪几个专家。

② Dispatch(分发 / 重新排队)

Router 知道"token0 给专家3、token1 给专家5、token2 也给专家3",但专家自己并不知道哪些 token 属于自己。Dispatch 就是按专家把 token 重新分组:
  • 专家3 ← token0, token2

  • 专家5 ← token1

这样每个专家就能一次性做完自己的矩阵乘法(一次 GEMM),而不是来一个 token 算一次。这是 MoE 能高效执行的关键。本质上是 token 的重排(reorder / scatter)

③ 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。

专家数(Number of Experts):一个 MoE 层里有多少个专家。比如 64 个专家,意味着 Router 在 64 个里挑。专家越多 → 模型容量越大、参数越多、Router 选择空间越大,但并不会让每个 token 多算
Top-K:每个 token 实际激活几个专家。比如 64 个专家里 Top-K=2,就是每个 token 只用 2 个。

Top-K 越大

Top-K 越小

表达能力

更强(用更多专家)

更弱

计算量(FLOPs)

越大

越小

推理速度

越慢

越快

Dispatch/Gather 开销

越大

越小

Top-K 是模型效果与推理效率之间最重要的旋钮。Switch Transformer 用过激进的 Top-1(每 token 只激活 1 个专家);Mixtral 用 Top-2;DeepSeek-V3 用 Top-8(在 256 个专家里挑 8 个)。

5. 计算效率分析:大容量与小计算

MoE 何以实现"大容量、小计算"?举个数。假设一个 MoE 层有 64 个专家,每个专家 500M 参数:

  • 总参数 = 64 × 500M ≈ 32B
  • 若 Top-K = 8,每个 token 实际只算 8 个专家:

  • 实际计算量 ≈ 8 × 500M = 4B
所以一个"32B 总参、4B 激活"的 MoE,在效果上可以接近更大的模型,在计算上只花 4B 的代价。
这就是 MoE 最本质的价值——它解耦了"参数量"和"计算量"。过去,模型多大就要算多少;MoE 让你能在固定算力预算下,靠堆参数换来更好的效果。这也是大模型 scaling 能继续往下走的重要支点。

命名记法

  • 30B-A3B:代表模型总参数量约 30B,单 token 推理时激活的有效参数量约 3B。

  • Mixtral 8×7B:模型包含 8 个专家 FFN 模块,单个专家 FFN 的参数量规模对标稠密 7B 模型的 FFN。该模型注意力、词嵌入等主干权重全局共享、不随专家复制,因此总参不能简单用 8×7 相乘,实际全部参数合计约 47B。


6. 常见误解辨析

关于 MoE,有两个最常见的误解。

误解一:激活只有 4B,那显存是不是也只要 4B?

不是。

原因很简单:每个 token 激活的专家不一样。这个 token 用专家 3、18,下一个 token 可能用专家 7、29。任何专家都可能在下一刻被选中,所以所有专家的权重都必须常驻显存
显存占用 ≈ 总参数量 计算量 ≈ 激活参数量
MoE 省的是算力,不是显存。这是它和"小模型"的根本区别——它"重"得像一个 32B 模型,但"跑"得像一个 4B 模型。

误解二:MoE 一定比同规模 Dense 更快?

不一定,这正是 MoE 最大的效率陷阱。

要分两个阶段看:

  • Prefill(首字 / 大 batch)阶段:一次处理很多 token,专家的权重被大量 token 复用,算术强度高,MoE 确实因为 FLOPs 低而更快、更划算。
  • 自回归解码(逐 token、小 batch)阶段:每生成一个 token 都要加载被激活专家的权重。此时瓶颈不是算力,而是显存带宽(memory-bandwidth bound)。专家权重再大,每个 token 也只用一次,算术强度极低。结果就是:解码阶段 MoE 的实际吞吐,未必优于、甚至可能低于一个同等"激活参数"规模的 Dense 模型。
换句话说:MoE 用更少的 FLOPs 换来了更大的显存带宽压力。 在低并发、对延迟敏感的在线推理场景,这个权衡并不总是划算的。这也是为什么 MoE 推理框架要花大力气做 expert grouping、缓存、batch 聚合——本质上都是在对抗带宽瓶颈。

7. 训练挑战:负载均衡与专家坍塌

MoE 训练的头号难题,是别让专家"偷懒"。如果让 Router 自由学习,它很容易偷懒——只把 token 送给少数几个"好用"的专家,其余专家常年闲置。这叫专家坍塌(expert collapse):模型看似有 64 个专家,实际只有 5 个在干活,容量没用到,参数全浪费了。
解决办法是负载均衡(load balancing):在训练时加一个辅助损失(auxiliary loss),惩罚"专家忙闲不均",逼着 Router 把 token 尽量均匀地分给各专家。主流做法几经演进:
  • 经典 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 都采用了这一思路。

正因如此,支持了一个 MoE 模型,并不等于支持了所有 MoE 模型。对量化工具链或推理框架而言,真正要适配的不是"MoE"这个概念,而是每一个模型的具体实现:Router 怎么写的、专家结构长什么样、Dispatch/Gather 怎么组织数据、用了哪种 Kernel、多卡怎么通信。这些任一不同,都可能需要重新分析与适配。

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. 总结

一句话概括 MoE 的本质——它用稀疏激活把"模型容量"和"计算成本"解耦:
  • 它用总参数量模型容量——所以很大、很重;
  • 它用激活参数量控制计算量——所以算得省;
  • 但它不省显存,且在解码阶段受带宽制约,并非无条件更快;
  • 它的训练需要负载均衡对抗专家坍塌,实现上没有统一标准
算法工具链
杂谈社区征文技术深度解析
评论0
0/600