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

交叉注意力是什么:解码器如何读取编码器输出

把 Transformer 中的交叉注意力单独拆开,理解 Query、Key、Value 的不同来源,以及目标序列如何根据当前状态对齐并汇总源序列信息。

相关工具

交叉注意力连接两段序列

在编码器—解码器架构中,编码器负责把源序列转换成上下文表示,解码器负责根据目标前缀逐步生成目标序列。解码器要完成生成,就不能只看自己已经写出的内容,还需要从编码器输出里找到与当前目标位置相关的信息。

交叉注意力就是这座桥。它让目标序列中的每个查询位置,去读取源序列中的键和值。翻译时,可以把它理解成当前准备生成的目标词,正在源句中寻找应该参考的词或短语。

它仍然使用注意力的基本计算方式,但 Q、K、V 不再来自同一段序列。信息来源一变,矩阵形状和注意力含义也随之变化。

Transformer 交叉注意力中解码器 Query 读取编码器 Key 和 Value 的结构图
交叉注意力的整体结构

Query 来自解码器,Key 和 Value 来自编码器,注意力权重帮助目标位置汇总源序列信息。

Q、K、V 分别来自哪里

交叉注意力中,Query 来自解码器当前的隐藏状态。它代表当前目标位置“想要寻找什么信息”。Key 和 Value 来自编码器输出,Key 用来计算相关性,Value 携带真正要汇总的源序列内容。

假设解码器当前有 T 个目标位置,编码器输出有 S 个源位置,那么 Q 的第一维是目标长度 T,K 和 V 的第一维是源长度 S。每个目标位置都会和所有源位置的 Key 计算相关性,再根据权重读取对应的 Value。

可以把 Key 想成源序列中可被检索的索引,把 Value 想成索引背后的内容。解码器用自己的 Query 去匹配这些索引,匹配结果决定从哪些源位置取多少信息。

交叉注意力的矩阵形状

设 Q 的形状为 T×d_k,K 的形状为 S×d_k,V 的形状为 S×d_v。计算 QKᵀ 后,K 转置为 d_k×S,得到的相似度矩阵形状是 T×S。它的每一行对应一个目标位置,每一列对应一个源位置。

对每一行做缩放和 Softmax 后,得到同样是 T×S 的注意力权重矩阵。再与 V 相乘,T×S 乘 S×d_v,得到 T×d_v 的交叉注意力输出。

这里最容易记错的是,交叉注意力矩阵不一定是正方形。源序列和目标序列长度可以不同,矩阵的行数由目标长度决定,列数由源长度决定。

Transformer 交叉注意力中 Q K V 形状以及 T×S 矩阵运算示意图
交叉注意力的矩阵形状

Q 来自目标序列,K/V 来自源序列,QKᵀ 产生目标长度×源长度的对齐矩阵。

它和解码器自注意力有什么不同

解码器掩码自注意力的 Q、K、V 都来自目标前缀,主要负责整理目标序列内部已经生成的内容,并用因果掩码防止读取未来。交叉注意力的 Q 来自解码器,K 和 V 来自编码器,主要负责读取源序列。

两者通常连续出现在一个解码器层中。解码器先通过掩码自注意力了解“我已经生成了什么”,再通过交叉注意力寻找“源序列里还有什么相关概念”,最后交给前馈网络继续加工。

因此,看到解码器里的两个注意力模块时,不能只看它们都叫 Attention。先检查 Q、K、V 的来源,再确认是否存在因果掩码,区别就会清楚。

交叉注意力如何形成对齐关系

在翻译任务中,一个目标位置可能主要关注源序列中的一个词,也可能同时关注多个相邻词。交叉注意力权重可以看成一种软对齐:权重高的位置贡献更多 Value,权重低的位置贡献较少。

这种对齐不是人工指定的词典映射,而是模型根据当前解码器状态和源序列表示学习出来的。随着目标前缀变化,Query 会变化,注意力分布也会变化。生成不同目标词时,模型可能访问源序列的不同区域。

注意力图可以帮助观察模型在某一步重点读取了哪些源位置,但不能简单把最高权重位置等同于唯一的翻译对应关系。多个头、多层和前馈网络都会共同影响最终输出。

交叉注意力根据源序列权重汇总信息并预测目标词的对齐示意图
交叉注意力中的源目标对齐

