FFN 前馈网络详解:概念、机制与目的

分类: 注意力与Transformer · 难度: 中级 · 关联讲座: L05

FFN 前馈网络详解:概念、机制与目的

本文深入剖析 Transformer 中前馈网络(FFN)的概念定义、核心机制(升维→非线性→降维)、现代变体(GLU/SwiGLU)、三个核心目的(非线性变换、逐位置信息处理、知识存储),以及参数量分析。


1. FFN 是什么?——概念定义

FFN(Feed-Forward Network,前馈网络)是 Transformer 每一层中与 Self-Attention 并列的第二个核心子层。完整的 Transformer Block 结构为:

Block(x)=FFN(Attention(x))\text{Block}(x) = \text{FFN}(\text{Attention}(x))

FFN 是一个逐位置(position-wise) 的两层全连接网络——它对序列中的每个位置独立、平行地应用相同的变换,不同位置之间不交换信息

变量定义

  • xRdmodelx \in \mathbb{R}^{d_\text{model}} = 单个位置的输入向量
  • W1Rdff×dmodelW_1 \in \mathbb{R}^{d_{ff} \times d_\text{model}} = 第一层权重(“上投影”)
  • W2Rdmodel×dffW_2 \in \mathbb{R}^{d_\text{model} \times d_{ff}} = 第二层权重(“下投影”)
  • b1Rdffb_1 \in \mathbb{R}^{d_{ff}}b2Rdmodelb_2 \in \mathbb{R}^{d_\text{model}} = 偏置项
  • dffd_{ff} = FFN 隐藏层维度(通常 dff=4dmodeld_{ff} = 4 \cdot d_\text{model}

2. 核心机制:升维→非线性→降维

标准 FFN(Vaswani et al., 2017)

FFN(x)=W2σ(W1x+b1)+b2\text{FFN}(x) = W_2 \cdot \sigma(W_1 x + b_1) + b_2

其中 σ\sigma 是激活函数(原始论文用 ReLU)。展开为三步:

第 1 步:升维投影(Up-Projection)

h=W1x+b1Rdffh = W_1 x + b_1 \in \mathbb{R}^{d_{ff}}

dmodeld_\text{model} 维向量映射到 dffd_{ff} 维(dff=4dmodeld_{ff} = 4d_\text{model}),维度扩展 4 倍

为什么要升维? 低维空间中线性不可分的特征,投影到高维后可能变得线性可分。这与核方法(kernel methods)的思想一致——通过升维获得更强的表达能力。

第 2 步:非线性激活

a=σ(h)a = \sigma(h)

ReLU:σ(z)=max(0,z)\sigma(z) = \max(0, z)。把负值归零,保留正值。

关键性质:ReLU 产生稀疏激活——实验表明,FFN 隐藏层中通常只有 ~10-30% 的神经元被激活(输出非零)。这意味着:

  • 每个输入只”使用”了 FFN 容量的一小部分
  • 不同输入激活不同的神经元子集 → FFN 像一个稀疏寻址的记忆库

第 3 步:降维投影(Down-Projection)

output=W2a+b2Rdmodel\text{output} = W_2 a + b_2 \in \mathbb{R}^{d_\text{model}}

dffd_{ff} 维压缩回 dmodeld_\text{model} 维,恢复原始维度以传入下一层。


3. 现代 FFN 变体:GLU 家族

GLU 家族(Gated Linear Unit)——现代 LLM 的标准选择:

FFNGLU(x)=W2[σ(Wgatex)(Wupx)]\text{FFN}_{\text{GLU}}(x) = W_2 \cdot \left[\sigma(W_{\text{gate}} x) \odot (W_{\text{up}} x)\right]

其中 \odot 是逐元素乘法(Hadamard 积),Wgate,WupRdff×dmodelW_{\text{gate}}, W_{\text{up}} \in \mathbb{R}^{d_{ff} \times d_\text{model}}

GLU 的关键创新:引入门控机制——σ(Wgatex)\sigma(W_{\text{gate}} x) 作为”门”,逐元素控制 WupxW_{\text{up}} x 中哪些信息通过。

变体激活函数 σ\sigma使用模型
SwiGLUSiLU(z)=zsigmoid(z)\text{SiLU}(z) = z \cdot \text{sigmoid}(z)LLaMA, Mistral, Gemma
GeGLUGELU(z)=zΦ(z)\text{GELU}(z) = z \cdot \Phi(z)PaLM
ReGLUReLU(z)=max(0,z)\text{ReLU}(z) = \max(0, z)部分实验模型

参数量对比

  • 标准 FFN:2×dmodel×dff2 \times d_\text{model} \times d_{ff} 参数
  • GLU FFN:3×dmodel×dff3 \times d_\text{model} \times d_{ff} 参数(多了 WgateW_{\text{gate}}
  • 为保持总参数量不变,LLaMA 将 dffd_{ff}4dmodel4d_\text{model} 调整为 83dmodel2.67dmodel\frac{8}{3} d_\text{model} \approx 2.67 d_\text{model}

4. FFN 的三个核心目的

目的 1:提供非线性变换能力

Self-Attention 本质上是加权平均——它是关于 Value 向量的线性组合(softmax 权重不依赖 Value 本身)。没有 FFN,堆叠再多层 Attention 仍然只是在做线性混合。

FFN 引入非线性,使得 Transformer 成为通用函数逼近器(universal approximator)。

目的 2:逐位置的信息处理(“思考”阶段)

Transformer 每层的计算可以理解为两个阶段:

  1. Attention = 收集:从序列中其他位置聚合相关信息(“社交”阶段)
  2. FFN = 处理:对聚合后的信息进行独立计算和变换(“思考”阶段)

类比:Attention 像开会讨论(收集各方意见),FFN 像会后各自回到工位做具体工作(独立处理)。

目的 3:知识存储(“事实记忆库”)

Geva et al. (2021) 的开创性研究 “Transformer Feed-Forward Layers Are Key-Value Memories” 证明:

FFN(x)=W2ReLU(W1x+b1)=i=1dffaivi\text{FFN}(x) = W_2 \cdot \text{ReLU}(W_1 x + b_1) = \sum_{i=1}^{d_{ff}} a_i \cdot v_i

其中 ai=ReLU(kiTx+b1,i)a_i = \text{ReLU}(k_i^T x + b_{1,i}) 是第 ii 个神经元的激活值,viv_iW2W_2 的第 ii 列(输出向量)。

这可以重新解读为:

  • W1W_1 的第 iikik_i = 键(key):定义”什么输入会激活这个神经元”
  • W2W_2 的第 iiviv_i = 值(value):定义”激活后输出什么信息”
  • FFN 整体 = 键值记忆(key-value memory)

实验证据

  • 编辑 FFN 中特定神经元的权重可以修改模型的事实性知识
  • 这是 知识编辑(knowledge editing)模型可解释性 的理论基础
  • Meng et al. (2022) 的 ROME 方法正是基于此原理定位和编辑 FFN 中的事实记忆

5. 参数量与计算量分析

对于 dmodel=4096d_\text{model} = 4096(LLaMA-7B 量级):

指标标准 FFN (dff=4dd_{ff}=4d)SwiGLU FFN (dff=83dd_{ff}=\frac{8}{3}d)
dffd_{ff}16,38410,923
参数量/层2×4096×16384=134M2 \times 4096 \times 16384 = 134\text{M}3×4096×10923=134M3 \times 4096 \times 10923 = 134\text{M}
FLOPs/token/层2×134M=268M2 \times 134\text{M} = 268\text{M}2×134M=268M2 \times 134\text{M} = 268\text{M}
占 Block 参数比例~67%~67%

FFN 占 Transformer 总参数的约 2/3,Self-Attention 只占约 1/3。


6. 数值计算示例

设定dmodel=3d_\text{model} = 3dff=6d_{ff} = 6

输入向量:x=[0.5,0.3,0.8]Tx = [0.5, -0.3, 0.8]^T

第 1 步h=W1x=[0.10,0.55,0.95,0.50,0.30,1.10]Th = W_1 x = [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]Ta = \text{ReLU}(h) = [0.10, \mathbf{0}, 0.95, 0.50, 0.30, \mathbf{0}]^T

稀疏激活:6 个神经元中只有 4 个激活(67%),神经元 2 和 6 被关闭。

第 3 步output=W2a=[0.02,0.49,0.28]T\text{output} = W_2 a = [-0.02, 0.49, 0.28]^T

Key-Value Memory 解读W1W_1 的第 3 行作为”键”对输入响应最强(0.950.95),W2W_2 的第 3 列作为”值”贡献了输出最大分量。


7. 常见误区

  1. FFN 是 position-wise 的,不同位置完全独立。“全连接”指维度间全连接,不是位置间
  2. FFN 占 Transformer 约 2/3 参数,是模型容量的主要来源,不是”辅助组件”
  3. dff=4dmodeld_{ff} = 4d_\text{model} 是经验选择,不是理论推导。LLaMA 用 8/38/3(配合 SwiGLU)
  4. SwiGLU 不仅换了激活函数,更引入了门控机制(额外 WgateW_{\text{gate}} 矩阵)
  5. 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)