为什么矩阵计算能把逐词注意力变成一次运算
围绕 Self-Attention 矩阵计算的描述,解释逐位置计算如何改写成 Q、K、V 矩阵运算,以及这种改写如何支持并行处理。
相关工具
先从一个位置的注意力算起
理解矩阵计算前,可以先看单个位置的流程:为当前位置生成 Query,为所有位置生成 Key 和 Value,计算 Query 与每个 Key 的分数,Softmax 得到权重,再对所有 Value 加权求和。
如果一句话有很多位置,逐个位置重复这套步骤会产生大量相似计算。Transformer 相关概念 先介绍逐步计算,再说明实际实现会把这些步骤组织成矩阵,以便更快处理整个序列。

一个 Query 依次匹配各个 Key,再用权重汇总全部 Value。
把所有位置排成输入矩阵 X
假设序列有 L 个位置,每个位置的词向量或隐藏表示宽度是 d_model,可以把它们按行排列成矩阵 X。X 的每一行对应一个序列位置,矩阵一次保留了整段输入。
这样,模型不必先取出第一个位置再取第二个位置,而是可以让所有行同时参与投影。序列长度体现在矩阵的行数,模型宽度体现在矩阵的列数。
三次矩阵乘法一次生成 Q、K、V
Self-Attention 中,Q、K、V 都由输入 X 分别乘以可学习的投影矩阵得到:Q=XW_Q,K=XW_K,V=XW_V。每个输入位置都会同时生成自己的 Query、Key 和 Value。
矩阵写法把原本逐词的投影合并成一次批量计算。Q、K、V 的每一行仍然对应一个位置,但所有位置可以在同一套矩阵运算中完成投影。

整段输入矩阵 X 通过三组投影矩阵,一次得到所有位置的 Query、Key 和 Value。
QK 的矩阵乘法同时算出所有位置关系
Q 的每一行是一个 Query,K 的每一行是一个 Key。计算 QK 的转置后,得到一个 L×L 的分数矩阵。第 i 行表示第 i 个位置作为 Query 时,对所有位置的匹配分数。
这个矩阵一次包含了所有位置之间的关系,不需要逐个 Query 单独循环。矩阵的行和列仍然保留了清晰含义:行是正在查询的位置,列是被查询的位置。
缩放、掩码和 Softmax 仍然可以批量完成
得到 QK 分数矩阵后,先除以根号 d_k,再根据需要加入 Padding Mask 或因果 Mask,最后沿每个 Query 对应的行做 Softmax。每一行都会变成一组注意力权重,行和通常为 1。
因此,矩阵化并没有改变注意力的语义步骤,只是把多个位置的相同步骤放在一张矩阵上同时完成。掩码仍然可以限制每一行的可见范围,Softmax 仍然负责把分数转成权重。

QK 分数矩阵经过缩放、掩码和按行 Softmax,形成所有 Query 的注意力权重。
最后一次矩阵乘法汇总所有 Value
注意力权重矩阵的每一行对应一个 Query,V 的每一行对应一个位置的 Value。权重矩阵乘以 V 后,得到长度仍为 L 的输出矩阵,每一行就是一个位置的上下文表示。
这一步同时完成所有位置的加权求和。逐位置理解时,每一行仍然是在汇总多个 Value;矩阵理解时,整个序列的汇总可以用一次乘法表达。
多头注意力只是增加了一个头维度
多头注意力先把 Q、K、V 按头拆成多个子空间,每个头分别计算分数、权重和输出。实现中通常把头数作为一个独立维度,批量完成多个头的矩阵运算。
各头结果沿特征维拼接,再经过输出投影回到 d_model。矩阵化处理因此同时利用了位置维度和头维度的并行性,概念上的“多个注意力头”在实现中可以组织成规整的张量。

多个头在独立子空间中并行计算,结果拼接后投影回模型宽度。
矩阵计算改变的是执行方式,不是信息边界
矩阵化不会让因果掩码失效,也不会让 Padding 变成有效内容。它只是把多个位置的合法计算组织在一起。训练时可以同时计算多个目标位置,推理时如果新目标词还没有产生,仍然存在自回归等待。
所以,矩阵计算带来的并行优势和生成顺序是两个层面的问题。前者描述已知张量如何高效执行,后者描述目标输入何时出现。理解二者的边界,才能正确判断 Transformer 的计算效率。
用一条公式记住矩阵版注意力
矩阵版缩放点积注意力可以写成 Attention(Q,K,V)=Softmax(QK^T/√d_k)V。QK^T 同时计算所有 Query 和 Key 的关系,Softmax 按行形成权重,最后乘 V 同时得到所有位置的输出。
这条公式不是把逐词逻辑变复杂,而是把逐词逻辑压缩成了几次规整的矩阵运算。读懂每个矩阵的行列含义,就能在逐步示意图和实际张量实现之间来回切换。
常见问题
矩阵计算是否改变了 Self-Attention 的结果含义?
没有。它把多个位置的相同计算合并执行,QK 分数、Softmax 权重和 Value 加权汇总的含义保持不变。
QK^T 得到的矩阵为什么是 L×L?
Q 有 L 个 Query,K 有 L 个 Key,每一行对应一个 Query,每一列对应一个被查询位置。
矩阵化能让推理一次生成所有词吗?
不能直接做到。矩阵化提高已知输入的计算效率,但自回归推理中的未来词元仍然需要按顺序产生。