AI Attention机制详解:用Query、Key、Value看懂注意力计算
Attention 机制解决的问题很具体:当模型处理一个词时,如何从句子其他位置提取有用信息,而不是只依赖固定窗口或循环状态。
它的基本动作是给每个位置算一个相关性分数,再按分数加权汇总信息。
理解这条主线,就能看懂 Transformer 里大部分注意力变体。
先分清 Query、Key、Value 各自负责什么
Attention 常被类比成查字典,但真正要抓住的是三个角色的分工:
- Query(查询):当前要处理的位置发出的“我需要什么信息”的向量。
- Key(键):每个位置提供的“我能匹配什么”的向量,用来和 Query 算相关性。
- Value(值):每个位置实际携带的内容向量,按相关性权重被汇总。
计算时先用 Query 和所有 Key 做点积得到分数,再经过缩放和 Softmax 变成权重,最后用权重对 Value 加权求和。
输出向量的每一维都来自 Value 的混合,混合比例由 Query 与 Key 的匹配程度决定。
缩放点积注意力的计算步骤
以单个 Query 和长度为 n 的序列为例,标准缩放点积注意力可以拆成四步:
- 算分数:
scores = Q · K^T,得到当前 Query 与每个 Key 的点积。 - 缩放:
scores = scores / sqrt(d_k),其中d_k是 Key 向量的维度。维度越大点积方差越大,不缩放会让 Softmax 过度尖锐。 - 归一化:对分数做 Softmax,得到总和为 1 的注意力权重。
- 加权求和:
output = weights · V,用权重混合所有 Value。
如果写成矩阵形式,就是:
Attention(Q, K, V) = softmax(QK^T / sqrt(d_k)) V
这里的 sqrt(d_k) 不是可调超参数,而是按维度做标准化。
很多入门解释会省略缩放,但实际实现中这一步直接影响训练稳定性。
自注意力与多头注意力不是两套公式
自注意力指 Query、Key、Value 都来自同一个序列。
比如处理句子“猫追老鼠”时,每个词都同时充当查询者和被查询者,因此能直接建模词与词之间的关系,不受距离限制。
多头注意力则是在同一层里并行做多组注意力,每组使用不同的线性投影得到自己的 Q、K、V,最后把多个头的输出拼接再投影。
它的意义不是简单增加参数量,而是让不同头关注不同模式,例如有的头偏向局部相邻词,有的头偏向句法依存。
两者关系可以这样记:自注意力描述“Q、K、V 从哪来”,多头注意力描述“做几组、怎么合并”。
实际模型通常同时使用两者。
从公式到代码:用 NumPy 验证一次权重
不需要深度学习框架也能验证 Attention 的计算过程。
下面用 NumPy 跑一个最小例子,重点看权重是否归一化、输出维度是否和 Value 一致:
import numpy as np
np.random.seed(0)
q = np.array([[1.0, 0.0]])
k = np.array([[1.0, 0.0], [0.0, 1.0], [1.0, 1.0]])
v = np.array([[10.0, 0.0], [0.0, 10.0], [5.0, 5.0]])
d_k = k.shape[1]
scores = q @ k.T / np.sqrt(d_k)
weights = np.exp(scores) / np.exp(scores).sum(axis=1, keepdims=True)
output = weights @ v
print(weights)
print(output)
执行后应看到 weights 每行和为 1,output 形状为 (1, 2),与 Value 的列数一致。
如果权重和明显不等于 1,优先检查 Softmax 是否按最后一维归一化;
如果输出维度不对,检查矩阵乘法方向。
常见误解和避坑点
- 把注意力权重当成解释性证据:权重高只说明当前计算中该位置贡献大,不能直接等同于模型决策原因。
- 忽略 mask 的作用:解码器自注意力需要因果 mask,把未来位置分数设为负无穷后再 Softmax,否则训练时会看到不该看的信息。
- 以为缩放可有可无:
sqrt(d_k)影响 Softmax 的平滑程度,去掉后大维度下梯度容易不稳定。 - 混淆注意力头和隐藏维度:多头注意力的总输出维度通常等于模型隐藏维度,不是每个头都占满隐藏维度。
怎么确认自己真的理解了
可以用三个检查点验证:第一,给定 Q、K、V 能手动算出权重和输出;
第二,能说清自注意力和多头注意力分别解决什么问题;
第三,在代码里改动 d_k 或去掉缩放,观察 Softmax 权重的变化。
能解释这些变化,比背公式更有用。
Attention 机制本身并不神秘,核心就是相关性打分加加权汇总。
把 Q、K、V 的角色、缩放点积公式和 mask 这几个点吃透,再去看 Transformer 的完整结构会顺畅很多。