Self-Attention Mechanism in Convolutional Neural Networks.

卷积神经网络中的自注意力(Self-Attention)机制表现为非局部滤波(non-local filtering)操作,其实现过程与Seq2Seq模型的自注意力机制类似。

标准的卷积层是一种局部滤波操作,其输出特征上的任意位置是由对应输入特征的一个邻域构造的,只能捕捉局部特征之间的关系。而自注意力机制通过计算任意两个位置之间的关系直接捕捉远程依赖,而不用局限于相邻点,相当于构造了一个和特征图尺寸一样大的卷积核,从而可以捕捉更多信息。

在卷积网络的自注意力机制中,首先构造输入特征$x$的键特征$f(x)$, 查询特征$g(x)$和值特征$h(x)$;然后应用点积注意力构造自注意力特征图:

\[\alpha_{i} = \text{softmax}\left(f(x_i)^Tg(x_j)\right) =\frac{e^{f(x_i)^Tg(x_j)}}{\sum_j e^{f(x_i)^Tg(x_j)}}\]

在计算输出位置$i$的响应$y_i$时,考虑所有输入值特征$h(x_j)$的加权:

\[y_i= \sum_{j}^{} \alpha_{j}h(x_j) = \sum_{j}^{} \frac{e^{f(x_i)^Tg(x_j)}}{\sum_k e^{f(x_i)^Tg(x_k)}} h(x_j)\]

上式可以被写作更一般的形式:

\[y_i=\frac{1}{C\left(x_i\right)} \sum_j f\left(x_i, x_j\right) h\left(x_j\right)\]

其中相似度函数$f(\cdot,\cdot)$计算两个特征位置$x_i,x_j$的相似程度,输出被权重因子$C(x_i)$归一化。注意到当相似度函数取Embedded Gaussian函数:

\[f\left(\mathbf{x}_i, \mathbf{x}_j\right)=e^{\theta\left(\mathbf{x}_i\right)^T \phi\left(\mathbf{x}_j\right)}\]

此时自注意力机制等价于上述query-key-value形式。

自注意力机制的实现可参考:

class SelfAttention(nn.Module):
    def __init__(self, in_channels):
        super(SelfAttention, self).__init__()
        self.f = nn.Conv2d(in_channels, in_channels, 1)
        self.g = nn.Conv2d(in_channels, in_channels, 1)
        self.h = nn.Conv2d(in_channels, in_channels, 1)
        self.o = nn.Conv2d(in_channels, in_channels, 1)

    def forward(self, x):
        b, c, h, w = x.shape
        fx = self.f(x).view(b, c, -1) # [b, c, hw]
        fx = fx.permute(0, 2, 1) # [b, hw, c]
        gx = self.g(x).view(b, c, -1) # [b, c, hw]
        attn = torch.matmul(fx, gx) # [b, hw, hw]
        attn = F.softmax(attn, dim=2) # 按行归一化

        hx = self.h(x).view(b, c, -1) # [b, c, hw]
        hx = hx.permute(0, 2, 1) # [b, hw, c]
        y = torch.matmul(attn, hx) # [b, hw, c]
        y = y.permute(0, 2, 1).contiguous() # [b, c, hw]
        y = y.view(b, c, h, w)
        return self.o(y)

卷积神经网络中的自注意力机制包括:

(1)增强特征提取能力

Non-local Net

Non-Local Net设计了卷积网络中自注意力机制的基本结构。

Dual Attention Network (DANet)

DANet设计了Dual Attention,同时引入了沿空间维度和和通道维度的自注意力。

Double Attention Network (A^2-Net)

$A^2$-Net首先使用双线性池化提取特征的一系列描述子,然后使用注意力机制将这些特征描述子分配给特征的每个位置。

Region-based Non-local (RNL)

基于区域的non-local计算两个特征位置$x_i,x_j$的相似程度时,不仅仅与这两个点本身有关,还与其周边region有关。 \(y_i=\frac{1}{C\left(x_i\right)} \sum_j f\left( \theta(\mathcal{N}_i),\theta(\mathcal{N}_j)\right) x_j\)

Dual Multi Scale Attention Network (DMSANet)

DMSANet首先把特征按通道进行分组,并行地应用空间和特征自注意力机制,再通过注意力机制聚合特征。

Self-attention Network (SAN)

作者设计了两种self-attention形式:pairwise self-attentionpatchwise self-attention

\[\mathbf y_i = \sum\limits_{j\in \mathcal{R}(i)}\alpha(\mathbf x_i,\mathbf x_j) \odot \beta(\mathbf x_j) \\ \mathbf y_i = \sum\limits_{j\in \mathcal{R}(i)}\alpha(\mathbf{x}_{\mathcal{R}_{(i)}})_j \odot \beta(\mathbf x_j)\]

Polarized Self-Attention (PSA)

极化自注意力基于摄影中的极化滤波原理。先在某个方向(通道维度或空间维度)上对特征进行压缩,然后对损失的强度范围进行增强或者抑制。

(2)降低计算复杂度

Criss-Cross Attention (CCNet)

CCNet设计了Criss-Cross Attention,计算一个点的横纵位置的attention信息,通过串行两个Criss-Cross attention模块间接与全图位置内的任意点进行注意力计算。

Global Context Network (GCNet)

GCNet设计了Global Context Block,通过querykey权重共享简化了attention map的构造,并且引入了通道注意力。

Expectation-Maximization Attention Network (EMANet)

EMANet通过期望最大化(EM)算法迭代出一组紧凑的基,在这组基上运行注意力机制。

Interlaced Sparse Self-Attention (ISANet)

ISANet把特征图进行分块,先进行块内的self attention计算得到Long-rangeattention;然后进行块之间计算self attention得到Short-rangeattention

Asymmetric Non-local Neural Network (ANNNet)

ANNNet通过Pyramid PoolingNon-Local中的KeyValue进行采样以减少计算量。

Lightweight Non-Local Network (LightNL)

LightNL是为神经结构搜索设计的轻量级Non-Local模块,主要有三点差异:$Q,K,V$的生成去掉了$1\times 1$卷积、输出卷积替换为深度卷积、使用更小的特征图计算相关性。

Non-Local Sparse Attention (NLSA)

NLSA通过局部敏感哈希构造attention bucket,只对同一个attention bucket内的特征进行自注意力计算。

⭐ 参考文献