特征图注意力_深度学习入门之注意力机制

关于注意力机制,谷歌的一篇论文给出了注意力机制的定义:给定一个Query和一系列的Key-Val对一起映射出一个输出。它包含下面三个关键性步骤:
- 将Query与Key进行相似性度量
- 将求得的相似性度量进行缩放标准化
- 将权重与value进行加权
用公式描述:

Fig Att-1 注意力机制示意图
上述定义源自谷歌2017年发表的《Attention is all you need》。它是基于序列到序列应用出发的而提出的定义。但是上述定义对于CV应用而言过于抽象,难以理解。
视觉注意力机制是人类视觉所特有的大脑信号处理机制。人类视觉通过快速扫描全局图像,获得需要重点关注的目标区域,也就是一般所说的注意力焦点,而后对这一区域投入更多注意力资源,以获取更多所需关注目标的细节信息,而抑制其他无用信息。
这是人类利用有点的注意力资源从大量信息中快速筛选出高价值信息的手段,是人类在长期进化中形成的一种生存机制,人类视觉注意力机制极大的提高了视觉信息处理的效率与准确性。Fig Att-2形象的展示了人类在看到一幅图像时是如何高效分配有限的注意力资源的,其中红色区域表明视觉系统更关注的目标,很明显对于Fig Att-2所示的场景,人们会更多注意力投入到人的脸部、文本标题以及文章首句等位置。

Fig Att-2 人类视觉注意力
那么,是不是可以这样理解:Attention是为了对特征进行权重重分配 ?在无Attention机制下,我们可以认为输入的每个特征对于输出的每个特征作用是相同的,而Attention则是为了进一步区分特征的不同重要性,为其赋予不同的注意力权值强调不同特征的重要性。
比有一个一维向量
,常规的特征映射可以描述为
。但是,我们可能认为
的作用更大,希望为其赋予更多的权重,希望通过
的值对齐进行“弥补”,即需要求得一组权值
对输入进行加权平均来得到
的最终值,此时特征映射可以描述为
,或描述为
。
正常情况下,我们更希望采用第二种形式的注意力描述方式。 其中,在深度学习中
往往表示卷积操作,那么注意力机制的关键是如何计算
。以下是个人对注意力的一点点片面理解,也许对也许不对。欢迎探讨。
Deep Residual Learning for Image Recognition
arxiv paper
基于上述公式出发,我们可以认为:最早在图像处理中应用注意力机制的深度学习模型为残差架构 。ResNet可以视作注意力机制在空域 层面的应用。
残差架构可以采用如下公式进行表述:
。 此时,对应注意力模型则有
,故而
。残差架构
中的1促进梯度的快速传递,加速了网络的收敛。

Fig ResNet-1 残差架构
Residual Attention Network for Image Classification
arxiv paper, code
RAN一文是首次明确将Attention机制用于图像分类任务中且取得优异的效果,但是其Attention机制应用稍显复杂,故而其影响力远远不如后续Attention方法,SENet。RAN中的Attention部分采用的是编解码方式计算,这种计算方式稍显复杂。RAN可以理解为空域的注意力机制,事实上RAN论文中也提到了空域注意力、通道注意力以及混合注意力的划分。
在注意力模型中,RAN可以描述为:

Fig RAN-1 注意力架构
SENet:Squeeze and Excitation Networks
arxiv paper, code, 作者分享
“复杂的东西往往得不到本质” 这句话可能指的就是RAN网络,而SENet可以视为RAN的极致精简版。SENet可以理解为通道层面的注意力机制。
SENet采用注意力公式描述为:
。

Fig SENet-1 网络架构
Bottleneck Attention Module
arxiv paper, BMVC paper
BAM
Fig BAM-1给出了BAM模块架构示意图。对于给定的输入特征图
,BAM用于计算一个3D注意力图
。修正后的特征图
可以通过下式计算得到:
其中,
表示点乘操作。为促进梯度传播采用残差学习机制。为设计一种高效的模块,首先计算通道注意力图
与空域注意力图
,然后将两者相加得到注意力图
其中,
表示
sigmoid激活函数。两个分支注意力在相加之前需要扩展为
。
BAM采用注意力公式可以描述为:
.

Fig BAM-1. BAM 模块示例
Channel Attention
通道注意力需要为特征图的每个通道计算一个响应值,用于探索通道内的相关性。它的计算方式可以描述为:
其中,
.
Spatial Attention
空域注意力需要为特征图生成一个空域注意力图
,用于增强或抑制不同位置的特征。有必要采用大感受野提取更有效的内容信息,作者采用扩张卷积提取感受野。可以采用如下公式进行描述:
将上述两种注意力图相结合即可得到作者所涉及的BAM模块。
CBAM: Convolutional Block Attention Module
ECCV2018 paper, arxiv paper
CBAM
CBAM与BAM为同一作者同一时期的产物。两者的区别仅在于两种注意力的叠加方式:BAM是并联注意力,CBAM是串联注意力。

Fig CBAM-1. CBAM 模块示例
GENet: Gather Excite Exploting Feature Context in Convolutional Neural Networks
arxiv paper, code
GENet是在SENet基础上进行的更进一步的扩展性研究。主要是针对Att(x)的实际生成进行了更多的探索研究。具体参见原文,因其没有什么可重点介绍的,仅列关键图,介绍暂时略过。待后续慢慢补充。


SKNet Selective Kernel Networks
arxiv paper, caffe code, Pytorch code, 知乎解读1, 知乎解读2
从某种程度上,SKNet可以理解为多尺度融合SENet。已有比较的知乎介绍,可参考上述链接。后期会慢慢补充个人理解。

Attention Augmented Convolutional Networks
:happy: paper, Pytorch, Tensorflow. :happy:
方法
首先定义如下命名:
表示特征图的高、宽以及输入通道数,
表示
multihead-attention中的 number of heads, the depth of values and the depth of queries and keys。
假设输入Tensor的形状为
,将其
flatten为
并执行MHA。自注意力机制的单头输出可以描述为:
其中,
为所学习线性变换,用于将输入X映射到Q(queries), K(keys), V(values)。
多头输出通过拼接并通过投影得到多头输入,可以描述如下:
将多头输出与卷积输出拼接即可得到本文所提到的注意力增广卷积,描述如下:
下图给出了注意力增广卷积的示意图。


GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond
arxiv paper, code

小结
本文对Attention在CV中的应用进行了简单的总结。在CV领域,Attention用于从不同的维度(空域或者通道)进行特征的重要性重分布;在而NLP领域,Attention则强调自相关特征,这种处理机制同样适用于CV领域。Attention在Image2Image中的应用与这里所列并无本质上的差异。
总体而言,Attention在CV中的应用主要有以下几种形式的架构:
- 像素级Attention。类似NLP中的Attention,但是这种方法代价过高,无论是内存占用还是计算耗时都比较高;
- 通道/空域级Attention。类似SENet这种架构设计;
- Layer级Attention。类似ResNet这种架构设计。
在实际应用中,可以考虑有针对性的将上述几种方式组合应用。我们可以优先基于
进行更多有意思的架构设计与探索,这种架构有助于梯度的迅速传递,加速网络收敛。
参考
- Attention机制的小理解
- Attention形式总结
- 目前主流Attention方法总结
- 自然语言处理中的Attention机制总结
- PytorchAttentionCode
- 百度百科-注意力机制
- 注意力机制的基本思想和实现原理 1
- 注意力机制的基本思想和实现原理 2
- Pay Less Attention with Lightweight and Dynamic Convolutions
- ResNet
后记
内容比较多,先把大体框架列上去,其他内容部分留待后续慢慢补充完善。
