AI 数学课程 · 第 41 课,共 180

内积如何衡量注意力中的对齐程度

计算点积,从几何角度理解它的符号和大小,并观察查询-键分数如何变成注意力权重。

分享这篇文章

当 Transformer 比较一个 token 的查询向量与另一个 token 的键向量时,计算的是点积。这个数值有助于决定从该键对应的值向量中收集多少信息。对于实向量,符号可以说明两个向量大致指向同一侧还是相反方向,而大小也取决于它们各自的长度。把这两个影响分开考虑,注意力分数就更容易理解。

学完本课后,你将能够计算内积,在通常的欧几里得几何中解释它的符号和大小,并追踪一个查询-键分数经过缩放和 softmax 后的变化。

学习目标: 计算内积,并将其符号和大小与对齐程度联系起来。

本课建立在第 017 课的向量加权和之上。Mathematics for Machine Learning 第 3.2 节介绍了内积,并用它推理长度、角度和正交关系。这里的数值示例、注意力推演、视觉图示和测验题均为原创内容。

将对应坐标相乘,以衡量对齐程度

对于具有相同坐标数的两个实向量 x=(x1,…,xn)x=(x_1,\ldots,x_n) 和 y=(y1,…,yn)y=(y_1,\ldots,y_n),它们的点积定义为

将第一个坐标配对并相乘,然后把所有坐标对的乘积相加。结果是一个标量。点积是内积的一种;更一般地说,内积是定义在向量对上的实值规则,对每个输入分别线性、满足对称性,并且非零向量与自身配对时结果为正。这里我们使用 Rn\mathbb{R}^n 上的标准点积。

具体计算一下,取 q=(2,1)q=(2,1) 和 k=(1,2)k=(1,2)。那么

正分数符合图形直觉:这两个向量都指向平面中的同一半区域。它们的欧几里得长度都是 5\sqrt5。由于这两个向量都非零,且采用普通的实欧几里得几何,它们之间的角 θ\theta 满足

⟨q,k⟩=∥q∥2 ∥k∥2cos⁡θ,cos⁡θ=455=0.8.\langle q,k\rangle = \|q\|_2\,\|k\|_2\cos\theta, \qquad \cos\theta = \frac{4}{\sqrt5\sqrt5}=0.8.

因此,点积比较的不只是方向。它把方向与两个向量各自的长度结合起来。余弦值 0.80.8 通过除去这些长度,单独表示方向上的对齐程度;这个归一化量称为余弦相似度,后续课程会介绍它。

查询向量在键向量方向上的投影标准点积为 4。q 沿 k 方向的有符号长度为 4/√5 ≈ 1.79;剩余分量与 k 垂直。
q 在 k 上的投影q=(2,1) 和 k=(1,2) 从同一原点出发。灰色虚线射线表示 k 的方向。实线箭头 q 的终点位于射线右上方。另一支实线箭头的终点落在投影点 (0.8,1.6) 所在的射线上;一条虚线线段从该点连接到 q 的箭头端点,并与 k 成直角。
  • 查询向量:q = (2, 1)
  • 键的方向:k = (1, 2)
  • 投影向量:projₖ(q)
  • 垂直余量:q − projₖ(q)

q · k = 2(1) + 1(2) = 4

projₖ(q) = (4/5)k = (0.8, 1.6)

有符号标量投影:4/√5 ≈ 1.79

投影显示了一个向量有多少沿着另一个向量

将 qq 投影到非零向量 kk 的方向上,相当于询问:qq 有多少部分沿着 kk?它的有符号标量长度为

comp⁡k(q)=⟨q,k⟩∥k∥2.\operatorname{comp}_{k}(q)=\frac{\langle q,k\rangle}{\|k\|_2}.

这个结果保留符号:负值表示分量朝向与 kk 相反。对于上面的例子,comp⁡k(q)=4/5≈1.79\operatorname{comp}_{k}(q)=4/\sqrt5\approx1.79。投影向量等于这个标量长度乘以 kk 方向上的单位向量:

proj⁡k(q)=⟨q,k⟩∥k∥22k=45(1,2)=(0.8,1.6).\operatorname{proj}_{k}(q) =\frac{\langle q,k\rangle}{\|k\|_2^2}k =\frac45(1,2)=(0.8,1.6).

剩下的向量是 q−proj⁡k(q)=(1.2,−0.6)q-\operatorname{proj}_{k}(q)=(1.2,-0.6)。验证它与 kk 垂直:

(1.2,−0.6)⋅(1,2)=1.2−1.2=0.(1.2,-0.6)\cdot(1,2)=1.2-1.2=0.

这种分解解释了几何意义:点积衡量沿 kk 方向的有符号分量,同时考虑 kk 自身的长度;垂直余量对这个乘积没有贡献。

