从 Token 到 Transformer · 07 / 10
Q、K、V 常被类比成“问题、目录和正文”。这个类比能帮助入门,但它会留下一个疑问:同一个 token 为什么同时拥有三份表示?
答案在于 Attention 要解决两个不同问题:哪些位置值得连接,以及连接后传递什么内容。 如果匹配和内容共用同一份表示,模型很难独立调整“容易被找到”和“找到后提供什么”。Q、K、V 就是把这两件事拆开。
三个向量都从当前表示投影而来
在 self-attention 中,输入矩阵记作 X。模型用三组可训练参数生成:
textQ = XW_Q K = XW_K V = XW_V
W_Q、W_K、W_V 会随着训练更新。Q、K、V 不是 tokenizer 提前准备好的字段,也不是三个独立词表;它们是同一份 hidden state 在不同线性子空间里的投影。
这意味着同一个 token 在不同层、不同上下文和不同注意力头中,会得到不同的 Q、K、V。
Query:当前位置在寻找什么
Query 表达的是当前位置用于匹配的特征。它并不一定对应一句可以翻译成人话的问题。
在“银行批准了贷款,因为它评估了风险”中,“它”这个位置的 Query 可能逐渐学会寻找一个合适的机构实体;在代码里,某个变量引用的 Query 可能寻找作用域中可见的定义。
“可能”很重要。我们能通过实验观察某些头的规律,却不能预先规定每一维代表主语、实体或语法关系。
Key:这个位置如何被匹配
每个位置都提供 Key,与其他位置的 Query 做点积。点积越大,说明在当前投影空间中越匹配。
Key 更像可检索特征,而不是位置本身的全部内容。一个 token 可以用某些特征回答“我是不是你要找的实体”,同时保留另一组信息作为 Value 传递。
这种分离让模型能够学习:某些线索适合决定连接,另一些线索适合进入结果。
Value:匹配成功后传递什么
Attention 权重最终作用在 Value 上。当前位置不会把 Key 本身拿回来,而是用权重混合各位置的 Value。
继续用检索类比:Query 和 Key 决定搜索排名,Value 是搜索结果真正携带的内容。排名信息与返回内容相关,但不必相同。
输出可以写成:
textscores = QK^T / sqrt(d_k) weights = softmax(scores + mask) output = weights V
三行分别对应匹配、规则约束与内容汇聚。
为什么要除以根号 d
当向量维度变大时,点积的绝对值往往也会变大。过大的分数进入 softmax 后容易变得极端,梯度随之不稳定。
除以 sqrt(d_k) 是一个尺度校正,让不同维度下的分数保持在更适合训练的范围。这不是为了改变排名语义,而是让优化过程更平稳。
Q、K、V 不是固定角色表
把某个注意力头命名为“指代头”或“标点头”很诱人,但同一个头可能在不同输入中承担不同功能,模型也会通过残差和后续层组合许多微弱信号。
更稳妥的理解是:Q、K、V 提供了一种通用机制,让网络自己学习匹配空间和内容空间。人类可以在训练后分析出现了哪些模式,却不应该在训练前把三个矩阵解释成固定语义字段。
Cross-attention 中的来源会变化
Self-attention 的 Q、K、V 来自同一序列。Cross-attention 中,Query 通常来自正在更新的一侧,Key 和 Value 来自另一侧。
例如,在编码器-解码器翻译模型中,解码器用当前输出表示生成 Query,再到编码器表示中寻找 Key 并读取 Value。这个结构把“我现在需要什么”与“源文本能提供什么”连接起来。
小结
Q、K、V 的价值不在三个字母,而在职责分离:
- Query 表达当前位置用什么特征发起匹配;
- Key 表达其他位置用什么特征接受匹配;
- Value 表达匹配后真正传递的内容。
一组 Q、K、V 已经能完成一次 Attention。下一篇要解释为什么 Transformer 还要并行使用多组投影,也就是多头注意力。
