你学过的所有模型(GPT-3、BERT…)都是 dense(稠密)的:每一个参数,对每一个 token,都参与计算。这很「公平」,但也意味着——模型越大,每生成一个 token 要做的计算就越多,成本严格随参数量涨。
人脑不是每想一件事都点亮整个大脑——你算数学时不太用到管音乐的区域。 MoE 把这个直觉搬进模型:模型可以很大(存很多本事),但每个 token 只调用其中一小部分。 于是「模型懂多少」(总参数)和「处理一个 token 要算多少」(激活参数)第一次被拆开——这就是「条件计算 / 稀疏激活」。
改动只在每个 Transformer 块的 FFN 子层(attention 部分不动):
| 组件 | dense 模型 | MoE 模型 |
|---|---|---|
| FFN 子层 | 1 个 FFN,所有 token 都过 | N 个并行专家 FFN(如 8、64、128…) |
| 谁来算 | 固定那一个 | 路由器(小网络)按 token 挑 top-k 个专家 |
| 每 token 激活 | 全部 FFN 参数 | 只有被选中的 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 的解耦。
看出门道了吗:绿色(算力)几乎钉死,橙色(容量)和红色(显存)一起飞涨。MoE 是用显存换算力——存得起一大堆专家,但每次只点亮一两个,所以又大又便宜……只要你显存够。
| 维度 | dense(稠密,如 GPT-3) | sparse / MoE(如 Switch、Mixtral) |
|---|---|---|
| 每 token 用多少参数 | 全部 | 只用 top-k 个专家 |
| 总参数 vs 算力 | 绑死(参数↑则成本↑) | 解耦(参数可↑↑,算力几乎不动) |
| 同算力下的质量 | 基准 | 更高(塞得进更多参数) |
| 显存 | 正常 | 大(所有专家都要常驻) |
| 麻烦事 | 少 | 负载均衡、通信、训练不稳 |
天下没有白吃的午餐,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) |
把这一课接到你真实工作上的几个关键问。点开看答。
基本不是——这是最常见的误解。专家不是人为按主题划分的,路由是训练中学出来的,怎么分工由「降 loss」驱动,不由「人类语义」驱动。实测发现专家更多是按token / 语法 / 表层模式聚集(比如某些标点、某类词形),而不是「这个专家懂医学」。同一句话里相邻的词都可能被发去不同专家。
所以「专家」是个比喻,别按字面理解。正确心智:它是「一堆可被条件调用的参数库」,路由器学会了「什么样的 token 该查哪几本」,而那个分类标准通常不对人类可读。
因为它省算力却很费显存、很难训、部署复杂:① 所有专家都得常驻显存,显存门槛极高——一张卡放不下,得多卡,小团队/端侧吃不消;② 路由是离散选择,训练更不稳,要负载均衡、容量因子一堆旋钮;③ 多卡间 token 路由的 all-to-all 通信是新瓶颈。
所以选型是算力 vs 显存 vs 复杂度的权衡:你算力紧、显存富、追极致质量 → MoE 划算;你要在单卡 / 端侧 / 低显存跑,一个喂饱的 dense 小模型(LLaMA 路线)反而更合适。没有绝对更优,看你卡在哪种资源上。
一条主线:「想要更强,但别让成本失控」,五篇各攻一个成本维度:
| 论文 | 回答的问题 | 动的是 |
|---|---|---|
| Scaling(P10) | 放大到底涨多少 | 把「大力出奇迹」量成可外推曲线 |
| Chinchilla(P11) | 钱该砸模型还是数据 | 修正配比(数据被低估) |
| LoRA(P12) | 怎么便宜微调 | 改「算什么」(低秩补丁) |
| FlashAttention(P13) | attention 怎么更快省显存 | 改「怎么算」(IO 顺序,无损) |
| MoE(P14) | 怎么又大又便宜 | 改「算多少」(稀疏激活,解耦容量与算力) |
合起来给你三把判断模型的尺:多大(总参数)、多强(数据/训练充分度)、多贵(激活参数 + 显存)——这三个数现在你都知道分别该去哪看了。下一阶段换主题:模型够强了,怎么让它听话(对齐)。
MoE 鼻祖 Shazeer(2017) 坚持 top-2,理由是「要两个专家对比,路由器才有梯度学谁更好」。Switch 证明 top-1 也行,四个底气:
① 路由器照样有梯度——被选专家的输出乘上路由器给的概率(gate),gate 在计算图里、照样回传,单选也能越路越准;② 深度给了无数次重来——token 穿过几十个 MoE 层、每层独立重路由,单层错不致命,后面能补救;③ 残差是安全地板——服务得差甚至被丢,残差也原样带向下一层,永有直通兜底;④ 省下的算力买更多容量——top-1 比 top-2 砍半路由/通信,同算力能塞更多专家,增益盖过偶尔误路由。
一句话:这是「多次便宜决策胜过少数昂贵决策」的赌注——靠层数冗余+残差兜底+路由持续学习,单次错根本不需要「有救」,因为从不靠那一次。
「丢」是什么:每个专家有接客上限(容量=容量因子×平均每专家 token 数);被挤爆时溢出 token 跳过该 FFN、靠残差直通——不是删除,是这一层少做一次 FFN 加工。伤不伤:有限且可控(残差兜底+层数多,漏一层可恢复;但大量丢会掉质量);且主要发生在训练早期,随均衡生效丢弃率下降。
四个缓解(治标→治本):① 调大容量因子(丢得少但 padding 更费;推理时常拉高甚至不丢);② 负载均衡辅助 loss(根因是不均衡,这是主杠杆);③ 换路由算法(如 Expert Choice:专家挑 token,结构上零丢弃+完美均衡);④ 推理时干脆不丢。
一句话:丢 token 本质是「训练吞吐」的妥协,不是非有不可,且大半能工程掉。
不是,而且关键纠错: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 控不住行为」的老困惑。
参考:
Fedus et al., Switch Transformers, 2021;Shazeer et al., Outrageously Large Neural Networks, 2017.