Mixture of Experts · 交互图解

总参数很大
每次只叫几个专家

稠密模型:每个 token 都要过完整网络。 MoE(混合专家):把一层拆成很多「专家」,路由器按 token 挑少数几个算。 于是「模型容量」变大,「每次前向」的算力却不一定涨。

8–64 专家
一层里常见的专家数
Top-2
每个 token 通常激活 1–2 个
省算力 ≠ 省显存
权重仍要放在卡上

医院分诊,不是人人看全科

把一层 FFN 想成诊室大楼:

专家 Expert

一份小前馈网络。不同专家擅长不同「模式」——有的偏代码,有的偏多语言(大意如此,不可字面理解)。

路由器 Router

对当前 token 算各专家得分,取最高几个。有时再加负载均衡,避免都挤去少数专家。

加权合并

选中的专家各算一份,按路由权重加权相加。像多科室会诊,而不是随机挑一个。

点一个 token,看它被派给谁

路由表是教学示意。真实模型的专家「专长」没这么整齐,但机制类似。

路由实验台
点 token · 高亮 Top-2 专家

句子:Write a Python function to retry HTTP 429 with backoff

专家阵列(本示意 8 个)
当前 token
路由得分(越高越亮)
点上面的 token。

省的是「算」,不一定省「存」

每次前向(算力)

稠密:整个 FFN 都要算。
MoE:只算 Top-k 个专家 + 路由器。
同等「总参数」下,MoE 的激活计算量可以小一个数量级。

权重存放(显存)

所有专家的参数仍要放进显存(或分片到多卡)。 所以 MoE 常常是:激活参数少、总参数大——推理要显存,训练要通信。

// 伪代码:MoE 一层
scores = router(x)           // [n_experts]
idx, w = topk(scores, k=2)  // 选专家 + 权重
y = Σ w[i] * Expert[idx[i]](x) // 只算选中的
读新闻时对一下: 「总参数 200B、激活 30B」这种写法,多半就是 MoE。 别只看总参数就觉得推理一定贵——要看激活。

激活参数 vs 总参数

拖专家数和 Top-k,看激活比例怎么变。

MoE 参数占比
拖动 · 对比稠密基线
总参数(都要放显存)
激活参数(每次前向大约)

四句话带走

  1. MoE = 多个专家 + 一个分诊台,每个 token 只走少数专家。
  2. 激活参数 ≪ 总参数——容量上去了,单次算力可以不涨那么多。
  3. 显存仍要装下所有专家,所以「省算力」不等于「随便一张卡就能跑」。
  4. 看到「总参 / 激活参」两个数,先问:哪个对应推理成本?通常看激活。