跳到主要内容

前馈块 — SwiGLU 与专家混合(MoE)

这一章讲两件事: 每个词过了注意力之后,去哪儿「单独加工」——前馈网络(FFN),以及它现代的两个升级件: SwiGLU 激活与专家混合(MoE)。第 02 章那句「总参数量和单次计算量是两回事」,这一章就是机制本体。 读完你能算清「Mixtral 8x7B 打赢 LLaMA 70B」这笔账。

1. 先看现象:注意力之后,每个词还要「自己想」

注意力解决的是词与词之间的信息交换;交换完的信息要变成「这个位置的新表示」, 还得在每个位置各自做一次非线性(输出和输入不成简单直线关系)的加工——这就是前馈网络(FFN,行话也叫 MLP,多层感知机)1。 原书给它的定位:注意力的计算依赖输入内容(动态),前馈是每个位置同一套权重(静态), 一横一纵互补2

它的形状三步就画完(用第 04 章的配置:256 → 256 → 256,本书的轻量取法; 大模型常见先扩 4 倍再缩回)3:

256 维 ──撑宽──▶ 中间层 ──过激活函数──▶ 256 维

图说:先撑宽(给思考留草稿纸),中间夹一个非线性激活(没有它,
两层线性怎么叠都等价于一层),再压回原宽——出口宽度必须等于入口(第 07 章的「形状不变」)。

激活函数(给线性变换掺进「弯折」的最小零件:不用它,再深的网络也只能学直线关系)是这一章的第一个主角。 历史上有 sigmoid(压到 0-1,深处梯度会消失)、ReLU(负数直接归零,简单但会「死」—— 某些神经元一旦输出恒零就再也学不动)4

2. 升级一:SwiGLU——给激活装一扇门

SwiGLU(Swish-gated linear unit)的思路:别只做「过不过」的硬弯折,装一扇—— 输入先分成两路,一路当「内容」,另一路过 Swish 激活后当开关;所谓门控,就是用一个 0 到 1 的开关去调信息流量—— 两路逐维相乘5。Swish 本身是 x · sigmoid(x) 的平滑版:两头平滑、负半轴不硬归零, 梯度好流6

为什么值得换?原书给的账7:

普通 FFN(ReLU/GELU)SwiGLU FFN
权重矩阵2 个3 个(内容路、门控路、输出路)
参数量基准约多 50%
回报大规模训练上困惑度改善 0.5-1.0 点

一行话总结:用「每次计算贵一半」换「同样的算力预算下效果更好」。 原书点名的使用者:Google 的 PaLM;开源一系的 LLaMA/Mistral 也全在这条船上8。 本书的实现还有个工程细节:为了避免参数翻倍,一层投影直接输出两倍宽, 再切成内容/门控两半——三矩阵的账用两矩阵的储存方式付掉9; Swish 用 sigmoid(1.702x) 快速近似,再按第 04 章的 swiglu_limit=7.0 设天花板防数值失控10

3. 升级二:专家混合(MoE)——总参数与单次计算解耦

前面的 FFN 不管多宽,每个 token 都要过全部权重。专家混合(MoE)把这个「全过」改成「点名」11:

  • 准备 N 个专家(每个就是一台 SwiGLU 前馈,各带自己的权重;本书 N=16);
  • 加一个门控(一个很小的线性层):看完 token,给 16 个专家各打一个分;
  • 只请分最高的 k 个上岗(本书 k=2),其余 14 个这个 token 完全不碰;
  • 上岗专家的输出按门控分数加权平均,合成最终结果12

主走查一轮(门控分数是为演示编的):

一个 token 进门控 → 16 个分:专家3 得 0.9,专家11 得 0.6,其余 ≤0.2
→ 只选专家 3 和 11(k=2)
→ 两台的输出各算一份(每台就是「撑宽→SwiGLU→压回」)
→ 按 0.9 : 0.6 归一后的比例加权合并 → 回到 256 维

图说:另外 14 个专家的参数躺在本子里没被碰——
这就是「6710 亿总参、370 亿激活」(第 02 章)的机制本体[^13]。

MoE 的代价:门控会偏心

