JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

注意力这个想法

在自注意力之前、在 Transformer 之前,只有一个简单的问题:我该注意哪些词?认识作为一种软的、可学习的查表的注意力——并看清为什么那个旧的固定长度摘要非走不可。

一切的起点:那个瓶颈

在上一段阶梯里,你认识了循环神经网络,以及它逐步读取序列的工作。要翻译一个句子,经典的序列到序列结构让一个编码器读完整个输入,把它压缩进一个固定长度的向量——一种被压扁的摘要——再由解码器把它展开成输出。它确实管用,曾一度是最先进的方法。但请留意这个设计里那股安静的暴力:无论是五个词还是五十个词,*每一个*句子都被硬挤进同样长度的一个向量。

想象有人要你读一段话,然后逐字逐句地把它用另一种语言写下来——但你读的时候只能用一张便利贴,而且不许回头看原文。对一句短语来说,没问题。但对一句又长又绕的句子,便利贴会写满;等你读到结尾,开头附近的细节早已模糊。这就是固定长度摘要问题,它不是一个你能调一调就消除的小毛病,而是写进了架构本身的形状里。

让模型回头看

解法自然得几乎让人不好意思。与其逼编码器交出一份冻结的摘要,不如把它逐步产生的*全部*表示都保留下来——每个输入词一个向量——并让解码器在需要时随时伸手去那一堆里取用。当它要生成下一个输出词时,它会问:在所有输入词里,*此刻*哪些重要?这个问题——「我该注意哪些词?」——正是整个注意力机制的种子。

具体来说:当把「the cat sat on the mat」翻译成法语、而模型正在决定「sat」对应的词时,它应当重重地依赖输入词 *sat*,只轻轻地看一眼 *the* 或 *mat*。注意力给每个输入词一个权重——一个数字,表示它对当前正在生成的词有多相关——然后按这些比例把各个输入向量混合在一起。得到的是一份新鲜的摘要,为这一刻量身定制,而不是一张冻结的、整句反复重用的便利贴。

请留意这种心态上的转变。模型不再需要预先把整句话背下来。它只需在每一步知道*该往哪里看*——而原始信息始终原封不动地摆在那里,随时可取。我们用一次压缩的动作,换来了一次选择性检索的动作。

加权聚焦:一次柔性平均,而不是只挑一个

下面是微妙而漂亮的地方。注意力*并不*只指向一个胜出的词、对其余视而不见。那会是一种硬选择——挑出唯一最相关的输入,只用它。注意力反而把焦点*柔性地*铺开:也许 70% 给 *sat*,15% 给 *cat*,剩下一点点散在其它所有词上,所有权重加起来等于 1。输出是所有输入向量的加权混合。这正是人们称它为注意力的原因——焦点是一条平滑的分布,而不是一个开关。

为什么要软、不要硬?有两个原因,都很深。第一,真实语言本就充满歧义——「它」也许主要指一个名词,又有几分指向另一个,而混合能诚实地捕捉这一点。第二,也更实际:软混合是可微的——你可以对它求梯度,用反向传播端到端地训练这些权重,正如你在普通网络里学过的那样。硬选择没有可供跟随的有用斜率。正是这份平滑,让注意力变得*可学习*。

原始的相关性分数怎样变成一组干净、加起来等于 1 的权重?用一个你已经认识的函数:softmax。它把任意一串数字变成加起来为一的正分数,并温和地放大较大的那些。把相关性分数送进 softmax,出来的就是注意力权重,可以直接拿去混合。

柔性查表:查询、键与值

还有一种更清爽的方式来理解这一切,它也是本段阶梯接下来要用的框架。想象一次普通的字典查找。你有一个查询(你要找什么)、一组(东西被归档时贴的标签),以及一些(内容本身)。你拿查询去和各个键比对,找到匹配的那一个,返回它的值。注意力就是这件事的*柔性*版本——一次查询-键-值查找,只不过你得到的不是一个精确匹配,而是对所有项的一次加权混合。

模型怎样衡量一个查询与某个键「合不合」?两者都不过是向量——空间里的点,就是你早先认识的那种嵌入——所以它用一个相似度分数。最简单的选择是点积:当两个向量指向同一方向时它很大,方向不一致时则小甚至为负。把查询和每个键打分,用 softmax 把这些分数变成权重,再对各个值取加权和。这三行配方就是注意力的核心。

# soft lookup over a memory of (key, value) pairs
scores  = [ dot(query, k) for k in keys ]   # how well query fits each key
weights = softmax(scores)                    # positive, sum to 1
output  = sum( w * v for w, v in zip(weights, values) )  # weighted blend
# one exact key would give weights like [0,0,1,0]; attention stays soft
三行写尽注意力:打分、归一化、混合。硬查找会跳到某一个值;软查找则按相关性把它们全部混合起来。

下一篇会揭开让它威力暴涨的转折:查询、键和值不必来自两个不同的句子。让*同一个*句子里的每个词都发出自己的查询,同时又充当其它词的键和值,你就得到了自注意力——Transformer 的引擎。但整座大厦,都建立在你刚刚搭起的这个朴素想法之上:一次允许模糊的查表。

注意力是什么——又不是什么

一旦看到那些权重,人们很容易把它们读作模型的*理由*。研究者甚至会把注意力画成热力图,称之为解释。这里要当心。注意力权重显示的是*信息从哪里被收集而来*,这有启发性,但它并不是模型为何做出某个决定的忠实交代。关于把注意力当作解释的大量文献已经表明:你常常可以打乱这些权重,却得到同样的答案。注意力是一种为信息选路的机制,而不是一扇通向心灵的窗。

第二个诚实的提醒:注意力本身并没有发明智能。它最早(约 2014 年)是被*加装*到循环翻译模型上的,使它们明显变好——那是一次改进,还不是一场革命。革命来得更晚,当研究者去问:能不能把循环结构整个扔掉,*只*保留注意力?那个故事,以及它背后那个著名的论文标题,留给后面的指南。眼下,请抵挡那种气喘吁吁的说法:注意力是一个绝妙的好想法,而不是魔法。