Query-Key-Value 框架:概念、设计动机与解决的问题
Transformer 的核心创新之一是 Query-Key-Value (QKV) 框架。本文从”注意力要解决什么问题”出发,解释为什么需要把每个词拆成三种角色,每个角色各自的含义和数学作用,以及这个设计背后的深层动机。
1. 注意力机制要解决什么问题?
💡 核心问题:如何让序列中的每个位置”看到”其他位置的信息?
RNN 的困境:RNN 逐步处理序列,第 步的隐状态 包含了前 步的信息,但距离越远信息衰减越严重(梯度消失)。“The cat that the dog chased ran away” 中,“ran” 需要知道主语是 “cat” 而不是 “dog”,但两者相距很远。
注意力的解法:让每个位置直接”查询”所有其他位置,根据相关性分配权重,加权汇聚信息。这样任何两个位置之间的路径长度都是 ,而不是 RNN 的 。
但关键问题是:怎么定义”相关性”?谁和谁相关?这就是 QKV 框架回答的问题。
2. 为什么需要三种角色?
📐 从”直接比较”到 QKV 的演进
最朴素的方案:直接用词向量做点积
位置 和位置 的注意力分数就是两个词向量的点积。
问题:这迫使同一个向量既要”表达自己的含义”,又要”决定和谁相关”,还要”提供什么信息给别人”。三种功能耦合在一起,表达力严重受限。
类比:这就像要求每个人的名片既是搜索关键词、又是被搜索的标签、还是搜索结果——信息必然混淆。
QKV 的解法:给每个词三种独立的”角色”
- Query :“我在找什么?“——位置 发出的查询请求
- Key :“我是什么?“——位置 用来被匹配的标签
- Value :“如果你选中我,我提供什么信息?“——位置 实际贡献的内容
注意力分数 = Query 和 Key 的匹配度:
注意力输出 = 按匹配度加权 Value:
三个投影矩阵 是独立学习的,模型可以自由决定:
- 用什么特征去”查询”(Query 空间)
- 用什么特征去”被查询”(Key 空间)
- 查询到之后提供什么信息(Value 空间)
🔢 数值示例:QKV 三种角色的区分
设定:句子 “The animal didn’t cross the street because it was too tired”
当处理 “it” 这个词时:
| 角色 | 含义 | 这个例子中 |
|---|---|---|
| Query(“it” 的查询) | “我是一个代词,我在找我的指代对象” | 编码了”需要找名词性先行词”的信息 |
| Key(各词的标签) | “我是什么类型的词?” | 编码了”我是名词,可以被代词指代”; 也是名词但语义不匹配 |
| Value(各词提供的信息) | “如果你选中我,我的语义内容是什么?” | 包含”动物”的语义特征,传递给 “it” |
(高分) (低分)
→ “it” 的输出向量主要包含 “animal” 的语义信息,从而解析了指代关系。
关键洞察:Query 和 Key 在同一个”匹配空间”中操作(维度都是 ),但 Value 在独立的”内容空间”中(维度 ,可以不同)。匹配逻辑和信息传递是解耦的。
3. 每个组件的数学定义
📐 QKV 的形式化定义
输入:( 个位置,每个 维)
三个投影矩阵(可学习参数):
投影结果:
注意力计算:
形状追踪:
| 步骤 | 计算 | 形状 |
|---|---|---|
| 1. 投影 | ||
| 2. 打分 | ||
| 3. 缩放 | (除以标量不改变形状) | |
| 4. 归一化 | (每行归一化为概率分布) | |
| 5. 加权 |
参数量: (假设 )。在 BERT-base 中:(单个注意力头)。
4. 缩放因子 的必要性
📐 为什么要除以 ?
问题:当 较大时, 的方差会很大。
数学分析:假设 且独立,则:
当 时, 的标准差 。点积值分布在 范围(),softmax 对这么大的输入会产生接近 one-hot 的输出,梯度几乎为零。
解法:除以 使方差归一化为 1:
没有缩放 → softmax 变成 argmax → 梯度消失 → 训练失败。缩放是让 softmax 在有意义的区间内工作的关键。
🔢 数值示例:缩放的效果
设定:,三个位置的注意力分数
| 无缩放 () | 有缩放 () | |
|---|---|---|
| 位置 1 | 12.5 | 1.56 |
| 位置 2 | -8.3 | -1.04 |
| 位置 3 | 15.1 | 1.89 |
| softmax | [0.07, 0.00, 0.93] | [0.34, 0.06, 0.60] |
观察:无缩放时 softmax 接近 one-hot(),梯度 ;缩放后分布更平滑,梯度有效。
5. QKV 设计解决的根本问题
💡 从数据库检索的类比理解 QKV
QKV 框架本质上是一个可微分的软检索系统:
| 数据库操作 | 对应的注意力组件 | 区别 |
|---|---|---|
SQL WHERE 条件 | Query | 定义”要找什么” |
| 表的索引列 | Key | 定义”按什么匹配” |
SELECT 的返回列 | Value | 定义”返回什么” |
| 精确匹配 | softmax 注意力 | 软匹配(概率加权而非 0/1) |
| 返回一行 | 注意力输出 | 返回所有行的加权平均 |
为什么”软”很重要? 因为硬检索(argmax)不可微,无法用梯度下降训练。softmax 让检索变成连续可微的操作,同时保留了”聚焦于高相关性位置”的效果。
QKV 解决了什么问题?
- 长距离依赖:任何位置可以直接关注任何其他位置, 路径长度
- 并行计算:所有位置的注意力同时计算(vs RNN 的顺序瓶颈)
- 灵活的关系建模:通过学习 ,模型可以捕捉语法关系(主谓一致)、语义关系(指代消解)、位置关系(相邻词偏好)等任意模式
- 信息提取与匹配解耦:Query-Key 负责”找谁”,Value 负责”拿什么”——搜索逻辑和返回内容可以完全不同
6. Self-Attention vs Cross-Attention
📐 两种注意力的 QKV 来源
| 类型 | Q 来自 | K, V 来自 | 用途 |
|---|---|---|---|
| Self-Attention | 自身序列 | 自身序列 | 序列内部建模(BERT、GPT) |
| Cross-Attention | 目标序列 | 源序列 | 跨序列信息传递(翻译、T5) |
Self-Attention:,,(Q/K/V 都来自同一个 )
Cross-Attention:,,(Q 来自目标,K/V 来自源)
直觉:Cross-Attention 中,目标序列用 Query”提问”,源序列用 Key/Value”回答”。例如翻译时,中文 decoder 的 Query 去检索英文 encoder 的 Key/Value,找到对应的翻译信息。
7. 常见误区
⚠️ 常见误区
- 误区:Q、K、V 是三种不同的输入 → 正确:在 Self-Attention 中 Q/K/V 来自同一个输入 ,通过三个不同的投影矩阵映射到不同空间。“三种角色”不是三种输入,而是同一个输入的三种不同”视角”。
- 误区: 必须等于 → 正确:Query 和 Key 的维度必须相同(因为要做点积),但 Value 的维度可以不同。实践中通常设 ( 是头数),但这只是常见选择,不是必须的。
- 误区:没有 Q/K/V 投影也能做注意力 → 正确:技术上可以直接用 做点积(即 ),但这样 Q/K/V 共享同一个空间,模型无法独立学习”找谁”和”拿什么”的策略,表达力严重下降。
- 误区:Self-Attention 的 注意力矩阵编码的是”语法树” → 正确:注意力矩阵是软权重分配,不一定对应任何语言学结构。研究(Clark et al., 2019)发现某些注意力头确实捕捉了语法关系,但多数头的模式更难以语言学解释。
- 误区:缩放因子 可以省略 → 正确: 较大时(如 64),不缩放会导致 softmax 饱和、梯度消失。Vaswani 原文明确指出 additive attention 不需要缩放(因为 限制了值域),但 dot-product attention 必须缩放。
🔗 知识关联
- 与 Self-Attention 推导:QKV 的概念理解后,完整的矩阵推导和形状追踪见 Self-Attention 完整推导
- 与 Multi-Head Attention:多头注意力是让模型同时运行多组不同的 QKV 投影,每个头捕捉不同类型的关系,见 Multi-Head Attention
- 与 Cross-Attention(L04 Seq2Seq):QKV 框架统一了 Seq2Seq 注意力和 Self-Attention——前者是 Cross-Attention 的特例
- 与信息检索(L10 RAG):RAG 的检索步骤本质上是离散版的 QKV——Query 是用户问题,Key 是文档索引,Value 是文档内容