Learn AI · 模型硬功底(由内而外)
第 15 课 / 经典论文 P14  ·  阶段三:规模与效率(收官 · Fedus et al., 2021)

MoE / Switch Transformers:
每个 token 只走一两个「专家」
——前沿模型能又大又便宜的根

Scaling Laws 说越大越好,Chinchilla 修了配比,FlashAttention 压了 attention 的成本。但还剩最后一道墙:常规(dense)模型里,每个参数对每个 token 都要算一遍——参数翻倍,每个 token 的计算成本也翻倍。 这一课 MoE 给出一条绕墙的路:能不能让参数量(模型懂多少)疯涨,但每个 token 实际花的算力(多贵)几乎不涨? 它回答你看模型发布时最该懂的一个反直觉:为什么有的模型号称上千亿、上万亿参数,跑起来却没那么贵、没那么慢?
MoE(Mixture of Experts,混合专家)的一句话:把 Transformer 里那块「人人都过」的 FFN,换成几十上百个并行的「专家」FFN,再加一个小路由器,让每个 token 只走其中一两个专家。
于是总参数量能涨到上万亿(容量、知识量),但每个 token 实际过的计算只相当于一个小模型(成本)。Switch Transformer 更激进——每个 token 只走 1 个专家。 MoE 把「模型多大」和「每个 token 多贵」解耦了——这就是前沿模型能又大又(相对)便宜的根。

一、立靶:dense 模型的墙——参数涨,每 token 成本同步涨

你学过的所有模型(GPT-3、BERT…)都是 dense(稠密)的:每一个参数,对每一个 token,都参与计算。这很「公平」,但也意味着——模型越大,每生成一个 token 要做的计算就越多,成本严格随参数量涨

立靶:知识量和计算量,能不能拆开?

人脑不是每想一件事都点亮整个大脑——你算数学时不太用到管音乐的区域。 MoE 把这个直觉搬进模型:模型可以很大(存很多本事),但每个 token 只调用其中一小部分。 于是「模型懂多少」(总参数)和「处理一个 token 要算多少」(激活参数)第一次被拆开——这就是「条件计算 / 稀疏激活」。

二、抽框架:FFN 换成「专家群 + 路由器」

改动只在每个 Transformer 块的 FFN 子层(attention 部分不动):

组件dense 模型MoE 模型
FFN 子层1 个 FFN,所有 token 都过N 个并行专家 FFN(如 8、64、128…)
谁来算固定那一个路由器(小网络)按 token 挑 top-k 个专家
每 token 激活全部 FFN 参数只有被选中的 k 个专家(其余闲置)
关键:总参数 ∝ 专家数 N,但算力 ∝ 激活数 k

每个 token 来了,路由器看一眼,把它发给最合适的 k 个专家(Switch Transformer 取 k=1,最简最省;常见 MoE 取 k=2)。 只有这 k 个专家为它计算,其余几十上百个纹丝不动。 所以你可以堆到 1.6 万亿参数(Switch-C),而每个 token 的计算量,还停在一个小模型的水平。容量和成本,就这样解耦了。

三、核心洞察:解耦容量与算力 + 必须付的工程税

一个洞察让它成立,几个工程难题让它「真能训起来」——后者是这篇论文真正的硬功夫。

说明
① 稀疏激活 = 容量与算力解耦不同 token 走不同专家(条件计算)。总参数决定「模型能装多少本事」,激活参数决定「每 token 多少算力」——两者第一次能分开调。同样算力下,MoE 能塞进远多于 dense 的参数,质量更高 / 达到同质量更快。
② 工程税一:负载均衡路由器若偏心,把大多 token 都发给少数几个「明星专家」,其余专家闲死、白占显存。Switch 加一个辅助的负载均衡 loss,逼路由器把 token 摊匀。
③ 工程税二:容量因子 / 丢 token每个专家有固定的「接客上限」(容量)。某专家被挤爆时,溢出的 token 会被丢弃(跳过该 FFN,靠残差直通)。容量因子调大些更安全但更费,是个取舍旋钮。

四、动手玩:调专家数与激活数,看「容量」和「成本」怎么分家

只看一个 FFN 子层。点不同配置,对比总参数(容量)↑↑、每 token 激活(算力成本)几乎不动、显存随总参数涨——这就是 MoE 的解耦。

选配置: 
总参数(容量/模型懂多少)
每 token 激活(算力/多贵)
显存占用(要存所有专家)

看出门道了吗:绿色(算力)几乎钉死,橙色(容量)和红色(显存)一起飞涨。MoE 是用显存换算力——存得起一大堆专家,但每次只点亮一两个,所以又大又便宜……只要你显存够。

