Transformer 交叉注意力的矩阵形状:源序列长度和目标序列长度如何相遇
围绕Encoder-Decoder Attention 的计算关系,解释源序列长度、目标序列长度和交叉注意力矩阵之间的形状对应。
相关工具
交叉注意力连接的是两种长度
自注意力的 Query、Key、Value 来自同一序列,因此序列长度为 L 时,注意力关系通常呈现 L×L。交叉注意力不同:Query 来自目标序列,Key 和 Value 来自源序列,两个序列的长度本来就可以不同。
假设当前目标前缀长度为 T,源序列长度为 S,那么交叉注意力的分数矩阵可以理解为 T×S。每一行对应一个目标 Query,每一列对应一个源位置。一个目标位置可以查看整段源记忆,矩阵因此表达的是目标到源的关系。

目标 Query 的数量由目标长度决定,源 Key 和 Value 的数量由源长度决定。
矩阵的行和列分别代表什么
交叉注意力矩阵的每一行表示一个目标位置正在查询源序列。目标端生成不同词元时,Query 不同,因此每一行可能有不同的权重分布。每一列表示某个源位置被不同目标位置关注的情况。
如果目标长度是 3、源长度是 6,矩阵就有 3 行 6 列。它不是要求两个序列一一对应,而是允许每个目标位置从 6 个源位置中分配权重。翻译中的短词、长短语和语序变化,都可以在这种不等长的关系矩阵中表达。

交叉注意力矩阵的行对应目标位置,列对应源位置,权重表示两侧的信息联系。
Q、K、V 的形状为什么可以配合
目标端的隐藏状态先投影成 Query,形状可以看成 T×d_k;源端的编码器输出投影成 Key,形状可以看成 S×d_k,转置后与 Query 相乘,得到 T×S 的分数矩阵。Value 则可以看成 S×d_v,权重矩阵与它相乘后,得到 T×d_v 的输出。
这里需要匹配的是 Q 和 K 的最后一维,也就是用于点积的 d_k,而不是两侧的序列长度。T 和 S 可以不同,只要投影后的特征维度适合做相关性计算,交叉注意力就能建立两侧关系。
源序列 Padding 应该屏蔽哪一边
源序列批次中可能存在 Padding 位置。交叉注意力的 Key 和 Value 来自源序列,因此需要在矩阵的列方向屏蔽源端填充位置。目标端每个 Query 仍然可以查询有效源位置,但不能把权重分给空位。
目标端如果有 Padding,也要在相应的目标位置上处理它们,尤其是在批量训练和损失统计中。两侧的长度和掩码边界不能混用:源 Padding 影响列,目标 Padding 影响行;目标未来约束主要由目标自注意力负责。

源端无效位置在归一化前被屏蔽,目标位置再对剩余源位置分配权重。
目标前缀变长,矩阵会怎样变化
推理时目标前缀从起始标记开始逐步变长。如果当前只生成了一个目标位置,交叉注意力可以看成 1×S;生成到多个位置后,当前计算的目标 Query 数量增加,矩阵行数随 T 增长。
源序列通常保持不变,列数 S 不变;目标前缀变化,行数 T 增加。缓存可以复用源端 Key 和 Value,减少重复投影,但每一轮新目标 Query 仍要与源记忆建立关系。
训练阶段为什么能同时计算多行
训练时,右移后的目标序列已经准备好,多个目标位置可以同时生成 Query。源序列也已经经过编码器形成 Key 和 Value,因此一轮前向计算可以同时得到 T 行交叉注意力结果。
并行计算不要求目标和源长度相同。它只要求把不同长度组织成合适的批次张量,并用 Padding Mask 记录有效位置。每一行仍代表不同目标位置,每一列仍代表源序列位置。
交叉注意力的成本由两边共同决定
自注意力常用 L×L 描述位置关系,而交叉注意力的主要关系矩阵是 T×S。源句很长或目标序列很长,都会增加交叉注意力需要处理的关系数量。翻译长文时,源长度和目标长度可能同时变大,成本也会随之上升。
这也是为什么阅读模型资源开销时,不能只看某一侧序列长度。编码器自注意力关注源长度的平方关系,解码器自注意力关注目标长度,交叉注意力则连接目标长度和源长度。
把矩阵形状放回信息流
源序列经过编码器后形成 S 个 Key 和 Value,目标前缀经过解码器自注意力后形成 T 个 Query。交叉注意力用 T×S 的分数矩阵分配源信息,输出仍然对应 T 个目标位置,再进入 FFN 和输出层。
记住三件事就够了:行是目标查询,列是源记忆;Q 和 K 的特征维度要匹配,序列长度可以不同;源端 Padding 需要在列方向屏蔽。这样再看交叉注意力的张量图,就不会把它误认为普通自注意力的方阵。
常见问题
交叉注意力矩阵一定是方阵吗?
不一定。目标长度为 T、源长度为 S 时,主要关系矩阵通常是 T×S,只有两侧长度恰好相等时才呈现方阵。
源序列和目标序列必须使用相同的 d_model 吗?
经典结构通常让两侧主干使用统一模型宽度,但交叉注意力内部会分别投影到适合点积的 d_k 和传值的 d_v,关键是投影后的计算维度能够匹配。
源端 Padding 为什么影响矩阵列?
Key 和 Value 的列对应源序列位置,源端填充位于这些列中,因此需要在交叉注意力归一化前屏蔽它们。