跳到主要内容

注意力 — 每个位置都向全序列提问

这一章讲三个零件: 注意力算子(大模型的心脏)、词元嵌入(token 怎么变成向量)、 位置编码(顺序怎么进去)。它在全书的位置:这是零件目录的最后一章, 也是最重要的一章——第 09 章的 Transformer、第 11 章的大语言模型, 全是这三个零件的排列组合。

1. 顶层全景:为什么需要第四种零件

零件目录到这里已有全连接、卷积、池化。但有一类需求它们都接不住: 把相距很远的位置上的信息,直接组合到一起1

  • 图像合成:画面左角和右角的细节要互相协调;
  • 语言:一句话的第 2 个词和第 18 个词可能要一起做「组词对不对」的决定。

现有零件各自的死法2:

  • 全连接: 参数随输入尺寸爆炸(第 06 章算过),而且处理不了变长输入;
  • 卷积: 信息每层只能挪半个窗口宽,距离远的两个位置要很多层才能搭上话;
  • 池化式聚合: 把大片区域平均成一个向量,多种信号糊在一起,谁也认不出谁。

注意力的回答:让每个位置直接对所有位置「点名」——不看距离远近, 任何两个位置一步连通。

2. 注意力算子:问、配、取(主走查)

每个位置随身带三样东西,都是从它的特征向量算出来的三个向量3:

  • 查询(query): 这个位置「想找什么」;
  • 键(key): 这个位置「身上贴的标签」,供别人的查询来配;
  • 值(value): 这个位置「实际提供的内容」,被点中了就把这份交出去。

运算分两步,第 06 章的「点积 = 匹配分」在这里兑现:

  1. 配: 每个查询和所有键做点积,得到一排匹配分;除以 √D(D 是向量长度) 保持数值范围稳定;再过 softmax,变成一排加起来等于 1 的权重—— 这就是注意力分数;
  2. 取: 按这排权重,把所有位置的值向量加权平均,得到这个位置的新表示4

拿第 1 节那句语言例子走一遍:「苹果落在地上,因为它有质量」。 处理到「它」这个位置时(所有向量、分数都是为演示编的):

「它」的查询 和 各位置的键 点积:
苹果 0.9 │ 落 0.2 │ 地上 0.1 │ 因为 0.0 │ 质量 0.3
softmax 后(注意力分数):
苹果 0.34 │ 落 0.17 │ 地上 0.15 │ 因为 0.14 │ 质量 0.19
加权取值向量:
「它」的新表示 ≈ 0.34×苹果的值 + 0.19×质量的值 + …

图说:「它」这份新表示里,最大的一份(约三分之一)掺进了「苹果」那份内容。
之后任何零件再看「它」,看到的已经是「带着苹果的它」。
指代就是这么被接上的——没有一条规则写着「它=苹果」。

两个极端情形帮你校准直觉5:如果一个查询只和一个键特别配, 权重几乎全压在那一处——这是「精确查表」;如果和几个键都差不多配, 取出来的是它们的平均——这是「模糊汇总」。注意力是这两端之间的连续谱。

3. 两个扩展:掩码与二次代价

原书给这个无参数的算子配了两个标准扩展6:

扩展一:掩码(mask)。 在 softmax 之前,拿一张布尔矩阵把某些 「查询×键」的格子直接禁掉。最重要的用法:用一张「下三角全通、上三角全禁」 的掩码,让每个位置只看得到自己和它左边的位置—— 这就是第 03 章「因果结构」的实现。第 09 章的 GPT 全靠它。

扩展二:在注意力分数上过一道 dropout(第 07 章),训练时随机清零 一部分连接,防过拟合,老配方。

代价: 每个查询要和每个键配一次,所以成本随序列长度平方增长。 序列几千个 token 还不要紧,到几万几十万就成了拦路虎—— 这也是第 05 章说的「一次能处理多长的前文」为什么稀缺。 改良路线有两条:大部分位置只看近处小窗、少数位置远程只挑几处看; 或利用矩阵乘法结合律调换运算顺序,把它「线性化」7

4. 多头注意力:一次问八组问题

上面的算子没有参数——纯粹的「配与取」。要让它能学,包一层可训练的壳, 这就是多头注意力层(Multi-Head Attention)8:

  • 输入的每个位置,先分别过 H 套可训练的小矩阵,算出 H 组 各自的查询/键/值——一个位置同时带着 H 个不同的「想找什么」去配;
  • H 组各自做一遍第 2 节的运算,得到 H 份结果;
  • H 份结果拼起来,再过一个可训练矩阵,合成最终输出。
