橙研所· 方法论 × Agent 拆解
AI 科普 · 逐章拆解

AI圣经14 《MoE 混合专家:万亿参数,为什么可以只算零头》

上一篇 FlashAttention 把「搬运」的钱砍到最省——那是省每一层里的账。可无论多省,一个词进了模型,仍要惊动全部参数:1750 亿的模型处理每个词,都得把这 1750 亿乘一遍。参数和算力像焊死的一对,Scaling Laws 说「越大越好」,于是「越大越贵」。这一篇问一个更狠的问题:非得全乘吗?能不能让每个词进门只叫醒其中一小撮参数,其余的睡大觉?这就是混合专家(MoE)——一个 1991 年就有、2017 年拿过 SOTA 却始终没火的老念头。Google 的 Switch Transformer 把它做减法做火了:参数堆到 1.6 万亿,每个词却只算零头,同样的算力预训练快 7 倍。今天所有你听说过「参数上万亿」的模型,底下多半躺着这套稀疏激活的思路。

AI圣经14 MoE 混合专家 封面
📚 AI 圣经 · 系列导览这是「AI 圣经」系列第 14 篇。我会带你逐篇精读撑起今天所有大模型的 21 篇经典论文,分 5 个阶段层层递进(本篇已高亮): 本篇论文:《Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity》· Fedus et al. 2022(Google)。可搜「switch transformer paper」或访问 arXiv 编号 2101.03961 下载。其余各篇论文地址,随当期文章给出。

太长不读2021 年前,把模型做大只有一条路:稠密(dense)——每多一个参数,处理每个词就多算一次,参数和算力焊死在一起。混合专家(MoE)想拆开这道焊缝:把一层前馈网络(FFN)换成一群「专家」,每个词进门只找其中一两位算,其余的睡大觉。这样参数能堆到天上,单个词的算力却几乎不变。可 MoE 从 1991 年就有,2017 年 Shazeer 用它拿过翻译 SOTA,却一直没火——太复杂、通信太贵、一放大训练就崩。Google 的 Switch Transformer 靠「做减法」把它盘活了:Shazeer 自己 2017 年断言过「每个词至少要路由给 2 个专家才有梯度」,Switch 偏反着来——只路由给 1 个(top-1),路由更省、通信更省、实现更简单,质量反而更好。再配三招土办法稳住训练(router 单独用 float32、初始化缩小 10 倍、专家层单独加大 dropout),大稀疏模型第一次能用 bfloat16 稳定训练。成绩单:同样算力下,Switch-Base 预训练比 T5-Base 快 7 倍;一路堆到 1.6 万亿参数的 Switch-C(2048 个专家),比 110 亿的 T5-XXL 快 4 倍,且训练毫不发散;跨 101 种语言全部提速,平均 5 倍;太大跑不动就蒸馏回小模型,压掉 99% 参数还能留住三成收益。这套「稀疏激活」,后来长成了 GPT-4 时代最大的公开秘密。

上篇回顾 · 先答一题上一篇 FlashAttention 讲完,「搬运」的账被算到了理论极限。先别往下翻,试着答:FlashAttention 反而多算了 13% 的浮点运算,凭什么还快 5.7 倍?……答案:因为注意力的瓶颈从来不在「算」,在「搬」——它把那张 N×N 大表在慢显存(HBM)和快缓存(SRAM)之间来回搬的次数砍了 9 倍,多出来的那点计算发生在快一个数量级的片上缓存里,省下的搬运才是时间大头。但 FlashAttention 省的是每一层里搬运的钱;模型的另一半开销还纹丝没动——每个词进来,都要惊动全部参数算一遍。今天这篇,轮到砍这笔账。

01稠密的诅咒:参数和算力,为什么焊死在一起