对于标准欧几里得坐标中的非零实向量,正内积表示夹角小于 90∘90^\circ,零内积表示向量垂直,负内积表示夹角大于 90∘90^\circ。零向量是边界情况:它与任意向量的点积都是零,但它没有方向,因此夹角无从定义。更一般地,这些角度结论以通常的实欧几里得内积为前提。不同的内积可能定义出不同的几何。

注意力先使用分数,再将其转成权重

在注意力机制中,查询描述某个位置正在寻找什么,而每个键描述另一个位置可以用来匹配的内容。模型通过学习得到的投影,将 token 表示转换为查询和键向量。原始 Transformer 论文将它们的兼容性定义为点积,然后将每个分数除以 dk\sqrt{d_k},其中 dkd_k 是每个查询和键的坐标数。对允许参与计算的键应用 softmax,就会得到对应值向量的权重(Vaswani 等人,Attention Is All You Need)。

对于一个查询 qq 和键矩阵 KK,缩放后的分数为 qKT/dkqK^\mathsf{T}/\sqrt{d_k}。如果只有一个查询,每个元素就是一个查询-键分数。如果有多个查询,矩阵乘法就能同时计算许多这样的分数。随后,对每个查询沿键所在的位置应用 softmax,这些权重再用于对值向量加权求和。

试试这个小例子:q=(1,2)q=(1,2),k1=(1,0)k_1=(1,0),k2=(0,1)k_2=(0,1)。两个键的维度都是 dk=2d_k=2:

点积 11 和 22 是原始兼容性分数。缩放后,0.7070.707 和 1.4141.414 是 logits。0.3300.330 和 0.6700.670 则是 softmax 权重;在没有 dropout 时,它们在两个未屏蔽的键上相加为 1。这是三个相关但不同的量。对于这个查询,这些权重构成归一化分布,但它们不是每个键在语义上相关的校准概率。PyTorch 的 scaled_dot_product_attention 遵循这一顺序:查询乘以转置后的键,进行缩放,添加任何掩码,应用 softmax,最后将权重乘以值。默认缩放因子为 1/dk1/\sqrt{d_k}。

这种缩放并不是余弦归一化。它除以的是基于维度的因子,而不是查询和键各自的长度。Transformer 论文指出,在其给定假设下——查询和键的坐标彼此独立、均值为零、方差为一——未缩放点积的方差为 dkd_k。除以 dk\sqrt{d_k} 后,在该假设下,分数的离散程度不会随着维度增加而增长。它不会把每个查询和键的长度变成 1,也不会让分数成为余弦相似度。

将分数大小与方向上的对齐分开

较大的正点积可能来自方向接近、向量较长,或两者兼有。例如,(4,0)⋅(1,0)=4(4,0)\cdot(1,0)=4 的余弦相似度为 11,而 (2,1)⋅(1,2)=4(2,1)\cdot(1,2)=4 的余弦相似度为 0.80.8。原始分数相同,不代表夹角相同。同样,将一个向量乘以正数会增大点积但不改变方向;乘以 −1-1 则会翻转符号并反转方向。

在注意力头中,查询和键的长度是模型表示的一部分。分数会作为兼容性 logit 使用,随后 softmax 会针对该查询的其他可用分数进行比较。它既不是独立概率,也不是通用的语义相似度度量。如果系统改为将每个非零向量归一化为单位长度,分数就会变成余弦相似度,去掉各个向量的大小影响。这对于比较文档嵌入等任务可能有用,但它与上文的标准缩放点积注意力是不同操作。

你可以用 NumPy 验证这些算术:

import numpy as np

q = np.array([2.0, 1.0])
k = np.array([1.0, 2.0])

dot = np.dot(q, k)
scalar_projection = dot / np.linalg.norm(k)
vector_projection = dot / np.dot(k, k) * k
cosine_similarity = dot / (np.linalg.norm(q) * np.linalg.norm(k))

print(dot)                 # 4.0
print(scalar_projection)  # 1.7888543819998317
print(vector_projection)  # [0.8 1.6]
print(cosine_similarity) # 0.8

同一个乘法现在可以从两种情境来理解:它既是有符号对齐程度的几何度量,也是比较查询和键时使用的兼容性分数。下一步,我们会把点积解读为特征加权分数,其中每个坐标都会贡献自身带符号的部分。

检验理解

Question 1

Show the step-by-step solution

计算 (2,−1,3)⋅(1,4,−2)(2,-1,3)\cdot(1,4,-2)。对于这两个非零向量,它的符号在标准实欧几里得空间中说明了什么?

先将对应坐标相乘并相加:

2⋅1+(−1)⋅4+3⋅(−2)=2−4−6=−8.2\cdot1 + (-1)\cdot4 + 3\cdot(-2)=2-4-6=-8.

点积为负。对于标准欧几里得内积下的两个非零实向量,负点积表示它们的夹角大于 90∘90^\circ。仅凭点积还不能得出确切角度;还需要使用向量长度。

Question 2

Show the step-by-step solution

对于 u=(2,1)u=(2,1) 和 v=(1,2)v=(1,2),计算 u⋅vu\cdot v 以及它们夹角的余弦。

