Skip to content
L2 里面是什么

注意力机制

「我们今天去公园散步吧」,处理「散步」时它在看谁。

像读一句话时你的眼睛会跳 ​

「苹果发布新手机」和「苹果很甜」——同一个词,念到它的时候你脑子里浮出的东西完全不同,但你的耳朵收到的音节一模一样。

那你是怎么判断的?你其实在往回扫。扫到前半句,看到「发布」,就知道这是公司不是水果。这个「往回扫一眼、决定多看谁一眼」的动作,就是注意力。

注意力机制(attention mechanism)——处理一个词时给上下文其他词分配权重的机制。

人类的眼睛和耳朵做不到同时看两处。但计算可以。一句话切成十个词元,那么第 7 个词元在处理的时候,可以同时看第 1 到第 10 个,一共看 70 份「关系」,然后给每一份打一个分数。这个分数就是权重,说白了是「这俩有多相关」。

三个角色,一套动作 ​

每个词元进模型的时候,会被复制成三份:

  • 查询(query)——「我在找什么」
  • 键(key)——「我是什么东西」
  • 值(value)——「我实际携带的内容」

流程是固定的四步:拿查询去跟所有键比对算出相似度,把相似度归一化(normalization)—— 压到 0 到 1 之间 —— 成权重,用权重去加权求和所有值。

下面这个图是「我们 去 公园 散步」这四个词元里,「散步」那一格的内部动作:

输入:整句话被切成词元,每个词元自带一个向量
每个词元复制三份角色——查询(问「我在找什么」)、键(说「我是什么」)、值(装「我的内容」)
拿「散步」的查询,去跟每个词元的键逐一比对,算出相似度
相似度归一化成权重:「公园」权重最高,「去」次之,「我们」和「散步」自己最低
用这组权重去加权求和所有词元的值
得到「散步」的新向量——此时它已经混进了公园的成分
同一套动作对整句话的每个词元各做一遍,位置信息在别处补回来
重复叠加很多层,词与词之间的远距离关系被反复重算、加深

图里那句「公园权重最高」,是我按直觉写的,不是实测。真要验证,Transformers 库里有个现成的东西:把任意模型加载进来,让它对一句话做注意力可视化,你会看到模型自己在标哪几个词重。同一段文字换个问法,重的地方就会挪位置。

2017 年之前为什么不这么做 ​

在那之前主流是循环神经网络——一个字一个字往前传,第五个字处理的时候只能看到前四个。句子长了,第七个字的「记忆」传到第十个的时候已经糊了。这叫长距离依赖问题。

Transformer 那篇论文的赌注是:别一个一个传了,让所有词两两之间直接连线。代价是句子长了两两连线的数量按平方涨,所以句子不能太长。这个取舍到今天还在,连上下文窗口那一页讲的缓存技术,一半是为了给这个平方增长买单。

论文里报的数字是:在德译英机器翻译任务上拿到 28.4 的 BLEU 分数(0 到 100,越高越接近人工翻译),同时训练快得多。翻译任务和聊天模型不是一回事,但这篇的结构后来几乎原封不动成了今天所有大语言模型的骨架。

注意力不等于「它在思考什么」 ​

我见过太多人把「注意力权重」当成模型的解释。有一篇 2021 年的短报告专门去挖视觉模型里的注意力,结果把注意力层整个换成前馈层,ImageNet 上还能拿到 74.9% 的准确率,跟原版差不了多少。

意思是:注意力很重要,但没你想象的那么独占。这一点到现在也没有定论。

延伸阅读 ​

  • Attention Is All You Need(Ashish Vaswani、Noam Shazeer、Niki Parmar et al.,2017,NeurIPS)—— Google 八个人写的,开头第一句是「当前最好的序列转换模型都建立在循环或卷积网络上」。这篇把循环和卷积全删了,只留注意力机制和前馈层,训练可以完全并行。标题里的「你需要的只有注意力」后来被无数人模仿,也被人嘲。arXiv: 1706.03762

  • BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding(Jacob Devlin、Ming-Wei Chang、Kenton Lee et al.,2019,NAACL)—— BERT 那个名字的全文是「双向编码器表示」。它让每一层的每个词元同时看左右两边,把注意力用满。Google Search 一换上去就是搜词方式的大变。arXiv: 1810.04805

动手试试 ​

装个 bertviz(pip install bertviz),然后打开这个在线页面:https://colab.research.google.com/drive/1Uu7gFcO-0zRdmnFbpcxZFgI-hlo0RY8R

在弹出的窗口里选一个模型(选 bert-base-uncased 就够),在输入框里粘一句中文或英文长一点的句子,看它高亮出来的词。

然后做一件事:把同一句话改写成意思一样、语序不同的版本,再看一次高亮位置怎么动。这一步是我自己第一次觉得「注意力」三个字有了实感。

下一站 ​

注意力要拿「查询」去和「键」比对,问题是这些词元在你输入的那一刻还只是字串。「散步」这两个字,凭什么有一个能被拿去比对的向量。

内容用 VitePress 构建,站内链接全部为相对路径。