Transformer 核心:Q / K / V 彻底讲透
为什么 Transformer 能"看懂上下文"?秘密全在这三个字母里:Query(查询)、Key(键)、Value(值)。
这篇用类比、流程图、数值例子和两组可交互演示,帮你从"知道名词"到"真正理解它怎么算、为什么这样设计"。
一句话定义:自注意力用 Q 去问"我要找什么",用 K 给每个词贴"能被怎样匹配"的标签,用 V 携带"这个词真正要贡献的内容";算完 Q 与所有 K 的匹配度,按匹配度高低去加权取回对应的 V,就得到每个词"看过全局后"的新表示。
一、先建立直觉:注意力 = 一场"检索 + 取内容"
注意力机制干的事,本质上和人类查资料一模一样:
- 你心里有一个问题 / 需求(这就是 Query)。
- 资料库里每一条内容都贴着标签 / 索引(这就是 Key)。
- 你要的不是标签本身,而是标签背后那真正的内容(这就是 Value)。
- 你拿 Query 去和每条 Key 比对相似度,相似度越高的内容,你取回得越多(加权求和)。
关键洞察:Value 和 Key 往往来自同一个词——这个词既"标了索引(Key)",又"装了内容(Value)"。Query 则通常是"当前正在处理的那个词"。这样每个词都能根据上下文,动态地决定"我该从别人那里借鉴多少信息"。
二、三个生活类比(看图)
图里虚线框的那一项,Key 和 Query 最匹配,于是它的 Value 被"取回得最多"。这就是注意力的全部动作:匹配 Key → 按匹配度取 Value。
Q · Query
"我正在处理的这个词,想从别人身上找什么信息?"
像检索时的搜索词。
K · Key
"我这个词,方便被哪种需求匹配到?"
像图书馆的索引标签,用来被比对。
V · Value
"我这个词真正要贡献的内容是什么?"
像书架上被借走的那本书本身。
三、Q、K、V 到底从哪来?——不是输入,是"算出来"的
很多人误以为 Q/K/V 是输入的一部分。其实,它们是对同一个输入表示做三次不同的线性投影(乘可学习矩阵)得到的:
Q = X · WQ K = X · WK V = X · WV
其中 X 是输入序列(每个 token 一个向量),W_Q / W_K / W_V 是模型在训练中学到的参数矩阵。因为三套矩阵不同,同一个词就"变"成了三种不同用途的向量:一个负责提问、一个负责被匹配、一个负责出内容。
为什么不直接用输入当 K/V?因为不同的任务需要不同的"视角":同一个词在"作为主语提问"和"作为宾语被匹配"时,理想表示是不一样的。三个独立矩阵让模型能分别学到最合适的三种投影。
四、一次注意力的完整计算(含数值例子)
拿到 Q、K、V 后,核心公式只有一行:
Attention(Q,K,V) = softmax( QKT / √dk ) · V
把它拆成 5 步,每一步都在下面这张流程图里,并配一个 3 个 token 的小例子(维度 d=2,数值为示意)。
分步看懂
- ① 相似度 QKᵀ:第 i 行第 j 列 = 第 i 个词(用它的 Q)与第 j 个词(用它的 K)的点积。点积大 = 这两个词"语义上该多交流"。
- ② 缩放 ÷√dₖ:维度越高,点积方差越大(会"爆炸"),softmax 会变得极尖锐、梯度接近 0,难训练。除以 √dₖ 把数值拉回稳定区间。下面有专门交互演示这点。
- ③ softmax:把每行变成"和为 1 的权重",代表"第 i 个词该把多少注意力分给第 j 个词"。
- ④ 加权取 V:用这些权重,把所有词的 V 做加权和。权重高的词,它的内容被"搬"得更多进当前词的新表示。
- ⑤ 输出:每个词都得到了一个"融合了全局相关信息"的新向量——这就是"自注意力"的"自":每个词都同时看了整句话再更新自己。
一个最容易被忽略的点:输出是所有 V 的加权和,不是只取最大那一个。注意力是"软性的、可分的"融合——这正是对比"硬检索/最大匹配"更平滑、更可微、更适合反向传播训练的地方。
五、亲手玩:两组交互演示
演示 1 · 注意力热力图:点一个词,看它"在看谁"
下面用一句话 小明 喜欢 踢 足球。点击任意一行(或左侧词),下方会画出这个词作为 Query 时,对其它每个词的注意力权重。颜色越深 = 越关注。
提示:试试点"踢"——它几乎只看"足球"(动宾关系);点"小明"——它最关注"喜欢"(主谓)。这些权重是示意性的,真实模型由训练学出。
演示 2 · 为什么必须 ÷√dₖ?看维度如何"引爆"点积
若 Q、K 各分量独立、均值 0、方差 1,则它们点积的方差 = 维度 dₖ(标准差 = √dₖ)。维度越大,点积越容易"飞到很大",softmax 就变成几乎只选一个(梯度≈0,学不动)。除以 √dₖ 后,方差被拉回 1。拖动滑块看 dₖ 变化时,未缩放 vs 缩放后的典型幅度:
六、它到底解决了什么"老问题"?
在 Transformer 之前,序列建模主要靠 RNN / LSTM 和 CNN,它们各有痛点。注意力的出现,正是为了针对性地解决它们。
| 老方案 | 痛点 | 注意力如何解 |
| RNN/LSTM | 必须顺序计算,无法并行;信息逐时间步传递,长程依赖衰减/易忘 | 所有位置一次性算出 QKᵀ,完全并行;任意两词直接相连 |
| CNN | 感受野局部,要看全局得堆很多层,路径长 | 单层即得全局依赖,路径长度 O(1) |
| 固定词向量 | 一个词只有一个静态表示,不懂上下文 | 每个词的输出随上下文动态变化(一词多义被自然处理) |
七、所以 Q/K/V 的"应用目的"到底是什么?
把上面所有内容收拢成一句话:Q/K/V 这套机制,是为了让模型能够"根据当前需要,从整段输入里动态地、有选择地抽取相关信息",并把这个选择过程变成可微、可并行、可学习的运算。
目的 1:动态上下文融合
同一个词在不同句子里,经注意力"看"完别人后表示不同,天然处理一词多义与指代。
目的 2:捕捉任意距离依赖
不靠距离、不靠层数,首尾两个词也能直接建立强联系。
目的 3:可并行 + 可学习
矩阵运算一次成型,且权重由 W_Q/W_K/W_V 经反向传播自动学出"该关注什么"。
一句话记住它:Q 是"我想找",K 是"我能怎么被找",V 是"我有什么可给";
用 Q 去匹配 K 得到权重,再用权重把 V 融合回来——这就是 Transformer 理解语言的全部核心引擎。
八、延伸:为什么实际用的是"多头"注意力?
单个 Q/K/V 只能学到一种"关注模式"(比如只关注语法依存)。实际模型把 Q/K/V 切成多个"头",每个头用不同的 W_Q/W_K/W_V,于是可以同时关注多种不同关系(一个头看语法、一个头看语义、一个头看指代……),最后拼接。这就是 Multi-Head Attention。
多头不是新原理,而是"把同一套 Q/K/V 机制并行跑很多份、各看一面,再合起来"——所以理解了一个头,就理解了全部。真正的复杂性在"切分与拼接",不在 Q/K/V 本身。
九、小结 · 自测清单
- ✅ Q/K/V 不是输入,是输入 X 乘三个可学习矩阵
W_Q/W_K/W_V 投影出来的。
- ✅ Q 提问、K 被匹配、V 出内容;用
softmax(QKᵀ/√dₖ)·V 得到融合表示。
- ✅ ÷√dₖ 是为了稳定数值、保护梯度(维度越高越必要)。
- ✅ 输出是所有 V 的加权和(软融合),不是硬选一个。
- ✅ 它解决了 RNN 难并行/长程衰减、CNN 局部、静态词向量不懂上下文的问题。
- ✅ 应用目的:让模型按需、动态、可学习地从全局抽取信息。