卷积神经网络中的注意力机制[持续更新]

卷积神经网络中的注意力机制

文章版权归作者所有,如需转载请联系作者。

在人类感知系统中,注意力有着非常重要的作用。人类视觉系统的特性之一就是:系统不会尝试去处理所有的视觉信息,而是将注意力放在最显著的物体上。

受到人类感知系统的启发,研究人员开始研究如何将注意力机制应用到深度学习中去。最开始,注意力机制的研究主要集中在自然语言处理领域,后来,人们开始将注意力机制应用于计算机视觉领域(主要是卷积神经网络)。本文的目的就是对卷积神经网络中常见的一些注意力机制进行总结。

Non-local Neural Networks

作者:Xiaolong Wang,Ross Girshick,Abhinav Gupta, Kaiming He

在传统的卷积核循环神经网络中,每个操作处理的都是局部邻域内的信息。针对该问题,在本文中提出了一种非局部操作(non-local operations),该操作可以被作为一种通用的模块,来获得长范围内的依赖信息(long-range dependecies)。

在本文中,non-local操作将所有位置的特征的加权和作为一个位置的响应值。该模块可以被插入多种计算机视觉框架中。

针对深度神经网络,作者定义了一种通用的non-local操作:

image-20200228190651287

其中,$i$为将要计算响应值的输出位置的索引,$j$为所有可能的位置的索引。$x$为输入信号(图片、序列、视频等特征),$y$为和$x$大小相同的输出信号。对函数$f$计算得到$i$和$j$之间的相关关系;一元函数$g$计算$j$位置的输入信号的表示。最后,使用因子$C(x)$对响应值进行归一化。

可以看出,一个位置的响应值为所有位置的响应值的加权和,这一行为和全连接层很类似,但实际上是不同的。non-local中的权重依据两个位置之间的相关性计算得到,而全连接的权重是可学习的参数。

用于计算相关关系的对函数可以有多种形式,如高斯函数等。一种比较简单的方式是将其表示为和self-attention机制类似的形式,即:

image-20200228191441030

进一步,作者将公式1转换为non-block的形式。同时为了在将该block插入预训练模型时,不影响原模型的行为,作者向block引入了残差连接。该模块的示意图(空间特征)如下所示:

image-20200228191809047

上图中给出的是对函数为embedded gaussian函数时的形式,embedded gaussian如下所示:

image-20200228192036337

可以将上述模块作为一个插件引入到现有的深度学习模型中。

CBAM: Convolutional Block Attention Module

作者:Sanghyun Woo, Jongchan Park, Joon-Young Lee, and In So Kweon

国籍:韩国

这是一个针对卷积神经网络提出的注意力模块。分别在两个维度,通道和空间,对特征图进行处理,最后将这两个维度的信息融合进输入特征图中,以对输入特征图进行微调。

作者认为之前有关网络结构的研究都集中在网络的深度、宽度和cardinality(ResNext和Xception中的概念)上,而在本文中,主要研究另一个机制:注意力机制。本文的目标是通过使用注意力机制来提升网络的表达能力:关注重要的特征,抑制不必要的特征。

本文提出的模块主要在两个维度提取特征:通道和空间。通道维度回答是什么的问题,空间维度回答在哪里的问题。

image-20200302145712673

Convolutional Block Attention Module

给定输入特征图$F\in R^{C\times H\times W}$,CBAM使用如图1所示的串行拼接一维通道注意力映射$M_C\in R^{C\times 1\times 1}$和二维空间注意力映射$M_s\in R^{1\times H\times W}$。将整体的注意力机制处理流程总结如下:

image-20200302151554723

上述两个模块的细节如下图所示:

image-20200302151721703

通道注意力模块:作用是探索特征通道之间的相关性。特征图的每一个通道都可以被看作一个特征探测器,给定一张输入图,通道注意力集中在输入图“是什么”的问题上。在构建通道注意力模块时,作者同时使用了最大池化(average-pooling)和平均池化(max-pooling)。流程如下:

首先分别使用最大池化和平均池化对各个通道的空间信息进行整合,分别得到两个以为的特征图,接着将得到的两个特征送入共享的多层感知器中,分别得到两个特征,最后将两个特征图按照元素进行求和,并使用softmax函数进行激活。

image-20200302152742788

空间注意力模块:通过使用特征之间的空间相关性来设计空间注意力模块。与通道注意力模块不同,该模块主要目标在于解决“目标在哪”的问题。

首先在通道维度分别使用平均池化和最大池化操作来对通道维度的信息进行整合,得到两个二维的特征图。两个特征图分别表示通道维度的平均池化特征和最大池化特征。接着,对着两个特征图进行拼接,并使用标准卷积来产生二维的空间注意力图。

image-20200302153407788

