Transformer 核心:Q / K / V 彻底讲透

为什么 Transformer 能"看懂上下文"?秘密全在这三个字母里:Query(查询)、Key(键)、Value(值)。 这篇用类比、流程图、数值例子和两组可交互演示,帮你从"知道名词"到"真正理解它怎么算、为什么这样设计"。

一句话定义:自注意力用 Q 去问"我要找什么",用 K 给每个词贴"能被怎样匹配"的标签,用 V 携带"这个词真正要贡献的内容";算完 Q 与所有 K 的匹配度,按匹配度高低去加权取回对应的 V,就得到每个词"看过全局后"的新表示。

一、先建立直觉:注意力 = 一场"检索 + 取内容"

注意力机制干的事,本质上和人类查资料一模一样:

关键洞察:Value 和 Key 往往来自同一个词——这个词既"标了索引(Key)",又"装了内容(Value)"。Query 则通常是"当前正在处理的那个词"。这样每个词都能根据上下文,动态地决定"我该从别人那里借鉴多少信息"。

二、三个生活类比(看图)

Query(你的问题) "我想找和 『主语』相关的 动作" 查询需求向量 资料库:每个词 = (Key 标签, Value 内容) Key: 主语标签 Value: 主语内容 Key: 动作标签 Value: 动作内容 Key: 修饰标签 Value: 修饰内容 ①匹配 ②取回Value(加权)

图里虚线框的那一项,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 是模型在训练中学到的参数矩阵。因为三套矩阵不同,同一个词就"变"成了三种不同用途的向量:一个负责提问、一个负责被匹配、一个负责出内容。

输入 X (每词向量) × WQ → Q × WK → K × WV → V Q K V ↓ 进入 ↓ 注意力 ↓ 计算 提问者 索引库 内容库
为什么不直接用输入当 K/V?因为不同的任务需要不同的"视角":同一个词在"作为主语提问"和"作为宾语被匹配"时,理想表示是不一样的。三个独立矩阵让模型能分别学到最合适的三种投影

四、一次注意力的完整计算(含数值例子)

拿到 Q、K、V 后,核心公式只有一行:

Attention(Q,K,V) = softmax( QKT / √dk ) · V

把它拆成 5 步,每一步都在下面这张流程图里,并配一个 3 个 token 的小例子(维度 d=2,数值为示意)。

① 算相似度 QKᵀ:每对词多像 ② 缩放 ÷√dₖ 防梯度消失 ③ 归一化 softmax→权重和=1 ④ 加权 × V ⑤ 输出 融合后表示 ① QKᵀ (原始相似度矩阵) [ 1.0 0.0 1.0 ] [ 0.0 1.0 1.0 ] [ 1.0 1.0 2.0 ] ② ÷√2 ≈÷1.414 [ .71 0 .71 ] [ 0 .71 .71 ] [ .71 .71 1.41 ] ③ softmax(权重) [.40 .20 .40] [.20 .40 .40] [.25 .25 .50] ④ 权重·V 每行 = 所有V 的加权和

分步看懂

一个最容易被忽略的点:输出是所有 V 的加权和,不是只取最大那一个。注意力是"软性的、可分的"融合——这正是对比"硬检索/最大匹配"更平滑、更可微、更适合反向传播训练的地方。

五、亲手玩:两组交互演示

演示 1 · 注意力热力图:点一个词,看它"在看谁"

下面用一句话 小明 喜欢 踢 足球。点击任意一行(或左侧词),下方会画出这个词作为 Query 时,对其它每个词的注意力权重。颜色越深 = 越关注。

提示:试试点"踢"——它几乎只看"足球"(动宾关系);点"小明"——它最关注"喜欢"(主谓)。这些权重是示意性的,真实模型由训练学出。

演示 2 · 为什么必须 ÷√dₖ?看维度如何"引爆"点积

若 Q、K 各分量独立、均值 0、方差 1,则它们点积的方差 = 维度 dₖ(标准差 = √dₖ)。维度越大,点积越容易"飞到很大",softmax 就变成几乎只选一个(梯度≈0,学不动)。除以 √dₖ 后,方差被拉回 1。拖动滑块看 dₖ 变化时,未缩放 vs 缩放后的典型幅度:

维度 dₖ = 64

未缩放:典型 |Q·K| ≈ √dₖ

缩放后:|Q·K|/√dₖ ≈ 1

六、它到底解决了什么"老问题"?

在 Transformer 之前,序列建模主要靠 RNN / LSTM 和 CNN,它们各有痛点。注意力的出现,正是为了针对性地解决它们。

RNN/LSTM(顺序) x1 x2 x3 x4 x1 的信息要一步步传到 x4 → 长程衰减/难并行 CNN(局部窗口) x1 x2 x3 x4 只看邻近窗口 → 需堆很多层才看全局 Self-Attention(全局直连) x1 x2 x3 x4 任意两位置 O(1) 直达 · 全并行 · 长程不衰减
老方案痛点注意力如何解
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。

Head 1
语法
Head 2
语义
Head 3
指代
Head 4
位置
… 拼接
融合

多头不是新原理,而是"把同一套 Q/K/V 机制并行跑很多份、各看一面,再合起来"——所以理解了一个头,就理解了全部。真正的复杂性在"切分与拼接",不在 Q/K/V 本身。

九、小结 · 自测清单

文档生成于 2026-08-23 · 仅供学习理解 Transformer 原理。具体数值与权重为示意性说明,真实模型的 Q/K/V 由大规模训练自动习得。落地结论请以官方论文(Vaswani et al., 2017 "Attention Is All You Need")与最新研究为准。