Jerry's Blog

Back

返回专题总目录 · 上一讲:单头注意力完整计算

01 > 02 > 03 > [04] > 05 > 06 | 07 > 08 > 09 > 10 > 11 > 12

QKQK^\top 不是语言学家定义的’关系’,而是模型自己学出来的:位置 ii 当前需要什么信息,位置 jj 能不能提供。“


这一讲要回答什么#

上一讲我们手推了完整的 Attention 计算流程,知道 QKQK^\top 会产生一个 (n,n)(n, n) 的分数矩阵。

但一个根本性的问题还没回答:

为什么两个向量做点积,就能表示”词与词的关系”?为什么偏偏是 QKQK^\top,而不是别的形式?

这一讲拆开讲三件事:

  1. 点积的几何意义——它到底在衡量什么
  2. 为什么不能用 XXXX^\top 代替 QKQK^\top——“提问”和”被匹配”必须分开
  3. Attention 学到的”关系”到底是什么——不是语法标签,而是动态的信息需求匹配

点积的几何意义#

两个向量的点积:

ab=abcosθ\mathbf{a} \cdot \mathbf{b} = \|\mathbf{a}\| \|\mathbf{b}\| \cos\theta

其中 θ\theta 是两个向量的夹角。这个公式告诉我们三件事:

  1. 方向相同θ0°\theta \approx 0°)→ 点积大且为正
  2. 方向正交θ=90°\theta = 90°)→ 点积为 0
  3. 方向相反θ180°\theta \approx 180°)→ 点积大且为负

所以点积本质上在衡量两个向量方向上的一致程度

交互演示:拖动向量,观察点积变化
拖动蓝色向量(a)的端点,观察它与橙色向量(b)的点积、夹角和投影长度如何变化

点积还有另一个等价的理解:投影ab\mathbf{a} \cdot \mathbf{b} 等于 a\mathbf{a}b\mathbf{b} 方向上的投影长度,再乘以 b\|\mathbf{b}\|。投影越长,说明 a\mathbf{a}b\mathbf{b} 的方向上”分量”越大。

把这个概念搬到 Attention 里:

Sij=qikjS_{ij} = \mathbf{q}_i \cdot \mathbf{k}_j

SijS_{ij} 大 ⟹ Query ii 和 Key jj 的方向接近 ⟹ 位置 ii 的”信息需求”和位置 jj 的”可提供线索”匹配度高


为什么不能用 XXXX^\top#

一个自然的疑问:既然 Q=XWQQ = XW^QK=XWKK = XW^K,那能不能跳过投影,直接算 XXXX^\top

XXvsQK=(XWQ)(XWK)XX^\top \quad \text{vs} \quad QK^\top = (XW^Q)(XW^K)^\top
交互对比:XXT vs QKT
左边是 XXT(无投影),右边是 QKT(有投影)——注意对称性和分数分布的差异
vs

XXXX^\top 有三个致命缺陷:

缺陷 1:对称性#

XX 是对称矩阵:(XX)ij=(XX)jiXX^\top \text{ 是对称矩阵:} (XX^\top)_{ij} = (XX^\top)_{ji}

这意味着”猫对地毯的关注”和”地毯对猫的关注”必须一样大。但在真实语言中这种对称几乎不存在——“猫”想找的是”在哪里”,而”地毯”想找的是”谁在上面”,两者的信息需求完全不同。

QKQK^\top 不是对称矩阵(因为 WQWKW^Q \neq W^K),所以位置 iijj 的关注可以和 jjii 完全不同。

缺陷 2:角色绑定#

XXXX^\top 意味着同一个向量 xi\mathbf{x}_i 既当 Query 又当 Key。但上一讲已经说过:

  • Query:我想找什么 → “提问的方式”
  • Key:我能匹配什么 → “被搜索的方式”

一个词被别人搜索时应该强调的特征,和它自己去搜索别人时应该强调的特征,不是同一回事。

比如”加州”:

  • 别人搜它时(Key 角色),应该突出”这是一个地名”
  • 它搜别人时(Query 角色),可能在问”谁在这里做了什么”

WQW^QWKW^K 是两组不同的参数,让模型有能力分别学习”怎么提问”和”怎么被匹配”。

缺陷 3:表达瓶颈#

XXXX^\top 的每个元素是原始嵌入的点积,表达能力受限于嵌入空间本身。而 QK=XWQ(WK)XQK^\top = XW^Q(W^K)^\top X^\top 中间多了一个 WQ(WK)W^Q(W^K)^\top ——这是一个可学习的双线性变换,能捕获嵌入空间中更复杂的关系模式。

交互演示:投影如何改变”谁和谁相关”
同样 3 个词,点击不同的投影模式,看关系矩阵如何变化

这就是为什么多头注意力中,不同的头学到不同的 WQ,WKW^Q, W^K,就能在同一个输入上发现完全不同类型的关系——后面第 9 讲会详细展开。


“关系”到底是什么#

说到这里,我们需要纠正一个常见误解:QKQK^\top 的分数不是在标注语言学关系(主谓、定语、指代…)。

它衡量的是一个更底层的东西:当前位置的信息需求,和候选位置的信息供给,匹配程度有多高。

这个”匹配”可以是语义上的,也可以是句法上的、位置上的、甚至是纯粹统计上的。模型不在乎”这是什么关系”——它只在乎”从这个位置取信息,对我接下来要做的预测有没有帮助”。

交互演示:同一个词在不同上下文中的注意力模式
点击不同的句子,看”bank”(或其他多义词)的 Query 会关注完全不同的位置

这个演示说明了一个关键事实:“关系”不是词的固有属性,而是上下文决定的。 同一个词在不同句子中,它的 Query 向量不同(因为 qi=xiWQ\mathbf{q}_i = \mathbf{x}_i W^Q,而 xi\mathbf{x}_i 受 position embedding 和上下文影响),所以它关注的位置也不同。


点积 vs 其他相似度函数#

Attention 论文(Vaswani et al., 2017)为什么选了点积而不是别的?其实 Bahdanau (2015) 最初用的是加法注意力:

eij=vtanh(W1qi+W2kj)(加法注意力)e_{ij} = \mathbf{v}^\top \tanh(W_1 \mathbf{q}_i + W_2 \mathbf{k}_j) \quad \text{(加法注意力)} eij=qikj(点积注意力)e_{ij} = \mathbf{q}_i \cdot \mathbf{k}_j \quad \text{(点积注意力)} eij=qikjdk(缩放点积注意力)e_{ij} = \frac{\mathbf{q}_i \cdot \mathbf{k}_j}{\sqrt{d_k}} \quad \text{(缩放点积注意力)}
交互对比:三种注意力分数函数
点击切换,看不同计算方式产生的分数分布差异

Transformer 选择缩放点积的原因很直接:

加法注意力点积注意力缩放点积
计算方式vtanh(W1q+W2k)\mathbf{v}^\top \tanh(W_1\mathbf{q} + W_2\mathbf{k})qk\mathbf{q} \cdot \mathbf{k}qkdk\frac{\mathbf{q} \cdot \mathbf{k}}{\sqrt{d_k}}
参数量额外需要 W1,W2,vW_1, W_2, \mathbf{v}无额外参数无额外参数
计算效率慢(需要非线性)快(纯矩阵乘法)
数值稳定性tanh 限制范围dkd_k 大时不稳定稳定
表达能力理论上更强实践中差不多实践中差不多

结论:dkd_k 不大时,点积和加法注意力效果差不多。但点积能用高度优化的矩阵乘法硬件加速,工程上完胜。


QKQK^\top 的对角线:自相关#

分数矩阵的对角线 Sii=qikiS_{ii} = \mathbf{q}_i \cdot \mathbf{k}_i,表示位置 ii 对自己的关注程度。

一个常见的直觉是”自己和自己一定最相关”——但这不一定成立

