注意力机制-Attention

今天从四个方面来介绍注意力机制。首先是我们为什么要引入注意力机制,深度学习对于特征提取近年来取得了巨大的成功,但是他还有什么不足呢? 其次,我将从Encoder-Decoder框架(一种深度学习领域的研究模式,应用场景异常广泛)来介绍注意力机制;接着,总结一下目前注意力机制研究的的分类与应用;最后,切入到计算机视觉CV领域来介绍注意力机制。

为什么要引入注意力机制?

我们知道深度学习近年来在计算机视觉,自然语言处理等领域取得了巨大的成功,使用多层的深度神经网络逐层进行特征提取,获取更加高级的语义特征。但这样,伴随着两个缺陷

计算能力的限制:当要记住很多“信息“,模型就要变得更复杂,然而目前计算能力依然是限制神经网络发展的瓶颈

优化算法的限制:虽然局部连接、权重共享以及pooling等优化操作可以让神经网络变得简单一些,有效缓解模型复杂度和表达能力之间的矛盾;但是,如循环神经网络中的长距离以来问题,信息“记忆”能力并不高。卷积神经网络中,虽然能通过堆叠卷积层来获得更大的感受野,但不断地池化也会丢失长距离依赖的语义信息。

image-20210112090446506

因此,注意力机制的出现就是为了解决这些问题。上图是一个图片描述系统,描述中画横线的描述就是主要通过图片中的白色光斑圈出区域进行特征提取得到的语义信息。深度学习从关注输入的全部,变成关注输入中的重点部分,从众多信息中选择出对当前任务目标更关键的信息

无注意力机制的Encoder-Decoder框架

下图就是一个文本处理领域的Encoder-Decoder框架,它能够应用在许多任务中,如机器翻译文本摘要、问答系统、语音识别和图像描述等。

image-20210112091944854

拿机器翻译来说,框架的目标是给定输入句子Source,期待通过Encoder-Decoder框架来生成目标句子Target。

拿中英文翻译来说

  • 编码器Encoder对输入的中文句子进行编码,通过非线性变换转化为中间语义表示C

  • 解码器Decoder,其任务是根据句子Source的中间语义表示C和之前已经生成的历史信息

    来生成 i 时刻要生成的单词

但这样的框架其实是没有体现出“注意力模型”地,因为在生成目标句子的单词时,不论生成哪个单词,它们使用的输入句子Source的语义编码C都是一样的,没有任何区别。这意味着不论是生成哪个单词,y1,y2还是y3,其实句子Source中任意单词对生成某个目标单词 yi 来说影响力都是相同的,这很明显是没有注意力焦点的。

增加注意力机制的Encoder-Decoder框架

下图是增加注意力机制的Encoder-Decoder框架,Attention模型的关键就是这里,即由固定的中间语义表示C换成了根据当前输出单词来调整的变化的Ci。

对于英汉翻译,如果输入是Tom chase Jerry,那么在生成中文单词汤姆时,其对应的语义表示C1,则对应着不同的 源句单词 的注意力分配概率分布。

image-20210112094554302

那么问题就来了,在生成目标句子某个单词,比如“汤姆”的时候,如何知道Attention模型所需要的输入句子单词注意力分配概率分布值呢?就是说“汤姆”对应的输入句子Source中各个单词的概率分布:(Tom,0.6)(Chase,0.2) (Jerry,0.2) 是如何得到的呢?

如何获得注意力分配的概率分布?

这里拿RNN举例,Encoder采用RNN模型,Decoder也采用RNN模型,如下图所示

image-20210112101206485

下图可以较为便捷地说明注意力分配概率分布值的通用计算过程

image-20210112101705623

对于采用RNN的Decoder来说,在时刻 i,如果要生成yi单词,我们是可以知道在生成Yi之前的时刻 i-1时,隐层节点i-1时刻的输出值Hi-1的,而我们的目的是要计算生成Yi时输入句子中的单词“Tom”、“Chase”、“Jerry”对Yi来说的注意力分配概率分布,那么可以用Target输出句子i-1时刻的隐层节点状态Hi-1去一一和输入句子Source中每个单词对应的RNN隐层节点状态hj进行对比,即通过一些相似度计算方法来获得目标单词yi和每个输入单词对应的对齐可能性,然后函数F的输出经过 Softmax 进行归一化就得到了注意力的权重系数

注意力机制的本质思想

刚才,我们在说的注意力思想都是依附于Encoder-Decoder框架中,其实,注意力机制是一种思想,本质思想就是找到注意力分配的概率分布也就是注意力权重系数,可以用在很多模型框架中。现在我们将注意力机制抽象出来。

image-20210112110425144

将Source中的构成元素想象成是由一系列的<Key,Value>数据对构成,此时给定Target中的某个元素Query,通过计算Query和各个Key的相似性或者相关性,得到每个Key对应Value的权重系数,然后对Value进行加权求和,即得到了最终的Attention数值。所以本质上Attention机制是对Source中元素的Value值进行加权求和,而Query和Key用来计算对应Value的权重系数。即可以将其本质思想改写为如下公式:

