Exploring Self-attention for Image Recognition稿

狭义的self attention

  self attention这个说法来自于attention is all you need这篇论文,它也是构成transformer的基础。提出的原因是因为基于rnn做attention的话,是无法做并行化且rnn的结构在长距离的依赖的时候效果并不好。
  self attention是针对key,value,query三个变量来计算的。这三个变量都来自于自己的本身乘以一个矩阵变换而来。因此叫做self attention。Exploring Self-attention for Image Recognition稿
计算attention的公式就是q和k之间计算点乘,然后为了防止尺度过大,会除以维度开更。之后做softmax乘以v。可以从动图中更加好地来理解这个过程。
Exploring Self-attention for Image Recognition稿
Exploring Self-attention for Image Recognition稿

self attention in cv

  在An Empirical Study of Spatial Attention Mechanisms in Deep Networks这篇论文中,很好地将cv中的self attention总结了起来。总结为以下四种的结合,query和content内容,query内容和与key的相对位置,单单只使用key的内容,只使用相对位置作为attention的计算内容。
Exploring Self-attention for Image Recognition稿最经典的就是第一种,前面讲的self attention就是这一种。这四种方式的排列组合就可以涵盖现在所有论文中的计算机视觉的self attention。
Exploring Self-attention for Image Recognition稿统一可以用上边这个公式去表示,区别在于如何去计算这些内容,也就是这边公式中的Am如何表示的问题。之后的论文都涵盖在这个公式之内,只不过公式的具体计算方法不同。

cnn&self-attention

  将cnn和self-attention结合使用起来,non local就是一个很好的例子。local代表的就是cnn的感受野大小有限,只考虑了局部的信息。尽管堆叠cnn可以增加感受野,但是网络浅层的感受野还是很小的。因此,我们需要一个能够提取全局信息的方法来帮助cnn一起来更好的提取特征,为后面层带去更丰富的信息。 Exploring Self-attention for Image Recognition稿
  作者定义了non local的公式。其中的x的下标代表的就是像素在图片中的位置。f函数就是用来计算attention,而g是一个映射函数。f和归一化函数c的对应关系如表格所示。有这四种方式,高斯公式,向量高斯公式,在计算之前有一步映射过程。而这个就相当于与是前面讲的self-attention。此外还有点乘和concat。论文中针对的是视频的处理,这边的图介绍的是针对2d图片的方法。
Exploring Self-attention for Image Recognition稿图片经过1*1卷积之后,q和k矩阵相乘做softmax,之后乘以v之后再恢复到原来的维度,做一个跳跃链接。这就是non-local block。

self-attention replace cnn

  既然使用self attention的方法计算non local的特征,为什么不用self attention代替cnn来计算local的特征呢?local relation和stand-alone这两篇文章就都是用了self attention来代替cnn。cnn由于卷积核固定的原因,是无法做到针对不同的像素内容做到自适应的改变的,而使用self attention来代替cnn就可以做到。
Exploring Self-attention for Image Recognition稿
  local relatioin的整体网络和前面介绍的non local差不多,区别在于计算的attention方式的不同(aggregation的计算方式)和引入了位置信息。aggregation的计算方式有平方差,差的绝对值,相乘。这里使用的都是标量。位置信息的引入是通过两层通道变换获得的相对位置信息。

proposed method

  本片论文针对前面的方法上,继续探讨了self-attention代替cnn的可能性。提出了两种形式的self attention,一种是pairwise,一种是patchwise。pairwise是一对一,patchwise是一对多。大致地原理和前面讲的差不多,有些小的差别。同样,self attention可以用公式表示,计算attention,最后hadarmard相乘。这里的a可以有以下这个公式表示,
Exploring Self-attention for Image Recognition稿如右图所示。作者又添加了几种计算的形式。此外作者也在这里添加了位置信息,位置信息的添加方式和local的大致相同,只是只有一层convolution1*1。这里gama就是两层1*1的cnn,当中加上relu。
  patch wise直观的理解一个像素特征和一块像素特征的配对。计作者提出了三种形式。star-product,clique-product和concat。

network

  作者仿照resnet的形式搭建网络,方便对比,通过堆叠self-attention的模块来搭建网络。transition是使用BN加relu加2*2的maxpooling。first stage的大小设置为3*3,之后的四个stage分别设置为7*7。

content and channel adaptive

  cnn的话,针对所有的内容,卷积核的值都相同,因此不具备content adaptive。但针对每个channel的卷积核值可以不同,因此称它为通道自适应。而non local,local, stand alone这三篇文正虽然做到了content adaptive,但是每个通道的值是相同的,因此不具备通道自适应(local里说了对8个channel共享了一同一个权值,这时共享不会影响准确率,此外在计算attention的时候使用的是标量,而不是向量,stand是对像素计算的,不同的channel作为多头计算,但任然共享参数,nonlocal是针对所有的输出通道共享同一个aggregation值)。而本文不看做标量,将一个位置的channel维度看做一个vector。
  这篇文章也share attention,原因是两个分支的维度不同,左边的分支的channel维度比右边的小,因此group share。图片1中的r1设置为16,r2为4。

训练的数据集

  val-origin是在训练集上训练,验证集上测试的。之后的实验的验证集是原始的训练集中每一类随机从中抽取50张图片组成的。这样做的目的是为了不用为了在和其他baseline比较的数据集上修改模型和超参?

和之前的resnet做对比

  pairwise使用的是减法。patchwise使用的是concat。resnet论文中使用的对比是10-crop,也就是每张图片随机采样10个224*224的大小的图片,之后ensemble。这里使用的是1-crop,resnet训出来的准确率和he自己提供的差不多。(一开始看论文觉得有问题,其实没有,是比较指标没对上)。效果都有一定的提升。

对比实验&ablation

  那种形式的attention计算效果更好,三个差不多。对于patch来说,concat的效果最好。
  这对gama mapping的消融实验。对于pairwise来说,两层linear加relu是由最好的效果。对于patch,效果差不多。
  使用相对位置信息能够获得最好的效果。
  鲁棒性的实验,pairwise形式的鲁棒性能最好。因为patchwise丢弃了空间信息,在一个local里,像素位置互换并不会影响最后的结果。
  在攻击情况下的结果,还是self attention的效果好。