一、先看非线性放在哪里
在常见的 Pre-Norm Transformer 层中,Attention 和 FFN 都接收归一化后的残差状态,但只有 FFN 通常显式使用 SiLU、GELU 一类逐元素激活。
x′ = x + a
f = FFN(RMSNorm(x′))
x_out = x′ + f
Attention 内部并非没有非线性:注意力分数会经过 softmax。区别在于,多头输出拼接后的输出投影 Wₒ 后面通常不再接 ReLU、SiLU 或 GELU,而是直接进入残差加法。这样不会在残差流入口处把负值截断。
“Attention 输出没有激活”通常特指 Wₒ 后没有逐元素激活,并不是说整个 Attention 计算是线性的。softmax 仍然是非线性运算;部分新架构还会额外加入输出门控。
二、SiLU 是平滑的自门控激活
SiLU 也常被称为 Swish。它把输入乘以一个位于 0 到 1 之间的 sigmoid 系数:大的正值近似原样通过,接近零的值被平滑压缩,负值不会像 ReLU 那样全部立刻归零。
| 性质 | ReLU | SiLU | 实际含义 |
|---|---|---|---|
| 负半轴 | 恒为 0 | 保留小的负输出 | 不会硬截断所有负方向信息 |
| 零点附近 | 有折点 | 平滑 | 梯度随输入连续变化 |
| 计算 | 取最大值 | 需要 sigmoid 与乘法 | 理论算子更贵,但训练/推理框架通常提供融合 kernel |
| 门控解释 | 正负阈值 | 输入决定自身通过比例 | 自然适合作为 GLU 的 gate 分支 |
这些性质解释了 SiLU 为什么适合大模型,但不能单独证明它一定优于 ReLU。实际模型效果还取决于初始化、宽度、训练数据和优化设置;现代 LLM 中常见的收益来自 SiLU 与 GLU 门控组成的 SwiGLU 整体。
三、SwiGLU 是 FFN 的门控升维部分
输入 X 同时进入两条线性分支。gate 分支经过 SiLU,value/up 分支保持线性;两者逐元素相乘后,再由 down projection 降回模型维度。
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_proj | d_model × d_ff | d_ff |
up_proj | d_model × d_ff | d_ff |
| 逐元素门控 | 无权重 | d_ff |
down_proj | d_ff × d_model | d_model |
忽略 bias,传统两投影 FFN 若取 d_ff = 4d,参数量约为 2 × d × 4d = 8d²。SwiGLU 有三个矩阵,为保持相近参数量,可令:
因此 d_ff ≈ (8/3)d
实际实现还会把中间维度对齐到适合硬件的整数倍,并可能使用不同的宽度倍率。所以 8/3 是同参数量比较下的基准,不是每个模型必须遵守的常数。
五、一个两维门控算例
假设两条升维分支已经产生 G = [2, -1] 和 U = [3, 4]。SiLU 作用于 gate 分支后约为 [1.762, -0.269],再与 value 分支逐元素相乘:
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 的平滑和负值保留提供了合理直觉,但模型质量收益是架构、宽度和训练设置共同作用的结果。
Llama 等开放实现可以直接核对 FFN;闭源模型若没有论文或代码披露,就无法可靠断言其激活函数与门控细节。
参考资料
- Noam Shazeer, GLU Variants Improve Transformer:比较 ReGLU、GEGLU、SwiGLU 等门控 FFN 变体。
- Attention Is All You Need:原始 Transformer 的 Attention 与位置前馈网络定义。
- LLaMA: Open and Efficient Foundation Language Models:公开说明使用 SwiGLU,并采用约
2/3 × 4d的中间宽度。 - Meta Llama 3 官方实现:FFN 前向计算为
w2(F.silu(w1(x)) * w3(x))。 - OpenAI gpt-oss 官方实现:采用带裁剪等工程调整的 SwiGLU。
评论加载中...