
简单的来说,注意力机制的目标就是学习到一个权重
。
将权重
施加在原来的特征上,使得施加权重
后的模型效果更好。
这里学习到的权重
没有一个固定的模式,可以是作用在原图上,可以作用在空间尺度上,也可以作用在channel尺度上。
对于注意力的分类,大家有分为以下几种:
- Soft attention,对所有的分量均做加权
- Hard attention,通过采样,只对部分分量做加权
下面通过论文的方式对不同的方法进行说明。
主要是在一些细粒度的图像分类中,类别之间的区别主要体现在一些局部的区域中的细微差别,如果直接用全尺寸的图像特征的话,这些细微的区别表达地不够。论文提出了RA-CNN(Recurrent Attention Convolutional Neural Network)
这里一共利用了三个相同网络结构,不同输入尺寸的CNN,利用coarse to fine的思想,希望网络能够聚焦到能够体现出细微差别的区域中。
对每一个网络,前面两个子网络论文将其称为APN
(Attention Proposal Network)。每个子网络都用来做两个事情:
对图像进行分类
$$
\begin{equation}
\mathbf{p}(\mathbf{X})=f\left(\mathbf{W}_{c} * \mathbf{X}\right)
\end{equation}
$$预测attention region
$$
\begin{equation}
\left[t_{x}, t_{y}, t_{l}\right]=g\left(\mathbf{W}_{c} * \mathbf{X}\right)
\end{equation}
$$
其中:$t_x, t_y$ 指 attention region 的中心坐标
$t_l$ 指预测出的squre边长的一半
Crop
$$
\begin{equation}
\begin{aligned} t_{x(t l)} &=t_{x}-t_{l}, \quad t_{y(t l)}=t_{y}-t_{l} \ t_{x(b r)} &=t_{x}+t_{l}, \quad t_{y(b r)}=t_{y}+t_{l} \end{aligned}
\end{equation}
$$
通过上一步,可以得到预测的attention region的四个点的坐标如上。crop操作只需要通过一个点乘来完成:
$$
\begin{equation}
\mathbf{X}^{a t t}=\mathbf{X} \odot \mathbf{M}\left(t_{x}, t_{y}, t_{l}\right)
\end{equation}
$$
这里M的是对原图运用$h(x)=1 /(1+\exp ^{-k x})$ 得到的,当k足够大时,类似于一个阶跃函数。下图是k=50时的情况。
在获得attention region之后,利用双线性插值的方法,获得一个增强的图像:
$$
\begin{equation}
\mathbf{X}{(i, j)}^{a m p}=\sum{\alpha, \beta=0}^{1}|1-\alpha-{i / \lambda} | 1-\beta-{j / \lambda}| \mathbf{X}_{(m, n)}^{a t t}
\end{equation}
$$
$\lambda$ 是上采样因子、$[]$用来取整,${}$用来取小数部分。Loss
包含两部分LOSS,分类和RANK:
$$
\begin{equation}
L(\mathbf{X})=\sum_{s=1}^{3}\left{L_{c l s}\left(\mathbf{Y}^{(\mathbf{s})}, \mathbf{Y}^{*}\right)\right}+\sum_{s=1}^{2}\left{L_{r a n k}\left(p_{t}^{(s)}, p_{t}^{(s+1)}\right)\right}
\end{equation}
$$$$
\begin{equation}
L_{r a n k}\left(p_{t}^{(s)}, p_{t}^{(s+1)}\right)=\max \left{0, p_{t}^{(s)}-p_{t}^{(s+1)}+\operatorname{margin}\right}
\end{equation}
$$直观的理解就是随着attention region的细化,它对应的分类损失也应该提高。
在训练好之后,对每一个子APN得到的feature进行归一化,之后融合起来就能得到一个fused feature。
主要的贡献是提出了这样一个Residual Attention Module
,结构如下图所示:
右边的分支为普通的卷积分支,左边的分支对原图进行下采样和上采样,得到attention mask。左边分支的激活函数是Sigmoid,输出值在(0,1)之间。如果直接用mask和原图相乘,在网络越来越深的时候,由于mask小于1,会导致输出的太小,给网络的训练带来困难。于是作者使用的是$H_{i, c}(x)=\left(1+M_{i, c}(x)\right) * F_{i, c}(x)$.
那么当M(x)=0时,该层的输入就等于F(x),因此该层的效果不可能比原始的F(x)差,这一点也借鉴了ResNet中恒等映射的思想,同时这样的加法,也使得Trunk Branch输出的feature map中显著的特征更加显著,增加了特征的判别性。这样,优化的问题解决了,性能的问题也解决了,因此通过将这种残差结构进行堆叠,就能够很容易的将模型的深度达到很深的层次,具有非常好的性能。