Attention 的出发点是学习一个 scale ,对深度网络的中间特征做线性激活,即:
对特征中有利于目标任务(如正确分类)的部分作增强( a > 1 a>1 a>1),对特征中不利于或无关目标任务的部分做抑制( a < 1 a<1 a<1)
- 基于CAM(Class Activation Mapping)的注意力机制
借助一个辅助分类器,在[conv]* -> [GAP/GMP] -> [Full Connected] -> [Sigmoid]
的常见分类网络中,通过目标类别对应的 C C C 个全连接层的权重对GAP/GMP
之前的特征( ∈ R H × W × C \in \Bbb R^{H\times W\times C} ∈RH×W×C)作 channel-wise 的乘积。
细节可以查看这篇博文 - Self-Attention
最经典的用途是 SAGAN - 自学习的 attention
这是本文的主题哈!
最近看到引用u-gat-it
的一篇文章 Breaking the cycle—Colleagues are all you need,里边也使用了 attention 来辅助图像转换,不过这里的 attention 不是像u-gat-it
中使用 CAM,而是使用一个网络分支来预测一个 mask,其中对 mask 的约束包括3个方面:(以当个 channel 的 mask M c ∈ R h × w M_c\in\Bbb R^{h\times w} Mc∈Rh×w)
稀疏性限制
min ∑ i , j h , w M c , i , j \min \sum_{i,j}^{h,w}M_{c,i,j} mini,j∑h,wMc,i,j
这是因为一般 mask 的使用方式是 f e a t _ r e f i n e d = f e a t × m a s k feat\_refined=feat \times mask feat_refined=feat×mask,为了有所输出,同时简单化,模型很容易就使得 m a s k = a l l o n e s mask=all~ones mask=all ones
平滑度限制
这是因为我们希望得到的 attention 足够平滑,并且较为集中,不会说出现很多个簇;我们可以使用 TV 正则项(Total Variation),即:
min ∑ i , j h , w ( M c , i + 1 , j − M c , i , j ) 2 + ( M c , i , j + 1 − M c , i , j ) 2 \min \sum_{i,j}^{h,w}(M_{c,i+1,j}-M_{c,i,j})^2+(M_{c,i,j+1}-M_{c,i,j})^2 mini,j∑h,w(Mc,i+1,j−Mc,i,j)2+(Mc,i,j+1−Mc,i,j)2
详情见
极端化促进
min ∑ i , j h , w 1 ∣ M c , i , j − 0.5 ∣ ↑ + ϵ ↓ \min \sum_{i,j}^{h,w}{1\over{|M_{c,i,j}-0.5|\uparrow+\epsilon}}\downarrow mini,j∑h,w∣Mc,i,j−0.5∣↑+ϵ1↓
这个正则项比较好懂,就是,让 mask 的值原理均值 0.5.
深度网络的本质是统计学习,统计学习最爱的就是均值 mean,因此,mask 比较容易回归到中规中矩的 mean
同时这个形式的正则项的图像为:,我们发现,在 0.5 附近梯度很大,更有利于 attn 的生成,而不是陷入 all 0.5 的情况。