编程与 AI14 分钟阅读更新于 2026-08-03

Transformer 编码器为什么先做 Self-Attention,再做 FFN

围绕编码器层结构,解释 Self-Attention 与位置前馈网络的先后分工,以及残差和归一化如何把两者串联起来。

相关工具

一个编码器层其实包含两种不同工作

文中把编码器描述为由 Self-Attention 和 Position-wise Feed Forward Network 两个子层组成。它们都处理同一段序列表示,但解决的问题不同:Self-Attention 负责让位置之间交换信息,FFN 负责在每个位置内部加工已经收集到的特征。

先理解这两个职责,才能看懂为什么它们要按固定顺序放在一起。Self-Attention 先决定应该从哪些位置读取什么,FFN 再把读回来的信息重新组合成更适合下一层使用的表示。

Transformer 编码器先经过自注意力再经过前馈网络的结构图
编码器层的处理顺序

输入表示先经过 Self-Attention,再经过 FFN,两个子层都通过残差和归一化连接。

Self-Attention 先建立位置之间的关系

编码器输入中的每个位置最初只有自己的词嵌入、位置编码和上一层传下来的表示。它还没有充分知道句子中其他词与自己的关系。Self-Attention 通过 Query、Key、Value 计算位置之间的相关性,再把相关 Value 汇总到当前位置。

经过这一步,同一个位置的向量已经融入了一部分前后文信息。它不再只是当前词是什么,还带有当前词和哪些词相关的结果。注意力主要完成跨位置的信息交换。

FFN 接着做逐位置的非线性加工

Self-Attention 输出的是一组包含上下文的序列表示,FFN 随后对每个位置单独处理。典型 FFN 会先把 d_model 维向量投影到更大的中间空间,经过激活函数,再投影回 d_model。

FFN 不直接读取其他位置,也不决定当前应该关注哪个词。它使用注意力已经汇总到当前位置的内容,进行非线性特征组合。可以把 Self-Attention 看成收集信息,把 FFN 看成在当前位置消化和重组信息。

Transformer Self-Attention 和 FFN 分工对比图
Attention 与 FFN 的职责分工

Self-Attention 负责跨位置交换信息,FFN 负责当前位置内部的特征变换。

为什么不是先 FFN 再 Attention

如果先进行 FFN,当前位置只能加工自己当时已有的表示,尚未获得其他词传来的上下文。之后虽然仍可以通过注意力读取其他位置,但跨位置信息和本地非线性加工的顺序就改变了。

经典 Transformer 选择先做注意力,让每个位置先形成上下文感知的表示,再交给 FFN 继续加工。其他模型可以采用不同的层顺序或归一化方式,但那会形成不同的结构变体。

残差连接让两个子层都能学习增量

Self-Attention 和 FFN 的输出通常不会直接替代输入,而是通过残差连接加回原表示。这样,注意力子层可以学习需要补充的跨位置信息,FFN 可以学习需要补充的局部特征,原有表示则沿着残差路径继续保留。

残差让两个子层的职责更像是在已有表示上做更新,而不是每次重新生成完整向量。LayerNorm 则帮助这些更新维持较稳定的数值尺度,使多个编码器层能够继续堆叠。

同一个顺序在多层编码器中反复出现

一层编码器完成一次建立关系、加工特征的循环,输出交给下一层。下一层面对的是更丰富的上下文表示,仍然先通过自注意力重新查看位置关系,再通过 FFN 做位置内部的非线性变换。

不同层参数不同,因此每层可以在同样的顺序下承担不同深度的加工。底层可能更关注词面和邻近关系,上层则可能学习句法、指代和语义联系。

Transformer 注意力输出进入位置前馈网络继续加工的示意图
注意力之后的 FFN 加工

每层先跨位置交换信息,再对每个位置做非线性加工,随后进入下一层。

解码器为什么也保留相似的分工

解码器比编码器多了掩码自注意力和交叉注意力,但基本思想仍然相似:先通过注意力读取需要的上下文,再由 FFN 对当前位置进行非线性加工。区别是解码器要先整理目标前缀,再读取编码器源记忆。

FFN 始终主要负责逐位置特征变换,真正改变信息来源的是前面的自注意力、掩码自注意力或交叉注意力。

把一个编码器层记成两句话

第一句话是先看别人:Self-Attention 让当前位置根据 Query、Key、Value 从其他位置读取相关信息。第二句话是再处理自己:FFN 把已经融合上下文的当前位置表示做非线性变换。

两者通过残差和归一化连接,并在多层结构中重复。这样,Transformer 既能让词语之间建立全局联系,又能增强每个位置本身的表达能力。

常见问题

FFN 会不会读取其他位置的信息?

经典 Transformer 的位置 FFN 对每个位置独立计算,不直接读取其他位置。跨位置的信息主要由 Self-Attention 或交叉注意力提供。

Self-Attention 和 FFN 哪个更重要?

两者职责不同,不能简单替代。Self-Attention 建立位置之间的联系,FFN 加工每个位置的特征,完整表示需要两者配合。

所有 Transformer 都必须先 Attention 再 FFN 吗?

经典结构采用这个顺序,但不同模型可能调整归一化位置或子层组织方式。阅读具体结构时,应以模型定义为准。