要理解 “q×kT\mathbf{q} \times \mathbf{k}^Tq×kT 是注意力分数”,核心是抓住注意力机制的本质目标 ——量化 “查询(q)” 与 “键(k)” 之间的关联程度,而向量点积(矩阵相乘的元素本质)恰好是实现这一目标的天然工具。下面分三步拆解:
一、注意力分数的核心使命:找 “查询与键” 的关联度
注意力机制的核心逻辑是 “按需聚焦”:比如阅读时,我们会根据当前 “想找的信息(查询 q)”,去关注文本中 “相关的内容(键 k)”。为实现这一逻辑,第一步必须先回答:“每个查询与每个键的相关性有多高?”
这个 “相关性数值”,就是注意力分数。
例如:
- 若查询 q 是 “猫的颜色”,键 k1 是 “黑色猫咪”、k2 是 “红色汽车”,则 q 与 k1 的分数应高,与 k2 的分数应低;
- 若有多个查询(如 “猫的颜色”“狗的大小”)和多个键,则需要一个 “查询 - 键关联表”,记录所有查询对所有键的相关性 —— 这正是 q×kT\mathbf{q} \times \mathbf{k}^Tq×kT 矩阵的作用。
二、向量点积:天然的 “关联度度量工具”
q×kT\mathbf{q} \times \mathbf{k}^Tq×kT 矩阵中,每个元素的本质是 “单个查询向量 **** **** 与单个键向量 **** **** 的点积”(即 qi⋅kj\mathbf{q}_i \cdot \mathbf{k}_jqi⋅kj),而点积的几何意义恰好能量化 “关联度”。
回顾向量点积的数学定义与几何意义:
对两个维度为 dkd_kdk 的向量 qi\mathbf{q}_iqi 和 kj\mathbf{k}_jkj,点积公式为:
qi⋅kj=∑t=1dkqi,t×kj,t\mathbf{q}_i \cdot \mathbf{k}_j = \sum_{t=1}^{d_k} q_{i,t} \times k_{j,t}qi⋅kj=∑t=1dkqi,t×kj,t
其几何等价形式为:
qi⋅kj=∥qi∥×∥kj∥×cosθ\mathbf{q}_i \cdot \mathbf{k}_j = \|\mathbf{q}_i\| \times \|\mathbf{k}_j\| \times \cos\thetaqi⋅kj=∥qi∥×∥kj∥×cosθ
其中:
- ∥qi∥\|\mathbf{q}_i\|∥qi∥、∥kj∥\|\mathbf{k}_j\|∥kj∥ 是向量的模长(可理解为向量的 “信息量大小”);
- θ\thetaθ 是 qi\mathbf{q}_iqi 与 kj\mathbf{k}_jkj 的夹角,cosθ\cos\thetacosθ 是 “方向相似度”——θ\thetaθ 越小(方向越接近),cosθ\cos\thetacosθ 越接近 1,点积越大;θ\thetaθ 越大(方向越背离),cosθ\cos\thetacosθ 越接近 - 1,点积越小。
这恰好完美匹配 “关联度” 的需求:
- 当查询 q 与键 k “方向相似”(比如 q 是 “猫”,k 是 “猫咪”),cosθ\cos\thetacosθ 大,点积大→注意力分数高,说明两者相关;
- 当查询 q 与键 k “方向无关”(比如 q 是 “猫”,k 是 “汽车”),cosθ\cos\thetacosθ 接近 0,点积小→注意力分数低,说明两者无关。
此外,点积还有一个关键优势:计算高效。相比欧氏距离(衡量 “差异”,需开平方)等其他度量方式,点积仅需加法和乘法,适合深度学习中大规模矩阵运算(这也是 Transformer 选择点积作为分数度量的重要工程原因)。
三、q×kT\mathbf{q} \times \mathbf{k}^Tq×kT:批量计算所有 “查询 - 键” 的关联度
前面讲的是 “单个查询 vs 单个键” 的情况,而实际模型中,我们通常有多个查询(m 个)和多个键(n 个),需要一次性计算 “所有查询对所有键的分数”—— 这就需要通过矩阵相乘 q×kT\mathbf{q} \times \mathbf{k}^Tq×kT 实现,其维度变化和元素含义如下:
1. 明确向量 / 矩阵维度(结合文档假设)
- 单个查询向量 qi\mathbf{q}_iqi:维度为 dkd_kdk(如文档中 dk=64d_k=64dk=64),即形状为 (1,dk)(1, d_k)(1,dk);
- 多个查询组成的矩阵 Q\mathbf{Q}Q:包含 mmm 个查询,形状为 (m,dk)(m, d_k)(m,dk)(每行是一个查询);
- 单个键向量 kj\mathbf{k}_jkj:维度同样为 dkd_kdk,形状为 (1,dk)(1, d_k)(1,dk);
- 多个键组成的矩阵 K\mathbf{K}K:包含 nnn 个键,形状为 (n,dk)(n, d_k)(n,dk)(每行是一个键);
- 键矩阵的转置 KT\mathbf{K}^TKT:将 K\mathbf{K}K 的行与列交换,形状变为 (dk,n)(d_k, n)(dk,n)(每列是一个键)。
2. 矩阵相乘的物理含义:生成 “注意力分数矩阵”
根据矩阵相乘的规则(前矩阵列数 = 后矩阵行数才能相乘),Q×KT\mathbf{Q} \times \mathbf{K}^TQ×KT 的计算过程如下:
- 输入维度:Q(m,dk)×KT(dk,n)\mathbf{Q}(m, d_k) \times \mathbf{K}^T(d_k, n)Q(m,dk)×KT(dk,n);
- 输出维度:(m,n)(m, n)(m,n)(前矩阵行数 × 后矩阵列数);
- 输出矩阵的每个元素 (i,j)(i, j)(i,j):第 iii 个查询向量 qi\mathbf{q}_iqi 与第 jjj 个键向量 kj\mathbf{k}_jkj 的点积(即 qi⋅kj\mathbf{q}_i \cdot \mathbf{k}_jqi⋅kj)。
这个 (m,n)(m, n)(m,n) 的输出矩阵,就是注意力分数矩阵—— 它本质是一张 “查询 - 键关联表”:
- 行:对应每个查询(共 mmm 行);
- 列:对应每个键(共 nnn 列);
- 元素 (i,j)(i,j)(i,j):第 iii 个查询对第 jjj 个键的 “关联度分数”。
3. 与文档逻辑的呼应:分数矩阵的后续处理
需要注意的是,Q×KT\mathbf{Q} \times \mathbf{K}^TQ×KT 得到的是 “原始注意力分数”,正如文档中强调的,由于点积的方差会随 dkd_kdk 增长(Var(qi⋅kj)=dk\text{Var}(\mathbf{q}_i \cdot \mathbf{k}_j) = d_kVar(qi⋅kj)=dk),原始分数会出现数值极端化问题。因此,后续必须除以 dk\sqrt{d_k}dk 进行方差归一化(将方差固定为 1),再通过 softmax 转化为 “注意力权重”(表示每个键对查询的贡献占比)—— 这也印证了文档中 “缩放点积注意力” 的完整流程:
Attention(Q,K,V)=softmax(Q×KTdk)×V\text{Attention}(\mathbf{Q}, \mathbf{K}, \mathbf{V}) = \text{softmax}\left( \frac{\mathbf{Q} \times \mathbf{K}^T}{\sqrt{d_k}} \right) \times \mathbf{V}Attention(Q,K,V)=softmax(dkQ×KT)×V
其中 V\mathbf{V}V(值向量)是最终要 “聚焦” 的内容,而 Q×KTdk\frac{\mathbf{Q} \times \mathbf{K}^T}{\sqrt{d_k}}dkQ×KT 正是归一化后的注意力分数矩阵。
四、举个具体例子:让抽象矩阵变直观
假设:
- 查询数量 m=2m=2m=2(比如查询 1:“猫的颜色”,查询 2:“狗的大小”);
- 键数量 n=3n=3n=3(比如键 1:“黑色猫咪”,键 2:“棕色小狗”,键 3:“红色汽车”);
- 维度 dk=2d_k=2dk=2(简化计算,实际为 64)。
1. 设定具体向量(符合文档初始化:均值 0、方差 1)
-
查询矩阵 Q\mathbf{Q}Q(2×2):
Q=[0.80.20.10.9]\mathbf{Q} = \begin{bmatrix} 0.8 & 0.2 \\ 0.1 & 0.9 \end{bmatrix}Q=[0.80.10.20.9]
(第 1 行:查询 1 “猫的颜色”,第 2 行:查询 2 “狗的大小”)
-
键矩阵 K\mathbf{K}K(3×2):
K=[0.70.30.20.80.4−0.5]\mathbf{K} = \begin{bmatrix} 0.7 & 0.3 \\ 0.2 & 0.8 \\ 0.4 & -0.5 \end{bmatrix}K=0.70.20.40.30.8−0.5
(第 1 行:键 1 “黑色猫咪”,第 2 行:键 2 “棕色小狗”,第 3 行:键 3 “红色汽车”)
-
键转置 KT\mathbf{K}^TKT(2×3):
KT=[0.70.20.40.30.8−0.5]\mathbf{K}^T = \begin{bmatrix} 0.7 & 0.2 & 0.4 \\ 0.3 & 0.8 & -0.5 \end{bmatrix}KT=[0.70.30.20.80.4−0.5]
2. 计算 Q×KT\mathbf{Q} \times \mathbf{K}^TQ×KT(原始注意力分数矩阵)
根据矩阵相乘规则:
- 元素 (1,1)(1,1)(1,1)(查询 1× 键 1):0.8×0.7+0.2×0.3=0.56+0.06=0.620.8×0.7 + 0.2×0.3 = 0.56 + 0.06 = 0.620.8×0.7+0.2×0.3=0.56+0.06=0.62(分数高,关联强);
- 元素 (1,2)(1,2)(1,2)(查询 1× 键 2):0.8×0.2+0.2×0.8=0.16+0.16=0.320.8×0.2 + 0.2×0.8 = 0.16 + 0.16 = 0.320.8×0.2+0.2×0.8=0.16+0.16=0.32(分数中,关联弱);
- 元素 (1,3)(1,3)(1,3)(查询 1× 键 3):0.8×0.4+0.2×(−0.5)=0.32−0.1=0.220.8×0.4 + 0.2×(-0.5) = 0.32 - 0.1 = 0.220.8×0.4+0.2×(−0.5)=0.32−0.1=0.22(分数低,关联弱);
- 元素 (2,1)(2,1)(2,1)(查询 2× 键 1):0.1×0.7+0.9×0.3=0.07+0.27=0.340.1×0.7 + 0.9×0.3 = 0.07 + 0.27 = 0.340.1×0.7+0.9×0.3=0.07+0.27=0.34(分数中,关联弱);
- 元素 (2,2)(2,2)(2,2)(查询 2× 键 2):0.1×0.2+0.9×0.8=0.02+0.72=0.740.1×0.2 + 0.9×0.8 = 0.02 + 0.72 = 0.740.1×0.2+0.9×0.8=0.02+0.72=0.74(分数高,关联强);
- 元素 (2,3)(2,3)(2,3)(查询 2× 键 3):0.1×0.4+0.9×(−0.5)=0.04−0.45=−0.410.1×0.4 + 0.9×(-0.5) = 0.04 - 0.45 = -0.410.1×0.4+0.9×(−0.5)=0.04−0.45=−0.41(分数低,关联弱)。
最终原始分数矩阵为:
Q×KT=[0.620.320.220.340.74−0.41]\mathbf{Q} \times \mathbf{K}^T = \begin{bmatrix} 0.62 & 0.32 & 0.22 \\ 0.34 & 0.74 & -0.41 \end{bmatrix}Q×KT=[0.620.340.320.740.22−0.41]
这个矩阵完全符合预期:
-
查询 1(猫的颜色)对键 1(黑色猫咪)分数最高,对键 3(红色汽车)分数最低;
-
查询 2(狗的大小)对键 2(棕色小狗)分数最高,对键 3(红色汽车)分数最低。
后续只需除以 dk=2≈1.414\sqrt{d_k} = \sqrt{2} \approx 1.414dk=2≈1.414 归一化,再经 softmax 就能得到合理的注意力权重。
总结:q×kT\mathbf{q} \times \mathbf{k}^Tq×kT 是注意力分数的本质原因
- 目标匹配:注意力需要 “关联度”,点积的几何意义(方向相似度 + 信息量)恰好量化了关联度;
- 运算高效:点积计算简单,适合大规模矩阵运算;
- 批量输出:q×kT\mathbf{q} \times \mathbf{k}^Tq×kT 能一次性生成 “所有查询对所有键” 的关联度,形成结构化的分数矩阵;
- 衔接后续流程:原始分数矩阵需经文档中提到的 “除以 dk\sqrt{d_k}dk 归一化” 和 “softmax 权重转化”,最终实现 “按需聚焦”—— 这也说明 q×kT\mathbf{q} \times \mathbf{k}^Tq×kT 是注意力机制的核心 “分数来源”。