稀疏激活带来一个新毛病:门控可能永远偏爱某几个专家,其他专家得不到训练,白白发工资。 解法是给损失加一项负载均衡惩罚——哪个专家被冷落就罚哪一笔,逼门控雨露均沾13。 原书列的变体里,量产用的都是 top-k 路线(本书 k=2;Switch Transformer 经典配置也是每 token 选 1-2 个)14

4. 两件一起上:块里的账本

本书的 MLPBlock 同时带两个升级,加上第 07 章的旧套路,整个块的清单15:

residual = x
x = RMSNorm(x) ← 预归一化,与注意力块同款
门控打分 → 选 top-2 专家
每台专家:撑宽到 2×中间宽 → 切半 → SwiGLU(带 7.0 上限)→ 压回 256
加权合并 → 残差相加

图说:和注意力块一样,出口=入口;唯一的区别是中间的「一人加工」
换成了「十六选二」。

这本书的代码里还埋了一件大模型才用得上的东西:如果多张卡并行,中间层的计算被分片到各卡, 最后把各卡的部分和总加(all_reduce)——张量并行(把一层摊到多张卡上算)的接入口在这里留了桩16。 教学模型用不上,配方先备好。

这笔账怎么帮 Mixtral 赢 LLaMA

原书给的对照:Mixtral 8x7B(8 专家、每台 70 亿参数)在 MMLU 基准上胜过 LLaMA 70B—— Mixtral 每 token 只激活约 130 亿参数,LLaMA 70B 是全量17。 「更大的总参数」买了更多知识容量,「稀疏激活」保住了单次计算的成本——这就是 MoE 的全部生意。

5. 作者的判断与证据

说法书里的证据我们的标注
SwiGLU 比普通激活好引 Shazeer 2020 论文与 PaLM 采用;0.5-1.0 困惑度改善7有论文出处
MoE 能撑万亿参数Switch Transformer、Grok、DeepSeek 的采用事实18厂商实践
门控会失衡,需要负载均衡机制性论证(冷门专家得不到梯度)+ 均衡损失公式13领域共识
Mixtral 8x7B > LLaMA 70B(MMLU)原书直接引用基准结果17第三方基准,可复核

判断(我们的,不是书里的): 原书把 SwiGLU 与 MoE 分成两节平铺;但两者的组合其实有个隐藏的化学反应—— MoE 的专家是「小的前馈」,SwiGLU 让「小的」也更有效,所以「稀疏路由」不必为省算力牺牲单专家的质量。 原书有一句接近的话,说到两级门控——全局的管选专家、局部的管特征(输入里值得抓的线索):「全局 MoE 选专家、局部 SwiGLU 调特征」19。但原书没把「互补」说透。

「互补」能否成立,需要同规模的消融实验(拆掉一件、看掉多少分)才能定论,原书没有给。 如果错,会错在: 如果 SwiGLU 的收益在稀疏场景(每专家见到的数据更少)下显著缩水, 「互补」就成了想当然——原书没有给实验,我们姑且存疑。

6. 边界与局限

原书自己列了,我们补后果:

  • 显存还是全量的:省的是计算,16 个专家的参数都得驻留显存——MoE 模型「跑得动」的门槛反而更高20;
  • 可解释性变差:哪个专家管哪类输入,事后很难说清(与第 09 章的可解释性一节呼应)21;
  • 均衡损失是新的超参:罚太轻门控照旧偏心,罚太重专家被迫同质化,原书给了典型系数(如 0.01)但强调要调22;
  • 原书 49:14 的章末总结把 MLP 的历史一路讲到 1958 年感知机与万能逼近定理——是背景板,不承担本章论证23

7. 可带走的

  1. 注意力管「词与词」,前馈管「每个词自己」;一横一纵,缺一不可;
  2. 前馈的形状永远是「撑宽→激活→压回」,出口=入口;
  3. SwiGLU = 内容路 × Swish 门控路;三矩阵、贵 50%,换 0.5-1.0 困惑度;
  4. 两倍宽投影再切半:三矩阵的账、两矩阵的存法;sigmoid(1.702x) 是 Swish 的省钱近似;
  5. MoE = 门控打分 + 每 token 只请 top-k 专家上岗;总参数与单次计算从此是两个数;
  6. 负载均衡损失治门控偏心——MoE 训练真正的难点在「分活儿」,不在「算」;
  7. MoE 省算不省显存:参数还是全量驻留;
  8. Mixtral 8x7B 胜 LLaMA 70B 的本质:知识容量按总参数算,计算成本按激活参数算。

