8.1 注意力机制基础
在认知科学应用中,由于信息处理的瓶颈,人类会选择性地关注所有信息的一部分,同时忽略其他可见的信息。上述这种机制通常被称为注意力机制。
8.1.1 注意力机制介绍
人类视网膜不同的部位具有不同程度的信息处理能力,即敏锐度(Acuity),只有视网膜中央凹部位具有最强的敏锐度。为了合理利用有限的视觉信息处理资源,人类需要选择视觉区域中的特定部分,然后集中关注它。例如,人们在阅读时,通常只有少量要被读取的词会被关注和处理。综上,注意力机制主要有两个方面:决定需要关注输入的哪部分;分配有限的信息处理资源给重要的部分。
注意力机制的一种非正式的说法是,神经注意力机制可以使得神经网络具备专注于其输入(或特征)子集的能力:选择特定的输入。注意力可以应用于任何类型的输入而不管其形状如何。在计算能力有限情况下,注意力机制(attention mechanism)是解决信息超载问题的主要手段的一种资源分配方案,将计算资源分配给更重要的任务 [1] 。
在现实应用中,通常将注意力分为如下两种:
- 一种是自上而下的有意识的注意力,称为聚焦式(focus)注意力。聚焦式注意力是指有预定目的、依赖任务的、主动有意识地聚焦于某一对象的注意力;
- 一种是自下而上的无意识的注意力,称为基于显著性(saliency-based)的注意力。基于显著性的注意力是由外界刺激驱动的注意,不需要主动干预,也和任务无关。
如果一个对象的刺激信息不同于其周围信息,一种无意识的“赢者通吃”(winner-take-all)或者门控(gating)机制就可以把注意力转向这个对象。不管这些注意力是有意还是无意,大部分的人脑活动都需要依赖注意力,比如记忆信息,阅读或思考等。
在认知神经学中,注意力是一种人类不可或缺的复杂认知功能,指人可以在关注一些信息的同时忽略另一些信息的选择能力。在日常生活中,我们通过视觉、听觉、触觉等方式接收大量的感觉输入。但是我们的人脑可以在这些外界的信息轰炸中还能有条不紊地工作,是因为人脑可以有意或无意地从这些大量输入信息中选择小部分的有用信息来重点处理,并忽略其他信息。这种能力就叫做注意力。注意力可以体现为外部的刺激(听觉、视觉、味觉等),也可以体现为内部的意识(思考、回忆等)。
8.1.2 注意力机制的变体
多头注意力(multi-head attention)是指利用多个查询,来平行地计算从输入信息中选取多个信息。每个注意力关注输入信息的不同部分。 硬注意力,即基于注意力分布的所有输入信息的期望。还有一种注意力是只关注到一个位置上,叫做硬性注意力(hardattention)。
硬性注意力有两种实现方式,一种是选取最高概率的输入信息。另一种硬性注意力可以通过在注意力分布式上随机采样的方式实现。硬性注意力的一个缺点是基于最大采样或随机采样的方式来选择信息。因此最终的损失函数与注意力分布之间的函数关系不可导,因此无法使用在反向传播算法进行训练。为了使用反向传播算法,一般使用软性注意力来代替硬性注意力。
- 键值对注意力:一般地来说,可以用键值对(key-value pair)格式来表示输入信息,其中“键”用来计算注意力分布,“值”用来生成选择的信息。
- 结构化注意力:要从输入信息中选取出和任务相关的信息,主动注意力是在所有输入信息上的多项分布,是一种扁平(flat)结构。如果输入信息本身具有层次(hierarchical)结构,比如文本可以分为词、句子、段落、篇章等不同粒度的层次,我们可以使用层次化的注意力来进行更好的信息选择[Yang et al., 2016]。此外,还可以假设注意力上下文相关的二项分布,用一种图模型来构建更复杂的结构化注意力分布。
8.1.3 注意力机制解决什么问题?
为了深入理解注意力机制可以做什么,接下来以本书前面7.3节中的神经机器翻译(NMT)为例进行讲解,在本书7.3的实例中用到了注意力机制。在传统的机器翻译系统中,通常依赖于基于文本统计属性的复杂特征工程。简而言之,这些系统是复杂的,并且大量的工程设计都在构建它们。神经机器翻译系统工作有点不同。在NMT中,将一个句子的含义映射成一个固定长度的向量表示,然后基于该向量生成一个翻译。通过不依赖于n-gram数量的东西,而是试图捕捉文本的更高层次的含义,NMT系统比许多其他方法更广泛地推广到新句子。也许更重要的是,NTM系统更容易构建和训练,而且不需要任何手动功能工程。事实上,Tensorflow中的一个简单的实现不超过几百行代码。
大多数NMT系统通过使用循环神经网络将源语句(例如,德语句子)编码为向量,然后基于该向量来解码英语句子,也使用RNN来工作。如图8-1所示。
图8-1 神经机器翻译(NMT)
在上述图中,将文字“Echt”,“Dicke”和“Kiste”馈送到编码器中,并且在特殊信号(未示出)之后,解码器开始产生翻译的句子。解码器继续生成单词,直到产生句子令牌的特殊结尾。这里,h向量表示编码器的内部状态。
如果仔细观察,可以看到解码器应该仅基于编码器的最后一个隐藏状态(上面的h_3)生成翻译,这个h3矢量必须编码我们需要知道的关于源语句的所有内容,它必须充分体现其意义。在更技术术语中,该向量是一个嵌入的句子。事实上,如果使用PCA或t-SNE绘制不同句子在低维空间中的嵌入以降低维数,可以看到语义上类似的短语最终彼此接近。这样十分完美。
然而,假设我们可以将所有关于潜在的非常长的句子的信息编码成单个向量似乎有些不合理,然后使解码器仅产生良好的翻译。让我们说你的源语句是50个字。英文翻译的第一个词可能与源句的第一个字高度相关。但这意味着解码器必须从50个步骤前考虑信息,并且该信息需要以矢量编码。已知经常性神经网络在处理这种远程依赖性方面存在问题。在理论上,像LSTM这样的架构应该能够处理这个问题,但在实践中,远程依赖仍然是有问题的。例如,研究人员已经发现,反转源序列(向后馈送到编码器中)产生明显更好的结果,因为它缩短了从解码器到编码器相关部分的路径。类似地,两次输入输入序列也似乎有助于网络更好地记住事物。
将句子颠倒的这种做法,使事情在实践中更好地工作,但这不是一个原则性的解决方案。大多数翻译基准都是用法语和德语来完成的,与英语非常相似(甚至中文的单词顺序与英语非常相似)。但是有一些语言(如日语),一个句子的最后一个单词可以高度预测英语翻译中的第一个单词。在这种情况下,扭转输入会使事情变得更糟。那么,有什么办法呢?那就是使用注意力机制。
通过使用注意机制,我们不再尝试将完整的源语句编码为固定长度的向量。相反,允许解码器在输出生成的每个步骤“参加”到源句子的不同部分。重要的是,我们让模型基于输入句子以及迄今为止所产生的内容,学习了要注意的内容。所以,在很好的语言(如英语和德语)中,解码器可能会顺序地选择事情。在制作第一个英文单词时参加第一个单词,等等。这是通过联合学习来整合和翻译的神经机器翻译所做的,如图8-2所示。
图8-2 使用注意机制
在上图8-2中, y是我们由解码器产生的翻译词,x是我们的源语句。上图说明使用双向循环网络,但是这并不重要,我们可以忽略反向方向。重要的部分是每个解码器输出字y_t现在取决于所有输入状态的加权组合,而不仅仅是最后一个状态。a的权重定义为每个输出应考虑每个输入状态的多少。所以,如果a_ {3,2}是一个大数字,这意味着解码器在产生目标句子的第三个单词时,对源语句中的第二个状态给予了很大的关注。a通常被归一化为总和为1(因此它们是输入状态的分布)。
另外,使用注意力机制的一大优点是能够使我们能够解释和可视化模型正在做什么。例如,通过在翻译句子时可视化注意力矩阵a,这样我们可以了解模型的翻译方式。