多头注意力
一句话里既有指代、又有语法、又有情感——一个「头」忙得过来吗?
一个词,往往牵着好几种关系
上一课的注意力机制解决了一件漂亮的事:读到「它」时让它回头看,发现最相关的是「小猫」,指代搞定。 但那是个只有一种关系的简单句。真实的句子,往往一个词同时牵着好几条线。读这句:
单单为了读懂它,你的大脑其实同时在追好几条不同性质的线:
- 指代:「他」=小明,「她」=小红,「那幅」=风景画;
- 主谓:动词「喜欢」的施动者是「他」;
- 动宾:「喜欢」的对象是「风景画」。
光盯着「喜欢」这一个词:它既要往左找主语「他」,又要往右找宾语「风景画」——这是两种不同的关系,要看向两个不同的地方。可上一课的注意力,整套 Q/K/V 只有一份, 一个词只能算出一组权重、问一个问题:「谁跟我最相关?」
那把主语和宾语都算成「相关」、一起加权进来,不就行了?我们来看看会发生什么。
开多个窗口:并排跑好几个头
既然一个头只擅长一种关系,解法就朴素到家了:同时跑好几个头。 每个头都有自己独立的一套 ,独立打分、独立算权重、独立混合—— 互不干扰。这样一来,让「喜欢」往左看主语的,是一个头;让它往右看宾语的,是另一个头。两种关系各算各的,再也不会糊成一团。
关键在于:这种「头 A 管主谓、头 B 管动宾」的分工不是人工指派的。 每个头的 都是从海量文本里独立训练出来的, 训练完一看,它们自然地各占了一摊。论文里标配 8 个、大模型动辄几十上百个头, 有的管指代、有的抠语法、有的盯情感色彩——全是自己「长」出来的。
那现实里到底用多少个头?给几个有代表性的数字,感受一下规模的演变:
| 模型 | 头数 | 每头维度 |
|---|---|---|
| 原始 Transformer(2017) | 8 | 64 |
| BERT-base / GPT-2-small | 12 | 64 |
| BERT-large | 16 | 64 |
| GPT-3(175B) | 96 | 128 |
| LLaMA-2 / 3 70B | 64 查询头 | 128 |
一个规律:每头维度这些年基本稳定在 64–128 维,模型想更强,多半是「加头」而不是「把头加宽」。 另外,今天的主流开源模型(LLaMA、Mistral 等)还会用 GQA(分组查询注意力):查询头照样几十个, 却让它们共享少数几套 K/V(比如 64 个查询头共用 8 套)——纯为省显存、提速,原理留到第 26 课。
一笔精妙的账:多个头,却几乎不多花钱
「同时跑 8 个头」听上去得花 8 倍的计算。如果每个头都用满整个 512 维,确实如此。 但多头注意力藏了个聪明的设计:把维度切开分给各头,每个头只用 1/H。
拿真实数字算一遍(论文的设置):词向量 512 维,8 个头——
8 个头 × 64 维 = 512 维 ← 和单头用的总维度一模一样
也就是说,不是「8 个 512 维的头」,而是「8 个 64 维的头」。每个头在自己那 64 维的小天地里独立打分、 混合,算完得到一个 64 维的小结果 ;再把 8 个小结果拼接回 512 维, 过一个线性层 收个尾、让各头的信息互相整合一下。写成式子:
总计算量和单个 512 维的头基本持平,却换来了同时建模 8 种关系的能力。 「免费」多看了 7 种关系——这正是多头最划算的地方。
读到这儿,很多人会卡住一个问题:把 512 维切成 8 份、每个头只拿 64 维——这不就等于把信息撕成 8 块、每个头只看到八分之一吗?那不是丢了一大半?这个担心非常合理,但答案是:不丢。问题全出在「切」这个字的误导上。
真相藏在刚才那个 里——它是一个 512 行、64 列的矩阵。 输入 是完整的 512 维向量, 这步乘法意味着:每个头都把完整的 512 维从头读到尾,再用自己那把「镜头」把它压进一个 64 维的工作空间。 没有哪个头被蒙住眼睛、只准看前 64 维。所以「切」切的不是输入,而是每个头工作空间的大小。
而且这把镜头是学出来的:每个头可以自由地从全部 512 个特征里, 线性组合出对自己这摊关系最有用的那 64 维。管主谓的头,学着把「谁在施动」的特征投影进来; 管指代的头,学着把「谁是名词实体」的特征投影进来——各取所需,互不挡道。
那 64 维够装下一种关系吗?够,而且绰绰有余。诀窍在于:一个头只干一件窄活。 要表达「512 维的完整语义」当然得用 512 维;但只回答「这个动词的主语是谁」这一个问题,需要的维度少得多。 把一个 512 维的「通才」拆成 8 个 64 维的「专才」,每个专才在自己的小空间里反而看得更清。 再回头看第 1 站那个「半个他、半个画」的四不像——那才是真正的信息损失;多头恰恰是来给它止损的。
输出端同样没丢:8 个头各自的 64 维结果拼接回 512 维,一维不少,再过 融合。 从头到尾,信息只是被重新分工,从来没有被丢弃。
天下没有白吃的午餐。每个头从头到尾各算各的,中途彼此看不到对方的结果, 只有最末尾那一步 才让它们汇合一次。 于是那种需要「边看边商量」的关系——比如「它」既是「小猫」的代词、又要当后半句的主语, 两个头各抓一半却没法在过程中拼起来——只能指望最后那个线性层勉强缝合,表达力受限。
后来的 MQA、GQA 等变体在「省显存」和「让头共享一部分」上做文章,但「多头并行、各管一摊」这个基本盘, 至今仍是每一台 Transformer 的标准配置。
掀开盖子:这些头到底在看什么
多头是「自己长出分工」的,那训练完之后,把每个头的注意力画出来,到底能看到什么? 研究者真的这么做了(把权重矩阵可视化成热力图),发现头确实分化出了一些看得懂、叫得出名字的角色:
其中最有名的,是后来在大模型里发现的「归纳头」(induction head): 它能完成「上文出现过 A B,这次又见到 A,那下一个多半是 B」的模式补全。 很多人相信,正是这类头的出现,标志着模型开始具备「照着例子现学现用」的上下文学习能力—— 也就是你给 ChatGPT 举几个例子,它就照着做的那种本事。一个个朴素的头叠加起来,竟涌现出这样的能力,这是多头最迷人的地方。
总结
一个词常常牵着好几种关系,而一个注意力头只会算一组权重、把多个焦点混成一团。 多头注意力的解法是并排跑 H 个独立的头,各管一种关系; 再靠「每头只用 d/H 维」让总成本几乎不变。拼接 + 线性层收尾,分工全是自己学出来的。
这一课你亲手推导了
- 单头的死穴:加权平均把主谓、动宾揉成「半个他半个画」的模糊向量。
- 多头的思路:H 套独立的 Q/K/V,各算各的,同一个「喜欢」在不同头里看向不同的词。
- 维度的账:512÷8=64,8 个 64 维头拼回 512 维,总计算量≈单头,却多看 7 种关系。
- 头会分工:上一个词头、句法头、指代头……乃至「归纳头」撑起上下文学习。
- 遗留局限:头之间全程不通气,只在末尾 W_o 缝合一次。
学习小测验
做完这一课,来检测一下核心知识点。选出你的答案后点击「提交」,即可看到正确选项与讲解。
Transformer 架构
注意力、多头都有了——可它们还只是零件。怎么拼成一台真能「预测下一个词」的语言模型?