Switch Transformer switch-p01.png
论文原文 · 第 1 页:标题 + 摘要。三位作者 William Fedus、Barret Zoph、Noam Shazeer(Google),发表于 JMLR 2022。摘要开门见山:深度学习里模型对所有输入都复用同一套参数,混合专家(MoE)偏要为每个输入挑不同的参数——得到一个稀疏激活的模型:参数量大得离谱,单次计算成本却恒定。但 MoE 一直没普及,卡在三座大山:复杂、通信成本、训练不稳。Switch Transformer 把路由做减法、配上稳训练的新招,让大稀疏模型第一次能用 bfloat16 低精度训练;基于 T5,同算力预训练提速最高 7 倍,跨 101 种语言全线提升,最大堆到万亿参数、比 T5-XXL 快 4 倍。

先看清这道焊缝。P10 的 Scaling Laws、P11 的 Chinchilla 反复讲了同一件事:模型越大越强,参数是硬通货。但「大」有个隐藏的代价——在稠密模型里,参数一多,每处理一个词要做的计算也同比例变多。GPT-3 有 1750 亿参数,它读你这句话里的每一个字,都得把这 1750 亿参数几乎全都乘一遍。想让模型强十倍、参数堆十倍,处理每个词的算力也就跟着涨十倍——训练更贵、推理更慢。参数量和计算量,像被焊死的一对。

有没有办法把这道焊缝拆开?让参数尽管堆,但每个词只用到其中一小部分?这个念头很老。1991 年 Jacobs 等人就提出混合专家(Mixture of Experts, MoE):与其让一个大网络包打天下,不如养一群「专家」子网络,再加一个「门控」(router)——它看一眼输入,决定这次派哪几个专家上工。分工,而不是全员出动。

2017 年,Noam Shazeer(这名字后面还会反复出现)把 MoE 搬进现代深度学习:在两层 LSTM 之间塞进一个 MoE 层,最多养到 1370 亿参数的专家,靠门控给每个词挑一小撮专家来算,在语言建模和机器翻译上都拿了 SOTA。思路验证成功了。

可接下来五年,MoE 始终是个「圈内人才碰」的边缘技巧,没能像 Transformer 那样铺开。这篇论文的摘要(上图)一句话点名了三座大山:复杂(complexity)、通信成本(communication costs)、训练不稳定(training instabilities)。养一群专家、还要在多台机器间把词发来发去,工程复杂;专家散在不同设备上,词要跨设备传输,通信贵;模型一放大,训练就动不动发散。Switch Transformer 这篇的全部功劳,就是把这三座山逐个削平——而且用的办法,出人意料地简单。

02反直觉的一刀:每个词,只找一个专家

Switch Transformer switch-p05.png
论文原文 · 第 5 页:Figure 2,Switch Transformer 的心脏。左边是缩略的编码器块,右边把那层「Switching FFN Layer」放大:原本一层稠密 FFN,被换成并排的 4 个 FFN 专家(浅蓝)。两个词 x₁=「More」、x₂=「Parameters」各自经过一个 Router 打分,softmax 出概率,每个词只被送进得分最高的那一个专家——「More」走 FFN2(p=0.65),「Parameters」走 FFN1(p=0.8),输出再乘以这个门控概率(虚线)。关键是逐 token 独立路由:同一句话里不同的词,去不同的专家。下方正文正是全文最反直觉的一刀——前辈断言路由至少要选 2 个专家,Switch 偏只选 1 个。

Switch 的设计哲学只有一句话:在保持每个词算力(FLOPs)不变的前提下,把参数量堆到最大。这是加深、加宽、多喂数据之外的「第四根轴」——加专家。加专家会让总参数暴涨,但因为每个词只经过被选中的那一个专家,单个词的计算量不变