点积为

u⋅v=2⋅1+1⋅2=4.u\cdot v=2\cdot1+1\cdot2=4.

它们的长度都是 5\sqrt5,因此根据欧几里得夹角公式,

cos⁡θ=u⋅v∥u∥2∥v∥2=455=45=0.8.\cos\theta=\frac{u\cdot v}{\|u\|_2\|v\|_2} =\frac{4}{\sqrt5\sqrt5}=\frac45=0.8.

点积是 44;余弦相似度是 0.80.8。它们不是同一个量。

Question 3

Show the step-by-step solution

将 q=(2,1)q=(2,1) 投影到 k=(1,2)k=(1,2) 上。求有符号标量长度和投影向量。

首先,q⋅k=4q\cdot k=4,且 ∥k∥2=5\|k\|_2=\sqrt5。有符号标量投影为

comp⁡k(q)=45≈1.79.\operatorname{comp}_{k}(q)=\frac{4}{\sqrt5}\approx1.79.

要得到向量投影,将点积除以 ∥k∥22=5\|k\|_2^2=5,再乘以 kk:

proj⁡k(q)=45(1,2)=(0.8,1.6).\operatorname{proj}_{k}(q)=\frac45(1,2)=(0.8,1.6).

Question 4

Show the step-by-step solution

两个非零实向量的标准点积为零。可以得出什么结论?如果一个向量为零,还需要注意什么?

对于欧几里得空间中的非零向量,x⋅y=∥x∥2∥y∥2cos⁡θx\cdot y=\|x\|_2\|y\|_2\cos\theta。由于两个长度都为正,点积为零就要求 cos⁡θ=0\cos\theta=0,因此两个向量垂直。如果其中一个向量为零,点积同样为零,但零向量没有方向,也就无法定义它与另一向量的夹角。

Question 5

Show the step-by-step solution

(4,0)⋅(1,0)(4,0)\cdot(1,0) 和 (2,1)⋅(1,2)(2,1)\cdot(1,2) 都等于 44。为什么相同的点积不能说明方向对齐程度相同?

第一对向量方向完全一致,因此余弦相似度为 11。第二对向量的长度都是 5\sqrt5,所以余弦相似度为 4/(55)=0.84/(\sqrt5\sqrt5)=0.8。两组向量的点积碰巧都等于 44,但每组中的向量长度不同。原始点积将长度和方向结合起来,因此它本身无法确定夹角。

Question 6

Show the step-by-step solution

对于 q=(1,2)q=(1,2)、k1=(1,0)k_1=(1,0) 和 k2=(0,1)k_2=(0,1),当 dk=2d_k=2 时,计算原始分数、缩放后的 logits 和 softmax 权重。哪个键的权重更大?

点积为 q⋅k1=1q\cdot k_1=1 和 q⋅k2=2q\cdot k_2=2。除以 dk=2\sqrt{d_k}=\sqrt2 后,logits 约为 0.7070.707 和 1.4141.414。应用 softmax 得到

(e0.707e0.707+e1.414,e1.414e0.707+e1.414)≈(0.330,0.670).\left(\frac{e^{0.707}}{e^{0.707}+e^{1.414}}, \frac{e^{1.414}}{e^{0.707}+e^{1.414}}\right) \approx(0.330,0.670).

键 k2k_2 获得较大的权重。这两个未屏蔽位置上的 softmax 权重相加为 1;点积和缩放后的 logits 则是分数,而非概率。

Question 7

Show the step-by-step solution

假设注意力查询是零向量,且有两个未屏蔽的键。在关闭 dropout 的常规 softmax 计算中,结果权重是多少?查询与任一键之间的夹角有定义吗?

零查询与每个键的点积都是零。缩放后两个 logit 仍为零,因此

softmax⁡(0,0)=(12,12).\operatorname{softmax}(0,0)=\left(\frac12,\frac12\right).

所以两个键获得相同的权重。夹角无定义,因为零查询没有方向。这里分数相同并不意味着查询在几何上与任何一个键对齐。

Question 8

Show the step-by-step solution

某实现将每个查询-键点积替换为余弦相似度,再应用 softmax。对于 q=(2,1)q=(2,1) 和 k=(1,2)k=(1,2),结果有何变化?为什么这与标准注意力缩放不同?

原始点积是 44。两个向量的长度都是 5\sqrt5,因此余弦相似度为 4/(55)=0.84/(\sqrt5\sqrt5)=0.8。余弦归一化会除以每个向量各自的长度,并从分数中去掉它们的大小影响。标准缩放点积注意力则除以 dk\sqrt{d_k};这个因子对该注意力头中所有向量都相同。它保留了大小对 logits 的影响,因此不是余弦相似度。

资料来源

  1. Mathematics for Machine Learning book PDF, Section 3.2
  2. Attention Is All You Need
  3. PyTorch documentation: scaled_dot_product_attention