激活与 FFN
FFN 三步结构与激活函数如何从 GELU 演进到 SwiGLU,以及它为何占 block 参数的三分之二
核心要点:
- FFN 占标准 block 参数 2/3, FLOPs ~2/3 (短序列下)
- 标准 FFN:上投影 → 激活 → 下投影,两个矩阵
- SwiGLU 三矩阵 + gating, Llama / PaLM / Qwen 全用
- $h_{\text{ffn}} = 8h/3$ 不是拍脑袋:三矩阵保参数总量与 4× 等价
- Shazeer 自己承认 SwiGLU 收益"归功于神的恩典"
名词定义
本篇共享名词在 5.1 总览 已定义 (FFN intermediate / GELU / SiLU / SwiGLU)。本篇内 "MLP" 与 "FFN" 同义,来自不同社区惯例:Transformer 论文用 FFN, Anthropic / mechanistic interp 用 MLP,指代同一部件。
| 名词 | 定义 |
|---|---|
| Gating (门控) | SwiGLU 引入的机制:一支路径乘 $\sigma(W_{\text{gate}} \mathbf{x})$ 作为"开关",控制另一支路径的通过 |
| Up projection | FFN 第一步,把 hidden 维 $h$ 投影到更大的 intermediate 维 $h_{\text{ffn}}$ |
| Down projection | FFN 最后一步,把 $h_{\text{ffn}}$ 维投回 hidden 维 $h$ |
@tbl-ffn-glossary 本篇新引入名词
FFN 在 Transformer block 里干什么?
核心问题:一个 block 里 attention 和 FFN 两个子层,attention 让 token 之间互相看,FFN 在做什么?为什么不直接堆 attention?
FFN 是单 token 内部的非线性加工:每个位置独立地做"升维 → 非线性 → 降维",给 attention 之后的 hidden state 加上独立位置的表达力。
三步:上投影 / 激活 / 下投影
标准 (pre-GLU) FFN 形式:
$$\begin{equation} \mathrm{FFN}(\mathbf{x}) = W_{\text{down}} \cdot \phi(W_{\text{up}} \mathbf{x}) \label{eq:ffn-standard} \end{equation}$$形状:
- $\mathbf{x} \in \mathbb{R}^h$ (单 token 的 hidden state)
- $W_{\text{up}} \in \mathbb{R}^{h_{\text{ffn}} \times h}$:升到中间维 $h_{\text{ffn}}$ (典型 $4h$)
- $\phi$:非线性激活 (ReLU / GELU / SiLU)
- $W_{\text{down}} \in \mathbb{R}^{h \times h_{\text{ffn}}}$:降回 $h$ 维
核心特征:FFN 每个位置独立做,不跨位置。Attention 是序列维上的混合 (token 间互看),FFN 是 hidden 维上的非线性混合 (单 token 内部加工)。两者交替,形成 Transformer 的"先看别人 → 再消化" 工作模式。
为什么必须先升维再降维?
直觉:FFN 不是简单的"过非线性",而是借助高维空间引入复杂的非线性变换。
- 升到 $4h$ 维是把信号投到更大空间,让非线性能在更多维度上独立作用
- 降回 $h$ 维让输出可以被加到 residual stream 上 (维度必须匹配)
- 没有升维直接 $\phi(\mathbf{x})$ 表达力极弱
Anthropic Transformer Circuits 视角:FFN 的中间层是模型存储"知识 / 特征 / lookup table" 的地方,升维是为了有足够空间存储这些特征。
GELU:把 dropout 连续化的激活
核心问题:ReLU 这种简单激活在 CNN 时代主导,为什么 Transformer / GPT 系全改用 GELU?
GELU 设计动机是把 dropout 的随机门控"连续化",输入越大保留概率越高,全程可微,解决 ReLU 在负值区的"死亡神经元" 问题。
GELU 数学
Hendrycks & Gimpel 2016[1] 给出 GELU 定义:
$$\begin{equation} \mathrm{GELU}(x) = x \cdot \Phi(x) \label{eq:ffn-gelu} \end{equation}$$其中 $\Phi(x)$ 是标准正态分布 $\mathcal{N}(0, 1)$ 的 CDF:
$$\begin{equation} \Phi(x) = \frac{1}{\sqrt{2\pi}} \int_{-\infty}^{x} e^{-t^2/2} \, dt \label{eq:ffn-phi} \end{equation}$$工程上常用 tanh 近似 (CDF 无解析形式,这条算得快):
$$\begin{equation} \mathrm{GELU}(x) \approx 0.5 x \left(1 + \tanh\left[\sqrt{2/\pi}(x + 0.044715 x^3)\right]\right) \label{eq:ffn-gelu-approx} \end{equation}$$设计直觉
GELU = 输入 × 保留概率,保留概率随输入大小递增:
- $x = +3$: $\Phi(x) \approx 0.998$,几乎全保留 ($\mathrm{GELU} \approx 2.99$)
- $x = 0$: $\Phi(0) = 0.5$,半保留 ($\mathrm{GELU}(0) = 0$)
- $x = -3$: $\Phi(x) \approx 0.001$,几乎全抑制 ($\mathrm{GELU} \approx -0.004$)
- 平滑过渡,全程可微;保留小幅负值 (与 ReLU 截断不同)
GPT 系全沿用
| 模型 | 激活函数 |
|---|---|
| GPT-1 (2018) | GELU (首用) |
| BERT | GELU ("following OpenAI GPT") |
| GPT-2 / GPT-3 | GELU |
| GPT-J / GPT-NeoX | GELU |
@tbl-ffn-gelu-adoption GELU 在 GPT 系 + BERT 主导 2018-2022
GELU 这条线在 2022 年达到顶点,之后被 SwiGLU 接管。
SwiGLU:引入 gating, "归功于神的恩典"
核心问题:SwiGLU 跟 GELU 看起来差不多 (都是平滑过渡),凭什么 Llama / PaLM / Qwen 全线改用?性能提升多大?
SwiGLU 引入门控机制,实测在 T5 上 perplexity 改善 2.4%,是 2023 年后 LLM 的事实标准激活;但 Shazeer 论文自己承认没有理论解释这种收益。
SiLU / Swish: SwiGLU 的基础激活
Ramachandran et al. 2017[2] 用神经架构搜索找出 Swish 激活:
$$\begin{equation} \mathrm{Swish}(x) = x \cdot \sigma(\beta x) \label{eq:ffn-swish} \end{equation}$$其中 $\sigma$ 是 sigmoid。Swish-1 (β=1) = SiLU = $x \cdot \sigma(x)$,是同一函数的不同命名。
SwiGLU 完整定义
Shazeer 2020[3] 提出 SwiGLU:
$$\begin{equation} \mathrm{SwiGLU}(\mathbf{x}) = \mathrm{SiLU}(W_{\text{gate}} \mathbf{x}) \odot (W_{\text{up}} \mathbf{x}) \label{eq:ffn-swiglu} \end{equation}$$与标准 FFN 的根本差别:三个矩阵,引入门控。完整 SwiGLU FFN:
$$\begin{equation} \mathrm{FFN}_{\text{SwiGLU}}(\mathbf{x}) = W_{\text{down}} \cdot \left[\mathrm{SiLU}(W_{\text{gate}} \mathbf{x}) \odot (W_{\text{up}} \mathbf{x})\right] \label{eq:ffn-swiglu-full} \end{equation}$$Gating 的直觉
- $\mathrm{SiLU}(W_{\text{gate}} \mathbf{x})$: "开关信号",对每个 intermediate 维度独立决定通过多少
- $W_{\text{up}} \mathbf{x}$: "内容信号",表达实际特征
- 两者逐元素相乘:内容被开关调制
门控机制让模型可以学"哪些维度被激活",比单一非线性 (GELU / ReLU) 更灵活。
Shazeer 2020 Table 1 实证
| Activation | T5 perplexity |
|---|---|
| ReLU baseline | 1.677 |
| GELU | 1.660 |
| GEGLU | 1.633 (最佳) |
| SwiGLU | 1.636 (次佳) |
@tbl-ffn-shazeer-ablation Shazeer 2020 Table 1: GLU 变体在 T5 上的 perplexity 实测
SwiGLU 改善约 2.4%,GEGLU (GELU 变种 GLU) 略好一点。
Shazeer 的诚实自白
论文结尾原文:
"We offer no explanation as to why these architectures seem to work; we attribute their success, as all else, to divine benevolence."
作者直接承认:我也不知道为什么有用,归功于神的恩典。这条 honest disclosure 在深度学习论文里少见,也说明 SwiGLU 的优势是经验得出的,缺乏严谨理论。
工业全面采用
| 模型 | FFN 激活 |
|---|---|
| PaLM (2022) | SwiGLU (首批大规模) |
| LLaMA 1 / 2 / 3 | SwiGLU |
| Qwen 2 / 2.5 / 3 | SwiGLU |
| DeepSeek-V3 | SwiGLU |
| Gemma / Mistral / Phi | SwiGLU |
@tbl-ffn-swiglu-adoption 2023 年后 LLM 全线 SwiGLU
$h_{\text{ffn}} = 8h/3$ 怎么来的?
核心问题:SwiGLU 引入第三个矩阵,FFN 参数从 $2 \cdot h \cdot h_{\text{ffn}}$ 变 $3 \cdot h \cdot h_{\text{ffn}}$,多了 50%。Llama 实际用 $h_{\text{ffn}} \approx 8h/3$ 而非 $4h$,这个数字怎么来的?
为保持 SwiGLU FFN 参数与标准 4× FFN 相当,把 $h_{\text{ffn}}$ 缩到 8h/3,这是 SwiGLU 三矩阵补偿参数膨胀的设计。
简单推导
标准 4× FFN 参数:$2 \cdot h \cdot 4h = 8h^2$
SwiGLU FFN 三矩阵参数:$3 \cdot h \cdot h_{\text{ffn}}$
要相等:
$$\begin{equation} 3 \cdot h \cdot h_{\text{ffn}} = 8h^2 \implies h_{\text{ffn}} = \frac{8h}{3} \approx 2.667h \label{eq:ffn-8over3} \end{equation}$$Shazeer 原文表述等价:"将 $d_{\text{ff}}$ 缩减 2/3",即 $h_{\text{ffn}} = (2/3) \cdot 4h = 8h/3$。
Llama 实际值:multiple_of 对齐
Llama 实际不直接用 $\lceil 8h/3 \rceil$,而是为了 GPU 友好向上对齐到 256 的倍数:
hidden_dim = 256 * ceil(4 * h * 2/3 / 256)
实际比例略高于 $8/3$:
| 模型 | $h$ | $h_{\text{ffn}}$ | 比例 |
|---|---|---|---|
| Llama 7B | 4096 | 11008 | 2.686 |
| Llama 13B | 5120 | 13824 | 2.700 |
| Llama 33B | 6656 | 17920 | 2.692 |
| Llama 65B | 8192 | 22016 | 2.686 |
@tbl-ffn-llama-h-ffn Llama 1 实际 $h_{\text{ffn}}$ (multiple_of=256 对齐,略高于 8/3)
FFN 占模型多少参数和计算?
核心问题:一个 Transformer block 里 attention 和 FFN 谁更"重"?实测占多少参数,多少 FLOPs?
FFN 在标准 Transformer 里占 block 参数的 2/3,训练 FLOPs 也约 2/3。直觉上 FFN 比 attention 更重要 (从计算占比角度),但实际行为分工不同。
参数占比:代数恒等式
单 block 参数 (无 GLU,标准 4×):
| 部件 | 参数 |
|---|---|
| Attention ($W_Q, W_K, W_V, W_O$) | $4h^2$ |
| FFN ($W_{\text{up}}, W_{\text{down}}$) | $2 \cdot h \cdot 4h = 8h^2$ |
| Block 总 | $12h^2$ |
@tbl-ffn-block-params 标准 Transformer block 参数分布
FFN 占 $8/12 = 2/3$, attention 占 $4/12 = 1/3$。与 $h$ 无关,是结构性恒等。
GPT-3 175B 实测验证
GPT-3 175B 配置 (96 层,$h = 12288$):
- Attention 参数 ≈ 58B
- FFN 参数 ≈ 116B
- FFN 占 66.7%,与代数恒等式一致
FLOPs 占比
单 token 前向 FLOPs:
| 部件 | FLOPs |
|---|---|
| FFN (4× 标准) | $16 h^2$ |
| Attention (Q/K/V 投影 + 输出投影) | $8 h^2$ |
| Attention (QK 内积 + softmax × V) | $4 T h$ ($T$ = 序列长度) |
短序列 $T \ll h$ 时,FFN : Attention ≈ 2 : 1, FFN 主导。
GPT-3 175B ($h = 12288, T = 2048$) 实测 FFN : Attention $\approx 1.85 : 1$, FFN 占约 65%。
Hoffmann et al. 2022 (Chinchilla) Appendix F 指出典型 LLM 训练中 FFN 贡献约 2/3 训练 FLOPs,与上述代数一致。
含义:FFN 是大模型的主要"重量"
- 工程优化重点:FFN 矩阵乘的 kernel (cutlass / cuBLAS / Triton) 是性能瓶颈,不是 attention
- 内存:FFN 中间激活 $h_{\text{ffn}} \cdot T \cdot B$ 很大,是 activation checkpointing 的重点
- 量化 / 稀疏 / 剪枝:优化 FFN 收益远大于优化 attention
MoE:把 FFN 替换成稀疏专家
核心问题:既然 FFN 占了 2/3 参数和计算,能不能让它更"稀疏" 只激活一部分?
Mixture of Experts (MoE) 把单一 FFN 替换成 $N$ 个并行 expert FFN + 路由 (router),每个 token 只激活其中 $k$ 个 (top-k routing,通常 $k = 1$ 或 $2$),用稀疏激活换"参数大 / 计算小"。
本章不展开 MoE 细节 (路由算法 / 负载均衡 / EP 通信),全部归 interconnect/05-LLM并行通信/08-专家并行:
- DeepSeek-V3: 671B 总参数,37B 激活 (256 expert, top-8 + 1 shared)
- Mixtral 8×7B: 47B 总参数,13B 激活 (8 expert, top-2)
- Qwen3-MoE 系列
点到为止:MoE 是 FFN 的延伸,数据流和位置不变 (仍是 attention 之后),只是 FFN 内部稀疏化。
Takeaway
| 知识点 | 核心结论 |
|---|---|
| FFN 角色 | 单 token 内非线性加工,与 attention 跨 token 混合互补 |
| 三步结构 | 上投影 $W_{\text{up}}$ → 激活 → 下投影 $W_{\text{down}}$ |
| 标准比例 | $h_{\text{ffn}} = 4h$ (Vaswani 经验值,无理论) |
| GELU 定义 | $x \cdot \Phi(x)$, GPT-1 至 GPT-3 / BERT 全用 |
| GELU 直觉 | 把 dropout 连续化,输入越大保留概率越高 |
| SiLU = Swish-1 | $x \cdot \sigma(x)$ |
| SwiGLU 定义 | $\mathrm{SiLU}(W_{\text{gate}} \mathbf{x}) \odot (W_{\text{up}} \mathbf{x})$,三矩阵门控 |
| Shazeer 实测 | T5 上 perplexity 改善 2.4% (1.677 → 1.636) |
| SwiGLU 现状 | 2023 后 Llama / PaLM / Qwen / DeepSeek / Gemma / Mistral / Phi 全线 |
| $8h/3$ 来源 | 三矩阵保参数总量与 4× 等价:$3 h \cdot 8h/3 = 8h^2$ |
| 参数占比 (代数恒等) | FFN 占 block 2/3, attention 占 1/3 |
| FLOPs 占比 | 短序列下 FFN : Attention ≈ 2 : 1, FFN 约 2/3 训练 FLOPs |
| MoE | FFN 替换为稀疏 expert,详见专家并行章 |
开放问题
- SwiGLU 为什么有用:Shazeer 自己承认无理论,业界 ablation 实测有效但缺机制解释;mechanistic interp 是否能给出答案仍开放
- $h_{\text{ffn}}$ 的最优比例是否真的是 $\sim 8h/3$:业界默认沿用,但是否在大模型上真的最优,还无系统研究
- 激活函数演化是否到终点:2023 后 SwiGLU 一统江湖,是否有下一代激活?GeGLU 实测略好但没人换
- MoE 是否会取代 dense FFN:DeepSeek 路线给 MoE 巨大动力,但部署复杂;是否所有大模型最终都走 MoE 还开放
延伸阅读
- 下一步:归一化与残差 → 5.3 归一化与残差
- 完整 block 顺序 → 5.4 Block 与堆叠
- MoE 详细 (路由 / 通信 / EPLB) → interconnect/05-LLM并行通信/08-专家并行
- scaling laws 完整内容 → 06-预训练/04-scaling-laws
- Karpathy nanoGPT MLP 实现 → https://github.com/karpathy/nanoGPT/blob/master/model.py
参考资料
- Hendrycks, Gimpel. Gaussian Error Linear Units (GELU). 2016. https://arxiv.org/abs/1606.08415
- Ramachandran et al. Searching for Activation Functions (Swish/SiLU). 2017. https://arxiv.org/abs/1710.05941
- Shazeer. GLU Variants Improve Transformer. 2020. https://arxiv.org/abs/2002.05202