8. 原文地图

主题原书章原文位置
FFN 定位与逐 token 加工The Feed-Forward Block: Position-Wise Transformationstext/54-fm-the-feed-forward-block-position-wise-transformat.txt:3(搜「Cascading to the MLPBlock」)
撑宽-激活-压回The Feed-Forward Block: Position-Wise Transformationstext/54-fm-the-feed-forward-block-position-wise-transformat.txt:3(搜「4×」)
MoE 是什么与复兴Mixture of Experts: A Comprehensive Overviewtext/44-fm-mixture-of-experts-a-comprehensive-overview.txt:3(搜「divide-and-conquer」) · text/44-fm-mixture-of-experts-a-comprehensive-overview.txt:9(搜「Jacobs」)
专家与门控两组件Architecture of Mixture of Expertstext/45-fm-architecture-of-mixture-of-experts.txt:3(搜「two primary components」) · text/45-fm-architecture-of-mixture-of-experts.txt:13(搜「Gating Network」)
稀疏激活与 top-kArchitecture of Mixture of Expertstext/45-fm-architecture-of-mixture-of-experts.txt:31(搜「Sparse Activation」) · text/45-fm-architecture-of-mixture-of-experts.txt:47(搜「Top-k MoE」)
负载均衡损失Architecture of Mixture of Expertstext/45-fm-architecture-of-mixture-of-experts.txt:103(搜「load balancing」)
MoE 的显存与可解释性代价Architecture of Mixture of Expertstext/45-fm-architecture-of-mixture-of-experts.txt:193(搜「Interpretability」) · text/45-fm-architecture-of-mixture-of-experts.txt:189(搜「Memory Requirements」)
SwiGLU 定义与出处SwiGLU: An In-Depth Explorationtext/46-fm-swiglu-an-in-depth-exploration.txt:3(搜「Swish-Gated Linear Unit」) · text/46-fm-swiglu-an-in-depth-exploration.txt:9(搜「Shazeer」)
Swish 治 dying ReLUSwiGLU: An In-Depth Explorationtext/46-fm-swiglu-an-in-depth-exploration.txt:17(搜「dying ReLU」) · text/46-fm-swiglu-an-in-depth-exploration.txt:43(搜「nonmonotonic」)
GLU 的门控结构SwiGLU: An In-Depth Explorationtext/46-fm-swiglu-an-in-depth-exploration.txt:47(搜「Gated Linear Units (GLU)」)
三矩阵参数账SwiGLU: An In-Depth Explorationtext/46-fm-swiglu-an-in-depth-exploration.txt:109(搜「Parameter Count」)
困惑度 0.5-1.0 与 50% 成本Alternative Activations: SwiGLU and Gated Variantstext/55-fm-alternative-activations-swiglu-and-gated-variant.txt:7(搜「0.5-1.0」)
PaLM 采用SwiGLU: An In-Depth Explorationtext/46-fm-swiglu-an-in-depth-exploration.txt:177(搜「PaLM」)
集成架构(Grok/Mixtral/Switch)Multilayer Perceptron Blocks with Mixture of Experts (MoE) and SwiGLU: A Comprehensive Integrationtext/47-fm-multilayer-perceptron-blocks-with-mixture-of-exp.txt:3(搜「Grok, Mistral AI」)
两级门控Multilayer Perceptron Blocks with Mixture of Experts (MoE) and SwiGLU: A Comprehensive Integrationtext/47-fm-multilayer-perceptron-blocks-with-mixture-of-exp.txt:119(搜「two-level gating」)
Mixtral 对 LLaMA 70BMultilayer Perceptron Blocks with Mixture of Experts (MoE) and SwiGLU: A Comprehensive Integrationtext/47-fm-multilayer-perceptron-blocks-with-mixture-of-exp.txt:127(搜「Mixtral 8x7B」)
MLPBlock 代码(门控与 SwiGLU)Multilayer Perceptron Blocks with Mixture of Experts (MoE) and SwiGLU: A Comprehensive Integrationtext/47-fm-multilayer-perceptron-blocks-with-mixture-of-exp.txt:267(搜「self.gate」) · text/47-fm-multilayer-perceptron-blocks-with-mixture-of-exp.txt:369(搜「chunk」) · text/47-fm-multilayer-perceptron-blocks-with-mixture-of-exp.txt:373(搜「1.702」) · text/47-fm-multilayer-perceptron-blocks-with-mixture-of-exp.txt:375(搜「clamp」)
张量并行分片In-Depth Analysis of the MLPBlock with Mixture of Experts (MoE) and SwiGLUtext/48-fm-in-depth-analysis-of-the-mlpblock-with-mixture-o.txt:43(搜「world_size」) · text/47-fm-multilayer-perceptron-blocks-with-mixture-of-exp.txt:391(搜「all_reduce」)
均衡系数 0.01Multilayer Perceptron Blocks with Mixture of Experts (MoE) and SwiGLU: A Comprehensive Integrationtext/47-fm-multilayer-perceptron-blocks-with-mixture-of-exp.txt:81(搜「0.01」)
1958 感知机背景Summarytext/49-fm-summary.txt:3(搜「1958」)