位置 x ──┬─ W₁ → 第1组 Q/K/V → att → 结果1 ─┐
├─ W₂ → 第2组 Q/K/V → att → 结果2 ─┤ 拼接 → Wᴼ → 输出
└─ … …… ─┘

图说:8 个头 = 8 套不同的「配法」同时跑:一个头可能在配指代,
一个在配语法搭配,一个在配语义相关……各头学出什么是训出来的。

按三个输入序列的来源,它有两种装法9:

  • 自注意力(self-attention): 查询、键、值全部来自同一个序列—— 序列内部互相看。GPT 的主体就是它;
  • 交叉注意力(cross-attention): 查询来自序列 A,键和值来自序列 B—— A 的每个位置去 B 里找料。翻译模型的「看着原文写译文」靠它(第 09 章)。

还有一个后面要用的性质:没有掩码时,这个算子对键和值的排列不敏感—— 把序列打乱顺序,输出只是跟着换顺序,内容不变。它对「谁在第几个位置」 天生是盲的。第 6 节解决这个问题10

5. 词元嵌入:整数怎么变成向量

第 03 章把文本切成了 token——但 token 只是编号(「第 5173 号」), 编号本身不携带任何意思。怎么变成能参与点积的向量?

嵌入层(embedding layer)的回答朴素到底:一张查找表。 它是一张可训练的 N×D 矩阵(N 是词表的大小,D = 向量长度), 第 k 行就是第 k 号 token 的向量。输入一串编号,输出对应那几行11

token 5173(「苹果」)→ 查表第 5173 行 → [0.3, −1.2, …, 0.8] (D 个数)
(向量值是训练出来的;查表这个动作本身没有计算,只有取数。)

图说:词义不在任何规则里,全在这张表的几亿个数里——
它们是训练从语料里磨出来的。

关键在「可训练」三个字: 这张表和其它参数一起被下山调整, 训练会把「用法相近的 token」磨到「向量相近」的方向上去—— 因为这样才能把损失降下来。词义的几何结构,是训练的副产品。

6. 位置编码:把「第几个」注进去

第 4 节末尾说了:注意力对位置是盲的。可语言里「狗咬人」和「人咬狗」 是同一批 token——顺序就是意义。卷积其实也盲(它对绝对位置无感), 只是对平稳信号这恰好是优点;语言不是平稳信号12

标准解法:给每个位置造一个只取决于位置编号的向量,加到该位置的特征上, 让「内容 + 位置」一起进入后续计算。这就是位置编码(positional encoding)。 它可以是学出来的,也可以是用公式写死的——原版 Transformer 用的是后者: 一串不同频率的正弦和余弦(两种最基本的周期波形),第 t 个位置的编码是这些波形在 t 处的取值, 频率从密到疏排开,合在一起每个位置都得到一把独一无二的「刻度」13

至此三个零件齐了:嵌入给内容,位置编码给顺序,注意力给组合。 第 09 章把它们拼成整机。

7. 作者的判断与证据

  • 注意力机制本身来自 Vaswani et al. 2017,原书给的是构造与性质, 「为什么有效」层面只给了动机论证(远程组合),没有更深的理论—— 它今天仍是「实证上无可替代、理论上理解有限」的零件;
  • √D 缩放是经验性稳定器,原书说明其作用是保持值域不随维度漂移;
  • 平方代价是结构性事实,两条改良路线(只挑少数位置看、改运算顺序)原书各引了一篇 (Beltagy et al. 2020;Katharopoulos et al. 2020),均未成为后来的主流;
  • 「位置编码可学也可用公式写死」是原书列的两条路线;今天的大模型多用 可学或旋转式的变体,超出本书范围(第 12 章提及的后续进展不含此项, 此处为通用知识补充)。

8. 边界与局限

  • 本章按原书只讲了算子本身;它在整机里怎么和归一化、残差、「每个位置自己想」块组装, 是第 09 章的事;
  • 「词义几何是训练副产品」在本章是机制性陈述;它的证据史(word2vec 一系) 原书未展开;
  • 二次代价的改良方案原书只点名了两篇;2023 年后的「少看几处」/线性注意力、 滑动窗等工程方案不在书里;
  • 位置编码只讲了「加法注入」一种主流形态;「拼接注入」原书一句话带过。

