跳到主要内容

3.1 注意力的直觉:你怎么知道「它」指谁

一道你毫不费力就答对的题​

读一遍这句话:

小猫追着蝴蝶跑,它累了就趴下休息。

问:「它」是谁?

你几乎不需要思考——当然是小猫。但慢放一下你大脑刚才的动作:读到「它」的瞬间,你回头扫了一眼前文,从「小猫」和「蝴蝶」两个候选里挑出了更合理的那个(会「累了就趴下」的多半是猫,不是蝴蝶)。

这个「回头看、挑相关」的动作,就是本章的主角——注意力机制。

第 2 章的网络为什么做不到​

第 2 章的神经网络已经很能干了,但拿它处理句子会立刻露馅:

  • 它孤立地处理每个输入。给它「它」这个词的词向量,它无从知道前文出现过小猫——每次计算都是一锤子买卖。
  • 那把整句话的向量拼接成一个大向量塞进去呢?两个麻烦:句子有长有短,而网络的输入尺寸是死的;更糟的是,「小猫」和「它」隔了 5 个词,网络得学会「第 6 个位置要回头看第 1 个位置」这种规律——换一句话,位置全变了,等于白学。

1.2 节提过的 RNN 是一种补救:按顺序读词、像传纸条一样把「记忆」一路传下去。但读到「它」的时候,「小猫」的信息已经被转手压缩了 5 次,模糊得差不多了;而且必须一个词一个词排队处理,快不起来。

注意力:与其排队传话,不如直接环顾四周​

2017 年的 Transformer 换了一个思路,简单得近乎粗暴:

让每个词直接看全句的所有词,按「相关程度」给每个词打分,然后按分数加权取用它们的信息。

以「它」为例,动作分三步:

  1. 打分:「它」拿自己和全句每个词比对相关度——「小猫」很相关,「蝴蝶」有点相关,「就」基本无关;
  2. 变成百分比:把这些分数归一化,变成一份总和为 100% 的「关注预算」;
  3. 加权取用:按预算比例,把各个词的信息混合进来,得到「它」的新表示——
「它」的新理解≈90%×小猫的信息+5%×蝴蝶的信息+⋯\text{「它」的新理解} \approx 90\% \times \text{小猫的信息} + 5\% \times \text{蝴蝶的信息} + \cdots

这正是 0.3 节里那种加权平均:权重大的多出力,权重小的少出力。经过这一步,「它」的向量里就真正装进了「我指的是小猫」这条信息——后续的层拿到的不再是一个孤零零的代词,而是一个「有上下文的它」。

这个设计一次性带来三个好处:

  • 任意距离直达:「它」看「小猫」和看隔壁的「累了」一样,都是一步到位,隔 5 个词还是隔 5000 个词没区别;
  • 权重是算出来的,不是定死的:换一句话,「它」自然会把注意力砸向别的词——同一套机制,随内容自适应;
  • 全句并行:每个词的「环顾四周」互不排队,可以同时算(这是它比 RNN 快的根本原因,深入层细说)。
这个类比在哪里不准确?

「注意力」这个词借自心理学,但两者只是神似。人类的注意力是稀缺资源,一次只能聚焦一两处;模型的注意力是一份可微的软权重——它同时「看」所有词,只是看的比重不同,而且这些比重可以被梯度下降训练(第 2 章的三件套照常适用)。它与大脑的注意力机制没有生物学上的对应关系,别把它想象成「模型在集中精神」。

小结​

本节要点
  • 第 2 章的网络孤立处理输入,看不懂顺序、够不着远处的词;RNN 靠排队传话,又慢又健忘。
  • 注意力 = 每个词环顾全句:打分 → 变百分比 → 加权取用,把相关词的信息混进自己的新表示。
  • 三大好处:任意距离一步直达、权重随内容动态计算、全句并行适合 GPU。
📝 动手自测0/3
1. 相比第 2 章的前馈网络,注意力机制主要解决了什么问题?
2. 经过注意力层之后,「它」的新向量是怎么得到的?
3. 与 RNN 的「传纸条」相比,注意力的两大优势是什么?

延伸阅读​