第07章:FFN——Transformer的”知识存储”藏在哪?
论文链接:Attention Is All You Need (Vaswani et al., NIPS 2017) 本章对应:Section 3.3, Table 3 row © 由于掘金格式识别错误,所以有些公式会显示错误或者消失,看完整内容可移步其他平台或GitHub,github.com/Yunzenn/blo…
核心困惑
FFN在Transformer中扮演什么角色?为什么dff=4×dmodel?
前面六章讲了Attention、残差连接、位置编码,但Transformer的每一层还有一个关键组件:Feed-Forward Network (FFN)。
FFN的结构很简单:
FFN(x)=max(0,xW1+b1)W2+b2
两层全连接网络,中间用ReLU激活。但这个简单的结构占据了Transformer 2/3的参数量。
原论文设置dff=2048=4×dmodel,为什么是4倍?FFN到底在做什么?
前置知识补给站
1. 全连接层(Fully Connected Layer)
全连接层是最基本的神经网络层:
y=Wx+b
参数量:din×dout+dout
2. ReLU激活函数
ReLU(x)=max(0,x)
特点:
- 非线性
- 计算简单
- 梯度不饱和(x>0时梯度为1)
3. Position-wise的含义
“Position-wise”是指FFN对每个位置独立应用,不同位置之间不共享信息。
数学表达:
每个位置的计算是独立的。
论文精读:FFN的设计
原论文的公式
Section 3.3:
“In addition to attention sub-layers, each of the layers in our encoder and decoder contains a fully connected feed-forward network, which is applied to each position separately and identically. This consists of two linear transformations with a ReLU activation in between.”
FFN公式:
参数设置:
- :输入和输出维度
- :中间层维度
FFN的参数量
单层FFN的参数量:
- :
- :
- :
- :
- 总计:M参数
对比Multi-Head Attention的参数量:
- :
- 总计:M参数
结论:FFN的参数量是Attention的2倍。
关键点:FFN占据了Transformer 2/3的参数量。
推导:
为什么是Position-wise?
Position-wise的含义:
- FFN对每个位置独立应用
- 不同位置之间不共享信息
- 相当于kernel size=1的1D卷积
为什么这样设计:
- Attention已经负责位置之间的信息交互
- FFN负责对每个位置的表示进行非线性变换
- 分工明确:Attention做”通信”,FFN做”计算”
第一性原理推导:FFN作为Key-Value Memory
视角1:非线性变换
最直观的理解:FFN提供非线性变换能力。
Attention是线性的(加权求和),如果没有FFN,整个Transformer就是线性模型。
数学表达:
这是线性的(softmax的输入是线性的,输出是加权求和)。
FFN的ReLU提供了非线性:
为什么非线性是必须的:如果没有ReLU,两层全连接等价于一层:
仍然是一个线性变换。整个Transformer就变成线性模型,表达能力大幅下降。
视角2:Key-Value Memory(Geva et al., EMNLP 2021)
核心洞察:FFN可以看作是一个Key-Value存储系统。
数学推导:
将FFN展开:
为什么的列是key:是矩阵,的第个分量是输入与第列的内积。因此的每一列可以理解为一个”key”——它定义了输入匹配什么模式时该神经元会被激活。
设的第列为,的第行为,则:
直观理解:
- :第个”key”(查询模式)
- :输入与key的匹配度
- :激活强度
- :第个”value”(存储的知识)
- 输出:所有被激活的value的加权和
类比:
- Attention:从输入序列中检索信息
- FFN:从参数中检索知识
视角3:专家系统
每个神经元可以看作一个”专家”:
- 当输入匹配某个模式时,对应的专家被激活
- 不同专家存储不同的知识
- 最终输出是所有激活专家的组合
消融实验解读:Table 3 row ©
原论文Table 3 row ©:同时变化了层数、模型维度和FFN维度。
关键数据(的变化):
| d_{ff} | PPL (dev) | BLEU (dev) | 解读 |
|---|---|---|---|
| 1024 | 5.12 | 25.4 | 2 \times d_{model},效果不如base |
| 2048 (base) | 4.92 | 25.8 | 原论文选择,4 \times d_{model} |
| 4096 | 4.75 | 26.2 | 8 \times d_{model},效果最好 |
关键发现:
- ()时效果最好,PPL=4.75,BLEU=26.2
- 原论文选择()是在性能和参数量之间的权衡
- 更大的提升效果,但参数量也显著增加(4096时参数量90M vs base的65M)
- 这说明不是理论最优,而是经验选择
2026年的批判性视角
1. FFN的作用直到2021年才被理论化
原论文的局限:
- 只说FFN是”fully connected feed-forward network”
- 没有深入分析FFN的作用
- 这个比例是经验选择,缺乏理论依据
后续研究的发现(Geva et al., EMNLP 2021):
- FFN作为Key-Value Memory的理论
- 从理论上解释为什么FFN存储知识
2. GeLU替代ReLU
原论文用ReLU:
现代模型用GeLU(Gaussian Error Linear Unit):
其中是标准正态分布的累积分布函数。
实践中常用近似公式:
为什么GeLU更好:
- 更平滑(可微)
- 在负值区域有小的梯度(不是完全截断)
- BERT、GPT等模型使用
3. SwiGLU:GLU的变体
GLU(Gated Linear Unit):
SwiGLU(Shazeer, 2020):
其中。
优势:
- 效果比ReLU和GeLU更好
- LLaMA、PaLM等模型使用
4. MoE:稀疏FFN
标准FFN的问题:
- 所有神经元都参与计算
- 计算量大
MoE(Mixture of Experts):
- 将FFN分成多个”专家”
- 每次只激活部分专家
- 用更少的计算量撬动更大的参数量
详见第10章。
FFN在Encoder和Decoder中的位置
添加图片注释,不超过 140 字(可选)
关键点:
- FFN在每个Attention子层之后
- Encoder每层有1个FFN
- Decoder每层有1个FFN
- FFN占据了模型参数的2/3
面试追问清单
⭐ 基础必会
- FFN的公式是什么?
- 提示:两层全连接,中间ReLU
- 为什么FFN是Position-wise的?
- 提示:对每个位置独立应用
- FFN的参数量占Transformer的多少?
- 提示:约2/3
⭐⭐ 进阶思考
- 为什么?
- 提示:经验选择,Table 3显示可能更好
- FFN在Transformer中扮演什么角色?
- 提示:非线性变换、Key-Value Memory
- 如果去掉FFN,只保留Attention,会怎样?
- 提示:模型变成线性的,表达能力大幅下降
⭐⭐⭐ 专家领域
- 如何从Key-Value Memory的角度理解FFN?
- 提示:的列是key,的行是value
- GeLU和ReLU有什么区别?为什么现代模型用GeLU?
- 提示:平滑性、负值区域的梯度
- 如何用MoE来扩展FFN的容量?
- 提示:稀疏激活、专家路由
下一章预告:第08章将深入拆解训练技巧,回答”为什么Transformer需要学习率warmup?Label Smoothing为什么有效?”
论文原文传送门:
- Transformer原论文:proceedings.neurips.cc/paper_files…
- 官方代码:github.com/tensorflow/…