Query-Key-Value 框架:概念、设计动机与解决的问题

分类: 注意力与Transformer · 难度: 中级 · 关联讲座: L05

Transformer 的核心创新之一是 Query-Key-Value (QKV) 框架。本文从”注意力要解决什么问题”出发,解释为什么需要把每个词拆成三种角色,每个角色各自的含义和数学作用,以及这个设计背后的深层动机。


1. 注意力机制要解决什么问题?

💡 核心问题:如何让序列中的每个位置”看到”其他位置的信息?

RNN 的困境:RNN 逐步处理序列,第 tt 步的隐状态 hth_t 包含了前 tt 步的信息,但距离越远信息衰减越严重(梯度消失)。“The cat that the dog chased ran away” 中,“ran” 需要知道主语是 “cat” 而不是 “dog”,但两者相距很远。

注意力的解法:让每个位置直接”查询”所有其他位置,根据相关性分配权重,加权汇聚信息。这样任何两个位置之间的路径长度都是 O(1)O(1),而不是 RNN 的 O(n)O(n)

但关键问题是:怎么定义”相关性”?谁和谁相关?这就是 QKV 框架回答的问题。


2. 为什么需要三种角色?

📐 从”直接比较”到 QKV 的演进

最朴素的方案:直接用词向量做点积

eij=xiTxje_{ij} = x_i^T x_j

位置 ii 和位置 jj 的注意力分数就是两个词向量的点积。

问题:这迫使同一个向量既要”表达自己的含义”,又要”决定和谁相关”,还要”提供什么信息给别人”。三种功能耦合在一起,表达力严重受限。

类比:这就像要求每个人的名片既是搜索关键词、又是被搜索的标签、还是搜索结果——信息必然混淆。

QKV 的解法:给每个词三种独立的”角色”

qi=WQxi,kj=WKxj,vj=WVxjq_i = W^Q x_i, \quad k_j = W^K x_j, \quad v_j = W^V x_j

  • Query qiq_i:“我在找什么?“——位置 ii 发出的查询请求
  • Key kjk_j:“我是什么?“——位置 jj 用来被匹配的标签
  • Value vjv_j:“如果你选中我,我提供什么信息?“——位置 jj 实际贡献的内容

注意力分数 = Query 和 Key 的匹配度:eij=qiTkje_{ij} = q_i^T k_j

注意力输出 = 按匹配度加权 Value:outputi=jsoftmax(eij)vj\text{output}_i = \sum_j \text{softmax}(e_{ij}) \cdot v_j

三个投影矩阵 WQ,WK,WVW^Q, W^K, W^V 是独立学习的,模型可以自由决定:

  • 用什么特征去”查询”(Query 空间)
  • 用什么特征去”被查询”(Key 空间)
  • 查询到之后提供什么信息(Value 空间)

🔢 数值示例:QKV 三种角色的区分

设定:句子 “The animal didn’t cross the street because it was too tired

当处理 “it” 这个词时:

角色含义这个例子中
Query(“it” 的查询)“我是一个代词,我在找我的指代对象”qitq_\text{it} 编码了”需要找名词性先行词”的信息
Key(各词的标签)“我是什么类型的词?”kanimalk_\text{animal} 编码了”我是名词,可以被代词指代”;kstreetk_\text{street} 也是名词但语义不匹配
Value(各词提供的信息)“如果你选中我,我的语义内容是什么?”vanimalv_\text{animal} 包含”动物”的语义特征,传递给 “it”

qitTkanimalq_\text{it}^T k_\text{animal}(高分) >> qitTkstreetq_\text{it}^T k_\text{street}(低分)

→ “it” 的输出向量主要包含 “animal” 的语义信息,从而解析了指代关系。

关键洞察:Query 和 Key 在同一个”匹配空间”中操作(维度都是 dkd_k),但 Value 在独立的”内容空间”中(维度 dvd_v,可以不同)。匹配逻辑和信息传递是解耦的