对注意力模块进行融合:给定输入图片,通道注意力模块和空间注意力模块将产生两个互补的特征图。因而,可以将两个模块使用并行或串行的方式进行放置。作者发现,串行放置的结果优于并行放置。因而最终采用的是串行放置的方式。正如图2所示。

CBAM模块可以被嵌入任何现有的网络结构中,并可以使用端到端的方式进行训练。如下图是和ResBlock的结合:

image-20200302154006452

BAM: Bottleneck Attention Module

这篇文章的作者和CBAM的作者是同一批人

在本文中,作者提出了一个名为Bottleneck Attention Module(BAM)的模块,给模块可以和任何前聩神经网络进行结合。作者将该模块插入到网络中发生特征图下采样操作的bottleneck位置。通过引入该模块,可以得到一系列具有层次感的注意力机制。

给定一个三维的输入特征图,BAM会生成一个三维的注意力图来识别出重要的元素。同样的,作者在BAM中将计算三维注意力图的步骤分为两个分支,即空间和通道,这两个分支分别解决“在哪里”和“是什么”的问题。

image-20200306120523618

在将BAM放到网络的每一个bottleneck之后,BAMs会产生一系列的层次性的注意力,这一特性与人类的视觉处理机制类似。BAM会抑制前面stage的特征图中的背景特征,而在后面的高层次语义特征部分会聚焦到具体的目标上。

Bottleneck Attention Module

BAM的整体框架如下图所示:

image-20200306120855150

给定输入特征图三维$F$,BAM给出一个三维的注意力图$M(F)$,最终经过调整的特征图$F’$为:

image-20200306121202686

通过上图和上式可知,作者在将注意力图和输入特征图进行融合时引入了残差连接。同时,通道注意力机制和空间注意力机制使用并行的方式进行计算,接着通过相加操作进行合并。

其中,通道注意力的计算方式为:

image-20200306121636801

作者指出使用BN的目的是将输出的特征的尺度调整为和空间分支一致。

而在设计空间注意力分支时,为了尽可能利用输入特征图中的背景信息,作者加入了空洞卷积来增大卷积核的感受野。其计算方式如下:

image-20200306122010888

同样,最后使用BN层来调整输出特征的尺度,以使其和通道分支一致。

值得注意的是,在两个分支中,作者使用了同样的通道削减因子$r$来降低BAM模块的计算量。

Self-Attention

Self-Attention模块来自于Self-Attention Generative Adversarial Networks。作者设计self-attention的目的是为了捕捉图片中大范围内的信息依赖。

首先将输入特征$x\in R^{C\times N}$划分到两个特征空间$f,g$中来计算注意力,其中$f(x)=W_fx, g(x)=W_gx$,接着使用下式对这两个空间的注意力进行整合:

image-20200309105858544

$\beta_{j,i}$表示在计算第$j$个特征位置时,对第$i$个特征位置的重视程度(简单点来说就是各个特征之间的影响程度)。$C$表示通道数目,$N$表示上一层隐藏层的输出特征的个数。注意力层的输出为$o=(o_1,o_2,…,o_j,…,o_N)\in R_{C\times N}$:

其中:

image-20200309110339030

上述公式中的$W_g\in R^{\hat C \times C},W_f\in R^{\hat C \times C},W_h\in R^{\hat C \times C},W_v\in R^{\hat C \times C}$都是可学习的参数,具体实现形式为$1\times 1$卷积。为了获得较高的计算效率,$\hat C$被设置为$C/k$,文章中作者将$k$设置为8。

最后,给输出$o_i$乘以可学习的尺度因子$\gamma$,并叠加到原始的输入特征图中。

引入尺度因子$\gamma$使得在训练的起始阶段,网络可以依赖于局部邻域特征,在训练的后部逐渐依赖非局部特征。作者这样设计的目的在于,让模型先学习较为简单的任务,接着再去学习较为复杂的任务。

Self-attention模块的示意图如下:
image-20200309111254723

实际上,从self-attention的计算过程中可以看出,其实就是在计算每一个位置的输出特征时,将其他所有位置的影响都考虑在内(以加权和的形式出现)。这样,就会获得大范围的依赖信息。

简单点说,self-attention就是一种空间注意力形式。

Residual Attention Network for Image Classification

本文的贡献主要如下:

  • 堆叠式网络结构:Residual Attention Network通过堆叠多个注意力模块构成。堆叠结构是混合注意力机制的基本应用。在不同的注意力模块中可以捕捉不同类型的注意力。
  • 注意力残差学习:直接堆叠注意力模块会导致明显的性能损失。因而提出注意力残差学习机制来优化非常深的残差注意力网络。
  • Bottom-up top-down feedforward attention:作者将该结构用于向特征添加软权重。

残差注意力网络主要通过堆叠多个注意力模块构成。每一个注意力模块可以分为两个分支:掩膜分支和主分支。主分支适用于任何网络结构。

