Transformer 编码器输出如何被解码器读取:源序列记忆与交叉注意力
解释编码器如何形成源序列记忆,以及解码器怎样通过交叉注意力逐步读取这些信息。
相关工具
编码器和解码器不是各自完成一半翻译
在 Transformer 的 Encoder-Decoder 结构中,编码器和解码器承担的任务不同,但它们并不是互相独立的两套网络。编码器先读取完整的源序列,把每个位置变成包含上下文的表示;解码器再根据已经生成的目标前缀,从这些表示中寻找当前需要的源信息。
文中把编码器最后一层的输出看成一组可以被解码器使用的 Key 和 Value。它们不是简单复制的源词,而是经过多层自注意力和前馈网络加工后的源序列记忆。解码器的每个目标位置都可以对这组记忆提出不同的问题。

源序列经过嵌入、位置编码和多层编码器后,形成供解码器读取的上下文表示。
编码器输出保存了什么
编码器底层先接收词嵌入与位置编码相加后的向量。经过自注意力后,每个位置不再只表示当前词,而是融入了句子中其他位置的信息;再经过位置前馈网络,表示得到进一步加工。多层编码器重复这个过程,让源序列的词义、顺序和相互关系逐步沉淀下来。
所以,编码器输出可以称为源序列记忆,但它不是一个只有一个摘要向量的记忆库。源句中的每个位置通常都有一条表示,解码器可以对这些位置分配不同的注意力权重。源句中哪些内容和当前目标位置相关,交叉注意力会在生成过程中动态选择。
如果源序列中有填充位置,编码器输出仍然可能保留对应的张量位置,但后续交叉注意力需要用 Padding Mask 忽略它们。记忆的形状可以统一,空位却不应该参与语义读取。
交叉注意力中的 Q、K、V 分别来自哪里
交叉注意力最容易混淆的地方,是三组向量并不来自同一侧。Query 来自解码器当前子层的表示,代表目标端正在寻找什么;Key 和 Value 来自编码器输出,代表源序列记忆中有哪些可被匹配、可被取回的内容。
计算时,解码器的 Query 会与每个源位置的 Key 比较相关性,得到一组注意力分数;这些分数经过掩码处理和 Softmax 后,作为权重汇总源位置的 Value。于是,当前目标位置可以从源句中取回与自己最相关的内容。
这和解码器自注意力的区别很清楚:自注意力的 Query、Key、Value 都来自目标侧,负责整理目标前缀;交叉注意力把目标端的问题和源端的记忆接起来,负责完成两套序列之间的信息交换。

Query 来自解码器,Key 和 Value 来自编码器输出,三者共同完成源目标信息匹配。
为什么每个目标位置都可能关注不同源位置
翻译或摘要不是把源句整体复制到目标句,而是目标序列中的不同位置需要不同的源信息。生成主语时,模型可能更关注源句中的人物;生成动作时,可能转向动词;生成补充成分时,又需要回看时间、地点或对象。
交叉注意力允许这种关注随目标位置改变。第一个目标位置形成的 Query 与第二个目标位置不同,因此它们和源序列各位置的匹配分数也不同。注意力图中的高权重区域可以看成当前目标位置与源序列之间的一种软对齐,但它不一定是一对一的硬对应。

目标端不同位置可以从源序列的不同区域读取信息,形成动态的软对齐。
多层结构如何传递这组记忆
经典 Transformer 会堆叠多层编码器和多层解码器。编码器的最终输出会作为解码器各层交叉注意力的 Key 和 Value 使用,而不是只供最底层解码器读取。这样,每一层解码器都能在自己的目标表示基础上重新查询源序列。
解码器第一层可能先建立较粗的源目标联系,后续层则在更丰富的目标上下文和已融合的源信息上继续加工。残差连接让每个交叉注意力子层可以在原有表示上补充信息,LayerNorm 帮助不同层之间保持稳定的数值尺度。
这里的“多层”不是把源句复制很多份,而是同一组编码器输出被不同层的参数反复读取。每个解码器层有自己的 Query 投影,也可以有自己的 Key、Value 投影,因此同一源记忆能够被不同层从不同角度理解。
训练和推理时读取源记忆有什么区别
训练阶段,编码器可以先完整处理源序列,解码器则在因果掩码下同时计算多个目标位置。每个目标位置都能读取完整的源序列记忆,但不能读取目标端未来内容。这样,源信息的读取可以并行进行,目标生成的顺序约束仍然保留。
推理阶段,源序列通常只需编码一次,之后每生成一个目标词,就用新的目标前缀查询同一组源记忆。随着目标前缀变长,Query 会变化,但源端 Key 和 Value 可以继续复用。解码器因此不是每次重新理解源句,而是在同一份上下文记忆上提出新的问题。
交叉注意力效果不理想时先看哪几件事
如果模型输出语法看起来通顺,却频繁漏掉源句中的关键内容,首先要确认交叉注意力确实连接了正确的两侧:Query 应来自解码器表示,Key 和 Value 应来自编码器输出。若三者误接成同一侧,模型会退化成自注意力式的局部处理。
还要看源序列的 Padding Mask 是否正确,源记忆的长度是否和掩码对应,以及编码器输出的模型维度是否能进入解码器的投影。注意力权重并不等于完整解释,但观察它是否始终集中在填充位置、是否完全平均,通常可以提供有价值的线索。
把编码器到解码器的链路串起来
完整流程可以概括为:源序列先经过词嵌入、位置编码和编码器堆叠,得到每个源位置的上下文表示;目标前缀经过掩码自注意力整理自身历史;交叉注意力用目标 Query 查询源 Key,并汇总源 Value;FFN 再加工融合后的表示,最后由输出层得到下一词概率。
这样看,交叉注意力不是一个孤立的公式,而是 Encoder-Decoder 之间真正的信息通道。编码器负责把源序列整理成可查询的记忆,解码器负责结合自己的生成状态决定此刻该读哪一部分。两边分工明确,Transformer 才能在保持并行训练的同时完成逐步生成。
常见问题
编码器输出为什么被称为 Key 和 Value?
这是从交叉注意力的计算角色来说的。解码器生成 Query,与编码器输出形成匹配分数;同一份编码器表示又作为 Value 被按权重汇总,带回源序列信息。
交叉注意力会把源句压缩成一个向量吗?
通常不会。编码器输出保留源序列各个位置的表示,解码器根据当前目标位置对这些位置进行加权读取,因此不同目标位置可以得到不同的源信息组合。
源序列只需要编码一次吗?
在常见的自回归推理中,源序列可以先编码一次,后续目标位置反复查询这组源记忆。变化的是目标端 Query,而不是源句本身。