3. 每个组件的数学定义

📐 QKV 的形式化定义

输入XRn×dmodelX \in \mathbb{R}^{n \times d_\text{model}}nn 个位置,每个 dmodeld_\text{model} 维)

三个投影矩阵(可学习参数):

WQRdmodel×dk,WKRdmodel×dk,WVRdmodel×dvW^Q \in \mathbb{R}^{d_\text{model} \times d_k}, \quad W^K \in \mathbb{R}^{d_\text{model} \times d_k}, \quad W^V \in \mathbb{R}^{d_\text{model} \times d_v}

投影结果

Q=XWQRn×dk,K=XWKRn×dk,V=XWVRn×dvQ = XW^Q \in \mathbb{R}^{n \times d_k}, \quad K = XW^K \in \mathbb{R}^{n \times d_k}, \quad V = XW^V \in \mathbb{R}^{n \times d_v}

注意力计算

Attention(Q,K,V)=softmax(QKTdk)注意力权重矩阵 ARn×nVRn×dv\text{Attention}(Q, K, V) = \underbrace{\text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)}_{\text{注意力权重矩阵}\ A \in \mathbb{R}^{n \times n}} V \in \mathbb{R}^{n \times d_v}

形状追踪

步骤计算形状
1. 投影Q=XWQQ = XW^Q(n×dmodel)(dmodel×dk)=n×dk(n \times d_\text{model}) \cdot (d_\text{model} \times d_k) = n \times d_k
2. 打分QKTQK^T(n×dk)(dk×n)=n×n(n \times d_k) \cdot (d_k \times n) = n \times n
3. 缩放QKT/dkQK^T / \sqrt{d_k}n×nn \times n(除以标量不改变形状)
4. 归一化softmax()\text{softmax}(\cdot)n×nn \times n(每行归一化为概率分布)
5. 加权AVA \cdot V(n×n)(n×dv)=n×dv(n \times n) \cdot (n \times d_v) = n \times d_v

参数量3×dmodel×dk3 \times d_\text{model} \times d_k (假设 dk=dvd_k = d_v)。在 BERT-base 中:3×768×64=147,4563 \times 768 \times 64 = 147{,}456(单个注意力头)。


4. 缩放因子 1/dk1/\sqrt{d_k} 的必要性

📐 为什么要除以 dk\sqrt{d_k}

问题:当 dkd_k 较大时,qTk=i=1dkqikiq^T k = \sum_{i=1}^{d_k} q_i k_i 的方差会很大。

数学分析:假设 qi,kiN(0,1)q_i, k_i \sim \mathcal{N}(0, 1) 且独立,则:

E[qTk]=i=1dkE[qiki]=0\mathbb{E}[q^T k] = \sum_{i=1}^{d_k} \mathbb{E}[q_i k_i] = 0

Var(qTk)=i=1dkVar(qiki)=i=1dk1=dk\text{Var}(q^T k) = \sum_{i=1}^{d_k} \text{Var}(q_i k_i) = \sum_{i=1}^{d_k} 1 = d_k

dk=64d_k = 64 时,qTkq^T k 的标准差 8\approx 8。点积值分布在 [24,24][-24, 24] 范围(3σ3\sigma),softmax 对这么大的输入会产生接近 one-hot 的输出,梯度几乎为零。

解法:除以 dk\sqrt{d_k} 使方差归一化为 1:

Var(qTkdk)=dkdk=1\text{Var}\left(\frac{q^T k}{\sqrt{d_k}}\right) = \frac{d_k}{d_k} = 1

没有缩放 → softmax 变成 argmax → 梯度消失 → 训练失败。缩放是让 softmax 在有意义的区间内工作的关键。

🔢 数值示例:缩放的效果

设定dk=64d_k = 64,三个位置的注意力分数

无缩放 (qTkq^T k)有缩放 (qTk/64q^T k / \sqrt{64})
位置 112.51.56
位置 2-8.3-1.04
位置 315.11.89
softmax[0.07, 0.00, 0.93][0.34, 0.06, 0.60]

