注意力机制
1. Attention是什么
注意力机制在很多AI领域内得到了成功的应用。这是人工神经网络在模仿人类进行决策过程的重要发展。
In humans, Attention is a core property of all perceptual and cognitive operations. Given our limited ability to process competing sources, attention mechanisms select, modulate, and focus on the information most relevant to behavior.
上面这段文字摘自Alana de Santana Correia, and Esther Luna Colombini的论文 ATTENTION, PLEASE ! A SURVEY OF NEURAL ATTENTION MODELS IN DEEP LEARNING。你应该注意到了,在你的视野中,只有一部分区域是很清晰的。对于视野周围的场景,你往往需要转转眼珠,把视野朝向它,才能完全看清。或者,你还发现,比起历史老师开始强调重点,你似乎对下课铃声的响起更加敏感——这就是注意力。你所处的环境包含着远超你的处理能力的信息,而注意力机制让你的大脑集中精力处理你视野中心的场景,或是你“更应该”关心的事物。
Attention机制听上去是一个很高大上的词汇,实际上,Attention在不经意间就会被使用。例如,循环神经网络中每一步计算都依赖于上一步计算结果的过程就可以被视为一种Attention:在 Attention 机制引入之前,有一个问题大家一直很苦恼:长距离的信息会被弱化,就好像记忆能力弱的人,记不住过去的事情是一样的。
如上图,在处理序列的循环神经网咯中,Attention的功能是关注重点,就算文本比较长,也能从中间抓住重点,不丢失重要的信息。上图中红色的预期就是被挑出来的重点。
对于文字序列的输入,有基于编码器解码器的注意力;对图像输入,有各种各样的空间注意力;在神经网络处理得过程中,还有通道注意力;还有强大的自注意力,并且具有能够将自注意力适用于各种输入的广泛化设计。
Attention具有以下三大优点:参数少、速度快、效果好。Attention机制如果浅层的 理解,跟他的名字非常匹配。他的核心逻辑就是从关注全部到关注重点。在认知科学中,由于信息处理的瓶颈,人类会选择性地关注所有信息的一部分,同时忽略其他信息。同理,当神经网络处理大量的信息输入时,快速聚焦其中一些关键信息来进行处理,这便是注意力机制。
1.1 Attention的分类
宏观上,Attention可以被分为:
-
显著性(Saliency-Based)注意力:自下而上的无意识的注意力。
在很常见的卷积神经网络和循环神经网络中,可以将 池化(
max pooling
)、门控(Gating
) 近似看作是自下而上的基于显著性的注意力机制。自下而上的意思是,这种注意力不需要策略和判断,也不需要经过学习,所以是无意识的。 -
聚焦式(Focus)注意力:自上而下的有意识的注意力。
这种注意力是需要设计或是经过学习才能产生的,所以称为自上而下的,或称为有意识的。在这一节我们主要对这种自上而下的注意力进行了解。
在视觉中细分的话,根据作用方式的差异,注意力又可以被分为:
-
空间(Spetial-wise)注意力(b)
如上图中(b),空间注意力是指作用与空间属性有关的注意力。这类注意力对输入特征图的空间属性敏感,在获得注意力后往往加权于输入本身,产生新的特征图。空间注意力往往能提升网络 在空间细节上的精度,常用于网络的浅层或中层。
-
通道(Channel-wise)注意力(a)
如上图中(a),通道注意力是指对空间属性不敏感,但是对通道信息敏感的注意力。这种注意力能够在通道维度上注意到语义上的重点信息。代表的成果是SENet。通道注意力模块往往产生长度和输入通道数一样的权值,然后使权值作用于输入本身产生新的特征图。通道注意力往往提升上下文信息的筛选能力,常用于网络的中层或深层。
-
3D注意力(c)
上述的空间注意力和通道注意力分别仅作用于平面维度和通道维度。3D注意力指的是同时对空间属性和通道信息。CBAM将空间注意力和通道注意力串联组成3D注意力模块;SimAM提出直接构建3D的权重来组成3D注意力模块。3D注意力模块比较适合出现在网络中层,同时兼顾空间信息和上下文。
还有一些其他的分类方式,例如,根据需不需要占用网络参数,可以分为有参数注意力和无参数的注意力等。
2. 初步理解
求注意力分布也就是为了实现选择关键的信息来进行处理。或者说,注意力分布就是关键信息的分布。
例如,人第一眼看到上面的图片,会不自觉地先看到红色的区域。上图中红色到绿色构成的mask就是注意力分布了。
注意力机制的一种可能的流程是这样的可以通过这样的两个步骤实现:
- 在所有输入信息上计算注意力分布
- 根 据注意力分布计算输入信息的加权和,以此选择关键信息
也就是说,我们设计注意力模块产生注意力(分布),然后让注意力通过某种方式作用于输入,形成更加有效的信息。
3. 衡量相关性
注意力的一种核心思想是衡量相关性。例如,我说,要你在一幅画面中找出苹果,那么你会注意到整个画面中所有红色的球形物体,因为这样的物体和苹果相关性较大。所以,设计注意力的时候就是要设计一种函数,用于衡量目标和当前对象的相关性。这种函数被称为打分函数,打分函数的输出被称为注意力分布。
3.1 打分函数
打分函数,就是计算每个输入量和查询向量之间的相关性的函数。打分函数根据是否需要通过学习获得,可以分文不需要学习的打分函数和需要学习的打分函数。
在上图的过程中,打分函数所处的位置是注意力机制模块。
3.1.1 不需要学习的打分函数
不需要学习的打分函数设计往往与具体任务相关。 例如,如果需要设计一个距离计算关系(离得越远分数越低)的打分函数,可以设计为。其中表示和之间的欧几里得距离。由于不需要学习参数,这类函数完全由手工设计,效果明确且单一。
3.1.2 需要学习的打分函数
需要学习的打分函数指需要通过训练过程才能完全确定的打分函数。这类打分函数通常在形式上是确定的,但是其中有一部分参数不是确定的,需要通过学习获得。在最新的注意力机制的相关工作中,出现的大部分打分函数都是需要学习的打分函数。其中常见的可以表示为以下几种:
- 加性模型:,其中、、是可训练的参数。
- 点积模型:,理论上,加性模型和点积模型的复杂度差不多,但是点积模型在实现上可以 更好地利用矩阵乘积,从而计算效率更高
- 缩放点积模型:,其中为输入输入向量的维度。当输入向量维度过高,点积模型通常有较大的方差,从而导致函数梯度较小,而缩放点积模型可以很好地解决这个问题。
- 双线性模型:,双线性模型可以看作一种更泛化的点积模型,相比点积模型,双线性模型在计算相似度时引入了非对称性。
其中,,为可学习的参数,为输入向量的维度。以上出现的公式均需要通过学习得到其中的参数。当然,也有一种叫做自注意力的函数设计更特殊一些,但是它也属于需要学习的打分函数。
3.2 注意力分布
为了从输入中选择出和某个特定任务相关的信息,我们需要引入一个和任务相关的表示,称为查询向量(Query Vector),并通过一个打分函数来计算每个输入向量和查询向量之间的相关性。
注意力分布可以解释为在给定任务相关的查询 时,第 个输入向量受关注的程度.我们采用一种“软性”的信息选择机制对输入信息进行汇总,即
给定一个和任务相关的查询向量,我们用 注意力变量来表示被选择信息的索引位置,即表示选择了第个输入向量。这里采用Soft Attention
的方式,即计算在给定和下,选择第个输入向量的概率:
上式中称为注意力分布(Attention Distribution),是注意力的打分函数。
3.3 相关性采样
在获得注意力分布后,往往需要对原本的输入进行一次采样,采样的依据是刚才获得的注意力分布:
根据注意力分布的形式的不同,可以设计不同的采样方法对原输入进行采样或处理。常见的方法有点积(dot product)等。例如,通过注意力分布对输入进行点积和加权平均,即使用作为权重参数对输入进行加权:
其中表示输入,是上文中的注意力分布,是对输入进行相关性采样的输出。
上图为这个过程的一种模式图。除了直接加权平均的方法,还有一些更加复杂的计算方法。但是加权平均是最常用的。一般情况下,需要设计的只是打分函数,采样过程是不需要设计的。
4. 不同的Attention机制
深度注意机制可以分为软注意(soft attention,或global attention)、硬注意(local attention)和自我注意(self attention,或intra-attention)。
4.1 软注意力(Soft Attention)
这是比较常见的Attention方式,其原理是为每个输入元素分配 0 到 1 的权重。它在注意力层中使用 softmax 函数来计算权重,从而使整个注意力模型具有确定性和可微性。软注意力可以对带有空间属性的推理和时间属性的推理起作用。
上图是软注意力的一种直观示例。
上文中提到的注意力分布:
和输入的之际加权平均*(也就是相关性采样过程本身)就是软注意力的一种形式。
4.2 硬注意力(Hard Attention)
在软注意力中,选择的信息是所有输入向量在注意力分布下的期望。此外,还有一种注意力是只关注某一个输入向量是否该被选择,或者说注意力分布只能是0或1的注意力机制,叫作硬性注意力(Hard Attention)。
注:由于很多情况下注意力机制不需要计算和储存权重参数,所以通常情况下硬注意力机制不需要训练。
硬注意力有两种实现方式:
- 选取最高概率的一个输入向量。即。其中为概率最大的输入向量的下标,即。
- 第二种硬注意力机制可以通过在注意力分布式上随机采样的方式实现.
硬性注意力的一个缺点是基于最大采样或随机采样的方式来选择信息。由于没有基本事实来表明正确的选择策略,硬注意类型的机制由随机过程表示。硬注意力机制使得最终的损失函数与注意力分布之间的函数关系不可导,无法使用反向传播算法进行训练。因此,硬性注意力通常需要使用强化学习来进行训练。为了使用反向传播算法,一般使用软性注意力来代替硬性注意力。由于在硬注意力机制中输入的信息没有被存储或处理(或变为权重参数储存),与软注意力机制相比,推理时间和计算成本就会减少。
软注意力和硬注意力的直观联系和区别可以通过它们的示意图观察得到:
上:软注意力机制示意;下:硬注意力机制示意。
4.3 键值注意力(Key-Value Attention)
键值注意力在处理序列输入时常用。这种注意力和后面会聊到的Transformer也具有很大的关系。
键值注意力模型可以宏观理解为一个查询(query)到一系列键值对(key-value)的映射。将Source中的构成元素想象成是由一系列的<key,value>
数据对构成,此时给定Target中的某个元素query,通过计算query和各个key的相似性或者相关性,得到每个key对应value的权重系数,通过softmax归一化后,对权重和相应value进行加权求和,即得到最终attention数值。
Attention为序列中每个元素都分配一个权重系数,这也可以理解为软寻址。如果序列中每一个元素都以(K,V)形式存储,那么attention则通过计算Q和K的相似度来完成寻址。Q和K计算出来的相似度反映了取出来的V值的重要程度,即权重,然后加权求和就得到了attention值。
本质上attention机制是对source中元素的value值进行加权求和,而query和key用来计算对应value的权重系数,在NLP领域中,往往。
一般我们可以用键值对(key-value pair)格式来表示输入信息,其中 “键”用来计算注意力分布,“值”用来计算聚合信息:
其中为输入中元素的向量表示,是键key的向量表示,是值value的向量表示。
用表示组输入信息,给定任务相关的查询向量为时,注意力函数为:
其中为打分函数。
上图给出键值对注意力机制的示例.当 时,键值对模式就等价于普通的注意力机制。
这种方式是直接精准定位到某个key,其余key就都不管了,相当于这个key的概率是1,其余key的概率全部是0。因此这种对齐方式要求很高,要求一步到位,如果没有正确对齐,会带来很大的影响。另一方面,因为不可导,一般需要用强化学习的方法进行训练。(或者使用gumbel softmax之类的)。
4.4 自注意力(Self Attention)
自注意力的核心内容是量化表示输入元素之间的相互依赖性。比如,通常情况下键盘和鼠标会同时出现,所以当输入中出现键盘时模型就可以关注相关位置是否有键盘。这种机制允许输入与彼此“自我”简历关系并确定他们应该更多关注什么。
上图:左侧为语言模型中在注意力的一种示意;右侧为视觉任务中自注意力的一种示意。
上图:自注意力模型的一种模式。接下来对这种Query-Key-Value的模式进详解:
首先假设我们的input是上图中的序列,每一个input (vector)先乘上一个矩阵得到embedding,即向量 。接着这个embedding进入self-attention层,每一个向量分别乘上3个不同的transformation matrix 、和,以向量为例,就会分别得到3个不同的向量、和 。
接下来使用每个query 去对每个key 做attention,attention就是匹配这2个向量有多接近,比如我现在要对和做attention,我就可以把这2个向量做scaled inner product(,是和的维度。这里处以相当于归一化的效果),得到,再取和做attention,得到,再取和做attention,得到,再取和做attention,得到。以此类推。这便是自注意力的打分函数设计。
接下来需要对所有计算得到的进行运算:
取完softmax操作以后,我们得到了,我们用它和所有的值进行相乘。具体来讲,把乘上,把乘上,把乘上,把乘上,把结果相加得到。在产生的过程中用了整个序列的特征(Considering the whole sequence)。如果要考虑local的特征,则只需要学习出相应的,上就不再带有对应分支的信息了;如果要考虑global的特征,则需要学习出相应的,上就带有对应分支的信息了。
在上述的过程中使用的三个值:、、分别是输入经过embadding变为后分别与、、相乘得到的。其中用来表示当前向量的查询值,查询值和其他所有向量的输入打分函数获得当前向量的相关性矩阵,然后相关性和当 前向量的代表值相乘得到输出。
以上注意力模式可以表示为公式:
其中为输入中元素的向量表示,是键key的向量表示,是值value的向量表示。
让它具有自注意力机制的最简单的办法就是令, 则在键值注意力中,计算相关性的过程就发生在输入本身内部(因为在键值注意力中是和各个的相关性,在用进行加权)。
4.4.1 自注意力的 优越
基于卷积或循环网络的序列编码都是一种局部的编码方式,只建模了输入信息的局部依赖关系。虽然循环网络理论上可以建立长距离依赖关系,但是由于信息传递的容量以及梯度消失问题,实际上也只能建立短距离依赖关系。
如果要建立输入序列之间的长距离依赖关系,可以使用以下两种方法:一种方法是增加网络的层数,通过一个深层网络来获取远距离的信息交互;另一种方法是使用全连接。全连接网络是一种非常直接的建模远距离依赖的模型,但是无法处理变长的输入序列。不同的输入长度,其连接权重的大小也是不同的。这时我们就可以利用注意力机制来“动态”地生成不同连接的权重,这就是自注意力模型(Self-Attention Model,有时也称为内部注意力即Intra-Attention)。
Self-Attention模型对于Seq2Seq模型的优越性在于:
- 对长期依赖关系有着更强的捕捉能力
- 可以并行计算
Self-Attention模型对于CNN模型的优越性在于:
- 元素与元素之间的距离从CNN的logarithmic path length进一步缩短到constant path length
- 由CNN fixed size perceptive变成了variable-sized的 perceptive,具体的长度等于文本长度,这也是self-attention相对于普通attention的优点。
4.4.2 多头自注意力
//抽出空写