很多人以为大模型读一句话只动用"一套注意力"。实际主流模型用的是多头注意力:同一句话,同时被几十组独立的注意力并行处理,每组盯一类关系。理解这件事,能解释不少使用中观察到的现象——为什么它记得住开头的指代,却弄丢中间的段落。
一个头在做什么:打分、加权、汇总
先看单头的机制。进来的是一串词元(token)的向量表示。每个头对"当前词"和句中每个其他词打一个相关度分数——比如处理"它"这个字时,对候选名词打的分会拉开差距。分数归一化成权重后,按权重把各个词的信息加权汇总,融合进当前词的表示里。出去的是每个位置的新向量:掺入了它该关注的信息,交给下一层继续加工。
把打分拆开看更清楚:每个头拿着三样东西干活——当前词发出的"查询",每个词自带的"键"和"值"。查询去和各个键对暗号,对得上就对谁加高权重,然后按权重把对应的值抄回来。所谓"关注",就是对暗号和抄值的整个过程,没有神秘直觉参与,全是可计算的分数。
一句话概括:每个头是一次"带着偏见的摘抄"——它只抄自己认为重要的部分,几十个头摘的方向各不相同。
为什么要同时开几十个头
一个头一次只能学一种关注模式,而语言里的关系是多样的:有的头盯语法搭配(主谓一致),有的头追指代("它"指谁),有的头只看相邻词,有的头负责远距离关联(开头立的论点与结尾的呼应)。多个头并行各管一类,最后把结果拼接,比让一个头什么都管效果好得多。
类比是一群人同时读同一篇论文:一个人专门看连接词,一个人专门核对图表编号,一个人盯作者的自引。各自记各自的笔记,汇总后的理解比任何单人通读都全面。但这个类比在下一节会失效。
分工是练出来的,不是派活的
失效点在于:没有人给头分配任务。几十个头起步时完全一样,是在训练中自发分化出各自模式的。事后研究发现,确实能找到一些职责清晰的头,比如专门做指代消解的;但也有大量头看不出明确分工——多头注意力里哪些部分在干什么,至今是可解释性研究的难题。所以别指望"对着某个头做精确手术",现有工具做不到定向修改而不伤及其他能力。
三个现象,反推注意力的存在
| 观察到的现象 | 背后的注意力行为 | 使用对策 |
|---|---|---|
| 长文档中段内容被忽略 | 超长序列上注意力被稀释,哪怕窗口标到 128K 也存在 | 关键信息放开头或结尾,或分段投喂 |
| 指代关系大多能答对 | 存在专门追指代的头,这类模式学得较早 | 指代密集时仍建议复述名词再问 |
| 隔得远的设定被忘记 | 远距离关联成本高,依赖头数与结构设计 | 重要设定每隔一段主动重申一次 |
窗口决定能看多远,头决定看了怎么用
注意力头和上下文窗口是两个常被混起来的概念。窗口是边界:窗口外的文本根本进不了视野,头再强也够不着。头是用法:窗口内的内容,靠各头的打分加权决定谁被真正"看到"。一篇文章塞进 128K 的窗口,不等于每个细节都被同等处理——中段稀释,就是窗口够大、注意力分配跟不上的结果。所以长文档的正确用法仍然是分段、带坐标提问,而不是迷信窗口标称值。
多头的成本账
代价是算力。几十层的堆叠,每层几十个头,每个头都要独立算一遍打分和加权,计算量随头数线性上涨——这是大模型生成速度慢的结构性原因之一。顺带解释一个现象:带思考链的模式比普通模式慢很多,因为它在输出前多跑了几轮内部计算,每轮都要过全部的头。也所以参数量相近的两个模型,速度可能差很多:头数、层数、结构设计不同,算力开销就不同,这层关系在参数量 7B 和 70B 的对比里展开过。速度感受怎么量化,参考每秒输出多少 token 决定等待时间。把模型"压瘦"而不明显掉能力,是当前工程的主攻方向之一,见模型量化为什么能让模型瘦身。
多头注意力速查
- 单头动作:打分 → 加权 → 汇总,输出掺了全局信息的新向量
- 多头并行各管一类关系,分工是训练自发形成的
- 长文中段易丢、远设定易忘,对策是分段投喂、主动重申
- 算力随头数线性涨,这是生成速度的结构性成本


