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

Transformer 编码器和解码器为什么看到的信息不同

围绕 Encoder、Decoder 和 Encoder-Decoder Attention 的描述,解释源序列双向可见、目标序列因果可见以及两侧信息如何连接。

相关工具

两侧处理的是两种不同的序列

Transformer 的 Encoder-Decoder 架构中,编码器处理源序列,解码器生成目标序列。源序列通常在开始时已经完整存在,目标序列则要从起始标记开始逐步产生。两侧的输入状态不同,注意力可见范围自然也不同。

文中把编码器看成一组负责理解输入句子的层,把解码器看成一组负责生成输出句子的层。编码器需要综合源句的前后文,解码器则必须遵守生成顺序,同时还要从编码器输出中读取源信息。

Transformer 编码器和解码器处理不同序列的结构示意图
编码器与解码器的注意力范围

编码器理解完整源序列,解码器处理目标前缀并逐步生成目标序列。

编码器为什么可以双向查看源序列

源句作为输入时,句子中的词元都已经给定。编码器处理某个位置,可以参考它前面的词,也可以参考它后面的词,因为这些内容都属于需要理解的源信息。这样的双向自注意力有助于判断词义、指代和句子结构。

例如,一个词的含义可能要结合后面的补充成分才能确定;如果编码器只能看左侧,就会错过已经存在于输入中的信息。编码器自注意力通常只需要处理 Padding Mask,不需要像解码器一样屏蔽未来。

解码器为什么不能看见未来目标词

目标序列不是一开始就全部知道的。生成第一个词时,模型只有起始标记;生成第二个词时,模型只能使用已经生成的第一个词。如果训练时让当前位置直接看到后面的真实答案,模型就会获得推理时不存在的线索。

因此,解码器自注意力使用因果掩码,当前位置可以查看自己和左侧前缀,右侧未来区域被遮住。训练时多个位置仍然可以并行计算,但每个位置看到的内容都符合从左到右的生成条件。

Transformer 解码器因果掩码限制未来可见范围的示意图
解码器的因果可见范围

目标位置只能查看当前位置和过去位置,未来目标词被掩码遮挡。

解码器还需要读取源序列

只看目标前缀还不够。翻译、摘要或基于输入回答时,解码器还要知道源序列中哪些内容与当前目标位置相关。交叉注意力提供了这条信息通道:Query 来自解码器,Key 和 Value 来自编码器输出。

交叉注意力并不是让解码器看到目标未来,而是让目标端查询已经编码好的源记忆。它通常需要屏蔽源序列中的 Padding 位置,但不使用目标自注意力那种未来三角掩码。目标端的因果约束和源端的填充约束是两类不同的边界。

Transformer 编码器输出通过交叉注意力连接解码器的示意图
编码器到解码器的信息桥梁

编码器输出作为源记忆,解码器通过交叉注意力查询其中与当前目标位置相关的内容。

训练时两侧如何同时工作

训练时,源序列可以完整送入编码器,编码器用双向自注意力形成源记忆。右移后的目标序列送入解码器,解码器自注意力用因果掩码限制目标可见范围,交叉注意力则读取完整源记忆。多个目标位置可以在同一次前向计算中完成。

因此,训练阶段存在两种不同的并行关系:编码器可以同时处理源序列的多个位置,解码器可以在掩码约束下同时预测多个目标位置。并行不代表解码器可以看到目标未来,掩码仍然保持了因果结构。

推理时可见范围如何变化

推理从起始标记或用户给出的前缀开始。随着词元逐步生成,目标端可见的历史前缀变长,但未来位置仍然不存在。编码器源记忆通常可以保持不变,解码器每一轮用新的目标表示查询它。

因此,推理阶段的源端是固定记忆,目标端是逐步增长的前缀。每轮交叉注意力都可能重新分配对源序列的关注,因为当前目标 Query 会随着已经生成的内容变化。

两种自注意力不能随意互换

如果编码器也遮住未来,源句中已经存在的后文信息就无法被充分利用;如果解码器取消因果掩码,训练时就可能读取答案,生成时却无法复现同样条件;如果交叉注意力误用目标端的 Key 和 Value,就失去了读取源记忆的作用。

三类注意力的差别可以从输入来源和可见范围两个角度判断:编码器自注意力连接源序列内部,解码器自注意力连接目标前缀内部,交叉注意力连接目标查询与源记忆。

把 Encoder-Decoder 结构串起来

完整链路是:源序列经过编码器双向理解,形成每个源位置的上下文记忆;目标前缀经过掩码自注意力整理历史;交叉注意力从源记忆中取回当前需要的信息;FFN 和残差继续加工,输出层再预测下一个目标词。

编码器的自由查看保证源句理解完整,解码器的因果限制保证目标生成诚实,交叉注意力则把两侧连接起来。三者共同构成 Encoder-Decoder 结构,而不是三种可以随意替换的注意力模块。

常见问题

编码器为什么不需要因果掩码?

源序列在输入时已经完整给定,编码器可以同时利用前后文来理解每个位置,因此通常只需要屏蔽 Padding 位置。

交叉注意力会让解码器看到目标未来吗?

不会。交叉注意力读取的是编码器源记忆,目标端未来约束由解码器自注意力中的因果掩码负责。

解码器能看到完整源句是不是一种作弊?

不是。源句是任务输入,生成目标时本来就应该使用它。需要被遮挡的是目标序列中尚未生成的未来词。