Activation · Gated FFN

SiLU 与 SwiGLU

现代 LLM 的 Attention 输出通常保持线性,真正集中的逐 token 非线性位于 FFN。SwiGLU 用两条升维分支把“传递什么”和“传递多少”分开,再投影回残差流。

3 个投影gate、up、down 共同构成完整的 SwiGLU FFN;SwiGLU 不只是一个独立激活函数。
位置SiLUSwiGLU维度算例边界资料

一、先看非线性放在哪里

在常见的 Pre-Norm Transformer 层中,Attention 和 FFN 都接收归一化后的残差状态,但只有 FFN 通常显式使用 SiLU、GELU 一类逐元素激活。

a = Wₒ · Attention(RMSNorm(x))
x′ = x + a

f = FFN(RMSNorm(x′))
x_out = x′ + f

Attention 内部并非没有非线性:注意力分数会经过 softmax。区别在于,多头输出拼接后的输出投影 Wₒ 后面通常不再接 ReLU、SiLU 或 GELU,而是直接进入残差加法。这样不会在残差流入口处把负值截断。

一个容易混淆的说法

“Attention 输出没有激活”通常特指 Wₒ 后没有逐元素激活,并不是说整个 Attention 计算是线性的。softmax 仍然是非线性运算;部分新架构还会额外加入输出门控。

二、SiLU 是平滑的自门控激活

SiLU(x) = x · sigmoid(x)

SiLU 也常被称为 Swish。它把输入乘以一个位于 0 到 1 之间的 sigmoid 系数:大的正值近似原样通过,接近零的值被平滑压缩,负值不会像 ReLU 那样全部立刻归零。

性质ReLUSiLU实际含义
负半轴恒为 0保留小的负输出不会硬截断所有负方向信息
零点附近有折点平滑梯度随输入连续变化
计算取最大值需要 sigmoid 与乘法理论算子更贵,但训练/推理框架通常提供融合 kernel
门控解释正负阈值输入决定自身通过比例自然适合作为 GLU 的 gate 分支

这些性质解释了 SiLU 为什么适合大模型,但不能单独证明它一定优于 ReLU。实际模型效果还取决于初始化、宽度、训练数据和优化设置;现代 LLM 中常见的收益来自 SiLU 与 GLU 门控组成的 SwiGLU 整体

三、SwiGLU 是 FFN 的门控升维部分

输入 X 同时进入两条线性分支。gate 分支经过 SiLU,value/up 分支保持线性;两者逐元素相乘后,再由 down projection 降回模型维度。

SwiGLU FFN 完整数据流输入分成 gate 和 up 两条升维分支,gate 经过 SiLU,与 up 逐元素相乘,再由 down projection 降回模型维度。 输入 Xd_model gate_projXW_gate up_projXW_up SiLU软门控 × down_proj降回 d_model
SwiGLU 的完整路径:两次升维投影、一次 SiLU、一次逐元素乘法和一次降维投影。图中省略 bias;Llama 等实现通常不用 bias。
G = XW_gate
U = XW_up
H = SiLU(G) ⊙ U
FFN(X) = HW_down
def swiglu_ffn(x):
    gate = silu(gate_proj(x))
    value = up_proj(x)
    return down_proj(gate * value)

因此,“SwiGLU 是 FFN 的第一部分”基本正确:狭义的 SwiGLU 是 SiLU(gate) * value,随后还需要 down_proj 才得到完整 FFN 输出。工程文档也经常把整个三投影 FFN 简称为 SwiGLU FFN。

四、维度与参数量为什么是 8/3 倍

设输入形状为 [B, T, d_model],门控中间宽度为 d_ff。两个升维投影都得到 [B, T, d_ff],逐元素乘法不会改变形状,最后降回 [B, T, d_model]

步骤权重形状输出最后一维
gate_projd_model × d_ffd_ff
up_projd_model × d_ffd_ff
逐元素门控无权重d_ff
down_projd_ff × d_modeld_model

忽略 bias,传统两投影 FFN 若取 d_ff = 4d,参数量约为 2 × d × 4d = 8d²。SwiGLU 有三个矩阵,为保持相近参数量,可令:

3 × d × d_ff ≈ 8d²
因此 d_ff ≈ (8/3)d

实际实现还会把中间维度对齐到适合硬件的整数倍,并可能使用不同的宽度倍率。所以 8/3 是同参数量比较下的基准,不是每个模型必须遵守的常数。

五、一个两维门控算例

假设两条升维分支已经产生 G = [2, -1]U = [3, 4]。SiLU 作用于 gate 分支后约为 [1.762, -0.269],再与 value 分支逐元素相乘:

SiLU(G) ≈ [1.762, -0.269]
H = SiLU(G) ⊙ U ≈ [5.285, -1.076]

第一个通道被较强地放大并传递,第二个通道被压低但没有被硬置零。随后 W_down 会混合全部中间通道,生成可加回残差流的 d_model 维输出。

六、结论与边界

  • 现代公开 LLM 中常见的是 SwiGLU FFN;其逐元素非线性是 SiLU/Swish,不应简单称为某个 ReLU 变体。
  • Attention 的输出投影后通常不接逐元素激活,但 Attention 内部有 softmax;某些变体还会加入 gate。
  • SwiGLU 用 gate 与 value 两条分支替代传统 FFN 的单条升维路径,完整输出还必须经过 down projection。
  • SiLU 的平滑和负值保留提供了合理直觉,但模型质量收益是架构、宽度和训练设置共同作用的结果。
不要从公开模型外推所有“最新 LLM”。

Llama 等开放实现可以直接核对 FFN;闭源模型若没有论文或代码披露,就无法可靠断言其激活函数与门控细节。

参考资料

  1. Noam Shazeer, GLU Variants Improve Transformer:比较 ReGLU、GEGLU、SwiGLU 等门控 FFN 变体。
  2. Attention Is All You Need:原始 Transformer 的 Attention 与位置前馈网络定义。
  3. LLaMA: Open and Efficient Foundation Language Models:公开说明使用 SwiGLU,并采用约 2/3 × 4d 的中间宽度。
  4. Meta Llama 3 官方实现:FFN 前向计算为 w2(F.silu(w1(x)) * w3(x))
  5. OpenAI gpt-oss 官方实现:采用带裁剪等工程调整的 SwiGLU。

评论加载中...