Footnotes

  1. 出处:「8. Multilayer Perceptron Block with Mixture of Experts (MoE) and SwiGLU」开头(text/43-ch08-8-multilayer-perceptron-block-with-mixture-of-ex.txt:15,搜「feedforward neural network」)。原文:MLP 又称前馈神经网络,通过层层互联的节点加工数据;在 transformer 里即逐位置的前馈层。

  2. 出处:「The Feed-Forward Block: Position-Wise Transformations」末段(text/54-fm-the-feed-forward-block-position-wise-transformat.txt:13,搜「complementarity」)。原文:注意力提供数据依赖的动态路由,FFN 在每个位置施加固定变换,两阶段互补。

  3. 出处:「Multilayer Perceptron Block with Mixture of Experts (MoE) and SwiGLU for Our Large Language Model」代码(text/47-fm-multilayer-perceptron-blocks-with-mixture-of-exp.txt:247,搜「intermediate_size」)。本书 hidden=intermediate=256(第 04 章配置);扩 4 倍的行业口径见 text/59-fm-the-transformerblock-class.txt:27(搜「expands the hidden dimension by a factor of 4」)。

  4. 出处:「Activation Functions」(text/46-fm-swiglu-an-in-depth-exploration.txt:31,搜「Sigmoid」;:35,搜「dying ReLU」)。原文:sigmoid 平滑但深处梯度消失;ReLU 简单高效但负输入会「死」。

  5. 出处:「SwiGLU: Definition and Structure」(text/46-fm-swiglu-an-in-depth-exploration.txt:65,搜「SwiGLU extends GLU by using Swish as the gating function」)与「Gated Linear Units (GLU)」(:49,搜「Gated Linear Units (GLU)」)。原文:输入分两路,一线性变换、一作门,逐元素相乘;SwiGLU 把 GLU 的 sigmoid 门换成 Swish。

  6. 出处:「Activation Functions」Swish 条(text/46-fm-swiglu-an-in-depth-exploration.txt:43,搜「nonmonotonic」)。原文:Swish = x·sigmoid(βx),平滑、非单调、下界为 0,负输入梯度非零、训练更稳。

  7. 出处:「Parameter Count」(text/46-fm-swiglu-an-in-depth-exploration.txt:109,搜「Parameter Count」)与「Alternative Activations: SwiGLU and Gated Variants」(text/55-fm-alternative-activations-swiglu-and-gated-variant.txt:7,搜「0.5-1.0」)。原文:SwiGLU 需三个权重矩阵(对比 ReLU FFN 的两个),参数约多;大规模预训练上困惑度改善 0.5-1.0 点、FFN 参数成本约 +50%。 2

  8. 出处:「SwiGLU: An In-Depth Exploration」第 9 段(text/46-fm-swiglu-an-in-depth-exploration.txt:9,搜「PaLM」)与「Applications of SwiGLU」(:177,搜「PaLM」)。原文:Shazeer 2020《GLU Variants Improve Transformer》提出;PaLM/PaLM 2 采用。

  9. 出处:「Multilayer Perceptron Block with Mixture of Experts (MoE) and SwiGLU for Our Large Language Model」代码(text/47-fm-multilayer-perceptron-blocks-with-mixture-of-exp.txt:271,搜「2*I」;:369,搜「chunk」)。原文:第一次投影输出 2I 宽,再切成两半用于 SwiGLU——注释明说这样免于两套矩阵。

  10. 出处:text/47-fm-multilayer-perceptron-blocks-with-mixture-of-exp.txt:373(搜「1.702」)与 :375(搜「clamp」)。原文代码:sigmoid(1.702·x) 是 swish 的近似;x1_glu 截到 swiglu_limit、x1_lin 加 1.0——注释「Clamp to keep AMP stable, affine-sigmoid for swish approx」。

  11. 出处:「Mixture of Experts: A Comprehensive Overview」(text/44-fm-mixture-of-experts-a-comprehensive-overview.txt:3,搜「divide-and-conquer」)。原文:MoE 用多个专家子模型+门控,动态把问题的不同部分分给专家,区别于单一整体结构。

  12. 出处:「Architecture of Mixture of Experts」(text/45-fm-architecture-of-mixture-of-experts.txt:13,搜「Gating Network」;:31,搜「Sparse Activation」)。原文:门控输出专家上的概率分布,只激活子集;top-k 只选分数最高的 k 个。

  13. 出处:「Load Balancing」(text/45-fm-architecture-of-mixture-of-experts.txt:103,搜「load balancing」)。原文:门控可能把输入堆给少数专家、其余欠训练;负载均衡损失加进目标函数逼门控均匀分配。 2

  14. 出处:「Variants of MoE」(text/45-fm-architecture-of-mixture-of-experts.txt:47,搜「Top-k MoE」)。原文:top-k 在软/硬之间折中,Switch Transformer 等量产模型采用。

  15. 出处:text/47-fm-multilayer-perceptron-blocks-with-mixture-of-exp.txt:321(搜「residual」)与 forward 代码(:327,搜「topk」;:395,搜「Weighted sum」)。原文:residual=x → RMSNorm → 门控 topk → 专家 SwiGLU → 权重求和 → 残差相加。

  16. 出处:text/48-fm-in-depth-analysis-of-the-mlpblock-with-mixture-o.txt:43(搜「world_size」)与 text/47-fm-multilayer-perceptron-blocks-with-mixture-of-exp.txt:391(搜「all_reduce」)。原文:world_size 取分布式环境卡数,I_local=I//world_size 分片;跨卡时 all_reduce 求和。

  17. 出处:「Empirical Performance」(text/47-fm-multilayer-perceptron-blocks-with-mixture-of-exp.txt:127,搜「Mixtral 8x7B」)。原文:Mixtral 8x7B(8 专家、每台 70 亿)在 MMLU 上胜过稠密的 LLaMA 70B,得益于 MoE 稀疏与 SwiGLU 表达力。 2

  18. 出处:text/44-fm-mixture-of-experts-a-comprehensive-overview.txt:9(搜「Switch Transformer」)与「Applications of Mixture of Experts」(text/45-fm-architecture-of-mixture-of-experts.txt:141,搜「Switch Transformer」)。原文:Switch Transformer 与 xAI 的 Grok 等模型用 MoE 高效扩展到超大参数量。

  19. 出处:「Specialization and Expressiveness」(text/47-fm-multilayer-perceptron-blocks-with-mixture-of-exp.txt:119,搜「two-level gating」)。原文:全局(MoE)与局部(SwiGLU)两级门控形成层级化专门化。

  20. 出处:「Limitations of MoE」(text/45-fm-architecture-of-mixture-of-experts.txt:189,搜「Memory Requirements」)。原文:稀疏激活仍要为所有专家驻留参数,大规模下显存可观。

  21. 出处:text/45-fm-architecture-of-mixture-of-experts.txt:193(搜「Interpretability」)。原文:模块化让「哪个专家对哪个预测负责」更难解读。

  22. 出处:text/47-fm-multilayer-perceptron-blocks-with-mixture-of-exp.txt:81(搜「0.01」)。原文:均衡损失系数 λ 典型取 0.01,鼓励均匀使用各专家。

  23. 出处:「Summary」(text/49-fm-summary.txt:3,搜「1958」)。原文:从 Rosenblatt 1958 单层感知机讲到反向传播复兴与万能逼近定理。