image-20210112110629123

Attention机制的具体计算过程,如果对目前大多数方法进行抽象的话,可以将其归纳为三个过程:第一个阶段根据Query和Key计算两者的相似性或者相关性;第二个阶段对第一阶段的原始分值进行归一化处理; 第三个过程根据权重系数对Value进行加权求和。如下图所示

image-20210112102736028

注意力机制的分类与应用

image-20210112102608815

计算机视觉中的自注意力机制

image-20210112111248613

之前讲的都是针对Source和Target的注意力机制,近年来计算视觉领域用的多的还是自注意力机制,也是从NLP中借鉴过来的思想,因此仍然保留了Query, Key和Value等名称。下图是self-attention的基本结构,feature maps是由基本的深度卷积网络得到的特征图

自上而下分为三个分支,分别是query、key、value。计算分为三步

  • 将query和每个key进行相似度计算得到权重,常用的相似度函数有点积,感知机等

  • 一般是使用一个softmax函数对这些权重进行归一化

  • 将权重和相应的键值value进行加权求和得到最后的attention。

可以看出,步骤和刚才我们抽象出来的注意力机制思想的基本步骤是一致的,只是这里的source和target是一个东西,我们需要找到特征图内部的重点。可能是通道上的,也可能是空间上的。下面就从空间和通道两个维度向大家介绍一些经典的CV领域的注意力模型。

空间注意力模型—Non-Local

我们知道卷积网络通过多层的网络来捕获更强的语义信息与更大的感受野,但这样的学习效率太低,需要通过不断加深的网络堆叠来实现,于是作者提出了一个泛化、简单、可直接嵌入到当前网络的非局部操作算子,这个简单的注意力模块可以方便的加入网络中,来学习长距离的依赖关系。

image-20210112102728299

作者这个思想是来源于传统的基于图片滤波领域的非局部均值滤波操作思想(核心思想是在计算每个像素位置输出时候,不再只和邻域计算,而是和图像中所有位置计算相关性)

image-20210112111401100

下图是 non-local block的示意图,从左到右也对应了之前说的query,key,value,通过1x1的卷积来映射特征与通道数降维。

image-20210112111502943

空间注意力模型—STN

空间区域注意力可以理解为让神经网络在看哪里。通过注意力机制,将原始图片中的空间信息变换到另一个空间中并保留了关键信息,在很多现有的方法中都有使用这种网络,自己接触过的一个就是ALPHA Pose。spatial transformer其实就是注意力机制的实现,因为训练出的spatial transformer能够找出图片信息中需要被关注的区域,同时这个transformer又能够具有旋转、缩放变换的功能,这样图片局部的重要信息能够通过变换而被框盒提取出来。

image-20210112111845810

STN主要分为三个模块

  • Localisation net由全连接和卷积构成的网络,它输入U,输出变化参数Θ,这个参数用来映射U和V的坐标关系

  • Grid generator根据V中的坐标点和变化参数Θ,计算出U中的坐标点。在Sampler中根据这个坐标在U中找到像素值,这样子来填充V

  • Sampler填充V,根据Grid generator得到的一系列坐标和原图U来填充,因为计算出来的坐标可能为小数,使用双线性或其他插值方法。

通道注意力模型—SENet

这篇论文就是通道维度(channel-wise)增加注意力机制,关键的两个操作是squeeze和excitation,所以论文把这个attention结构命名为SE block,SE block是为了显式地实现特征通道的的相互依赖关系,就是说就是通过自动学习的方式(用另外一个新的神经网络实现)获取到每个特征通道的重要程度,然后用这个重要程度去给每一个特征通道赋予一个权重值,从而让神经网络重点关注某些特征通道,即提升对当前任务有用的特征通道并抑制对当前任务用处不大的特征通道。

image-20210112111958685

第一个操作:Squeeze,通过全局池化(global pooling),将每个通道的二维特征(H×W)压缩为1个实数,论文是通过平均值池化的方式实现。这属于空间维度的一种特征压缩,因为这个实数是根据二维特征所有值算出来的,所以在某种程度上具有全局的感受野,通道数保持不变,所以通过squeeze操作后变为1×1×C。

第二个操作:excitation,通过参数来为每个特征通道生成一个权重值,这个权重值是如何生成就很关键了,论文是通过两个全连接层组成一个Bottleneck结构去建模通道间的相关性,并输出和输入特征同样数目的权重值。

第三个操作:Scale,将前面得到的归一化权重加权到每个通道的特征上。论文中的方法是用乘法,逐通道乘以权重系数,完成再通道维度上引入attention机制。

总结

注意力机制就是通过学习得到一个权重分布,再把这个权重分布施加到原来的特征上面。以获取更多所需要关注目标的细节信息,而抑制其他无用信息。是一种资源分配方式。