641 字
3 分钟
Trasformer-OtherPartsInEncoder-FFN
2026-06-28
无标签

这里讲解码器的前馈网络(Feed Forward Network,FFN),它是 Transformer 编码器和解码器中每个子层的一个重要组成部分。也是 Transformer block 中的第二个子层(第一个子层是多头注意力)。

alt text

逐位置#

在transformer中,前馈网络是逐位置(position-wise)的,也就是说,它对每个位置的表示独立地应用 相同 的前馈网络。

公式#

假设输入序列的表示为 XRn,dX\in\mathbb{R}^{n, d},其中 nn 是序列长度,dd 是特征维度

一个标准的FFN包含两个线性层(Linear Layers),中间夹一个非线性激活函数(原始Transformer用ReLU,现代GPT/ViT多用GELU)。

FFN(X)=max(0,XW1+b1)W2+b2forxiX,xiR1,d,FFN(xi)=max(0,xiW1+b1)W2+b2FFN(X) = \max(0, XW_1 + \mathbf{b_1})W_2 + \mathbf{b_2}\\[1ex] \text{for} \mathbf{x}_i\in X,\mathbf{x}_i\in\mathbb{R}^{1, d}, \\ FFN(\mathbf{x}_i) = \max(0, \mathbf{x}_iW_1 + \mathbf{b_1})W_2 + \mathbf{b_2}

从下面的公式可以看出,FFN对每个位置的向量 xi\mathbf{x}_i 都是独立处理的,不涉及其他位置的信息。而且参数矩阵 W1,W2W_1, W_2 和偏置向量 b1,b2\mathbf{b_1}, \mathbf{b_2} 在所有位置共享。

注意参数矩阵的维度

  • W1Rd,dffW_1\in\mathbb{R}^{d, d_{ff}}b1Rdff\mathbf{b_1}\in\mathbb{R}^{d_{ff}}
  • W2Rdff,dW_2\in\mathbb{R}^{d_{ff}, d}b2Rd\mathbf{b_2}\in\mathbb{R}^{d}

dffd_{ff} 是前馈网络的隐藏层维度,通常比 dd 大很多(例如 dff=4dd_{ff}=4d)。

为什么需要FFN#

注意力本质上是“线性组合”:多头注意力做的事情本质上是加权求和线性组合)。如果不加FFN,把多个注意力层堆叠起来,数学上等价于一个线性变换(因为线性变换的复合还是线性变换)。

FFN提供“非线性”:扩宽后的FFN + 激活函数,给了模型独立于注意力之外的强大非线性表达能力。它把每个位置的向量先“投影”到一个高维空间(4倍宽),在这个空间里做非线性变换(GELU/ReLU),再投影回原来的维度。

至于为什么要扩宽4倍,应该是为了有足够的“神经元储备”去挖掘特征组合,说白了就是堆参数。

CNN中的1x1卷积和FFN的相似#

在CNN中,1×1 卷积的作用是跨通道混合信息(即只混合特征维度 c,不混合空间维度 (H,W)。

在ViT中,FFN也是只混合特征维度 d , 完全不混合序列维度 n

多头注意力负责混合“空间/序列”信息(类似CNN的大卷积核),而FFN负责混合“通道/特征”信息(类似 CNN的1×1 卷积)。这种“空间-通道”交替处理的范式,是视觉模型(无论是CNN还是Transformer)的共同底层逻辑。

Trasformer-OtherPartsInEncoder-FFN
https://biscuit0613.github.io/posts/ml/trasformer-otherpartsinencoder-ffn/
作者
Biscuit
发布于
2026-06-28
许可协议
CC BY-NC-SA 4.0
Trasformer-编码器的其他部分:Add&Norm
Trasformer-ViT视觉Transformer