内积如何衡量注意力中的对齐程度
计算点积,从几何角度理解它的符号和大小,并观察查询-键分数如何变成注意力权重。
当 Transformer 比较一个 token 的查询向量与另一个 token 的键向量时,计算的是点积。这个数值有助于决定从该键对应的值向量中收集多少信息。对于实向量,符号可以说明两个向量大致指向同一侧还是相反方向,而大小也取决于它们各自的长度。把这两个影响分开考虑,注意力分数就更容易理解。
学完本课后,你将能够计算内积,在通常的欧几里得几何中解释它的符号和大小,并追踪一个查询-键分数经过缩放和 softmax 后的变化。
学习目标: 计算内积,并将其符号和大小与对齐程度联系起来。
本课建立在第 017 课的向量加权和之上。Mathematics for Machine Learning 第 3.2 节介绍了内积,并用它推理长度、角度和正交关系。这里的数值示例、注意力推演、视觉图示和测验题均为原创内容。
将对应坐标相乘,以衡量对齐程度
对于具有相同坐标数的两个实向量 和 ,它们的点积定义为
将第一个坐标配对并相乘,然后把所有坐标对的乘积相加。结果是一个标量。点积是内积的一种;更一般地说,内积是定义在向量对上的实值规则,对每个输入分别线性、满足对称性,并且非零向量与自身配对时结果为正。这里我们使用 上的标准点积。
具体计算一下,取 和 。那么
正分数符合图形直觉:这两个向量都指向平面中的同一半区域。它们的欧几里得长度都是 。由于这两个向量都非零,且采用普通的实欧几里得几何,它们之间的角 满足
因此,点积比较的不只是方向。它把方向与两个向量各自的长度结合起来。余弦值 通过除去这些长度,单独表示方向上的对齐程度;这个归一化量称为余弦相似度,后续课程会介绍它。
- 查询向量: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
投影显示了一个向量有多少沿着另一个向量
将 投影到非零向量 的方向上,相当于询问: 有多少部分沿着 ?它的有符号标量长度为
这个结果保留符号:负值表示分量朝向与 相反。对于上面的例子,。投影向量等于这个标量长度乘以 方向上的单位向量:
剩下的向量是 。验证它与 垂直:
这种分解解释了几何意义:点积衡量沿 方向的有符号分量,同时考虑 自身的长度;垂直余量对这个乘积没有贡献。
对于标准欧几里得坐标中的非零实向量,正内积表示夹角小于 ,零内积表示向量垂直,负内积表示夹角大于 。零向量是边界情况:它与任意向量的点积都是零,但它没有方向,因此夹角无从定义。更一般地,这些角度结论以通常的实欧几里得内积为前提。不同的内积可能定义出不同的几何。
注意力先使用分数,再将其转成权重
在注意力机制中,查询描述某个位置正在寻找什么,而每个键描述另一个位置可以用来匹配的内容。模型通过学习得到的投影,将 token 表示转换为查询和键向量。原始 Transformer 论文将它们的兼容性定义为点积,然后将每个分数除以 ,其中 是每个查询和键的坐标数。对允许参与计算的键应用 softmax,就会得到对应值向量的权重(Vaswani 等人,Attention Is All You Need)。
对于一个查询 和键矩阵 ,缩放后的分数为 。如果只有一个查询,每个元素就是一个查询-键分数。如果有多个查询,矩阵乘法就能同时计算许多这样的分数。随后,对每个查询沿键所在的位置应用 softmax,这些权重再用于对值向量加权求和。
试试这个小例子:,,。两个键的维度都是 :
点积 和 是原始兼容性分数。缩放后, 和 是 logits。 和 则是 softmax 权重;在没有 dropout 时,它们在两个未屏蔽的键上相加为 1。这是三个相关但不同的量。对于这个查询,这些权重构成归一化分布,但它们不是每个键在语义上相关的校准概率。PyTorch 的 scaled_dot_product_attention 遵循这一顺序:查询乘以转置后的键,进行缩放,添加任何掩码,应用 softmax,最后将权重乘以值。默认缩放因子为 。
这种缩放并不是余弦归一化。它除以的是基于维度的因子,而不是查询和键各自的长度。Transformer 论文指出,在其给定假设下——查询和键的坐标彼此独立、均值为零、方差为一——未缩放点积的方差为 。除以 后,在该假设下,分数的离散程度不会随着维度增加而增长。它不会把每个查询和键的长度变成 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
计算 。对于这两个非零向量,它的符号在标准实欧几里得空间中说明了什么?
先将对应坐标相乘并相加:
点积为负。对于标准欧几里得内积下的两个非零实向量,负点积表示它们的夹角大于 。仅凭点积还不能得出确切角度;还需要使用向量长度。
Question 2
Show the step-by-step solution
对于 和 ,计算 以及它们夹角的余弦。
点积为
它们的长度都是 ,因此根据欧几里得夹角公式,
点积是 ;余弦相似度是 。它们不是同一个量。
Question 3
Show the step-by-step solution
将 投影到 上。求有符号标量长度和投影向量。
首先,,且 。有符号标量投影为
要得到向量投影,将点积除以 ,再乘以 :
Question 4
Show the step-by-step solution
两个非零实向量的标准点积为零。可以得出什么结论?如果一个向量为零,还需要注意什么?
对于欧几里得空间中的非零向量,。由于两个长度都为正,点积为零就要求 ,因此两个向量垂直。如果其中一个向量为零,点积同样为零,但零向量没有方向,也就无法定义它与另一向量的夹角。
Question 5
Show the step-by-step solution
和 都等于 。为什么相同的点积不能说明方向对齐程度相同?
第一对向量方向完全一致,因此余弦相似度为 。第二对向量的长度都是 ,所以余弦相似度为 。两组向量的点积碰巧都等于 ,但每组中的向量长度不同。原始点积将长度和方向结合起来,因此它本身无法确定夹角。
Question 6
Show the step-by-step solution
对于 、 和 ,当 时,计算原始分数、缩放后的 logits 和 softmax 权重。哪个键的权重更大?
点积为 和 。除以 后,logits 约为 和 。应用 softmax 得到
键 获得较大的权重。这两个未屏蔽位置上的 softmax 权重相加为 1;点积和缩放后的 logits 则是分数,而非概率。
Question 7
Show the step-by-step solution
假设注意力查询是零向量,且有两个未屏蔽的键。在关闭 dropout 的常规 softmax 计算中,结果权重是多少?查询与任一键之间的夹角有定义吗?
零查询与每个键的点积都是零。缩放后两个 logit 仍为零,因此
所以两个键获得相同的权重。夹角无定义,因为零查询没有方向。这里分数相同并不意味着查询在几何上与任何一个键对齐。
Question 8
Show the step-by-step solution
某实现将每个查询-键点积替换为余弦相似度,再应用 softmax。对于 和 ,结果有何变化?为什么这与标准注意力缩放不同?
原始点积是 。两个向量的长度都是 ,因此余弦相似度为 。余弦归一化会除以每个向量各自的长度,并从分数中去掉它们的大小影响。标准缩放点积注意力则除以 ;这个因子对该注意力头中所有向量都相同。它保留了大小对 logits 的影响,因此不是余弦相似度。