看架构(上图 Figure 2)。Transformer 每一块里,注意力之后原本是一层稠密 FFN;Switch 把它换成一个「Switch FFN 层」——并排放着 4 个(图里)FFN 专家,每个专家就是一个独立的小前馈网络。一个词进来,先过一个 Router:router 给这个词对每个专家打一个分,softmax 归一成概率,然后只把这个词送进得分最高的那一个专家,算完,输出再乘以那个门控概率。图里两个词很直观:「More」被路由到 FFN2(概率 0.65),「Parameters」被路由到 FFN1(概率 0.8)。注意是逐词独立路由——同一句话里,不同的词会被发去不同的专家。

这里藏着全文最反直觉的一刀。前辈 Shazeer 在 2017 年(对,同一个人)白纸黑字断言过:路由必须选至少 2 个专家(top-k,k≥2),否则 router 学不到有用的梯度——直觉是「你得能比较至少两个专家,才知道该往哪个方向调整」。后来 Ramachandran 和 Le(2018)更进一步,说底层还得用更大的 k。

Switch 偏偏反着来:只选 1 个(top-1)。而且证明这个「减法」不但没掉质量,还带来三个红利,正好一一对着那三座大山去:(1)router 的计算量减少,因为只往一个专家发;(2)每个专家要处理的批大小(专家容量)至少能砍一半,省显存;(3)路由实现被大大简化,设备间通信也随之减少。一刀下去,复杂、通信、(配上下一节的招数)不稳,同时松动。有时候,最好的工程不是加东西,是敢减东西。

03让它真能训起来:容量、丢词,和三招土办法

Switch Transformer switch-p06.png
论文原文 · 第 6 页:Figure 3,路由的工程现实。每个专家分在一个设备上,容量(要处理的 token 批大小)在编译期就定死 = (batch 内 token 总数 / 专家数)× 容量因子。左(容量因子 1.0)与右(1.5)对比:token 按 router 概率涌向各专家,一旦某个专家收到的 token 超过容量就溢出——红色虚线标出的这些词这一层不被处理,直接靠残差连接跳过去(丢词)。容量因子调大能少丢词,但也留下更多空槽,白白浪费算力和设备间通信。左侧术语栏定义了专家、专家容量、容量因子三个关键词。

只选一个专家,麻烦也随之而来:token 分配不均。router 是学出来的,很可能学着学着,一窝蜂的词都涌向某几个「热门」专家,冷门专家闲着。可硬件(TPU)要求每个专家的批大小在编译时就静态定死,不能临时膨胀。怎么办?

论文引入容量因子(capacity factor):每个专家的容量 =(一批里的 token 总数 / 专家数)× 容量因子。因子设成 1.0,就是刚好平均分;设成 1.5,就是给每个专家留 50% 的缓冲,容纳分配不均。代价见上图 Figure 3:如果涌向某专家的词超过了它的容量,超出的那些词就「溢出」——图里红色虚线标出的这些词,这一层不被任何专家处理,直接靠残差连接原样跳到下一层(论文叫「丢词」,dropped tokens)。容量因子调大能少丢词,但也会留下一堆空槽,白白浪费算力和通信。这是个要拿捏的取舍。

光靠容量因子还不够均衡,得主动引导。论文加了一个负载均衡损失(load balancing loss):一个附加的辅助损失项,专门惩罚「分配不均」,鼓励每个词大致均匀地散到各专家。它带一个系数 α,论文从 10⁻¹ 到 10⁻⁵ 扫了一遍,最后选 α=0.01——大到足以均衡,又小到不会盖过主任务的学习。配上它,丢词率通常压到 1% 以下

最硬的骨头是训练稳定性——这正是 MoE 五年没火的第三座大山。Switch 用三招土办法把它按住,招招都不花哨,但缺一不可:

三座大山,到这里被削平了:top-1 削了复杂和通信,这三招土办法削了不稳。MoE 从「实验室玩具」,第一次变成「工业界能大规模用的东西」。

04放榜一:又快又好,还打脸了自己的祖师爷

