- 阶段一 · 地基:P01《Attention Is All You Need》 · P02 Bahdanau Attention · P03 seq2seq · P04 word2vec
- 阶段二 · 预训练范式:P05 BERT · P06 GPT-1 · P07 GPT-2 · P08 GPT-3 · P09 T5
- 阶段三 · 规模与效率:P10 Scaling Laws · P11 Chinchilla · P12 LoRA · P13 FlashAttention · P14 MoE · 本篇
- 阶段四 · 对齐与推理:P15 InstructGPT(RLHF)· P16 思维链 CoT · P17 DPO · P18 Constitutional AI
- 阶段五 · 检索与 Agent:P19 RAG · P20 ReAct · P21 Toolformer
太长不读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稠密的诅咒:参数和算力,为什么焊死在一起
先看清这道焊缝。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 的设计哲学只有一句话:在保持每个词算力(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让它真能训起来:容量、丢词,和三招土办法
只选一个专家,麻烦也随之而来: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 用三招土办法把它按住,招招都不花哨,但缺一不可:
- 选择性精度(selective precision):大稀疏模型直接用 bfloat16 低精度训练会发散(论文实测,质量崩到 -3.780)。前人 GShard 的做法是全程用 float32,稳是稳,但 float32 张量在设备间广播,通信巨贵。Switch 的巧劲:只在 router 函数内部、本地把输入临时转成 float32 算,算完立刻转回 bfloat16 再对外通信。结果:既拿到 float32 的稳定(质量 -1.716,几乎追平纯 float32 的 -1.718),又保住 bfloat16 的速度。这是大稀疏模型第一次能用低精度稳定训练——摘要里专门点名的成就。
- 初始化缩小 10 倍:把 Transformer 默认的权重初始化幅度直接除以 10。就这一下,早期训练质量从 -3.60 提到 -2.72,三个随机种子之间的标准差从 0.68 掉到 0.01——从「碰运气」变成「稳当」。
- 专家层单独加大 dropout:微调时下游数据往往很少,而稀疏模型参数远多于同算力的稠密模型,特别容易过拟合。招数:非专家层用小 dropout(0.1),唯独专家层用大 dropout(0.4)。四个下游任务上都涨。
三座大山,到这里被削平了:top-1 削了复杂和通信,这三招土办法削了不稳。MoE 从「实验室玩具」,第一次变成「工业界能大规模用的东西」。
04放榜一:又快又好,还打脸了自己的祖师爷
先看头条数字(上图 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放榜二:一路堆到万亿,还稳得不可思议
既然「加专家」是加参数最便宜的方式,那就一路堆上去,看能堆多高。论文设计了两头巨兽(上图 Table 9):Switch-XXL(3950 亿参数,64 个专家,每词算力对标 T5-XXL)和 Switch-C(1.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 时代的公开秘密
按系列惯例,讲讲它后来的命运。第一道现实关:万亿参数怎么部署?没人能把 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. MoE 凭什么能做到「参数堆几十倍,每个词的算力却几乎不变」?
- 2. 前辈断言「路由至少要选 2 个专家」,Switch 只选 1 个反而更好——它靠什么补上了只选一个的短板?
- 3. 1.6 万亿参数的 Switch-C 训练完全不崩,小它 4 倍的 Switch-XXL 反而发散。为什么?
答案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)的吗?评论区聊聊。