FFN 前馈网络详解:概念、机制与目的
分类: 注意力与Transformer · 难度: 中级 · 关联讲座: L05
FFN 前馈网络详解:概念、机制与目的
本文深入剖析 Transformer 中前馈网络(FFN)的概念定义、核心机制(升维→非线性→降维)、现代变体(GLU/SwiGLU)、三个核心目的(非线性变换、逐位置信息处理、知识存储),以及参数量分析。
1. FFN 是什么?——概念定义
FFN(Feed-Forward Network,前馈网络)是 Transformer 每一层中与 Self-Attention 并列的第二个核心子层。完整的 Transformer Block 结构为:
Block(x)=FFN(Attention(x))
FFN 是一个逐位置(position-wise) 的两层全连接网络——它对序列中的每个位置独立、平行地应用相同的变换,不同位置之间不交换信息。
变量定义:
- x∈Rdmodel = 单个位置的输入向量
- W1∈Rdff×dmodel = 第一层权重(“上投影”)
- W2∈Rdmodel×dff = 第二层权重(“下投影”)
- b1∈Rdff,b2∈Rdmodel = 偏置项
- dff = FFN 隐藏层维度(通常 dff=4⋅dmodel)
2. 核心机制:升维→非线性→降维
标准 FFN(Vaswani et al., 2017):
FFN(x)=W2⋅σ(W1x+b1)+b2
其中 σ 是激活函数(原始论文用 ReLU)。展开为三步:
第 1 步:升维投影(Up-Projection)
h=W1x+b1∈Rdff
将 dmodel 维向量映射到 dff 维(dff=4dmodel),维度扩展 4 倍。
为什么要升维? 低维空间中线性不可分的特征,投影到高维后可能变得线性可分。这与核方法(kernel methods)的思想一致——通过升维获得更强的表达能力。
第 2 步:非线性激活
a=σ(h)
ReLU:σ(z)=max(0,z)。把负值归零,保留正值。
关键性质:ReLU 产生稀疏激活——实验表明,FFN 隐藏层中通常只有 ~10-30% 的神经元被激活(输出非零)。这意味着:
- 每个输入只”使用”了 FFN 容量的一小部分
- 不同输入激活不同的神经元子集 → FFN 像一个稀疏寻址的记忆库
第 3 步:降维投影(Down-Projection)
output=W2a+b2∈Rdmodel
从 dff 维压缩回 dmodel 维,恢复原始维度以传入下一层。
3. 现代 FFN 变体:GLU 家族
GLU 家族(Gated Linear Unit)——现代 LLM 的标准选择:
FFNGLU(x)=W2⋅[σ(Wgatex)⊙(Wupx)]
其中 ⊙ 是逐元素乘法(Hadamard 积),Wgate,Wup∈Rdff×dmodel。
GLU 的关键创新:引入门控机制——σ(Wgatex) 作为”门”,逐元素控制 Wupx 中哪些信息通过。
| 变体 | 激活函数 σ | 使用模型 |
|---|
| SwiGLU | SiLU(z)=z⋅sigmoid(z) | LLaMA, Mistral, Gemma |
| GeGLU | GELU(z)=z⋅Φ(z) | PaLM |
| ReGLU | ReLU(z)=max(0,z) | 部分实验模型 |
参数量对比:
- 标准 FFN:2×dmodel×dff 参数
- GLU FFN:3×dmodel×dff 参数(多了 Wgate)
- 为保持总参数量不变,LLaMA 将 dff 从 4dmodel 调整为 38dmodel≈2.67dmodel
4. FFN 的三个核心目的
目的 1:提供非线性变换能力
Self-Attention 本质上是加权平均——它是关于 Value 向量的线性组合(softmax 权重不依赖 Value 本身)。没有 FFN,堆叠再多层 Attention 仍然只是在做线性混合。
FFN 引入非线性,使得 Transformer 成为通用函数逼近器(universal approximator)。
目的 2:逐位置的信息处理(“思考”阶段)
Transformer 每层的计算可以理解为两个阶段:
- Attention = 收集:从序列中其他位置聚合相关信息(“社交”阶段)
- FFN = 处理:对聚合后的信息进行独立计算和变换(“思考”阶段)
类比:Attention 像开会讨论(收集各方意见),FFN 像会后各自回到工位做具体工作(独立处理)。
目的 3:知识存储(“事实记忆库”)
Geva et al. (2021) 的开创性研究 “Transformer Feed-Forward Layers Are Key-Value Memories” 证明:
FFN(x)=W2⋅ReLU(W1x+b1)=∑i=1dffai⋅vi
其中 ai=ReLU(kiTx+b1,i) 是第 i 个神经元的激活值,vi 是 W2 的第 i 列(输出向量)。
这可以重新解读为:
- W1 的第 i 行 ki = 键(key):定义”什么输入会激活这个神经元”
- W2 的第 i 列 vi = 值(value):定义”激活后输出什么信息”
- FFN 整体 = 键值记忆(key-value memory)
实验证据:
- 编辑 FFN 中特定神经元的权重可以修改模型的事实性知识
- 这是 知识编辑(knowledge editing) 和 模型可解释性 的理论基础
- Meng et al. (2022) 的 ROME 方法正是基于此原理定位和编辑 FFN 中的事实记忆
5. 参数量与计算量分析
对于 dmodel=4096(LLaMA-7B 量级):
| 指标 | 标准 FFN (dff=4d) | SwiGLU FFN (dff=38d) |
|---|
| dff | 16,384 | 10,923 |
| 参数量/层 | 2×4096×16384=134M | 3×4096×10923=134M |
| FLOPs/token/层 | 2×134M=268M | 2×134M=268M |
| 占 Block 参数比例 | ~67% | ~67% |
FFN 占 Transformer 总参数的约 2/3,Self-Attention 只占约 1/3。
6. 数值计算示例
设定:dmodel=3,dff=6
输入向量:x=[0.5,−0.3,0.8]T
第 1 步:h=W1x=[0.10,−0.55,0.95,0.50,0.30,−1.10]T
第 2 步:a=ReLU(h)=[0.10,0,0.95,0.50,0.30,0]T
稀疏激活:6 个神经元中只有 4 个激活(67%),神经元 2 和 6 被关闭。
第 3 步:output=W2a=[−0.02,0.49,0.28]T
Key-Value Memory 解读:W1 的第 3 行作为”键”对输入响应最强(0.95),W2 的第 3 列作为”值”贡献了输出最大分量。
7. 常见误区
- FFN 是 position-wise 的,不同位置完全独立。“全连接”指维度间全连接,不是位置间
- FFN 占 Transformer 约 2/3 参数,是模型容量的主要来源,不是”辅助组件”
- dff=4dmodel 是经验选择,不是理论推导。LLaMA 用 8/3(配合 SwiGLU)
- SwiGLU 不仅换了激活函数,更引入了门控机制(额外 Wgate 矩阵)
- FFN 层数不同功能不同:底层偏通用特征变换,高层偏事实性知识存储
参考文献
- Vaswani et al. (2017). Attention Is All You Need
- Geva et al. (2021). Transformer Feed-Forward Layers Are Key-Value Memories
- Shazeer (2020). GLU Variants Improve Transformer
- Meng et al. (2022). Locating and Editing Factual Associations in GPT (ROME)