本文已参与「新人创作礼」活动,一起开启掘金创作之路。
SCA-CNN
《SCA-CNN: Spatial and Channel-wise Attention in Convolutional Networksfor Image Captioning》
总体介绍
文章认为CNN具有三个非常重要的性质,channel,spatial,multilayer,但是现有的基于注意力机制的CNN方法大多只在网络最后一层的引入spatial attention机制,罔顾了channel和multilayer这两个特性。作者认为spatial信息是用于回答“哪里”重要,即feature map中哪些位置更为重要(对应原图中的感受野更为重要),channel信息是用于回答“哪些”重要,即feature map中的哪些channle(特征)更为重要,因为不同的channle由不同的filter得到,不同的filter可以认为是不同的特征提取子。而单单在最后一层利用spatial attention,产生了感受野过大,feature map不同位对应感受野差异性不足的问题。为此,作者提出了spactial and channle wise attention-CNN来更好的利用CNN前述的三个特性。
模型介绍
SCA-CNN在某一层的运算流程如下公式:
可以看出对于我们首先会计算网络上一层的输出feature map ,而后通过函数计算出注意力,再将得到的注意力图样与该层的输入feature map经函数组合得到该层的加权输入,这里的可以认为是来及结果层面上的指导,文章是拿image caption问题做例子,先用CNN做特征提取模块(encoder),送入LSTM得到文字输出(decoder)。公式中的就是LSTM在前一时刻的隐状态,函数就是简单的点乘。实际上这个过程更好的顺序表述为(2),(3),(1),即先由前层的输出计算注意力,将输出与注意力点乘得到本层的真正输入,再送入本层CNN得到本层输出。
改进
上式在理论层面上没有问题,但在实操层面存在着运算量过大的问题,因为注意力图样,我们需要至少的内存(k和隐状态有关,但没看懂),因此作者将又细分为了通道层面的注意力和空间层面的注意力以分别计算,节省空间。
空间层面的注意力计算如下:
其中为原始特征图样在空间层面上flatten的结果,,最终得到,其余参数尺寸:。为矩阵向量相加,即把向量加在矩阵的每一行上。
通道层面的注意力如下:
其中为原始特征图样在空间层面上mean pooling结果,,最终得到 根据是先计算空间层面的注意力还是通道层面的注意力,我们的SCA-CNN也可以细分为S-C和C-S类型,值得注意的是此时后一步运算用到的特征图样已不再是原始的特征图样,而是经前一步得到注意力加权得到的图样。详细流程见下图:
由函数计算出在channel层面上的注意力分布,在此基础上由函数得到了spatial层面上的注意力分布,最后将计算出的与原始的结合得到当前的加权后feature map。
实验结果
文章实验主要是为了验证3个问题:
- 引入通道层面的注意力是否有用->通过对S,C,C-S,S-C,SAT模型效果比对,证明了当feature map层数过多时引入通道层面的注意力,模型表现更好;而将通道注意力与空间注意力结合则会达到最好的效果;
- 引入多层注意力是否有用-通过在S和C-S模型中引入不同数目的attenion module,发现在大部分实验里多层的效果要优于单层,但层数过多存在着过拟合的风险。
- 与现有SOTA模型相比,SCA-CNN效果怎么样->比大部分模型效果好的,略逊色与某些模型,要么因为是ensemble modle要么因为模型有着更优越的结构。
总结
文章的主要思路还是在最初提出的两个问题,关注"what"和"where",得到了不错的结果,强调了通道和空间都很重要,至于multilayer,感觉效果没有很明显