)
什么是 FFNSwiGLU如果说 Attention 负责“信息交换”那么 FFNFeed Forward Network前馈网络负责“信息加工”。在现代大模型LLaMA、Qwen、Gemma、Mistral、DeepSeek 等里Transformer Block 基本都是输入 │ ▼ Attention │ ▼ FFNSwiGLU │ ▼ 输出很多人会把 Attention 当成 Transformer 的核心但实际上模型参数的大头往往在 FFN 里而不是 Attention。在 LLaMA 系列中大约 60%~70% 的参数都在 FFN 中。1. 先看原始 Transformer 的 FFN2017 年《Attention Is All You Need》中的 FFN 非常简单FFN(x)W2(ReLU(W1x)) FFN(x)W_2(ReLU(W_1x))FFN(x)W2(ReLU(W1x))流程x │ ▼ Linear(W1) │ ▼ ReLU │ ▼ Linear(W2) │ ▼ 输出如果模型维度d_model 4096则4096 ↓ 16384 (扩张4倍) ↓ 4096因此 FFN 又叫Expansion → Activation → Compression即扩张 ↓ 非线性变换 ↓ 压缩2. 为什么要改进 FFN研究人员发现ReLU虽然简单但信息利用率不高梯度不够平滑表达能力有限后来出现ReLU ↓ GELU ↓ GLU ↓ GEGLU ↓ SwiGLU2020 年 Noam ShazeerTransformer 原作者之一发表论文GLU Variants Improve Transformer专门研究FFN 中的激活函数能不能换掉结果发现GEGLU SwiGLU效果明显优于ReLU GELU3. 什么是 GLU理解 SwiGLU 前必须先理解 GLU。普通 FFN普通 FFNhReLU(xW1) h ReLU(xW_1)hReLU(xW1)本质上输入 ↓ 激活 ↓ 输出只有一条路。GLUGLUGated Linear Unit增加了一条门控路径GLU(x)(xW)⊗σ(xV) GLU(x) (xW)\otimes \sigma(xV)GLU(x)(xW)⊗σ(xV)其中⊗ \otimes⊗表示逐元素相乘。流程┌────► Linear(V) │ x ────────┤ │ └────► Linear(W) │ ▼ Sigmoid │ ▼ Element-wise *可以理解成Value × Gate即真正的信息 × 通过比例类似水流 × 阀门开度4. SwiGLU 做了什么SwiGLU 把 GLU 中的 Sigmoid 换成了 SwishSiLU。原始 GLUGLU(x)(xW)⊗σ(xV) GLU(x) (xW) \otimes \sigma(xV)GLU(x)(xW)⊗σ(xV)SwiGLUSwiGLU(x)(xV)⊗SiLU(xW) SwiGLU(x) (xV) \otimes SiLU(xW)SwiGLU(x)(xV)⊗SiLU(xW)其中SiLU(z)zσ(z) SiLU(z)z\sigma(z)SiLU(z)zσ(z)5. 为什么叫 SwiGLU因为Swish GLU合起来SwiGLU而Swish ≈ SiLU所以代码里经常看到F.silu(...)实际上就是 SwiGLU 的一部分。6. 现代大模型里的 SwiGLULLaMA 的 FFN不是ydown_proj(silu(up_proj(x)))而是ydown_proj(silu(gate_proj(x))*up_proj(x))对应gate_proj │ ▼ x ─────────────────► SiLU │ ▼ Gate x ──► up_proj ─────► Value Gate * Value │ ▼ down_proj │ ▼ 输出因此你会看到gate_proj up_proj down_proj三个矩阵。而传统 FFN 只有up_proj down_proj两个矩阵。7. 为什么 SwiGLU 更强这是很多人最关心的问题。实际上论文作者自己都承认他们也没有严格理论解释只知道实验效果更好。但从直觉上理解普通 FFNy GELU(Wx)对于所有特征统一处理SwiGLUy Value × GateGate 可以动态决定哪些维度保留 哪些维度抑制 哪些维度放大类似注意力里的权重但是发生在 FFN 内部。因此表达能力更强。8. 参数为什么变成 8/3 倍原始 FFN4096 ↓ 16384 ↓ 4096中间层4d 4d4dSwiGLU 有三组矩阵gate_proj up_proj down_proj如果仍然用4d 4d4d参数会暴涨。于是论文采用83d \frac{8}{3}d38d代替4d 4d4d这样总参数量和原 FFN 基本一致。9. 为什么 LLaMA 的 hidden_dim 是 11008例如dim4096理论上83×409610922 \frac{8}{3}\times4096 1092238×409610922再对齐到256倍数得到11008所以你会看到gate_proj:4096→11008up_proj:4096→11008down_proj:11008→4096这正是 LLaMA 的实现。10. 一句话理解 SwiGLU如果说Attention 让不同Token交流那么FFN 对每个Token进行加工而普通FFN 加工一次SwiGLU 先生成一个“阀门(Gate)” 再决定哪些信息该通过即输出 信息(Value) × 门控(Gate)这相当于给 FFN 增加了一个可学习的信息筛选器因此在几乎相同参数量下通常比 ReLU/GELU FFN 具有更好的表达能力和训练效果。对于学习大模型源码可以记住一个最核心的公式FFNSwiGLU(x)(SiLU(xWg)⊙(xWu))Wd FFN_{SwiGLU}(x) \bigl( SiLU(xW_g) \odot (xW_u) \bigr) W_dFFNSwiGLU(x)(SiLU(xWg)⊙(xWu))Wd对应代码gateF.silu(gate_proj(x))upup_proj(x)hiddengate*up outdown_proj(hidden)这就是今天几乎所有主流 LLMLLaMA、Qwen、Gemma、Mistral、DeepSeek的 FFN 核心实现。