本专栏将从论文的角度解读一下CV方向的一些经典神经网络模型及其贡献与意义,以期加深自己的印象,后续可以随时翻看并且学习其中好的tricks。这一期记录一下CV中的注意力机制这几年的一部分经典论文。
写在前面
注意力机制的思想其实很简单,是借鉴了人类的大脑信号处理机制——人类可以通过快速扫描一张图像从而找出重点,然后对这一区域投入更多的注意力,以获取更多所需信息,抑制其它无用信息。这一思想其实天然就和CV非常契合,哪怕对于同一张图片,如果任务不同可能侧重点也不同,所以注意力机制的提出也比较早。但是比较公认的是,2014年Google DeepMind团队发表的论文《Recurrent Models of Visual Attention》(比较棒的解读)让注意力机制火了起来,其在RNN模型上使用了注意力机制来进行图像分类:
同样,还是Google团队,在2017年发表的论文《Attention Is All You Need》更是将注意力机制带到一个巅峰,其提出了大名鼎鼎的基于 Multi-Head Self Attention 的Transformer结构,掀起了一波研究热潮。因此想粗略地学习一下这几年来CV中的注意力发展历程。
STN
论文全名为《Spatial Transformer Networks》(原文链接:https://arxiv.org/abs/1506.02025),还是来自Google DeepMind团队。一个好的CNN模型需要对同一物体在不同图像中的变化不敏感,通常的解决方法是增加感受野或者设计多尺度,而作者们设计了STN这样的空间注意力模型,希望能够直接学习到如下图这样的仿射变换Tθ(G):
从下图这张ST模块架构图来看,Localisation net用来学习一个参数θ,Grid generator用来做仿射变换(这个变换可以把歪着的目标摆正),Sampler负责从原图中把这部分重点区域截取出来,用于后续的学习:
具体如何操作以及对应的公式可以看原文,我感觉很多是一些计算机图形学的知识。作者们也在论文里可视化了ST模块学习到的一些仿射变换Tθ(G):
意思就是ST模块能够有助于将目标对齐,方便卷积层学习特征,有点数据预处理的意思,从上图(a)中ST模块插入的位置也有一定体现。之前在一次比赛中我们也写程序手动将横七竖八的目标全都摆正了才输入模型,而ST模块能够自主地起到类似效果,所以结果自然是有提升的。
Non-local Network
论文全名为《Non-local Neural Networks》(原文链接:https://arxiv.org/abs/1711.07971),作者团队同样如雷贯耳,发表在CVPR 2018上。CNN模型为了增加感受野,主要通过加深网络逐级缩小特征图增加通道数来实现,但是这种增加有限,所以实际上的感受野与理论感受野差别较大。对于一些可能需要很大乃至全局的感受野的任务来说,比如视频场景理解,这样的感受野显然是不够的。因此作者们设计了如下图这样非常标准的自注意力结构 Non-local block:
上面这张论文结构图是以输入视频(图片序列)为例,因此有一个T维度,1×1×1表示的也是三维卷积。接下来我们以单张图片(H×W×1024)为输入来理解。这篇论文的理论基础比较深,要看懂这张图还是得从公式入手。公式(1)定义了一个神经网络中的non-local操作:
对于输入特征图 x 来说,通过这个公式计算得到同样大小的输出特征图 y,下标 i 代表某个position(比如空间维、通道维或两者),f(·) 是计算相似度的函数,g(·)用于计算 xj 的嵌入空间表示,C(x) 的作用是归一化。
显而易见,其non-local之处就在于对于每一个 xi,都会考虑它与其他所有位置上的 xj 的关系,理论上可以捕捉到任意两个位置之间的依赖,哪怕是远距离的,这是非常难得的。与传统的卷积层(相当于每一个点只考虑局部的领域信息)相比的话,相当于是构建了一个全图大小的滤波器,所以获得了更多的信息;与全连接层(没错,全连接层也是一种non-local操作)相比的话,这个操作是通过计算相似度来加权,还能处理任意大小的输入,而全连接是直接让网络学习权重。
接下来就是选择合适的f(·) 和g(·)函数了,但作者们的实验表明准确率对这个选择并不是很敏感,这也从侧面证明了non-local思想的有效,而不是依靠某一个f(·) 或g(·)函数:
因此为了简单,作者们g(·)选择了线性形式:
其中的 Wg 是需要学习的权重矩阵,显然可以通过1×1卷积实现。f(·)选择了高斯函数的简单扩展Embedded Gaussian:
同样也能通过1×1卷积实现。于是,等价于
像不像《Attention Is All You Need》中的自注意力机制公式:
所以non-local block ≈ transformer - FFN - positional encoding!
讲到这里再来看架构图就比较清晰了:
X 是输入特征图, 形状为 [H,W,1024],分别经过三个 1×1 卷积核,将通道数缩减为512。然后对 H、W 两个维度进行 flatten操作,变为 [512,H×W] 的 tensor,其中 θ 所对应的 tensor 要进行转置,即形状变为 [H×W,512],再与 Φ 代表的 tensor 进行矩阵乘法,得到一个形状为 [H×W,H×W] 的矩阵。接着将其经由 softmax 得到的 tensor 与 g 经过同样 flatten 和转置得到的 tensor 进行矩阵相乘(这一步就可以看成是Attention),得到的形状为 [H×W,512] 的结果 y,将 y 中 H×W 维度逆伸展回去并同样通过 1×1 卷积核将通道数恢复,得到形状为 [H,W,1024] 的 tensor,最后加上一个残差连接就是整个的 non-local block 流程了。
计算量增加应该是毫无疑问的…作者们为了权衡计算量,所以将通道数一开始就减少了一半,此外还可以将 xj下采样之后再进行non-local操作:
实现也很简单,在 Φ 和 g 的1×1卷积层后接一个pooling层即可。还可以考虑用一小块与一小块之间的相似度代替点与点之间的相似度。无论如何,效果还是不错的,并且可想而知加在浅层效果显著,因为深层丢失的信息太多了,远距离的点与点之间联系已经很模糊了。
SENet
论文全名为《Squeeze-and-Excitation Networks》(原文链接:https://arxiv.org/abs/1709.01507),发表在CVPR 2018上。SENet应该是耳熟能详的Attention模型,毕竟是2017年ImageNet分类比赛的冠军。从图上来看,显然SENet是一种通道注意力模型,其对通道之间的依赖关系进行建模。其具体操作也是非常简单明了:
首先使用一个 global average pooling 将二维的特征图直接变成一个实数(Squeeze 操作),紧接着先用一个全连接层将通道数降低到输入的 C/r,然后经过 ReLu 激活后再通过一个全连接层恢复原来的通道数,相当于构造了一个BottleNeck的结构,目的就是更好地建模通道之间关系的同时降低一点计算量。然后通过 Sigmoid 激活函数得到归一化的权重(Excitation 操作),最后将这个权重(这里就是Attention,代表每个特征通道的重要性)逐通道加权到先前的特征图上,完成在通道维度上的注意力机制。此外,作者们还对SE模块插入的位置做了讨论:
同样,作者也考虑了如何降低由于增加SE-block而带来的计算量这个问题,把网络末尾(显然通道数很大)的SE-block删除,准确率下降不多但是可以相对减少很多增加的计算量。总的来说,SENet思想很直观,操作也很简单,泛化性非常好,几乎可以在任何主流模型中做到即插即用,效果也是不错的。
GCNet
论文全名为《GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond》(原文链接:https://arxiv.org/abs/1904.11492),2019年的工作。作者们通过实验分析,深入探讨了上面讲到的 Non-local Network 的优缺点然后结合 Non-local Network 和 SENet 并改进提出了GCNet。
Non-local Network 希望从其他所有位置聚集信息来增强当前位置的特征,但作者们发现 Non-local Network 的全局上下文信息在不同位置几乎是相同的(意思就是对于每个点,和其他点之间的Attention map差不多,换句话说就是几乎所有点都强依赖于几个重点区域):
那也好办,每个点共享一张 Attention map 不就好了。所以作者们将Non-local:
做了如下简化:
可以看出改进后的公式中,xi 加上的后面这一块已经与 xi 没有关系了,少了一条支路。为了减少计算量,再一次改进:
最后再与 SE block 结合,就得到了最终的 GC block:
相对于SE block改进之处在于加入了 LayerNorm ,论文中说这一改进效果很好。值得注意的地方就在于最后这个 C×1×1 应该是通过广播机制和输入 C×H×W 相加的,这里也体现了 H×W 维度上每一个点共享一个Attention的思路,整体上做的应该是空间注意力以及通道注意力的综合吧。
其实最引人深思的点就在于,为什么不同点与其他点的依赖关系如此相似呢,即为什么不同点的Attention map差不多?是因为任务特殊还是因为被什么东西影响了?这个问题的答案应该暂时没有定论,但2020年的一篇论文《Disentangled Non-Local Neural Networks》(原文链接:https://arxiv.org/abs/2006.06668),感觉很大程度上回答了这一点,不过毕竟和 GCNet 一样都是微软亚研的成果,回答出来也不奇怪,解读强推这篇!