Switch Transformer switch-p13.png
论文原文 · 第 13 页:Figure 5,全文的头条。横轴是训练时间(墙钟),纵轴是质量(负对数困惑度,越高越好)。所有模型都在 32 张 TPUv3 上、每个样本花同样的 FLOPs。那根醒目的「7x Speedup」箭头是关键:64 个专家的 Switch-Base 达到 T5-Base 的同等质量,只用了七分之一的时间,之后还在继续变好。注意这不是省算力换来的——每个 token 的浮点运算量和 dense 基线几乎一样,快出来的 7 倍纯粹来自「同样的算力预算下,参数多了几十倍」。

先看头条数字(上图 Figure 5)。在 32 张 TPUv3 上、每个样本花同样的 FLOPs、跑同样的墙钟时间,64 个专家的 Switch-Base 追平 T5-Base 的质量,只用了七分之一的时间——这就是那根「7x Speedup」箭头。换个说法更狠:T5-Base 吭哧吭哧训到 45 万步的水平,Switch-Base 只要 6 万步就到了。而这 7 倍不是省算力换来的——每个词的浮点运算量和稠密基线几乎一样,快出来的全部来自「同样的钱,买到了几十倍的参数」。

再看一个更值得玩味的对照(论文 Figure 6):与其把预算砸给「更多专家的稀疏模型」,不如砸给「更大的稠密模型」?论文拿 Switch-Base 去比 T5-Large——后者每个词要多算 3.5 倍的 FLOPs。结果 Switch-Base 依然更省,快 2.5 倍。也就是说,同一笔算力预算,「加专家」比「加宽加深」更划算。

那 top-1 到底比老式的 top-2 好在哪?论文让 Switch 和 MoE(top-2)正面对刚(Table 1):在「速度—质量」的权衡曲线上,Switch 全面胜出,而且算力足迹更小。更有意思的是,Switch 在低容量因子(1.0、1.25)下表现更好——这恰好对上了大模型的现实:显存越紧张、容量因子越想压小,而 Switch 正好在这个区间最强。祖师爷 Shazeer 的「必须 top-2」断言,被他自己参与的这篇论文推翻了。

预训练快,不代表下游真有用。得看微调(Table 5):Switch-Base 比 T5-Base 在 SuperGLUE 上 +4.4 分、Winogrande +6.7、闭卷 Trivia QA 大涨,GLUE、SQuAD 也全线上扬。加速真的翻译成了能力,不是纸面上的虚快。一句话收这一节:这不是新架构打败旧架构,是「同样的算力,买到了大几十倍的参数,参数又换成了实打实的质量」。

05放榜二:一路堆到万亿,还稳得不可思议

Switch Transformer switch-p23.png
论文原文 · 第 23 页:Table 9,一路堆到万亿的账本。上半张是模型规格:T5 三兄弟(0.2B/0.7B/11B)对阵 Switch 四兄弟。看最后一行 Switch-C——1.57 万亿参数(1571B)、2048 个专家、15 层,但每个序列只算 890B FLOPs,比 110 亿参数的 T5-XXL(6.3T FLOPs/seq)还少:参数是它的 143 倍,单序列算力却只有它的七分之一。这就是「万亿参数,只算零头」的字面意思。下半张是成绩:Switch-C 比 T5-XXL 快 4 倍到达同等困惑度。正文还点出最反直觉的一点——1.6 万亿、2048 专家的 Switch-C 训练「完全不崩」,反而是每 token 算力大 10 倍的 Switch-XXL(395B)时不时发散:稳不稳,不看总参数,看每个 token 真正算了多少。

既然「加专家」是加参数最便宜的方式,那就一路堆上去,看能堆多高。论文设计了两头巨兽(上图 Table 9):Switch-XXL(3950 亿参数,64 个专家,每词算力对标 T5-XXL)和 Switch-C1.57 万亿参数,2048 个专家,只用专家并行、连模型并行都不用)。这是当时公开的第一批「万亿参数」模型。

