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

为什么每个解码器层都可以读取同一份编码器记忆

围绕编码器输出 Key、Value 和 Decoder Encoder-Decoder Attention 的描述,解释源序列记忆如何被多个解码器层逐层查询。

相关工具

编码器先把源序列整理成一份记忆

在 Encoder-Decoder Transformer 中,源序列先经过编码器堆叠。每个源位置的表示经过多层 Self-Attention、FFN、残差和归一化后,最终形成一组上下文向量。资料 把这些输出描述为会被解码器使用的 Key 和 Value。

这组输出可以看成源序列记忆:它保留各个位置,同时已经融合了源句上下文。编码阶段完成后,源记忆通常不需要随着目标词生成而改变,解码器可以在不同时间步和不同层中反复查询它。

Transformer 编码器输出作为共享源序列记忆供解码器读取的结构图
编码器形成源序列记忆

源序列经过编码器堆叠后形成一组位置化表示,作为交叉注意力的 Key 和 Value。

每个解码器层都有自己的 Query

解码器的每一层都会先处理目标端表示。经过该层的掩码自注意力后,当前位置已经包含了目标前缀相关信息,再由它生成 Query 去查询源序列记忆。不同层接收到的目标表示不同,因此产生的 Query 也不同。

所以,所谓“读取同一份记忆”并不是每层得到相同的交叉注意力结果。源端 Key 和 Value 可以相同,但不同层的 Query 不同,匹配分数和权重分布也会变化。每层都从自己的表示状态出发,重新判断当前需要哪些源信息。

为什么不把源记忆只接到最后一层

如果只有最后一层解码器能够读取源记忆,前面的解码器层就只能处理目标前缀,无法在中间阶段利用源句内容调整表示。目标端需要先形成一个状态,再经过多层加工,最后才一次性读取源信息,这会限制逐层融合的机会。

经典结构让每个解码器层都包含 Encoder-Decoder Attention,使源信息可以在不同深度进入目标表示。底层可能先建立较粗的源目标关系,上层在更丰富的目标状态上继续调整和重组。

Transformer 编码器源记忆连接多个解码器层的示意图
源记忆进入多个解码器层

同一份编码器记忆分别连接到多个解码器层,每层使用自己的目标 Query 进行查询。

共享的是源表示,不是交叉注意力参数

多个解码器层可以读取同一组源 Key 和 Value,但每层的 Query 投影、Key/Value 投影和输出处理通常属于自己的参数集合。即使源端输入相同,不同层也可以用不同的投影空间理解这份记忆。

这和层堆叠中“结构相同但参数不同”的关系一致。源记忆作为稳定接口被重复使用,各解码器层通过自己的参数和目标状态,对它进行不同角度的读取。

交叉注意力输出仍然是目标位置表示

交叉注意力并不会把整段源序列直接复制到解码器。每个目标位置的 Query 对源位置分配权重,再对源 Value 做加权求和,得到与目标位置一一对应的输出向量。

因此,交叉注意力的输出长度由目标端 Query 数量决定,源序列长度决定可被查询的列数。源记忆可以保持不变,但每个目标位置和每个解码器层得到的融合结果都可能不同。

Transformer 交叉注意力从源记忆读取信息并返回目标位置表示的示意图
源记忆查询后回到目标位置

目标 Query 查询源 Key/Value,交叉注意力输出仍按目标位置排列,继续进入 FFN 和下一层。

训练时多个目标位置可以同时查询

训练阶段,右移后的目标序列可以一次送入解码器。每个目标位置经过掩码自注意力后形成 Query,随后同时查询编码器源记忆,得到多行交叉注意力结果。因果约束限制目标端未来,源端有效位置则可以被完整读取。

因此,源记忆复用和训练并行并不矛盾。源端编码结果可以被多个目标位置共同使用,多个 Query 也可以在矩阵计算中一起处理。模型仍然保持每个目标位置独立的权重分布。

推理时可以复用源端 Key 和 Value

推理阶段目标前缀逐步变长,但源序列没有变化。编码器输出的源 Key 和 Value 可以缓存或复用,不必在每生成一个目标词时重新编码源句。每一轮主要新增的是当前目标 Query,以及它与源记忆之间的关系计算。

这类复用减少了重复工作,但不改变交叉注意力的职责。每个解码器层仍会根据自己的目标状态查询源记忆,交叉注意力输出继续经过 FFN、残差和下一层处理。

同一份记忆为什么能支持不同目标词

翻译或摘要时,不同目标位置需要关注源句的不同区域。源记忆提供稳定的候选位置,当前目标状态则决定此刻的查询重点。生成名词、动词、修饰词或标点时,Query 都可能不同,注意力权重也随之变化。

所以,源记忆不是一张固定的“答案表”,而是一组可被不同 Query 读取的上下文表示。多个解码器层和多个生成时间步可以从中提取不同信息,再逐步形成目标输出。

用四个问题检查源记忆复用

第一,编码器输出是否保留源序列的各个有效位置;第二,交叉注意力中的 Query 是否来自当前解码器层;第三,源 Key 和 Value 是否来自编码器输出;第四,交叉注意力结果是否回到目标位置并继续进入 FFN。

这四个问题能区分“共享源输入”和“共享全部计算”。Transformer 复用的是编码器已经形成的源序列记忆,查询方式、投影参数和目标状态仍然随解码器层与生成位置变化。

常见问题

多个解码器层使用的是完全相同的交叉注意力结果吗?

通常不是。源 Key 和 Value 可以来自同一份编码器记忆,但每层的目标表示和投影参数不同,因此 Query、权重和输出都可能不同。

推理时为什么可以缓存编码器输出?

源序列在生成过程中通常不变,编码器输出的 Key 和 Value 可以复用,避免每轮重新编码同一源句。

交叉注意力输出的长度由源序列还是目标序列决定?

输出按 Query 的数量排列,因此通常由当前目标序列长度决定;源序列长度决定可供查询的位置数量。