论文解析:SCA-CNN

1,761 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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在某一层的运算流程如下公式:

Vl=CNN(Xl1)(1)γl=Φ(ht1,Vl)(2)Xl=f(Vl,γl)(3)V^l=CNN(X^{l-1})\qquad(1)\\ \gamma^l=\Phi(h_{t-1},V_l)\qquad(2)\\ X^l=f(V^l,\gamma^l)\qquad(3)

可以看出对于我们首先会计算网络上一层的输出feature map VlRHWCV^l\in R^{H*W*C},而后通过函数Φ()\Phi()计算出注意力γlRHWC\gamma^l \in R^{H*W*C},再将得到的注意力图样与该层的输入feature map经函数f()f()组合得到该层的加权输入XlX^l,这里的ht1h_{t-1}可以认为是来及结果层面上的指导,文章是拿image caption问题做例子,先用CNN做特征提取模块(encoder),送入LSTM得到文字输出(decoder)。公式中的ht1h_{t-1}就是LSTM在前一时刻的隐状态,函数f()f()就是简单的点乘。实际上这个过程更好的顺序表述为(2),(3),(1),即先由前层的输出计算注意力,将输出与注意力点乘得到本层的真正输入,再送入本层CNN得到本层输出。

改进

 上式在理论层面上没有问题,但在实操层面存在着运算量过大的问题,因为注意力图样γlRHWC\gamma^l\in R^{H*W*C},我们需要至少O(kHWC)O(kHWC)的内存(k和隐状态有关,但没看懂),因此作者将γl\gamma^l又细分为了通道层面的注意力和空间层面的注意力以分别计算,节省空间。

 空间层面的注意力计算如下:

al=tanh((WsVl+bs)Whsht1)αl=softmax(Wia+bi)a^l=tanh((W_sV^l+b_s)\oplus W_{hs}h_{t-1})\\ \alpha^l=softmax(W_ia+b_i)

其中VV为原始特征图样在空间层面上flatten的结果,VRCm,m=HWV\in R^{C*m},m=H*W,最终得到αlRm\alpha^l \in R^m,其余参数尺寸:WsRkC,WhsRkd,ht1Rd,WiRkW_s\in R^{k*C},W_{hs}\in R^{k*d},h_{t-1}\in R^d,W_i\in R^k\oplus为矩阵向量相加,即把向量加在矩阵的每一行上。

 通道层面的注意力如下:

bl=tanh((Wcvl+bc)Whcht1)βl=softmax(Wib+bi)b^l=tanh((W_c\otimes v^l+b_c)\oplus W_{hc}h_{t-1})\\ \beta^l=softmax(W'_ib+b'_i)

其中vv为原始特征图样在空间层面上mean pooling结果,vRCv\in R^C,最终得到βRC\beta \in R^C 根据是先计算空间层面的注意力还是通道层面的注意力,我们的SCA-CNN也可以细分为S-C和C-S类型,值得注意的是此时后一步运算用到的特征图样已不再是原始的特征图样,而是经前一步得到注意力加权得到的图样。详细流程见下图:

1.png 由函数ϕc()\phi_c()计算出在channel层面上的注意力分布βlRC\beta^l\in R^C,在此基础上由函数ϕs()\phi_s()得到了spatial层面上的注意力分布αlRHW\alpha^l\in R^H*W,最后将计算出的αl,βl\alpha^l,\beta^l与原始的VlV^l结合得到当前的加权后feature map。

实验结果

 文章实验主要是为了验证3个问题:

  1. 引入通道层面的注意力是否有用->通过对S,C,C-S,S-C,SAT模型效果比对,证明了当feature map层数过多时引入通道层面的注意力,模型表现更好;而将通道注意力与空间注意力结合则会达到最好的效果;
  2. 引入多层注意力是否有用-通过在S和C-S模型中引入不同数目的attenion module,发现在大部分实验里多层的效果要优于单层,但层数过多存在着过拟合的风险。
  3. 与现有SOTA模型相比,SCA-CNN效果怎么样->比大部分模型效果好的,略逊色与某些模型,要么因为是ensemble modle要么因为模型有着更优越的结构。

总结

 文章的主要思路还是在最初提出的两个问题,关注"what"和"where",得到了不错的结果,强调了通道和空间都很重要,至于multilayer,感觉效果没有很明显