「万亿参数只算零头」在这张表里是字面意义的。Switch-C 有 1.57 万亿参数,但它处理一个序列只算 890B 次浮点运算——比只有 110 亿参数的 T5-XXL(6.3T FLOPs/序列)还少。参数是 T5-XXL 的 143 倍,单序列的算力却只有它的七分之一。参数和算力,被彻底解绑了。战报:Switch-C 比 T5-XXL 快 4 倍到达同等困惑度,而且随训练推进差距还在拉大。

但全表最反直觉的一行,是训练稳定性。按常理,越大越难训。可论文发现:1.6 万亿、2048 个专家的巨无霸 Switch-C,训练完全不崩;反而是「小一号」的 Switch-XXL(3950 亿参数)时不时发散。区别在哪?Switch-XXL 每个词要算的 FLOPs 是 Switch-C 的近 10 倍。结论颠覆直觉:稳不稳,不看你总共有多少参数,看你每个词真正算了多少。参数多不可怕,每个词摊到的计算量大,才是不稳的根源。

论文也留了一道诚实的裂缝。Switch-XXL 在上游预训练的困惑度刷到了 SOTA,可这份优势还没完全兑现到下游:1.6 万亿的 Switch-C 在 SQuAD 上只有 87.7 分,反而不如小它一大截的 Switch-XXL(89.6)。参数量、每词 FLOPs、微调质量三者到底怎么共同决定表现,论文坦白「还没搞懂」,把这个坑明明白白留给了后人。这也预告了后来 MoE 研究的一大主线:光把参数堆上去不够,得让每个词摊到的算力和总参数配得当。

06后日谈:从边缘技巧到 GPT-4 时代的公开秘密

Switch Transformer switch-p18.png
论文原文 · 第 18 页:Table 7 + Table 8,回答「万亿参数怎么部署」。上表:把大稀疏模型蒸馏回同架构的小 dense 模型。14.7B 的稀疏老师压掉 99% 变回 223M 的 dense 学生,还能留住 28% 的质量增益;压 82% 能留 37%。下表:连微调过的模型也能蒸——SuperGLUE 上压掉 97% 参数仍保住 30% 的收益。稀疏训练、稠密部署,成了后来一条常用的路。页面底部那段还记着多语言战报:跨 101 种语言,全部提升,平均 5 倍加速,91% 的语言至少 4 倍。

按系列惯例,讲讲它后来的命运。第一道现实关:万亿参数怎么部署?没人能把 1.6 万亿参数塞进服务器做推理。Switch 给的答案是蒸馏(上图 Table 7):拿大稀疏模型当「老师」,把它的本事教给一个小小的稠密「学生」。数字很惊人——14.7B 的稀疏老师压掉 99% 变回 223M 的稠密学生,还能留住 28% 的质量增益;压 82% 能留 37%;连微调过的模型也能蒸(Table 8,压 97% 保 30%)。「稀疏训练、稠密部署」,成了后来一条被反复使用的路。

第二个亮点是多语言(Table 7 同页下方):跨 101 种语言一起预训练,全部 101 种都比稠密的 mT5 提升,平均快 5 倍,91% 的语言至少快 4 倍。稀疏专家天生适合「多任务/多语言」——不同的专家可以各管一摊,互不打架。论文还专门回答了「我没有超算,这东西跟我有关系吗」:哪怕只用 2 个专家,也能在普通 GPU 上提升——不是只有 Google 玩得起。

那为什么 MoE 之前一直没火?论文的自问自答很坦诚:稠密模型的巨大成功把所有人的注意力都吸走了,而这份成功一部分要归功于「硬件本来就是为稠密矩阵乘法量身定做的」(Hooker 2020 称之为「硬件彩票」)——好的想法如果不合当下硬件的口味,就赢不了。Switch 的意义,正是证明了这条被硬件偏见压住的路真的走得通。