交互演示:对角线一定最大吗?
点击矩阵中的行,看该位置是否最关注自己

SiiS_{ii} 不一定最大,因为 qi\mathbf{q}_iki\mathbf{k}_i 是通过不同的权重矩阵从同一个 xi\mathbf{x}_i 得来的。WQW^QWKW^K 把输入投影到了不同的空间——同一个输入在 Query 空间和 Key 空间的方向可能完全不同。

什么时候自关注会低?

  • 功能词(“的”、“在”、“了”):自身携带的语义很少,Query 更倾向于关注内容词
  • 上下文强依赖的词:比如代词”他”,必须去找先行词才能确定含义
  • 深层网络中:经过多层 Attention 后,每个位置已经融合了大量上下文,自关注的相对重要性下降

一个完整的例子:从嵌入到关系#

[猫, 坐, 垫子] 做一个完整的追踪:

步进演示:从词嵌入到关系矩阵的完整路径
逐步观察 x → q,k → 点积 → 关系分数 → softmax 权重(支持键盘 ←→)
0 / 5

文字版总结这个路径:

  1. 嵌入层给每个词一个静态向量 xi\mathbf{x}_i
  2. WQW^Qxi\mathbf{x}_i 投影到 Query 空间:“位置 ii 想了解什么”
  3. WKW^Kxj\mathbf{x}_j 投影到 Key 空间:“位置 jj 能提供什么线索”
  4. 两个空间中的向量点积衡量匹配度
  5. 匹配度经过 softmax 变成注意力权重——这就是”词与词的关系”

关键洞见:“关系”不存在于原始词嵌入中,而是通过 WQW^QWKW^K 的投影被”提取”出来的。 不同的 WQ,WKW^Q, W^K(不同的头)会提取出不同类型的关系。


对应的 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

运行后你会观察到:

  • XXXX^\top 严格对称,QKQK^\top 不对称
  • 对角线不总是最大
  • 每次随机初始化 WQ,WKW^Q, W^K,得到的关系矩阵完全不同

这一讲的三个核心结论#

  1. 点积衡量方向一致性qikj\mathbf{q}_i \cdot \mathbf{k}_j 越大,说明位置 ii 的信息需求和位置 jj 的可提供线索在方向上越匹配。

  2. QKQK^\topXXXX^\top 强在角色分离WQW^QWKW^K 让模型分别学习”怎么提问”和”怎么被匹配”,打破了 XXXX^\top 的对称约束和角色绑定。

  3. “关系”是动态的、学出来的。同一个词在不同上下文中 Query 不同,关注的位置也不同。这不是语言学标签,而是对下游任务有用的信息流动模式。


试着想一想#

  1. 如果强制 WQ=WKW^Q = W^KQKQK^\top 会变成对称矩阵吗?为什么?
  2. 点积可以为负数。在 Attention 中负分数意味着什么?softmax 之后这些位置的权重会变成什么?
  3. 在 Cross-Attention 中(Decoder 的 Q 查 Encoder 的 K),QKQK^\top 的形状是什么?还是 (n,n)(n, n) 吗?
  4. 如果把 QKQK^\top 换成 cosine similarity qkqk\frac{\mathbf{q} \cdot \mathbf{k}}{\|\mathbf{q}\|\|\mathbf{k}\|},有什么好处和坏处?
  5. 真实模型中,浅层和深层的注意力矩阵通常有什么不同?(提示:浅层更关注局部/位置,深层更关注语义。)

下一讲#

我们已经知道 QKQK^\top 产生分数,softmax 把分数变成权重。但下一讲要更深地钻进 softmax:

为什么 softmax 正好满足”注意力权重”的所有要求?它和 hardmax、sparsemax 有什么区别?


Attention 04:为什么 QKᵀ 表示词与词的关系
https://jerry609.github.io/blog/attention-04-qkt-meaning
Author Jerry
Published at March 16, 2026
Comment seems to stuck. Try to refresh?✨