跳到主要内容

3.3 多头注意力与位置编码

一句话,好几种关系​

还是那句「小猫追着蝴蝶跑,它累了就趴下休息」。上一节我们只关心了一种关系——「它」指谁。但这句话里同时还藏着别的关系:

  • 「追着」和「跑」的动作是谁发出的?(动词找主语)
  • 「趴下」和「休息」是连着发生的两个动作?(相邻搭配)
  • 整句话的大意是什么?(全局汇总)

一路注意力(一组 Q、K、V)一次只能学会一种扫视句子的方式。解决办法直白得可爱:多问几路。这就是多头注意力——同时运行多组独立的注意力,每组(每个「头」)戴着自己的三副眼镜,学自己的关注模式,最后把各头取回的信息拼在一起。

逐个头看过去​

回到实验台,这次把四个头都点一遍:

🎮 动手实验
注意力实验台:每个词都在看谁?
点击任意一个词,弧线粗细 = 它分给其他词的注意力权重。换不同的「头」,同一句话会被用完全不同的方式扫视。(权重为示意数据,模式参考真实模型中观察到的头行为)
🧭 专管「这个代词指谁」:选中「它」,看它把注意力砸向哪里。
小猫100%追着蝴蝶跑,它累了��就趴下休息。
「它」的注意力去向: 小猫 100%
💡 要点:注意力权重每行加起来恰好是 100%——每个词把「关注预算」分配给全句。不同的头 = 不同的关注模式:有的管指代、有的管邻居、有的管「谁在做动作」。真实大模型每层有几十个头、共几十层,这些分工全是训练中自己涌现的,没人手工指定。
  1. 「邻居头」:随便点几个词——每个词几乎 100% 只看它前一个词。别嫌它单调,这是真实模型里最常见的头之一,专管「趴下→休息」这类局部搭配。
  2. 「动作头」:点「追着」或「跑」,注意力齐刷刷砸向「小猫」;点「累了」「趴下」「休息」,九成以上给了「它」、还分一点给「小猫」——动词们集体在找「谁在做这个动作」。
  3. 「平滑头」:雨露均沾,自己留两成,其余每个词各分约 8%——看起来没个性,但它在做全局信息的「大锅搅拌」,汇总句子整体基调。
  4. 再切回**「指代头」**对比:四个头,四种完全不同的扫视方式,同一句话被并行地读了四遍。

真实的大模型远不止四个头:每层几十个头、叠几十层(2025 年的旗舰模型动辄上千个头)。最妙的是,这些分工没有任何人手工指定——第 2 章的训练三件套照常运转,各个头的「性格」全是从数据里自己涌现的。

多头的实现也不神秘:不是把向量复印几十份,而是切开分工——把词向量分成 h 段,每段交给一个头独立做注意力,最后把 h 段结果拼回原长度。总计算量几乎不变,视角却多了 h 个。

位置编码:注意力弄丢了语序​

现在暴露一个尴尬的事实:注意力本身根本不知道词的先后顺序。

它对句子做的事是「每个词环顾所有词、按匹配度加权」——这套动作跟词的排列位置无关。把「小猫追着蝴蝶跑」打乱成「蝴蝶追着小猫跑」,每个词的 Q、K、V 都没变,两两匹配度也没变,注意力看到的几乎是同一袋词。可「小猫追蝴蝶」和「蝴蝶追小猫」显然不是一个意思!

补救办法:在词向量进入模型之前,给每个位置发一张「工牌」——第 1 号位、第 2 号位……每张工牌也是一个向量,直接加到词向量上:

进入模型的向量=词的意思(embedding)+位置工牌\text{进入模型的向量} = \text{词的意思(embedding)} + \text{位置工牌}

这就是位置编码。有了它,「第 1 号位的小猫」和「第 3 号位的小猫」是两个不同的向量,注意力自然能学会区分「谁追谁」。顺带一提,2025-2026 年的主流开源大模型基本都用一种更精巧的「旋转位置编码」(RoPE),思想仍是「把位置信息注入注意力」,见深入层。

这个实验在哪里不准确?

实验台的四个头是手工设计的干净版本,为的是让「分工」一眼可见。真实模型里,多数头的行为看不出明确含义——研究者盯着权重图也说不清它在干嘛;像「指代头」「前一词头」这样可解释的明星头是少数。这不妨碍多头有用:它的价值在于给模型多个并行视角,而不在于每个视角都能被人类翻译成一句话。

小结​

本节要点
  • 一个头只能学一种关注模式;多头 = 把向量切成 h 段并行做注意力再拼回,用同阶计算量换来 h 个视角。
  • 各头的分工(指代、邻居、动作、平滑……)全是训练中自发涌现的,且多数头并不可解释。
  • 注意力本身不分先后(置换等变),必须给每个位置发「工牌」;现代主流方案是旋转位置编码 RoPE。
📝 动手自测0/3
1. 为什么需要「多头」注意力,而不是一路注意力用到底?
2. 如果去掉位置编码,Transformer 会怎样?
3. 实验台里的「邻居头」几乎只看前一个词。关于这类头,下面哪个说法是对的?

延伸阅读​