当前目标位置根据注意力权重从多个源位置加权汇总信息,再用于预测下一个目标词。

为什么 Value 也来自编码器

Q 和 K 负责回答“相关不相关”,Value 负责提供“相关概念是什么”。在交叉注意力中,编码器输出包含源序列的上下文信息,因此既适合作为 Key 建立检索索引,也适合作为 Value 被加权汇总。

如果只使用编码器的 Key 来计算相关性,却没有对应的 Value,模型只能知道应该关注哪些位置,却无法把这些位置包含的内容传回解码器。Attention 的加权求和正是把关系判断转换成了信息传递。

Key 和 Value 可以来自同一组编码器表示,但使用不同的线性投影。这样,模型可以学习一种适合被匹配的 Key 表示,以及另一种适合被读取和组合的 Value 表示。

交叉注意力中的掩码怎么用

交叉注意力通常不需要像解码器自注意力那样屏蔽源序列的未来位置,因为源序列已经完整编码,目标生成没有必要按源序列方向限制访问。

但源序列可能经过批量填充,所以仍需要填充掩码。目标查询可以读取源序列中的所有有效位置,却不应该读取 PAD 对应的 Key 和 Value。这样每个目标位置的权重会在有效源位置之间重新分配。

目标侧的因果限制主要由解码器自注意力负责。不要把目标序列的未来屏蔽错误地施加到跨注意力的源序列列上,否则模型会失去读取完整源内容的能力。

多头交叉注意力如何工作

多头交叉注意力会为 Q、K、V 分别进行多组投影,每个头独立计算目标—源位置之间的关系。一个头可能关注词义对应,另一个头可能关注短语边界,还有的头可能关注较远的上下文。

每个头的输出形状通常是 T×d_v,多个头沿最后一个维度拼接,再经过输出投影恢复到 d_model。之后,交叉注意力输出会进入残差连接和层归一化,作为后续前馈网络的输入。

多头不会改变“行是目标位置、列是源位置”的基本含义,只是让这种对齐关系在多个表示空间里同时计算。

如何检查交叉注意力是否正确

第一检查来源:Q 必须来自解码器当前状态,K 和 V 必须来自编码器输出。第二检查形状:注意力权重应为目标长度 T×源长度 S,而不是默认的 L×L。第三检查掩码:通常只屏蔽源序列 PAD。

第四检查输出:权重与 V 相乘后得到 T×d_v,多头拼接并投影后回到 T×d_model,才能和解码器主干的残差路径对齐。

用一个源长度和目标长度不同的小例子最容易发现错误。例如源序列 6 个位置、目标前缀 4 个位置时,权重矩阵应有 4 行 6 列;如果出现 6×6 或 4×4,就需要重新检查张量来源。

交叉注意力的四个检查点
步骤 1
来源正确

Q 来自解码器,K/V 来自编码器输出。

步骤 2
形状正确

权重矩阵是目标长度 T×源长度 S。

步骤 3
范围正确

通常屏蔽源序列 PAD,不把目标因果掩码套过来。

步骤 4
输出对齐

多头输出投影回 d_model 后接入解码器残差路径。

把交叉注意力放回序列到序列任务

源序列经过编码器后,得到一组带上下文的表示。解码器每生成一个目标位置,就用当前状态形成 Query,读取这组源表示中的相关概念,再结合目标前缀和前馈网络继续预测。

这让编码器和解码器形成了清晰的分工:编码器准备可以被查询的源序列记忆,解码器负责按目标语言或目标格式逐步组织输出,交叉注意力负责在两者之间传递与当前步骤相关的信息。

理解交叉注意力后,翻译、摘要、图像描述等序列到序列任务的共同结构会更容易看清。它们的输入内容不同,但都需要让生成侧根据当前状态访问另一段已经编码的表示。

常见问题

交叉注意力中的 Q、K、V 都来自解码器吗?

不是。Q 来自解码器当前状态,K 和 V 通常来自编码器输出。

交叉注意力矩阵为什么不一定是正方形?

因为它的行对应目标序列位置,列对应源序列位置,目标长度和源长度通常可以不同。

交叉注意力能直接看源序列中的 PAD 吗?

通常不能。源序列批量补齐产生的 PAD 位置应通过填充掩码屏蔽。