技术博客

SwiGLU:门控线性单元为什么成为主流

第 99 / 147 篇 · 2025-07-04 · ai · 激活函数SwiGLUFFN

LLaMA、Qwen、DeepSeek 的 FFN 都不是经典的"上投影 → 激活 → 下投影"三层结构,而是四个权重矩阵:$W_1, W_3$ 两个上投影、一个 Swish 门控相乘、$W_2$ 下投影。这就是 SwiGLU(Shazeer, 2020)。它在 PaLM 之后事实上取代了 GeLU,成为开放权重模型的默认选择。这篇文章回答两个问题:门控结构从哪来,多花的参数买到了什么。

GLU 家族:从 LSTM 门控借来的结构

GLU(Gated Linear Unit)原始定义是逐元素乘积

$$ \mathrm{GLU}(x) = (xW)\otimes\sigma(xV), $$

一个分支提供内容、一个分支提供门(0 到 1 之间的逐通道权重),输出是"被门控的内容"。它直接借自 LSTM 的输入门/遗忘门设计——门控循环网络早已验证"数据依赖的逐通道开关"是有效的归纳偏置。Shazeer 的观察是:这个结构不需要循环也能用,套在 FFN 位置上就是一个更强的非线性。

把门换成别的激活函数就得到一个家族:GeLU 门控叫 GEGLU,Swish 门控叫 SwiGLU,SiLU 门控就是 SwiGLU(两者同义,$\mathrm{Swish}_1(x)=x\sigma(x)=\mathrm{SiLU}(x)$)。完整形式

$$ \mathrm{SwiGLU}(x) = \big(\mathrm{SiLU}(xW_1)\otimes (xW_3)\big)W_2, $$

其中 $W_1,W_3\in\mathbb R^{d\times h}$,$W_2\in\mathbb R^{h\times d}$。

参数量账本:为什么 hidden size 是 $8d/3$

标准 FFN(上投影 $d\times4d$,下投影 $4d\times d$)参数量是 $8d^2$。SwiGLU 多一个 $W_3$,三矩阵结构按 hidden size $h$ 算是 $3dh$。要在参数量上与标准 FFN 打平:

$$ 3dh = 8d^2 \quad\Rightarrow\quad h = \frac{8}{3}d \approx 2.67d. $$

这就是常见做法"SwiGLU 的 intermediate size 取 $\lceil 8d/3\rceil$ 的某个整除值"的来源。LLaMA-7B 的 $d=4096$,intermediate 取 $11008$——恰好是 $4096\times 8/3 \approx 10922$ 向上对齐到 128 的倍数。注意对齐的不是 $4d=16384$:如果惯性沿用 GeLU FFN 的 $4d$ 隐藏维度,参数量会多出 50%,这正是"多一个矩阵"的分量。

这个配比还有第二层依据:Shazeer 论文里的消融显示,在参数量打平的前提下,SwiGLU 以 $h\approx 8d/3$ 的配置在多项任务上稳定优于 GeLU FFN,且优势随规模保持。也就是说 $8/3$ 不是精确最优点,而是"参数守恒"约束下的良好近似,实践中大家对齐整除粒度即可。

SwiGLU 数据流:两个上投影,一个做内容、一个做门 输入 x R^d xW₁ → SiLU 门分支(平滑 0/1) xW₃ 内容分支(线性) × → W₂ 下投影 R^h → R^d 输出 回残差流 参数量:3dh,令 h=8d/3 与经典 FFN 的 8d² 打平

门控买到什么:逐通道的内容选择

多花的 $dh$ 参数买到的是 FFN 内部的一次逐通道选择。把门分支的值记为 $g=\sigma(xW_1)\odot xW_1$ 前的 sigmoid 部分,第 $j$ 个中间通道的输出是 $g_j\cdot(xW_3)_j$——门接近 0 的通道整条内容被关掉,门接近 1 的保留。标准 FFN 里 $\mathrm{GeLU}(xW_1)$ 也能起到类似的选择作用,但 GeLU 的"门"和内容来自同一个投影 $W_1$,选择什么和输出什么是耦合的;SwiGLU 把它们解耦成两个投影,每个中间神经元可以独立决定"我对当前输入敏不敏感"和"我携带什么内容"。

这个解释和 FFN 的键值记忆假说(Geva et al., 2021)严丝合缝:FFN 第一层 $W_1$ 的神经元像 key,匹配输入模式,第二层 $W_2$ 的列像 value,存着要写回残差流的知识。SwiGLU 的三矩阵结构让分工更干净——$W_1$ 专心做 key 匹配(只进 sigmoid 门),$W_3$ 提供被写入的内容,门控后的乘积再经 $W_2$ 写入残差流。键、值、写入三个角色各占一个矩阵。

训练的稳定性细节

SwiGLU 有两个实测的坑值得提前知道。第一是初始化:门分支用 SiLU(零点附近近似恒等),若 $W_1$ 和 $W_3$ 都用标准 Xavier 初始化,乘积的方差会比方差守恒预期的高(两个零均值变量的乘积方差是各自方差之积,但 SiLU 有偏置项),LLaMA 的做法是给 $W_2$ 的初始化标准差除以 $\sqrt{2L}$ 补偿整体尺度。第二是 dead gate:Sigmoid 门在训练早期若把某通道压到接近 0,该通道两个投影都收不到有效梯度,恢复很慢——SwiGLU 版的"死亡神经元"问题,缓解靠合理的 $W_1$ 偏置初始化(略偏正,让初始门均值大于 0.5)。

小结

SwiGLU = GLU 门控结构 + SiLU 门函数,三矩阵 $3dh$ 参数,hidden 取 $8d/3$ 与经典 FFN 参数守恒。它比 GeLU FFN 多的不是一个更花哨的非线性,而是把"选择"与"内容"解耦成两个投影——这和 FFN 作为键值记忆的机制理解互相印证,也解释了为什么它没有随着尺度增大而被更简单的结构替代:门控是大模型 FFN 里知识存取的天然接口。