9. 可带走的

  1. 注意力 = 每个位置带「想找什么」去和全序列的「标签」配分,按分取回「内容」;
  2. 点积是配分器,softmax 把配分洗成权重——第 03、06 章的旧零件在这里合体;
  3. 两个极端:一对一精确查表 ↔ 多对多模糊汇总,真实情形在中间;
  4. 下三角掩码 = 因果 = 只许看左边。GPT 的全部「守规矩」就来自这张表;
  5. 平方代价:序列长度翻倍,注意力成本翻四倍——「能看多长的前文」的稀缺由此而来;
  6. 多头 = 多套配法并行;自注意力看同序列,交叉注意力跨序列;
  7. 嵌入层 = 可训练的查找表:编号变向量,词义几何是下山磨出来的副产品;
  8. 注意力对顺序天生盲,位置编码把顺序注回去——「狗咬人」和「人咬狗」才不会同分。

10. 原文地图

主题原书章原文位置
动机:远程组合Attention layerstext/21-fm-attention-layers.txt:2(搜「combine local information at locations far apart」)
现有零件的死法Attention layerstext/21-fm-attention-layers.txt:10(搜「cannot process large」)
Q/K/V 与两步运算Attention layerstext/21-fm-attention-layers.txt:43(搜「queries」) · text/21-fm-attention-layers.txt:30(搜「averaging the values」)
两种极端情形Attention layerstext/21-fm-attention-layers.txt:74(搜「matches one key」)
掩码与因果Attention layerstext/21-fm-attention-layers.txt:96(搜「masked」)
平方代价与改良Attention layerstext/21-fm-attention-layers.txt:126(搜「quadratic」)
多头注意力Attention layerstext/21-fm-attention-layers.txt:165(搜「Multi-head」)
自/交叉注意力Attention layerstext/21-fm-attention-layers.txt:201(搜「self」)
排列性质Attention layerstext/21-fm-attention-layers.txt:210(搜「permutation」)
词元嵌入Token embeddingtext/22-fm-token-embedding.txt:6(搜「lookup table」)
位置编码Positional encodingtext/23-fm-positional-encoding.txt:1(搜「positional en」) · text/23-fm-positional-encoding.txt:32(搜「sines and cosines」)

Footnotes

  1. 出处:「Attention layers」第 1–8 段(text/21-fm-attention-layers.txt:2,搜「combine local information at locations far apart」)。

  2. 出处:「Attention layers」第 9–14 段(text/21-fm-attention-layers.txt:10,搜「cannot process large」)。

  3. 出处:「Attention layers」第 40–52 段(text/21-fm-attention-layers.txt:43,搜「queries」)。

  4. 出处:「Attention layers」第 53–72 段(text/21-fm-attention-layers.txt:65,搜「scaling factor」;:68,搜「averaging the values」)。原书公式 4.1、4.2;公式在转码文本中为碎片,此处按含义重述。

  5. 出处:「Attention layers」第 74–79 段(text/21-fm-attention-layers.txt:74,搜「matches one key」)。

  6. 出处:「Attention layers」第 112–122 段(text/21-fm-attention-layers.txt:96,搜「masked」;图 4.12 题注 :106,搜「masked by a constant matrix」)。

  7. 出处:「Attention layers」第 124–134 段(text/21-fm-attention-layers.txt:126,搜「quadratic」)。引 Beltagy et al., 2020 与 Katharopoulos et al., 2020。

  8. 出处:「Attention layers」第 165–197 段(text/21-fm-attention-layers.txt:165,搜「Multi-head」;图 4.13 题注 :158,搜「Multi-head Attention layer applies」)。

  9. 出处:「Attention layers」第 199–206 段(text/21-fm-attention-layers.txt:201,搜「self」)。

  10. 出处:「Attention layers」第 208–211 段(text/21-fm-attention-layers.txt:210,搜「permutation」)。

  11. 出处:「Token embedding」全章(text/22-fm-token-embedding.txt:6,搜「lookup table」)。

  12. 出处:「Positional encoding」第 1–19 段(text/23-fm-positional-encoding.txt:10,搜「oblivious to the absolute position」)。

  13. 出处:「Positional encoding」第 21–45 段(text/23-fm-positional-encoding.txt:1,搜「positional en」;:29,搜「sines and cosines」)。引 Vaswani et al., 2017。