Attention 背后的数学:Q、K、V 白话详解
基于 Outcome School 文章《Math behind Attention - Q, K, and V》的中文整理与扩展讲解。
原文链接:https://outcomeschool.com/blog/math-behind-attention-qkv
原文作者:Amit Shekhar
原文页面标注日期:2026 年 4 月 3 日
一句话理解 Attention
Attention 可以理解成:
每个词都先问一句:“当前情况下,我应该重点参考哪些词?”然后根据相关程度,从其他词那里提取信息,形成一个包含上下文的新表示。
例如句子:
I love AI
处理 I 时,模型可能会发现 love 和它关系比较大,于是给 love 更高权重;处理 AI 时,也可能重点参考 love。
完整公式是:
Attention(Q, K, V)
= softmax(Q × Kᵀ / √dₖ) × V
这条公式可以拆成 6 步:
文字
↓ embedding
数字向量 X
↓
生成 Q、K、V
↓
Q 和 K 做匹配
↓
Softmax 转成权重
↓
用权重加权混合 V
↓
得到包含上下文的新向量
一、文字为什么要先变成数字?
神经网络不能直接处理 I、love、AI 这些文字,它只能处理数字。
所以 Transformer 会先把每个词变成一组数字,叫做 embedding(词向量)。
文章为了方便演示,使用了非常小的 4 维向量:
I → [1, 0, 1, 0]
love → [0, 1, 0, 1]
AI → [1, 1, 0, 0]
把它们堆起来,就是输入矩阵 X:
X =
[ 1 0 1 0 ] ← I
[ 0 1 0 1 ] ← love
[ 1 1 0 0 ] ← AI
它的形状是:
X: 3 × 4
含义是:
- 3 行:有 3 个词
- 4 列:每个词用 4 个数字表示
需要注意:这些数字只是教学用的简单数字。
在真实模型里,embedding 通常是几百维甚至上千维,而且每个数字不一定有直观的人类含义。例如,不能简单地说“第 1 位代表感情,第 2 位代表名词”。
二、Q、K、V 是什么?
Q、K、V 分别是:
| 符号 | 英文 | 白话含义 |
|---|---|---|
| Q | Query | 我现在想找什么信息 |
| K | Key | 我这里有什么特征,可以用来匹配 |
| V | Value | 真正要被取走的信息 |
可以把它类比成搜索系统:
- Query:你输入的搜索问题
- Key:每篇文章的标题、标签、关键词
- Value:文章真正的内容
搜索过程大概是:
Query 和所有 Key 比较
→ 判断哪些内容相关
→ 从相关内容对应的 Value 中提取信息
在 Self-Attention 中,I、love、AI 这三个词都会分别生成自己的 Q、K、V。
也就是说:
I → Q_I、K_I、V_I
love → Q_love、K_love、V_love
AI → Q_AI、K_AI、V_AI
它们不是三组不同的词,而是每个词都同时拥有 Q、K、V 三种表示。
三、如何从 X 生成 Q、K、V?
模型使用三个不同的权重矩阵:
These weight matrices are learned during training.
Q = X × W_Q
K = X × W_K
V = X × W_V
文章中使用的权重矩阵是:
W_Q =
[ 1 0 1 ]
[ 0 1 0 ]
[ 1 0 0 ]
[ 0 1 1 ]
W_K =
[ 0 1 0 ]
[ 1 0 1 ]
[ 0 0 1 ]
[ 1 1 0 ]
W_V =
[ 1 0 0 ]
[ 0 1 0 ]
[ 0 0 1 ]
[ 1 1 0 ]
它们的形状都是:
4 × 3
因为输入向量是 4 维,经过变换后希望得到 3 维的 Q、K、V 向量。
3.1 计算 Q
最终得到:
Q =
[ 2 0 1 ] ← I
[ 0 2 1 ] ← love
[ 1 1 1 ] ← AI
举例,第一行 I 的 Q 是:
[1*1 + 0*0 + 1*1 + 0*0, 1*0 + 0*1 + 1*0 + 0*1, 1*1 + 0*0 + 1*0 + 0*1] = [2, 0, 1]
[1, 0, 1, 0] × W_Q
= [2, 0, 1]
第二行 (“love”): [0*1 + 1*0 + 0*1 + 1*0, 0*0 + 1*1 + 0*0 + 1*1, 0*1 + 1*0 + 0*0 + 1*1] = [0, 2, 1]
第三行 (“AI”): [1*1 + 1*0 + 0*1 + 0*0, 1*0 + 1*1 + 0*0 + 0*1, 1*1 + 1*0 + 0*0 + 0*1] = [1, 1, 1]
3.2 计算 K
K =
[ 0 1 1 ] ← I
[ 2 1 1 ] ← love
[ 1 1 1 ] ← AI
3.3 计算 V
V =
[ 1 0 1 ] ← I
[ 1 2 0 ] ← love
[ 1 1 0 ] ← AI
这里最重要的是:
Q用来提问K用来匹配V保存实际信息
真实模型不会手工指定这些权重矩阵,而是在训练过程中自动学习出来。文章中的数字只是为了让计算能够手算。
四、Q × Kᵀ:计算词与词之间的相关程度
下一步是:
Scores = Q × Kᵀ
这里的 Kᵀ 表示 K 的转置,也就是把行和列互换。
原来的 K:
K =
[ 0 1 1 ] ← I
[ 2 1 1 ] ← love
[ 1 1 1 ] ← AI
转置后:
Kᵀ =
[ 0 2 1 ]
[ 1 1 1 ]
[ 1 1 1 ]
为什么要转置?
因为我们希望:
- Q 的每一行代表一个“当前正在提问的词”
- K 的每一行代表一个“候选参考词”
- 两者两两比较
计算结果:
Scores =
[ 1 5 3 ] ← I
[ 3 3 3 ] ← love
[ 2 4 3 ] ← AI
行和列的含义是:
行:当前哪个词在寻找信息
列:它正在参考哪个词
因此:
Scores[ I ][ love ] = 5
表示 I 的 Query 和 love 的 Key 匹配程度是 5。
举例:I 和 love 的匹配
I 的 Query:
Q_I = [2, 0, 1]
love 的 Key:
K_love = [2, 1, 1]
点积计算:
2×2 + 0×1 + 1×1
= 4 + 0 + 1
= 5
在 I 这一行中:
I → I = 1
I → love = 5
I → AI = 3
所以当前这组人为设置的数字认为:
I 最应该关注 love
但要注意:
这个例子里的“
I最关注love”只是演示结果,不代表模型真的通过这几个简单数字理解了英语语义。
在真实模型中,Q 和 K 的权重是训练出来的,匹配结果才会逐渐反映语法、语义和上下文关系。
五、为什么要除以 √dₖ?
公式中还有一步:
Scores / √dₖ
这里:
dₖ = Key 向量的维度
本例中的 K 是 3 维,因此:
dₖ = 3
√3 ≈ 1.732
于是:
Scaled Scores = Scores / √3
结果约为:
[ 0.577 2.887 1.732 ] ← I
[ 1.732 1.732 1.732 ] ← love
[ 1.155 2.309 1.732 ] ← AI
为什么要缩小数值?
因为向量维度越大,点积结果通常也会变大。如果直接把很大的数字送进 Softmax:
[100, 2, 1]
Softmax 可能会变成接近:
[1.0, 0.0, 0.0]
这样模型几乎只选择一个词,其他词的权重全部接近 0,梯度也会变得不利于训练。
除以 √dₖ 的作用,就是让点积数值保持在比较稳定的范围内。
更深入一点看:
- 每个维度都可能产生正负贡献
- 维度越多,点积的波动规模大约会随
√dₖ增长 - 除以
√dₖ可以把这种增长抵消掉
所以,缩放不会改变分数的相对大小,只是把整体数值压小。
六、Softmax:把分数变成注意力权重
经过缩放后,模型还不能直接把这些数字当成百分比。
例如 I 这一行是:
[0.577, 2.887, 1.732]
Softmax 会把它转换成总和为 1 的权重:
Softmax(x_i) = e^(x_i) / 所有 e^(x_j) 的总和
计算后:
I 这一行:
[0.070, 0.707, 0.223]
对应关系是:
I → I 7.0%
I → love 70.7%
I → AI 22.3%
这说明:
处理 I 时:
70.7% 的参考信息来自 love
22.3% 的参考信息来自 AI
7.0% 的参考信息来自 I 自己
love 这一行的分数全部相等:
[1.732, 1.732, 1.732]
所以 Softmax 后也会完全平均:
[0.333, 0.333, 0.333]
AI 这一行:
[1.155, 2.309, 1.732]
Softmax 后:
[0.168, 0.533, 0.299]
也就是:
AI → I 16.8%
AI → love 53.3%
AI → AI 29.9%
注意一个非常重要的点:
Softmax 的每一行加起来都是 1,但它不是在判断“哪个词正确”,而是在分配“参考比例”。
七、Attention Weights × V:真正提取信息
到这里我们只有“应该关注谁”的权重,还没有真正拿到信息。
真正的信息保存在 V 中:
V =
[ 1 0 1 ] ← I
[ 1 2 0 ] ← love
[ 1 1 0 ] ← AI
现在用注意力权重对 V 做加权平均。
Attention Weights = 我应该关注谁、关注多少
V = 每个词真正提供什么信息
Output = 按照关注比例混合信息之后的新表示
7.1 计算 I 的新表示
I 的注意力权重是:
[0.070, 0.707, 0.223]
所以:
Output_I
= 0.070 × V_I
+ 0.707 × V_love
+ 0.223 × V_AI
代入:
= 0.070 × [1, 0, 1]
+ 0.707 × [1, 2, 0]
+ 0.223 × [1, 1, 0]
分别计算每一列:
第 1 维:
0.070×1 + 0.707×1 + 0.223×1
= 1.000
第 2 维:
0.070×0 + 0.707×2 + 0.223×1
= 1.637
第 3 维:
0.070×1 + 0.707×0 + 0.223×0
= 0.070
因此:
Output_I = [1.000, 1.637, 0.070]
这个向量不再只是 I 自己的信息,而是:
I 自己的信息
+ love 的信息
+ AI 的信息
只不过 love 的贡献最大,因为它的权重是 0.707。
7.2 完整输出
Output =
[ 1.000 1.637 0.070 ] ← I
[ 1.000 1.000 0.333 ] ← love
[ 1.000 1.365 0.168 ] ← AI
这就是 Attention 的核心:
每个词都会根据相关程度,从整句话中收集其他词的信息,生成一个新的、带上下文的表示。
原来的 I:
只包含 I 自己的信息
Attention 之后的 I:
包含 I 自己的信息,
同时融合了 love 和 AI 的信息,
而且主要融合了 love 的信息
八、用矩阵形状理解整个过程
假设:
- 句子有
n个词 - 每个输入向量有
d_model维 - Q、K 的维度是
d_k - V 的维度是
d_v
那么矩阵形状如下:
X : n × d_model
W_Q : d_model × d_k
W_K : d_model × d_k
W_V : d_model × d_v
Q : n × d_k
K : n × d_k
V : n × d_v
Kᵀ : d_k × n
Q × Kᵀ : n × n
Q × Kᵀ 得到的是一个 n × n 的矩阵,因为它需要记录:
每一个词
对每一个词
的关注程度
然后:
Attention Weights : n × n
V : n × d_v
Attention Weights × V : n × d_v
最终每个词仍然对应一个向量,但这个向量已经融合了整句话的信息。
九、最容易混淆的几个地方
1. Q、K、V 不是三组不同的词
错误理解:
Q 是一部分词
K 是另一部分词
V 是第三部分词
正确理解:
每一个词都同时生成 Q、K、V
例如 I 同时有:
Q_I、K_I、V_I
只是这三个向量承担的职责不同。
2. Q 和 K 负责“找关系”,V 负责“提供内容”
可以记成:
Q × Kᵀ → 应该关注谁
Attention Weights × V → 实际拿什么信息
Q、K 的分数本身不是最终输出。
3. 注意力权重不是最终答案
例如:
I 对 love 的权重是 0.707
这只说明处理 I 时,会较多参考 love。
最终的输出还要把 love 对应的 Value 向量混合进来。
4. 文章中的 embedding 和权重是人为简化的
真实模型中的:
- embedding
W_QW_KW_V
都不是这样整齐的 0、1,而是大量浮点数,例如:
0.137, -0.824, 1.293, ...
这些参数通过训练自动学习。文章选用简单整数,是为了让初学者可以手算整个过程。
十、真实的大语言模型还会多做什么?
文章展示的是一个简化版的单头 Self-Attention。真实 LLM 通常还会加入以下机制。
1. Causal Mask
生成文字时,当前位置不能偷看未来。
例如模型正在生成:
我 喜欢
处理“喜欢”时,不能看到后面还没生成的词。
因此语言模型会把未来位置遮住,这叫:
Causal Attention Mask
2. Multi-Head Attention
真实模型通常不会只做一组 Q、K、V,而是并行做很多组,叫多头注意力。
不同的头可能分别学习:
- 主语和谓语关系
- 代词指代关系
- 时间关系
- 位置关系
- 语义相似关系
最后再把多个头的结果合并起来。
3. Attention 不是整个 Transformer
Attention 只是 Transformer 的核心模块之一。
完整 Transformer 通常还包括:
Token Embedding
位置编码
Multi-Head Attention
残差连接
LayerNorm
前馈神经网络
输出层
所以更准确的说法是:
Attention 负责让词与词之间交换上下文信息;Transformer 再通过其他模块继续加工这些信息。
十一、总结
把整篇文章压缩成下面 6 句话:
- 先把每个词转换成数字向量
X。 - 用三个不同的权重矩阵生成
Q、K、V。 - 用
Q × Kᵀ计算每个词应该关注哪些词。 - 除以
√dₖ,避免分数过大。 - 用 Softmax 把分数变成总和为 1 的注意力权重。
- 用这些权重加权混合
V,得到带有上下文的新向量。
最终公式:
Attention(Q, K, V)
= softmax(Q × Kᵀ / √dₖ) × V
最核心的直觉是:
Q:我想找什么?
K:我有什么可以匹配?
V:匹配上以后,我真正提供什么?
因此,Attention 并不是某种神秘的“思考动作”,从数学上看,它本质上是:
先计算相关性,再把多个向量按相关性做加权平均。
来源
[1] Math behind Attention - Q, K, and V — Amit Shekhar,页面标注发布日期为 2026 年 4 月 3 日。