观察:无缩放时 softmax 接近 one-hot([0,0,1][0, 0, 1]),梯度 0\approx 0;缩放后分布更平滑,梯度有效。


5. QKV 设计解决的根本问题

💡 从数据库检索的类比理解 QKV

QKV 框架本质上是一个可微分的软检索系统

数据库操作对应的注意力组件区别
SQL WHERE 条件Query qq定义”要找什么”
表的索引列Key kk定义”按什么匹配”
SELECT 的返回列Value vv定义”返回什么”
精确匹配softmax 注意力软匹配(概率加权而非 0/1)
返回一行注意力输出返回所有行的加权平均

为什么”软”很重要? 因为硬检索(argmax)不可微,无法用梯度下降训练。softmax 让检索变成连续可微的操作,同时保留了”聚焦于高相关性位置”的效果。

QKV 解决了什么问题?

  1. 长距离依赖:任何位置可以直接关注任何其他位置,O(1)O(1) 路径长度
  2. 并行计算:所有位置的注意力同时计算(vs RNN 的顺序瓶颈)
  3. 灵活的关系建模:通过学习 WQ,WK,WVW^Q, W^K, W^V,模型可以捕捉语法关系(主谓一致)、语义关系(指代消解)、位置关系(相邻词偏好)等任意模式
  4. 信息提取与匹配解耦:Query-Key 负责”找谁”,Value 负责”拿什么”——搜索逻辑和返回内容可以完全不同

6. Self-Attention vs Cross-Attention

📐 两种注意力的 QKV 来源

类型Q 来自K, V 来自用途
Self-Attention自身序列 XX自身序列 XX序列内部建模(BERT、GPT)
Cross-Attention目标序列 YY源序列 XX跨序列信息传递(翻译、T5)

Self-AttentionQ=XWQQ = XW^QK=XWKK = XW^KV=XWVV = XW^V(Q/K/V 都来自同一个 XX

Cross-AttentionQ=YWQQ = YW^QK=XWKK = XW^KV=XWVV = XW^V(Q 来自目标,K/V 来自源)

直觉:Cross-Attention 中,目标序列用 Query”提问”,源序列用 Key/Value”回答”。例如翻译时,中文 decoder 的 Query 去检索英文 encoder 的 Key/Value,找到对应的翻译信息。


7. 常见误区

⚠️ 常见误区

  1. 误区:Q、K、V 是三种不同的输入 → 正确:在 Self-Attention 中 Q/K/V 来自同一个输入 XX,通过三个不同的投影矩阵映射到不同空间。“三种角色”不是三种输入,而是同一个输入的三种不同”视角”。
  2. 误区dkd_k 必须等于 dvd_v正确:Query 和 Key 的维度必须相同(因为要做点积),但 Value 的维度可以不同。实践中通常设 dk=dv=dmodel/hd_k = d_v = d_\text{model} / hhh 是头数),但这只是常见选择,不是必须的。
  3. 误区:没有 Q/K/V 投影也能做注意力 → 正确:技术上可以直接用 XX 做点积(即 WQ=WK=WV=IW^Q = W^K = W^V = I),但这样 Q/K/V 共享同一个空间,模型无法独立学习”找谁”和”拿什么”的策略,表达力严重下降。
  4. 误区:Self-Attention 的 n×nn \times n 注意力矩阵编码的是”语法树” → 正确:注意力矩阵是软权重分配,不一定对应任何语言学结构。研究(Clark et al., 2019)发现某些注意力头确实捕捉了语法关系,但多数头的模式更难以语言学解释。
  5. 误区:缩放因子 dk\sqrt{d_k} 可以省略 → 正确dkd_k 较大时(如 64),不缩放会导致 softmax 饱和、梯度消失。Vaswani 原文明确指出 additive attention 不需要缩放(因为 tanh\tanh 限制了值域),但 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 是文档内容