给定主分支在输入$x$下的输出$T(x)$,掩膜分支使用bottom-up top-down结构来学习具有同样大小的掩膜$M(x)$,该掩膜被用于对$T(x)$施加软权重。注意力模块$H$的输入如下所示:

image-20200303172517838

其中$i$表示特征图上的空间位置,$c$表示特征图的通道编号。

在注意力模块中,注意力掩膜不仅可以在前向传播过程中作为特征选择器,同时,在反向传播过程中,也可以作为梯度更新的过滤器。如,在soft mask分支,掩膜关于输入特征的梯度如下:

image-20200303172945576

在反向传播过程中,掩膜可以过滤掉噪声类标的梯度。

然而,只是简单的将注意力模块进行堆叠会损害性能。一方面,连续的和掩膜(值在0~1之间)进行点乘会不断降低特征的大小;另一方面,软掩膜会损坏主分支的性能,例如,破坏残差单元的identical mapping。

因而,为了解决这一问题,作者模仿residual学习的方法。定义了注意力残差学习,使得加入注意力机制后的性能不会弱于没有注意力机制。将注意力模块的输出修改如下:

image-20200303174103755

从上式中可以看出,当掩膜的值近似为0时,模块的输出和原始特征一样。同时,掩膜分支的作用就是增强主分支中好的特征,抑制噪声特征。

整体网络结构如下图所示:

image-20200303174842149

掩膜分支采用feed-forward和top-down的方式构建,首先使用最大池化来增大感受野,接着使用线性插值进行上采样,最后使用sigmoid层进行激活。同时,在bottom-up和top-down之间添加跳层连接以达到捕捉不同尺度信息的目的。如下图所示,为掩膜分支和主分支的感受野的对比。

image-20200303175329620

可以发现掩膜分支的感受野要比主分支大很多。

通过在掩膜分支中使用不同的激活函数,可以得到不同的注意力。

image-20200303180529458

上面三个式子分别对应混合注意力、通道注意力和空间注意力。

Squeeze-and-Excitation Networks

SE网络是一种通道注意力机制,其主要目的为对通道之间的重要性进行区分。模块的整体结构非常简单,如下图所示:

image-20200309113630242

所谓squeeze,即对全局信息(空间信息)进行编码。作者认为,每一个学习到的卷积核都是在局部信息上进行操作的,无法捕捉局部区域之外的背景信息。为此,作者提出squeeze操作将全局空间信息“挤压”进一个单个的通道内部。这一操作是使用全局平均池化(global average pooling)完成的。

在squeeze之后,为了使用通过squeeze操作所整合的信息,作者提出了另一个操作excitation来捕捉通道之间的依赖关系。为了达到这一目的,作者指出,该操作需要具有如下两个功能:

  • 灵活,可以捕捉通道之间的非线形相关信息;

  • 为了可以同时关注多个通道,该操作给出的必须是一组互不排斥的通道间相关信息,而非一种one-hot编码的形式。为了达到这一要求,使用sigmoid激活函数而非softmax函数。

    这一操作使用两个全连接层完成,第一层全连接的激活函数使用ReLU。同时,对两个全连接层之间的通道数进行削减,以降低计算复杂度。

在对输入特征图依次进行squeeze和excitation操作之后,将得到各个通道的权重。随后,使用这些通道权重对输入特征图的特征进行加权,得到最终的输出特征图。

为了更加具体地了解SE模块是如何被应用到具体的网络中的,在文中,作者给出了SE模块在Inception和ResNet中的使用方式。如下述两幅图所示:

image-20200309115545658

总结

从概念上理解,可以把Attention理解为从大量信息中有选择地筛选出少量重要信息并聚焦到这些重要信息上,同时忽略大多数不重要的信息。

而在具体实现时,通过上述内容的总结,我们可以发现:聚焦的过程体现在权重系数的计算方式上,权重越大越聚焦于其对应的Value值上,即权重代表了信息的重要性,而Value是其对应的信息。

在上述论文中,无论注意力模块如何变化,总的来说,就是围绕如下几个方面展开的:

  • 通道注意力:主要解决聚焦在哪种类型的目标上;
  • 空间注意力:主要解决所要聚焦的目标在空间中的位置。

可以只使用通道注意力(例如,SE模块)或空间注意力(例如self-attention),也可以同时使用通道注意力和空间注意力(例如,CBAM和BAM)。通过自由选择这些组合方式可以设计出不同的注意力机制。

同时,还有很重要的一点,所设计的注意力模块一般都是要嵌入到当前已有的模型中,这无疑会增大模型的计算复杂度和参数量。为了避免或减轻这一问题,研究人员在涉及时都会在进行通道变换时,首先对输入特征图的通道数进行削减,计算完成后,再将通道数提升到和输入特征图相同的数目。

参考