Attention 04:为什么 QKᵀ 表示词与词的关系
点积的几何意义、为什么不能用 XXᵀ、以及 Attention 学到的'关系'到底是什么。
01 > 02 > 03 > [04] > 05 > 06 | 07 > 08 > 09 > 10 > 11 > 12
” 不是语言学家定义的’关系’,而是模型自己学出来的:位置 当前需要什么信息,位置 能不能提供。“
这一讲要回答什么#
上一讲我们手推了完整的 Attention 计算流程,知道 会产生一个 的分数矩阵。
但一个根本性的问题还没回答:
为什么两个向量做点积,就能表示”词与词的关系”?为什么偏偏是 ,而不是别的形式?
这一讲拆开讲三件事:
- 点积的几何意义——它到底在衡量什么
- 为什么不能用 代替 ——“提问”和”被匹配”必须分开
- Attention 学到的”关系”到底是什么——不是语法标签,而是动态的信息需求匹配
点积的几何意义#
两个向量的点积:
其中 是两个向量的夹角。这个公式告诉我们三件事:
- 方向相同()→ 点积大且为正
- 方向正交()→ 点积为 0
- 方向相反()→ 点积大且为负
所以点积本质上在衡量两个向量方向上的一致程度。
点积还有另一个等价的理解:投影。 等于 在 方向上的投影长度,再乘以 。投影越长,说明 在 的方向上”分量”越大。
把这个概念搬到 Attention 里:
大 ⟹ Query 和 Key 的方向接近 ⟹ 位置 的”信息需求”和位置 的”可提供线索”匹配度高。
为什么不能用 #
一个自然的疑问:既然 ,,那能不能跳过投影,直接算 ?
有三个致命缺陷:
缺陷 1:对称性#
这意味着”猫对地毯的关注”和”地毯对猫的关注”必须一样大。但在真实语言中这种对称几乎不存在——“猫”想找的是”在哪里”,而”地毯”想找的是”谁在上面”,两者的信息需求完全不同。
不是对称矩阵(因为 ),所以位置 对 的关注可以和 对 完全不同。
缺陷 2:角色绑定#
用 意味着同一个向量 既当 Query 又当 Key。但上一讲已经说过:
- Query:我想找什么 → “提问的方式”
- Key:我能匹配什么 → “被搜索的方式”
一个词被别人搜索时应该强调的特征,和它自己去搜索别人时应该强调的特征,不是同一回事。
比如”加州”:
- 当别人搜它时(Key 角色),应该突出”这是一个地名”
- 当它搜别人时(Query 角色),可能在问”谁在这里做了什么”
和 是两组不同的参数,让模型有能力分别学习”怎么提问”和”怎么被匹配”。
缺陷 3:表达瓶颈#
的每个元素是原始嵌入的点积,表达能力受限于嵌入空间本身。而 中间多了一个 ——这是一个可学习的双线性变换,能捕获嵌入空间中更复杂的关系模式。
这就是为什么多头注意力中,不同的头学到不同的 ,就能在同一个输入上发现完全不同类型的关系——后面第 9 讲会详细展开。
“关系”到底是什么#
说到这里,我们需要纠正一个常见误解: 的分数不是在标注语言学关系(主谓、定语、指代…)。
它衡量的是一个更底层的东西:当前位置的信息需求,和候选位置的信息供给,匹配程度有多高。
这个”匹配”可以是语义上的,也可以是句法上的、位置上的、甚至是纯粹统计上的。模型不在乎”这是什么关系”——它只在乎”从这个位置取信息,对我接下来要做的预测有没有帮助”。
这个演示说明了一个关键事实:“关系”不是词的固有属性,而是上下文决定的。 同一个词在不同句子中,它的 Query 向量不同(因为 ,而 受 position embedding 和上下文影响),所以它关注的位置也不同。
点积 vs 其他相似度函数#
Attention 论文(Vaswani et al., 2017)为什么选了点积而不是别的?其实 Bahdanau (2015) 最初用的是加法注意力:
Transformer 选择缩放点积的原因很直接:
| 加法注意力 | 点积注意力 | 缩放点积 | |
|---|---|---|---|
| 计算方式 | |||
| 参数量 | 额外需要 | 无额外参数 | 无额外参数 |
| 计算效率 | 慢(需要非线性) | 快(纯矩阵乘法) | 快 |
| 数值稳定性 | tanh 限制范围 | 大时不稳定 | 稳定 |
| 表达能力 | 理论上更强 | 实践中差不多 | 实践中差不多 |
结论:当 不大时,点积和加法注意力效果差不多。但点积能用高度优化的矩阵乘法硬件加速,工程上完胜。
的对角线:自相关#
分数矩阵的对角线 ,表示位置 对自己的关注程度。
一个常见的直觉是”自己和自己一定最相关”——但这不一定成立。
不一定最大,因为 和 是通过不同的权重矩阵从同一个 得来的。 和 把输入投影到了不同的空间——同一个输入在 Query 空间和 Key 空间的方向可能完全不同。
什么时候自关注会低?
- 功能词(“的”、“在”、“了”):自身携带的语义很少,Query 更倾向于关注内容词
- 上下文强依赖的词:比如代词”他”,必须去找先行词才能确定含义
- 深层网络中:经过多层 Attention 后,每个位置已经融合了大量上下文,自关注的相对重要性下降
一个完整的例子:从嵌入到关系#
拿 [猫, 坐, 垫子] 做一个完整的追踪:
文字版总结这个路径:
- 嵌入层给每个词一个静态向量
- 把 投影到 Query 空间:“位置 想了解什么”
- 把 投影到 Key 空间:“位置 能提供什么线索”
- 两个空间中的向量点积衡量匹配度
- 匹配度经过 softmax 变成注意力权重——这就是”词与词的关系”
关键洞见:“关系”不存在于原始词嵌入中,而是通过 和 的投影被”提取”出来的。 不同的 (不同的头)会提取出不同类型的关系。
对应的 PyTorch 实验#
用代码验证本讲的核心观点:
import torch
import torch.nn as nn
import torch.nn.functional as F
import math
d_model, d_k = 4, 3
X = torch.tensor([
[1.0, 0.5, -0.2, 0.8], # 猫
[0.3, -0.6, 1.2, 0.1], # 坐
[0.7, 0.9, 0.4, -0.5], # 垫子
])
# ---- 实验 1:XX^T 是对称的 ----
XXT = X @ X.T
print("XX^T:")
print(XXT)
print(f"对称? {torch.allclose(XXT, XXT.T)}") # True
# ---- 实验 2:QK^T 通常不对称 ----
W_Q = nn.Linear(d_model, d_k, bias=False)
W_K = nn.Linear(d_model, d_k, bias=False)
Q = W_Q(X)
K = W_K(X)
QKT = Q @ K.T
print("\nQK^T:")
print(QKT)
print(f"对称? {torch.allclose(QKT, QKT.T)}") # 几乎总是 False
# ---- 实验 3:对角线不一定最大 ----
attn = F.softmax(QKT / math.sqrt(d_k), dim=-1)
print("\n注意力权重:")
print(attn)
for i in range(3):
max_j = attn[i].argmax().item()
words = ['猫', '坐', '垫子']
self_attn = attn[i, i].item()
max_attn = attn[i, max_j].item()
print(f" {words[i]}: 自关注={self_attn:.3f}, "
f"最关注={words[max_j]}({max_attn:.3f})")
# ---- 实验 4:不同 W^Q, W^K → 不同关系 ----
print("\n不同的投影 → 不同的关系矩阵:")
for head in range(3):
W_Q_h = nn.Linear(d_model, d_k, bias=False)
W_K_h = nn.Linear(d_model, d_k, bias=False)
Q_h = W_Q_h(X)
K_h = W_K_h(X)
attn_h = F.softmax(Q_h @ K_h.T / math.sqrt(d_k), dim=-1)
print(f" Head {head}: {attn_h.detach().numpy().round(2)}")python运行后你会观察到:
- 严格对称, 不对称
- 对角线不总是最大
- 每次随机初始化 ,得到的关系矩阵完全不同
这一讲的三个核心结论#
-
点积衡量方向一致性。 越大,说明位置 的信息需求和位置 的可提供线索在方向上越匹配。
-
比 强在角色分离。 和 让模型分别学习”怎么提问”和”怎么被匹配”,打破了 的对称约束和角色绑定。
-
“关系”是动态的、学出来的。同一个词在不同上下文中 Query 不同,关注的位置也不同。这不是语言学标签,而是对下游任务有用的信息流动模式。
试着想一想#
- 如果强制 , 会变成对称矩阵吗?为什么?
- 点积可以为负数。在 Attention 中负分数意味着什么?softmax 之后这些位置的权重会变成什么?
- 在 Cross-Attention 中(Decoder 的 Q 查 Encoder 的 K), 的形状是什么?还是 吗?
- 如果把 换成 cosine similarity ,有什么好处和坏处?
- 真实模型中,浅层和深层的注意力矩阵通常有什么不同?(提示:浅层更关注局部/位置,深层更关注语义。)
下一讲#
我们已经知道 产生分数,softmax 把分数变成权重。但下一讲要更深地钻进 softmax:
为什么 softmax 正好满足”注意力权重”的所有要求?它和 hardmax、sparsemax 有什么区别?