五、对照表(一):dense vs sparse(MoE)

维度dense(稠密,如 GPT-3)sparse / MoE(如 Switch、Mixtral)
每 token 用多少参数全部只用 top-k 个专家
总参数 vs 算力绑死(参数↑则成本↑)解耦(参数可↑↑,算力几乎不动)
同算力下的质量基准更高(塞得进更多参数)
显存正常大(所有专家都要常驻)
麻烦事负载均衡、通信、训练不稳

六、对照表(二):MoE 的代价、命名解读、与前沿

天下没有白吃的午餐,MoE 省算力是拿这些换的:

代价说明
显存暴涨每 token 只用 k 个专家,但所有专家都得常驻显存——省了算力,没省显存
通信开销专家常分布在多张卡上,token 要被路由/搬运到对应卡(all-to-all),通信变重
训练不稳 + 负载均衡路由是离散选择,训练更难调;要靠辅助 loss 防专家「旱涝不均」

读懂命名:Mixtral 8x7B = 8 个专家、每个约 7B、每 token 激活 2 个 → 总参数 ~47B,但激活只 ~13B(不是 56B,因为 attention 等是共享的)。所以它「跑起来像 13B 那么快,肚子里却有 47B 的本事」。

🔮 阶段三收官:Scaling 立范式 → Chinchilla 修配比 → LoRA 省微调 → FlashAttention 省 attention → MoE 解耦容量与算力。业界普遍相信 GPT-4 等前沿模型就是 MoE,DeepSeek、Mixtral 等已公开是 MoE——「又大又便宜」基本是这条路。下一阶段进入对齐与推理(P15 InstructGPT/RLHF):模型够强了,怎么让它听话

七、映射到你的项目

你工作里的东西其实就是这篇论文的什么
看到「某模型 1.6 万亿参数」就以为它一定超贵超慢它可能是 MoE——看激活参数而非总参数。参数量现在连「成本」都不是好代理了(Chinchilla 说它不是「能力」代理,MoE 再补一刀)
读 Mixtral / DeepSeek 这类「NxB」命名就是 MoE:NxB = N 个专家、每个约 B,真实成本看每 token 激活几个
你做选型,算「这个模型部署要多少显存 / 多少钱」MoE 的账要分开算:算力(按激活参数,便宜)vs 显存(按总参数,贵)——它省的是算力不是显存,自建部署要掂量得起那堆专家
你以为「专家」是按主题分工的(这个管代码、那个管医学)别想当然:路由是学出来的,专家通常按人能理解的主题分工,常按 token/语法层面的模式分。这是常见误解
更通用:你判断「大模型」的两把尺合起来记:多大(总参数)≠ 多强(看训了多少数据,Chinchilla)≠ 多贵(看激活多少,MoE)

八、检索练习(关掉上文,凭记忆答)

1. MoE 的核心机制是?
2. MoE「又大又便宜」靠的是解耦什么?
3. MoE 省了算力,但主要代价是什么?

九、常见问题 FAQ

把这一课接到你真实工作上的几个关键问。点开看答。

「专家」真的各有专长吗(一个管代码、一个管数学)?

基本不是——这是最常见的误解。专家不是人为按主题划分的,路由是训练中学出来的,怎么分工由「降 loss」驱动,不由「人类语义」驱动。实测发现专家更多是按token / 语法 / 表层模式聚集(比如某些标点、某类词形),而不是「这个专家懂医学」。同一句话里相邻的词都可能被发去不同专家。

所以「专家」是个比喻,别按字面理解。正确心智:它是「一堆可被条件调用的参数库」,路由器学会了「什么样的 token 该查哪几本」,而那个分类标准通常不对人类可读。

MoE 既然这么省算力,为什么不是所有模型都用它?

因为它省算力却很费显存、很难训、部署复杂:① 所有专家都得常驻显存,显存门槛极高——一张卡放不下,得多卡,小团队/端侧吃不消;② 路由是离散选择,训练更不稳,要负载均衡、容量因子一堆旋钮;③ 多卡间 token 路由的 all-to-all 通信是新瓶颈。

所以选型是算力 vs 显存 vs 复杂度的权衡:你算力紧、显存富、追极致质量 → MoE 划算;你要在单卡 / 端侧 / 低显存跑,一个喂饱的 dense 小模型(LLaMA 路线)反而更合适。没有绝对更优,看你卡在哪种资源上。

阶段三这五篇(Scaling / Chinchilla / LoRA / FlashAttention / MoE)怎么串成一张图?

