注意力机制与外部记忆
根据通用近似定理,前馈网络和循环网络都有很强的能力。但由于优化算法和计算能力的限制,在实践中很难达到通用近似的能力。
神经网络中可以存储的信息量称为网络容量(Network Capacity)。一般来讲,利用一组神经元来存储信息时,其存储容量和神经元的数量以及网络的复杂度成正比。如果要存储越多的信息,神经元数量就要越多或者网络要越复杂,进而导致神经网络的参数成倍地增加。
大脑神经系统有两个重要机制可以解决信息过载问题:注意力和记忆机制。我们可以借鉴人脑解决信息过载的机制,从两方面来提高神经网络处理信息的能力。一方面是注意力,通过自上而下的信息选择机制来过滤掉大量的无关信息;另一方面是引入额外的外部记忆,优化神经网络的记忆结构来提高神经网络存储信息的容量。
1、注意力
在计算能力有限情况下,注意力机制(Attention Mechanism)作为一种资源分配方案,将计算资源分配给更重要的任务,是解决信息超载问题的主要手段。
1.1、认知神经学中的注意力
注意力是一种人类不可或缺的复杂认知功能,指人可以在关注一些信息的同时忽略另一些信息的选择能力。
注意力一般分为两种:一种是自上而下的有意识的注意力,称为聚焦式(Focus)注意力。聚焦式注意力是指有预定目的、依赖任务的、主动地有意识地聚焦于某一对象的注意力;另一种是自下而上的无意识的注意力,称为基于显著性(Saliency-Based)的注意力。基于显著性的注意力是由外界刺激驱动的注意,不需要主动干预,也和任务无关。
一个和注意力有关的例子是鸡尾酒会效应。当一个人在吵闹的鸡尾酒会上和朋友聊天时,尽管周围噪音干扰很多,他还是可以听到朋友的谈话内容,而忽略其他人的声音(聚焦式注意力)。同时,如果未注意到的背景声中有重要的词(比如他的名字),他会马上注意到(显著性注意力)。
1.2、人工神经网络中的注意力机制
在目前的神经网络中,我们可以将最大汇聚(Max Pooling)、门控(Gating)机制来近似地看作是自下而上的基于显著性的注意力机制。除此之外,自上而下的会聚式注意力也是一种有效的信息选择方式。
用表示组输入信息,其中每个向量都表示一组输入信息。为了节省计算资源,不需要将所有信息都输入到神经网络,只需要从中选择一些和任务相关的信息。注意力机制的计算可以分为两步:一是在所有输入信息上计算注意力分布,二是根据注意力分布来计算输入信息的加权平均。
- 注意力分布:为了从个输入向量中选择出和某个特定任务相关的信息,我们需要引入一个和任务相关的表示,称为查询向量(Query Vector),并通过一个打分函数来计算每个输入向量和查询向量之间的相关性。
给定一个和任务相关的查询向量,我们用注意力变量来表示被选择信息的索引位置,即表示选择了第个输入向量。为了方便计算,我们采用一种“软性”的信息选择机制,首先计算在给定和下,选择第个输入向量的概率:
其中称为注意力分布(Attention Distribution),为注意力打分函数,可以使用以下几种方式来计算:
- 加性模型:
- 点积模型:
- 缩放点积模型:
- 双线性模型:
其中为可学习的网络参数,为输入向量的维度。理论上,加性模型和点积模型的复杂度差不多,但是点积模型在实现上可以更好地利用矩阵乘积,从而计算效率更高。但当输入向量的维度比较高,点积模型的值通常有比较大方差,从而导致函数的梯度会比较小。因此,缩放点积模型可以较好地解决这个问题。
- 加权平均:注意力分布可以解释为在给定任务相关的查询时,第个输入向量受关注的程度。我们采用一种“软性”的信息选择机制对输入信息进行汇总:
上式称为软性注意力机制(Soft Attention Mechanism)。下图给出了软性注意力机制的示例。
1.3、注意力机制的变体
1.3.1、硬性注意力
上面提到的注意力是软性注意力,其选择的信息是所有输入向量在注意力分布下的期望。此外,还有一种注意力是只关注到某一个输入向量,叫做硬性注意力。
硬性注意力有两种实现方式:
- 一种是选取最高概率的一个输入向量,即:
其中为概率最大的输入向量的下标,即
- 另一种硬性注意力可以通过在注意力分布上随机采样的方式实现。
硬性注意力的一个缺点是基于最大采样或随机采样的方式来选择信息。因此最终的损失函数与注意力分布间的函数关系不可导,因此无法用反向传播算法进行训练(硬性注意力需要通过强化学习来进行训练)。为了使用反向传播算法,一般使用软性注意力来代替硬性注意力。
1.3.2、键值对注意力
更一般地,我们可以用键值对(key-value pair)格式来表示输入信息,其中“键”用来计算注意力分布,“值”用来计算聚合信息。
用表示组输入信息,给定任务相关的查询向量时,注意力函数为:
下图给出键值对注意力机制的示例。当时,键值对模式就等价于普通的注意力机制。
1.3.3、多头注意力
多头注意力(Multi-Head Attention)是利用多个查询,来平行地计算从输入信息中选取多组信息。每个注意力关注输入信息的不同部分。
其中表示向量拼接。
1.3.4、结构化注意力
在之前介绍中,我们假设所有的输入信息是同等重要的,是一种扁平(Flat)结构,注意力分布实际上是在所有输入信息上的多项分布。但如果输入信息本身具有层次结构,比如文本可以分为词、句子、段落、篇章等不同粒度的层次,我们可以使用层次化的注意力来进行更好的信息选择。
2、注意力机制的应用
注意力机制一般可以用作一个神经网络中的组件。
2.1、指针网络
注意力机制可以分为两步:一是计算注意力分布,二是根据来计算输入信息的加权平均。我们可以只利用注意力机制中的第一步,并将注意力分布作为一个软性的指针(pointer)来指出相关信息的位置。
指针网络(Pointer Network)是一种序列到序列模型, 输入是长度为的向量序列, 输出是下标序列。
和一般的序列到序列任务不同,这里的输出序列是输入序列的下标(索引)。比如输入一组乱序的数字,输出为按大小排序的输入数字序列的下标。比如输入为20, 5, 10,输出为1, 3, 2。
条件概率可以写为:
其中条件概率可以通过注意力分布来计算。假设用一个循环神经网络对进行编码得到向量,则:
其中为在解码过程的第步时,每个输入向量的未归一化的注意力分布:
其中为可学习的参数。下图给出指针网络的示例。
2.2、自注意力模型
当使用神经网络来处理一个变长的向量序列时,我们通常可以使用卷积网络或循环网络进行编码来得到一个相同长度的输出向量序列。
基于卷积或循环网络的序列编码都是可以看做是一种局部的编码方式,只建模了输入信息的局部依赖关系。虽然循环网络理论上可以建立长距离依赖关系,但是由于信息传递的容量以及梯度消失问题,实际上也只能建立短距离依赖关系。如果要建立输入序列之间的长距离依赖关系,可以使用以下两种方法:一种方法是增加网络的层数,通过一个深层网络来获取远距离的信息交互;另一种方法是使用全连接网络。全连接网络是一种非常直接的建模远距离依赖的模型,但是无法处理变长的输入序列。不同的输入长度,其连接权重的大小也是不同的。这时我们就可以利用注意力机制来“动态”地生成不同连接的权重,这就是自注意力模型(Self-Attention Model)。
假设输入序列为,输出序列为,首先我们可以通过线性变换得到三组向量序列:
其中分别为查询向量序列,键向量序列和值向量序列,分别为可学习的参数矩阵。
利用键值对的注意力函数,可以得到输出向量:
其中为输出和输入向量序列的位置,连接权重由注意力机制动态生成。
下图给出全连接模型和自注意力模型的对比,其中实线表示为可学习的权重,虚线表示动态生成的权重。由于自注意力模型的权重是动态生成的,因此可以处理变长的信息序列。
自注意力模型可以作为神经网络中的一层来使用,既可以用来替换卷积层和循环层,也可以和它们一起交替使用。
3、外部记忆
为了增强网络容量,我们可以引入辅助记忆单元,将一些信息保存辅助记忆中,在需要时再进行读取,这样可以有效地增加网络容量。这个引入辅助记忆单元一般称为外部记忆(External Memory),以区别与循环神经网络的内部记忆(即隐状态)。
3.1、人脑中的记忆
生理学家发现信息是作为一种整体效应(collective effect)存储在大脑组织中。当大脑皮层的不同部位损伤时,其导致的不同行为表现似乎取决于损伤的程度而不是损伤的确切位置。大脑组织的每个部分似乎都携带一些导致相似行为的信息。也就是说,记忆在大脑皮层是分布式存储的,而不是存储于某个局部区域。
人脑中的记忆具有周期性和联想性。
- 记忆周期:虽然人脑记忆的存储机制还不清楚,但是在我们已经大概可以确定不同脑区参与了记忆形成的几个阶段。人脑记忆的一个特点记忆一般分为长期记忆和短期记忆。长期记忆(Long-Term Memory),也称为结构记忆或知识,体现为神经元之间的连接形态,其更新速度比较慢。短期记忆(Short-Term Memory)体现为神经元的活动,更新较快,维持时间为几秒至几分钟。短期记忆是神经连接的暂时性强化,通过不断巩固、强化可形成长期记忆。短期记忆、长期记忆的动态更新过程称为演化(Evolution)过程。
长期记忆可以类比于人工神经网络中的权重参数,而短期记忆可以类比于人工神经网络中的隐状态。
除了长期记忆和短期记忆,人脑中还会存在一个“缓存”,称为工作记忆(Working Memory)。在执行某个认知行为(比如记下电话号码,算术运算)时,工作记忆是一个记忆的临时存储和处理系统,维持时间通常为几秒钟。
- 联想记忆:大脑记忆的一个主要特点是通过联想来进行检索的。联想记忆(Associative Memory)是指一种学习和记住不同对象之间关系的能力,比如看见一个人然后想起他的名字,或记住某种食物的味道等。联想记忆是指一种可以通过内容匹配的方法进行寻址的信息存储方式,也称为基于内容寻址的存储(Content-Addressable Memory,CAM)。作为对比,现代计算机的存储方式根据地址来进行存储的,称为随机访问存储(Random Access Memory,RAM)。
和之前介绍的LSTM中的记忆单元相比,外部记忆可以存储更多的信息,并且不直接参与计算,通过读写接口来进行操作。而LSTM模型中的记忆单元包含了信息存储和计算两种功能,不能存储太多的信息。因此,LSTM中的记忆单元可以类比于计算机中寄存器,而外部记忆可以类比于计算机中的存储器:内存、磁带或硬盘等。
借鉴人脑中工作记忆,可以在神经网络中引入一个外部记忆单元来提高网络容量。外部记忆的实现途径有两种:一种是结构化的记忆,这种记忆和计算机中的信息存储方法比较类似,可以分为多个记忆片段,并按照一定的结构来存储;另一种是基于神经动力学的联想记忆,这种记忆方式具有更好的生物学解释性。
一个不太严格的类比表格如下:
3.2、结构化的外部记忆
为了增强网络容量,一种比较简单的方式是引入结构化的记忆模块,将和任务相关的短期记忆保存在记忆中,需要时再进行读取。这种装备外部记忆的神经网络也称为记忆网络(Memory Network,MN)或记忆增强神经网络(Memory Augmented Neural Network,MANN)。
记忆网络结构如图:
一般有以下几个模块构成:
-
主网络C:也称为控制器(Controller),负责信息处理,并与外界的交互(接受外界的输入信息并产生输出到外界)。主网络还同时通过读写模块和外部记忆进行交互。
-
外部记忆单元M: 外部记忆单元用来存储信息, 一般可以分为很多记忆片段(Memory Segment),这些记忆片段按照一定的结构来进行组织。记忆片段一般用向量来表示,外部记忆单元可以用一组向量来表示。这些向量的组织方式可以是集合、树、栈或队列等。大部分信息存储于外部记忆中,不需要全时参与主网络的运算。
-
读取模块R:根据主网络生成的查询向量,从外部记忆单元中读取相应的信息。
-
写入模块W:根据主网络生成的查询向量和要写入的信息来更新外部记忆。
这种结构化的外部记忆是带有地址的,即每个记忆片段都可以按地址读取和写入。要实现类似于人脑神经网络的联想记忆能力,就需要按内容寻址的方式进行定位,然后进行读取或写入操作。按内容寻址通常使用注意力机制来进行。通过注意力机制可以实现一种“软性”的寻址方式,即计算一个在所有记忆片段上的分布,而不是一个单一的绝对地址。比如读取模型的实现方式可以为:
其中是主网络生成的查询向量,为打分函数。类比于计算机的存储器读取,计算注意力分布的过程相当于是计算机的“寻址”过程,信息加权平均的过程相当于计算机的“内容读取”过程。因此,结构化的外部记忆也是一种联想记忆,只是其结构以及读写的操作方式更像是受计算机架构的启发。
通过引入外部记忆,可以将神经网络的参数和记忆容量的“分离”,即在少量增加网络参数的条件下可以大幅增加网络容量。注意力机制可以看做是一个接口,将信息的存储与计算分离。
3.3、典型的记忆网络
端到端记忆网络(End-To-End Memory Network,MemN2N)采用一种可微的网络结构,可以多次从外部记忆中读取信息。在端到端记忆网络中,外部记忆单元是只读的。
给定一组需要存储的信息,首先将其转换成两组记忆片段和,分别存放在两个外部记忆单元中,其中用来进行寻址,用来进行输出。
主网络根据输入生成,并使用注意力机制来从外部记忆中读取相关信息:
并产生输出:
其中为预测函数。当应用到分类任务时,可以设为softmax 函数。
为了实现更新复杂的计算,我们可以让主网络和外部记忆进行多轮交互。在第轮交互中,主网络根据上次从外部记忆中读取的信息,产生新的查询向量:
其中为初始的查询向量,。
假设第轮交互的外部记忆为和,主网络从外部记忆读取信息为:
端到端记忆网络结构如图: