
注意力机制到底在算什么?
用通俗说法说明 Query、Key、Value、因果掩码、多头注意力、归纳头,以及长提示词为何昂贵。
文字变成 token、并带上位置相关的向量之后,Transformer 每一层的核心只做一件事:让每个 token 查看它被允许看到的其他 token,再决定哪些对「接下来要说什么」真正重要。这个机制就是注意力——也是 Transformer 得名的部分。
每个 token 的三个角色:Q、K、V
每个 token 会被变换成三个新向量:Query、Key 与 Value。可以这样理解:Query 在问「我在找什么」,Key 在答「我能提供什么」,Value 则携带匹配成功时真正被传递的信息。产生 Q、K、V 的投影矩阵是训练学出来的,所以模型会自己摸索每个 token 该找什么、该提供什么。
匹配靠相似度打分完成:每个 Query 与它能看到的 Key 比较,再把分数变成总和为一的权重。分数高的权重大,分数低的几乎消失。某个 token 的新表示,就是各 Value 向量的加权混合——信息从「重要」的那些 token 被拉了过来。
以这句为例:The cat that I saw yesterday was sleeping(那只我昨天看到的猫正在睡觉)。模型处理到 was 时,需要搞清楚到底是什么在睡觉。注意力可以隔着好几个词,仍把高权重给 cat——因为训练让 was 这类动词去找「像主语」的 Key,而 cat 刚好产生对得上的信号。
因果掩码:不能偷看未来
像 GPT 这类自回归语言模型是从左到右生成文字。位置 5 的 token 可以注意位置 1 到 5,绝对不能看 6、7、8——那些位置的 token 还没生成。因果掩码的做法很直接:把未来 token 的匹配分数压到极低,经过 softmax 之后权重实际为零。
多个头,不是固定切块
语言里同时发生太多种关系:主谓一致、代词指代、跨句引用、局部短语结构。多头注意力就是并行跑多次注意力。这里要纠正一个常见误解:每个头拿到的,不是原始向量的固定切片。每个头有自己学出来的投影,把完整向量映射到更小的 Q/K/V 空间。各头跑完后,输出拼接起来,再经一个学出来的线性层混回完整尺寸。
没有人指定每个头该干什么,特化却常在训练中涌现。研究者发现过追踪语法、分辨代词、跟随位置模式的头;Anthropic 的可解释性研究还指出「归纳头」(induction heads):第二次看到 A 时,回头看上次 A 后面跟了什么,再照抄——这是目前对上下文学习最清晰的机制之一。
长提示词为何昂贵,以及 GQA
在完整注意力里,每个 token 要和所有可见 token 比较。提示词长度翻倍,计算量大约翻四倍。这正是 FlashAttention、稀疏注意力等效率研究的动机。推理时,模型还会保留过去的 Key 与 Value(KV 缓存),以免每一步重算整个前缀——长上下文时,这也是主要内存开销来源。
分组查询注意力(GQA)是实务上的回应:多组查询头共享较少的键值头。LLaMA-2 70B、Mistral 7B 等模型采用此设计,精度几乎不损,内存与推理成本却能下降。注意力不是单一魔法,而是「token 能交换什么」与「算得起多少」之间的一整组取舍。