一条主线:「想要更强,但别让成本失控」,五篇各攻一个成本维度:

论文回答的问题动的是
Scaling(P10)放大到底涨多少把「大力出奇迹」量成可外推曲线
Chinchilla(P11)钱该砸模型还是数据修正配比(数据被低估)
LoRA(P12)怎么便宜微调改「算什么」(低秩补丁)
FlashAttention(P13)attention 怎么更快省显存改「怎么算」(IO 顺序,无损)
MoE(P14)怎么又大又便宜改「算多少」(稀疏激活,解耦容量与算力)

合起来给你三把判断模型的尺:多大(总参数)、多强(数据/训练充分度)、多贵(激活参数 + 显存)——这三个数现在你都知道分别该去哪看了。下一阶段换主题:模型够强了,怎么让它听话(对齐)

Switch 为什么敢用 top-1,不怕路由错了没救?

MoE 鼻祖 Shazeer(2017) 坚持 top-2,理由是「要两个专家对比,路由器才有梯度学谁更好」。Switch 证明 top-1 也行,四个底气:

路由器照样有梯度——被选专家的输出乘上路由器给的概率(gate),gate 在计算图里、照样回传,单选也能越路越准;② 深度给了无数次重来——token 穿过几十个 MoE 层、每层独立重路由,单层错不致命,后面能补救;③ 残差是安全地板——服务得差甚至被丢,残差也原样带向下一层,永有直通兜底;④ 省下的算力买更多容量——top-1 比 top-2 砍半路由/通信,同算力能塞更多专家,增益盖过偶尔误路由。

一句话:这是「多次便宜决策胜过少数昂贵决策」的赌注——靠层数冗余+残差兜底+路由持续学习,单次错根本不需要「有救」,因为从不靠那一次。

丢 token 会不会伤质量、怎么缓解?

「丢」是什么:每个专家有接客上限(容量=容量因子×平均每专家 token 数);被挤爆时溢出 token 跳过该 FFN、靠残差直通——不是删除,是这一层少做一次 FFN 加工。伤不伤:有限且可控(残差兜底+层数多,漏一层可恢复;但大量丢会掉质量);且主要发生在训练早期,随均衡生效丢弃率下降。

四个缓解(治标→治本):① 调大容量因子(丢得少但 padding 更费;推理时常拉高甚至不丢);② 负载均衡辅助 loss(根因是不均衡,这是主杠杆);③ 换路由算法(如 Expert Choice:专家挑 token,结构上零丢弃+完美均衡);④ 推理时干脆不丢

一句话:丢 token 本质是「训练吞吐」的妥协,不是非有不可,且大半能工程掉。

MoE、LoRA 多补丁、稀疏注意力都叫「稀疏」,是一回事吗?

不是,而且关键纠错:LoRA 根本不是「稀疏」,是「低秩」。三者沿完全不同的轴省东西:

在什么上省精确/近似目的
稀疏注意力token 间注意力对(只看部分)近似(有损)省 attention 算力
MoE(稀疏激活)每 token 激活的专家(只点亮 top-k)精确(选中的全算)解耦容量与算力
LoRA其实是低秩非稀疏(ΔW 低秩)近似(拟合全量微调)省微调成本

分清两词:稀疏 = 大部分是 0、只少数在动(稀疏注意力、MoE 符合);低秩 = 矩阵塞满非零、但能写成两片瘦矩阵之积(LoRA 的 B·A 是稠密的,只是秩低)。低秩 ≠ 稀疏。共同精神是「别做满」,但省的维度/是否有损/为啥而省全不同——只有前两个是真稀疏,LoRA 是低秩。

本课主源

读原典:Fedus et al. — Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity(2021)

想看 MoE 起源:Shazeer et al.(2017,top-2 路由的稀疏 MoE 层);想看现代落地:搜 Mixtral 8x7B / DeepSeek-MoE 的技术报告。

阶段三「规模与效率」到此收官。下一阶段「对齐与推理」开篇 P15 InstructGPT / RLHF:为什么 ChatGPT 会听话——直接对上你「prompt 控不住行为」的老困惑。

我是你的老师,随时提问。 比如:「Switch 为什么敢用 top-1,不怕路由错了没救?」「丢 token 会不会伤质量、怎么缓解?」 「MoE 和我学的 LoRA 多补丁、稀疏注意力,都叫『稀疏』,是一回事吗?」——别带着模糊往下走。

参考:
Fedus et al., Switch Transformers, 2021;Shazeer et al., Outrageously Large Neural Networks, 2017.