注意力机制(Attention)是深度学习里的一种信息选择方式:模型在处理序列中某个位置时,不是平均地看待其他所有位置,而是给每个位置算一个权重,然后按权重把信息汇总过来。权重高的位置对当前结果影响大,权重低的几乎不起作用。
这个想法 2014 年最早出现在机器翻译里,用来解决「长句翻到后面就忘了前面」的问题。2017 年《Attention Is All You Need》把它推到极致:干脆把循环结构全部去掉,只留注意力。今天所有大模型的算力开销、上下文长度限制和缓存机制,追根溯源都落在这一个零件上。
先用一句话抓住它
注意力就是让模型自己决定「现在这一步,该重点看输入里的哪几个地方」。
想象你在读一句话:「小张把文件交给小李,因为他赶时间。」要判断「他」指谁,你会不自觉地把目光在「小张」和「小李」之间来回扫,而不是重读整句话的每个字。注意力机制做的就是这件事,只不过它把「往回看谁、看多重」变成了一组可以被训练出来的数字。
它是怎么算的
注意力的标准写法是三个角色:Query(查询)、Key(键)、Value(值)。每个位置都会从自己的表示里投影出这三样东西。
用图书馆打个比方:Query 是你要查的问题,Key 是每本书封面上的主题标签,Value 是书里的实际内容。你拿问题去和所有标签比一遍相关度,然后按相关度高低把这些书的内容混合成一份答案——相关度高的书占比大,无关的书几乎不占。
「自注意力」(Self-Attention)指的是 Query、Key、Value 都来自同一段序列,也就是让一句话内部的词互相看。「交叉注意力」(Cross-Attention)则让一段序列去看另一段,比如让生成的图像去看文本提示。
多头是什么意思
实际模型不会只算一套注意力,而是并行算好几套,这就是「多头注意力」。每套用不同的投影矩阵,学出的关注模式也不同:可解释性研究里能观察到,有的头稳定地关注前一个词,有的头关注对应的标点或括号,有的头在做指代消解。最后把这些头的结果拼起来,再过一层线性变换。
多头的直觉是:一个位置和其他位置的关系不止一种。只用一套权重,语法关系和语义关系会被迫挤在同一组数字里互相干扰。
为什么它决定了上下文窗口的成本
一个长度为 n 的序列,标准自注意力要算 n×n 组相关分数。输入翻一倍,这部分计算量变四倍,需要缓存的中间结果也线性增长。这就是上下文窗口不能随便无限放大的根本原因,也是长文档明显更慢更贵的来源。
围绕这个瓶颈长出了一整片工程:
- KV 缓存:生成时前面已经算过的 Key 和 Value 不用重算,直接复用。这是提示词缓存省钱的底层机制,也解释了为什么把稳定不变的系统提示放在最前面更划算。
- 分组查询注意力(GQA/MQA):让多个 Query 头共享同一组 Key、Value,显著压低缓存显存占用,是长上下文模型的常规配置。
- 稀疏与滑窗注意力:不再让每个位置看全部位置,只看邻近窗口或按规则挑选的少数位置,用一点效果换很大的长度。
- 高效实现:FlashAttention 一类的方法不改数学定义,只改显存读写方式,实测能大幅提速。
和 Transformer、上下文工程的关系
Transformer 是把注意力组装成完整架构的那个设计:注意力负责在位置之间搬信息,前馈层负责在位置内部加工,残差和归一化保证深层能训起来。注意力是零件,Transformer 是整机。
上下文工程则是注意力约束的直接产物。因为注意力预算有限、而且信息越多信噪比越差,才需要认真决定每一轮往窗口里放什么。业界常说的「中间信息容易被忽略」,也是在描述注意力权重在长序列上的分布问题——不是模型故意跳过,而是相关信号被大量无关内容稀释了。
容易误解的地方
「注意力权重就是模型的解释」——注意力图看起来很像解释,但研究反复指出它不能直接当成因果解释:同样的输出可以由很不一样的注意力分布产生,改动注意力权重也不一定改变结论。它是一条有用的线索,不是判决书。
「注意力等于模型在理解」——它算的是相关性权重,是路由。相关性经常和语义重合,但重合不等于理解,这也是幻觉会发生的原因之一。
「窗口变大就没有注意力问题了」——窗口变大只是把边界推远。平方级开销和长序列上的信号稀释都还在,所以长窗口模型仍然需要检索、压缩和分工。
学到什么程度够用
普通使用者知道两句话就够了:模型是靠「按相关度加权取信息」工作的,所以你把关键信息放在哪、说得多明确,会实实在在影响结果;输入越长,无关内容对关键信号的稀释越强,所以精简的提示往往比堆料的提示更稳。
做开发的话,值得再理解 KV 缓存的生命周期(什么情况下缓存会失效)、GQA 对显存的影响,以及为什么长上下文评测里「大海捞针」通过了不代表复杂多跳推理也没问题。