而它之后,稀疏专家彻底从边缘走到了台面中央:Google 自家紧接着做了 GLaM(1.2 万亿参数,2021);业界普遍相信的「GPT-4 其实是个 MoE」的说法(虽未官方证实,却是从业者共识);到 2023–2024 年开源界更是实锤——Mistral 的 Mixtral 8×7B(8 个专家、每词选 2 个)用远小的激活量打平大得多的稠密模型,DeepSeek 系列把「细粒度专家 + 共享专家」做到六千多亿参数、每个词只激活其中约 370 亿。你今天听到的很多「参数上万亿」的前沿模型,底下都是一层层 Switch 点亮的思路:参数堆到天上,每个词只算零头

放进系列时间线收个尾。到这一篇,前三个阶段讲完了:地基(P01–04)教会模型「读写」,预训练范式(P05–09)教会它「自学」,规模与效率(P10–14)——Scaling Laws 说「大就是好」、Chinchilla 说「大要喂饱」、LoRA 把「用起来」砍到平民价、FlashAttention 把「跑起来」的搬运账算清、MoE 把「养得起」的参数账解了绑——让模型又大、又快、又便宜。但它此刻还只是个博学的复读机:会接话,不会「听话」;你问它,它未必答你想要的。下一个阶段,轮到「对齐」。

读完自测:先别往下翻,试着答

主动回忆一遍才记得住。三问,想好再看答案:

答案1. 因为把一层稠密 FFN 换成了一群专家,每个词只被路由到其中一个专家来算——参数随专家数暴涨,但单个词经过的计算量不变,参数量和计算量被解绑了。2. 靠三件事补短板:容量因子留缓冲、少丢词;负载均衡损失(α=0.01)主动把词均匀分到各专家、避免旱涝不均;再加 selective precision / 缩小初始化 / 专家层大 dropout 三招稳住训练。3. 因为稳定性不由总参数决定,而由每个词摊到的 FLOPs 决定:Switch-XXL 每词算力是 Switch-C 的近 10 倍,所以它更容易发散——参数多不可怕,每词计算量大才是不稳的根源。

一句话带走,和下一步

只记一句:MoE(混合专家)把一层稠密 FFN 换成一群专家,靠一个门控网络给每个词只挑一个专家来算(Switch 的 top-1),从而给参数和算力「解绑」——参数能堆到万亿,单个词却只算零头;配上容量因子、负载均衡损失和三招稳训练的办法,同算力预训练快 7 倍、跨 101 种语言平均快 5 倍、蒸馏压 99% 还留三成,稀疏激活由此从边缘技巧长成 GPT-4 时代的主流。

启后:到这里,「地基 → 预训练 → 规模与效率」三个阶段收官,模型已经又大又快又便宜。可它仍是个只会预测下一个词的「复读机」——知识满腹,却未必听话。下一篇 P15《InstructGPT / RLHF》,进入阶段四「对齐」:怎么把一个漫无目的接话的语言模型,调教成一个你说什么、它就尽力做什么的助手——这是从「GPT-3」到「ChatGPT」之间,那道最关键的门。

想再深入一点原论文:arXiv 2101.03961(《Switch Transformers》,Fedus, Zoph & Shazeer, JMLR 2022,官方代码在 google-research/t5x)。关键前作:现代 MoE 的奠基作 Shazeer et al. 2017《Outrageously Large Neural Networks》(arXiv 1701.06538),以及把 MoE 扩到百种语言机器翻译的 GShard(Lepikhin et al. 2020,arXiv 2006.16668)。延伸阅读:稀疏专家的开源实锤 Mixtral of Experts(Mistral AI, 2024,arXiv 2401.04088)与 DeepSeek-V3 技术报告。/ 互动钩子:你用过哪些「号称参数上万亿」的模型?知道它是稠密的还是稀疏(MoE)的吗?评论区聊聊。

← 返回 AI 圣经目录