注意力机制
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 需要学习的打分函数
需要学习的打分函数指需要通过训练过程才能完全确定的打分函数。这类打分函数通常在形式上是确定的,但是其中有一部分参数不是确定的,需要通过学习获得。在最新的注意力机制的相关工作中,出现的大部分打分函数都是需要学习的打分函数。其中常见的可以表示为以下几种:
- 加性模型:,其中、、是可训练的参数。
- 点积模型:,理论上,加性模型和点积模型的复杂度差不多,但是点积模型在实现上可以 更好地利用矩阵乘积,从而计算效率更高
- 缩放点积模型:,其中为输入输入向量的维度。当输入向量维度过高,点积模型通常有较大的方差,从而导致函数梯度较小,而缩放点积模型可以很好地解决这个问题。
- 双线性模型:,双线性模型可以看作一种更泛化的点积模型,相比点积模型,双线性模型在计算相似度时引入了非对称性。
其中,,为可学习的参数,为输入向量的维度。以上出现的公式均需要通过学习得到其中的参数。当然,也有一种叫做自注意力的函数设计更特殊一些,但是它也属于需要学习的打分函数。