QKV · Query / Key / Value 篇
上一篇我们说清了 Attention 的直觉——"跳回去看一眼相关的词"。这一篇要把这个直觉翻译成一个公式:Attention(Q, K, V) = softmax(QKᵀ / √d) · V。看起来吓人,但只要你记住"图书馆查资料"这个比喻,它就变得再自然不过。
周末,你走进图书馆,想找一本关于"深度学习"的书。你会怎么做?
第一步:脑子里先形成"我要查什么"——"深度学习相关的书",这是你的查询意图。
第二步:走到目录检索机前,输入关键词。系统会拿你的关键词和每本书的索引标签做比对——"计算机 · 人工智能 · 深度学习"匹配度高、"烹饪 · 川菜"匹配度低。
第三步:系统告诉你:"这三本最相关,那两本次相关,其他不推荐"。你按推荐去书架取书,把书里的内容综合起来读。
这一整套流程,就是 QKV 的完整生活版本——查询、匹配、取值。
三个字母各是什么
对于句子里的每一个词,Transformer 会把它同时"变身"成三个不同的向量。不是三份复制,而是三种不同的"用途视角"——就像同一个人在图书馆里既是提问者、也是被别人翻阅的书目、还带着自己的一本内容。
| 字母 | 全称 | 角色 | 直觉理解 |
|---|---|---|---|
| Q | Query(查询) | "我想找什么" | 当前词发出的询问:"哪些词跟我有关?" |
| K | Key(键) | "我是什么" | 每个词自我描述的"标签":让别人用来匹配我。 |
| V | Value(值) | "我带来什么" | 每个词真正携带的信息内容,被别人加权取用。 |
数学上:一个词的原始向量 x,会被三个不同的矩阵 WQ, WK, WV 分别乘一下,就得到了这个词的 q, k, v 三个向量。这三个矩阵是模型训练时学出来的——它们决定了"这个词该以什么姿态提问、以什么姿态展示自己、以什么姿态贡献内容"。
把一句话想成一场相亲会:每个词是一位嘉宾。
Q(查询):你走过去时,脑子里"我在找什么样的对象"的清单——身高、爱好、性格。
K(键):每位嘉宾佩戴的"胸牌"——身高、爱好、性格的关键词摘要。
V(值):嘉宾本人——真正的内容、故事、经历。
你的清单(Q)去逐个匹配大家的胸牌(K),得出"跟谁最合"的分数,然后按分数决定坐下来听谁多聊、听谁少聊——听到的就是 V。
Attention 的完整四步公式
把生活场景翻译成公式,只有四步——记住它,你就懂了整个 Transformer 的核心运算。
1. 打分 · QKᵀ
当前词的 q 向量,和句子里每个词的 k 向量做点积——点积越大,说明两个向量方向越接近,代表越相关。
直觉:"我的查询"和"你的自我描述"匹配吗?
结果:得到一串"原始分数",句子多长就多少个数。
2. 缩放 · ÷ √d
把上一步的分数除以 √d(d 是向量维度,通常 64 或 128)。
直觉:把分数缩小到一个"温和"的范围,避免下一步 softmax 变得极端。
细节我们下面单独讲。
3. 归一化 · softmax
把一串分数转成一串"总和为 1"的概率权重。
直觉:"每本书我该看多重?"——不是绝对分数,而是相对比例。
结果:得到一组权重,比如 [0.7, 0.2, 0.05, 0.05],总和恰好是 1。
4. 加权求和 · · V
把每个词的 v 向量按上面得到的权重加权相加。
直觉:"把最相关的那本书的内容多抄一点,不相关的少抄"——最后得到当前词的新表示。
这一步就是 Attention 的最终输出。
把四步合成一行 · 那个著名的公式
把上面四步压成一行数学,就是这个 2017 年之后所有 AI 工程师都能背下来的公式:
Attention(Q, K, V) = softmax( QKᵀ / √d ) · V
拆开读一遍:把 Q 和 K 的转置相乘(打分)→ 除以 √d(缩放)→ 走一遍 softmax(归一化)→ 再乘 V(加权求和)。
整个 Transformer 的核心运算,就是这一行;接下来的多头、层数堆叠、Encoder/Decoder,都是围绕这一行做扩展。
为什么要除以 √d?· 一个容易被忽略的细节
公式里那个不起眼的 √d,是很多人第一次看时都会一笔带过的。但它其实是整个 Transformer 稳定训练的关键之一。
想象两个 d 维向量做点积。如果 d 很大(比如 512),点积的结果就会非常大——从统计上讲,方差会随 d 线性增长。而 softmax 有个不太友好的性质:输入数值一旦拉得太大,输出就会变得极端——最大的那个几乎是 1,其他全接近 0。
这会带来两个坏消息:
- 梯度消失softmax 输出接近 0/1 时,反向传播时梯度几乎为零——模型学不到东西。
- 注意力过于尖锐每个词只盯着一个词看,其他全忽略——失去了"综合关注多个词"的能力。
把点积除以 √d,正好把方差拉回到 1 附近——softmax 就能得到一个"温和分布",既有主次,也不会一边倒。这个看似不起眼的除法,是让 Transformer 能训练得动的核心技巧之一。没有这一除,你的 Transformer 十有八九训不起来。
把声音调太大,喇叭就炸了、只听得见一个声源;调太小,什么都听不见。
√d 缩放就是那个"合适的音量"——让每个词都能被听见,同时又有主有次。
这就是为什么 Transformer 又叫 "Scaled Dot-Product Attention"——多的那个"Scaled",就是指这一步缩放。
一个具体例子 · 用数字走一遍
假设有一句超短的话:"猫追球"——三个词。为了简单,我们把每个词的 Q/K/V 都设成 2 维向量(真实里通常是 64 或 128 维)。
| 词 | Q | K | V |
|---|---|---|---|
| 猫 | [1, 0] | [1, 0] | [1, 2] |
| 追 | [0, 1] | [0, 1] | [3, 0] |
| 球 | [1, 1] | [1, 1] | [0, 1] |
现在算"追"这个词的 Attention 输出:
- Step 1 · 打分"追"的 q=[0,1] 分别和"猫"的 k=[1,0](点积=0)、"追"的 k=[0,1](点积=1)、"球"的 k=[1,1](点积=1)。原始分数:[0, 1, 1]。
- Step 2 · 缩放除以 √2 ≈ 1.41 → [0, 0.71, 0.71]。
- Step 3 · Softmax得到权重 ≈ [0.22, 0.39, 0.39]。三者加起来是 1。
- Step 4 · 加权求和0.22×[1,2] + 0.39×[3,0] + 0.39×[0,1] = [1.39, 0.83]。这就是"追"的新表示。
看出来了吗?"追"的新表示,融合了"猫"、"追"、"球"三个词的信息,各按不同权重。这个新向量不再是原来那个孤立的"追",而是"在这个句子里、由这些邻居定义的追"。
QKV 让 Attention 变得可训练
你可能会问:为什么要搞出 Q、K、V 三个不同的向量?直接拿词向量互相点积不行吗?——
答案是:不行,会太死板。如果直接用词向量互相点积,那"相关性"就是固定的,无法根据不同任务、不同上下文灵活调整。
引入 WQ, WK, WV 三个可学习的投影矩阵后,情况就完全不同了——同一个词,可以以不同的姿态提问、以不同的姿态展示、以不同的姿态贡献。模型通过训练,学会"处理这个词时,我应该关心什么方面的信息"——这才是 QKV 设计的精髓。
K 和 V 为什么要分开 · 一个常被忽略的问题
还有一个精妙的设计——为什么 K 和 V 是两个不同的向量而不是同一个?直觉上,"用来匹配的东西"和"被取走的内容",好像也可以合并成一个吧?
但仔细想想图书馆的比喻——目录卡片(K)上写的是"标题、作者、关键词",简短、便于快速匹配;而书的正文(V)是完整内容,是你真正要读的东西。检索时用简短的标签匹配,取用时读完整的内容——这是两件不同的事,用不同的向量表达才最自然。
在数学上,把 K 和 V 分开,让模型能学到:"我用哪些维度做匹配、用哪些维度贡献内容"——这两组维度可以完全不同。比如"猫"这个词,用"名词-动物-主语候选"这些标签做匹配(K);但真正被取走的内容(V)可能包含"猫的语义、情感联想、上下文角色"等更丰富的东西。K 和 V 分离,让 Attention 的表达能力翻了一倍。
Attention 是"软"的——不是硬选一个
要理解 Attention 的另一个精妙之处:它给出的是一组权重分布,而不是"选中一个"的硬性选择。
很多人第一次学 Attention 时会想:"模型是不是像我们查资料一样,找到最相关的那一本书就打开?"——不是。Attention 是 softmax 输出的一组概率,比如 [0.4, 0.3, 0.15, 0.1, 0.05]——它不"选定"任何一个,而是按比例混合所有的候选。
这一点非常重要——它让 Attention 变成了一个可微分的操作,梯度可以通过它反向传播回去、调整参数。如果是"硬选一个",就没法算梯度,模型就没法学习了。"软注意力"是 Transformer 能被端到端训练的数学基础。
QKV 出现在 Transformer 的三个地方
了解了 QKV 的运作,还得清楚它在整个 Transformer 里出现的位置——共有三处,作用略有不同:
| 出现位置 | Q 来源 | K/V 来源 | 用途 |
|---|---|---|---|
| Encoder Self-Attention | 输入句子 | 同一输入句子 | 让每个输入词理解全句上下文 |
| Decoder Self-Attention(带掩码) | 已生成部分 | 同一已生成部分 | 生成下一词时回顾自己写过的内容 |
| Decoder Cross-Attention | Decoder 当前状态 | Encoder 全部输出 | 翻译时"看一眼源语言" |
三处使用的 QKV 是不同的三套矩阵——Encoder 有自己的一套 WQ/WK/WV,Decoder 的 Self-Attention 有另一套,Cross-Attention 又有一套。它们独立学习、各司其职。整个 Transformer 里,QKV 是最基础也是最反复出现的建筑构件。
QKV 是 Attention 的心脏:Q 提问、K 展示、V 贡献。四步公式——打分 → 缩放 → 归一化 → 加权求和——就是 Transformer 每一层里最核心的运算。
但一组 QKV 只能捕捉一种相关性。人类看一句话时,会同时关注语法、语义、指代、情感——一组 QKV 显然不够用。下一篇,我们把"一组"变成"很多组"——多头注意力。