Attention 背后的数学:Q、K、V 白话详解

Posted on Aug 31, 2026

基于 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 分别是:

符号英文白话含义
QQuery我现在想找什么信息
KKey我这里有什么特征,可以用来匹配
VValue真正要被取走的信息

可以把它类比成搜索系统:

  • 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_Q
  • W_K
  • W_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 句话:

  1. 先把每个词转换成数字向量 X。
  2. 用三个不同的权重矩阵生成 Q、K、V。
  3. 用 Q × Kᵀ 计算每个词应该关注哪些词。
  4. 除以 √dₖ,避免分数过大。
  5. 用 Softmax 把分数变成总和为 1 的注意力权重。
  6. 用这些权重加权混合 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 日。