Transformer 论文解读:前馈神经网络(FFN)详解
在深入理解 Transformer 架构时,除了自注意力机制(Self-Attention),前馈神经网络(Feed-Forward Networks, FFN)同样是核心组件之一。尽管论文中对 FFN 的描述相对简洁,但其对模型特征提取能力的影响至关重要。
1. FFN 的基本定义
根据原始论文第 3.3 节,Encoder 和 Decoder 的每一层都包含一个全连接前馈网络(Fully Connected Feed-Forward Network)。该网络独立且相同地应用于每个位置(Position-wise)。
其结构由两个线性变换组成,中间通过 ReLU 激活函数连接。公式如下:
FFN(x) = max(0, xW1 + b1)W2 + b2
虽然不同位置的线性变换参数是相同的,但不同层之间的参数是不同的。从另一个角度看,这也可以描述为两个卷积核大小为 1 的卷积操作。
2. 结构细节与维度变化
FFN 层的输入和输出维度通常保持一致,即 d_model(默认为 512)。然而,其内部隐藏层的维度 d_ff 通常更大(默认为 2048)。
2.1 维度变换流程
- 升维:第一个全连接层将输入向量从 512 维映射到 2048 维。
- 非线性激活:应用 ReLU 函数,引入非线性因素。
- 降维:第二个全连接层将 2048 维映射回 512 维。
这种'升维 - 激活 - 降维'的结构设计,使得模型能够在高维空间中进行更丰富的特征表达,然后再压缩回原始维度,从而保证后续层(如 Attention 或 LayerNorm)的输入维度一致性。

3. 为什么需要 FFN?
既然输入输出维度一致,为何不直接使用恒等映射?FFN 的存在主要解决了以下问题:
3.1 引入非线性
如果只有线性变换(FC 层),无论堆叠多少层,整个网络仍然等价于一个单层线性变换。ReLU 激活函数的引入打破了线性限制,使模型能够拟合复杂的非线性关系,捕捉数据中更深层次的特征模式。
3.2 增强特征表达能力
通过将低维特征映射到高维隐空间(512 -> 2048),模型获得了更多的计算自由度。在高维空间中,特征可以更加稀疏地被表示,经过再加工后,输出的 512 维特征比输入的 512 维特征包含了更丰富、更抽象的信息。
3.3 并行计算优势
FFN 层中的计算是完全并行的,不受时间步长的依赖影响。这与 RNN 形成鲜明对比,RNN 必须按顺序处理序列,而 Transformer 利用 FFN 实现了高效的 GPU 并行加速,显著提升了训练和推理效率。

4. PyTorch 代码实现
为了更直观地理解 FFN 的实现,以下是基于 PyTorch 的简单示例:
import torch
import torch.nn as nn
class PositionwiseFeedForward(nn.Module):
def __init__(self, d_model, d_ff, dropout=0.1):
super().__init__()
self.linear1 = nn.Linear(d_model, d_ff)
self.dropout = nn.Dropout(dropout)
self.linear2 = nn.Linear(d_ff, d_model)
def forward(self, x):
x = self.linear1(x)
x = torch.relu(x)
x = self.dropout(x)
x = self.linear2(x)
return x
model = PositionwiseFeedForward(d_model=512, d_ff=2048)
input_tensor = torch.randn(32, 10, 512)
output = model(input_tensor)
print(output.shape)
5. FFN 在 Transformer 块中的位置
在实际的 Transformer 层结构中,FFN 并不是孤立存在的。它通常位于残差连接(Residual Connection)和层归一化(Layer Normalization)之间。标准的 Encoder Block 结构如下:
- Multi-Head Attention
- Add & Norm (Residual + LayerNorm)
- FFN
- Add & Norm (Residual + LayerNorm)
这种结构确保了梯度能够顺畅地反向传播,防止了深层网络中的梯度消失问题,同时也稳定了训练过程。

6. 总结
FFN 层作为 Transformer 架构中的关键组件,虽然结构简单,但作用不可替代:
- 非线性映射:通过 ReLU 激活函数打破线性限制。
- 特征扩展:通过维度扩张(512->2048)提升特征表达能力。
- 并行效率:支持高效的大规模并行计算。
- 防止退化:避免模型退化为简单的线性模型。
理解 FFN 的工作原理,有助于更好地调整超参数(如 d_ff 的大小)以及优化模型性能。在未来的变体模型(如 BERT、ViT)中,FFN 的具体实现可能有所调整(例如使用 GELU 激活函数),但其核心设计理念依然保持不变。