通道注意力机制、空间注意力机制、混合注意力机制
1. 通道注意力机制
参考文献
阅读了“Squeeze-and-Excitation Networks”这篇论文,但是懂了它的流程原理,但是不知道有什么用,先说说它的流程吧。
上面这是论文中讲到的Squeeze-and-Excitation(挤压-奖励)模块,这个模块有4个关键点,分别是: F t r 、 F s q 、 F e x 、 F s c a l e F_{tr}、F_{sq}、F_{ex}、F_{scale} Ftr、Fsq、Fex、Fscale,下面详细来讲他的流程:
- F t r F_{tr} Ftr:假设我们的特征图是X,通过 F t r F_{tr} Ftr,将X转换为U,在这个过程中,每个通道进行了卷积以及相关操作(比如偏置和加权等),简单来说这个 F t r F_{tr} Ftr就是可学习的滤波器的一个集合(这里要区别简单的卷积核和滤波器的区别)。论文中给出了这样的数学公式: u c = v c ∗ X = ∑ s = 1 C v c s ∗ x s u_c = v_c * X = \sum_{s=1}^C v_c^s * x^s \quad uc=vc∗X=∑s=1Cvcs∗xs,其中 V = [ v 1 , v 2 , . . . . , v C ] V=[v_1, v_2,....,v_C] V=[v1,v2,....,vC]表示学习到的滤波器集合, U = [ u 1 , u 2 , . . . , u C ] U=[u_1, u_2,...,u_C] U=[u1,u2,...,uC]表示 F t r F_{tr} Ftr的输出(因为这里的通道为C,所以是一个集合的形式)。
- F s q F_{sq} Fsq:挤压操作。我们得道的U,对于这个特征图来说,每个通道之间都是独立的,那么U的每个单元无法利用除了该区域之外的上下文信息,因为我们在 F t r F_{tr} Ftr中,每个滤波器是指在自己对应的层进行操作的。我们先看 F s q F_{sq} Fsq干了什么事,它将原来的 H × W × C H \times W \times C H×W×C的特征图变为了 1 × 1 × C 1 \times1 \times C 1×1×C的形式,是不是感觉从一个立体图变为了一个平面图,这就是所谓的挤压,将所有的特征进行了压缩,这里的“压缩”采用的是全局平均池化,原文中是这样描述的:将全局空间信息压缩到一个通道描述符中。这是通过使用全局平均池化生产通道级统计量来实现的。形式上,通过沿空间维度 H × W H \times W H×W压缩 U U U,生成统计量 z z z,然后给出了数学公式: z c = F s q ( u c ) = 1 H × W ∑ i = 1 H ∑ j = 1 W u c ( i , j ) z_c = F_{sq}(u_c) = \frac {1} {H \times W} \sum_{i=1}^H \sum_{j=1}^W u_c(i,j) \quad zc=Fsq(uc)=H×W1∑i=1H∑j=1Wuc(i,j),就是一个平均池化的过程,这里的输出 U U U可以解释为一组局部描述符的集合,但是这里也没有说到每个通道之间的关系呀,继续往后面看。
- F e x F_{ex} Fex:激励操作。这里我们要利用挤压操作得到的信息,我们要获取每个通道之间的依赖关系。我们看论文中是怎么实现的: s = F e x ( z , W ) = δ ( g ( z , W ) ) = δ ( W 2 δ ( W 1 , z ) ) s=F_{ex}(z, W) = \delta(g(z, W)) = \delta(W_2\delta(W_1, z)) s=Fex(z,W)=δ(g(z,W))=δ(W2δ(W1,z)),这里的 δ \delta δ是 R e L U ReLU ReLU函数, W 1 W_1 W1用于降维, W 2 W_2 W2用于升维,怎么捕获通道间的依赖关系呢?这里使用的是门控机制,通过门控机制,我们可以利用 F s q F_{sq} Fsq中聚合的信息来选择哪些留下,哪些走开。
- F s c a l e F_{scale} Fscale: x c = F s c a l e ( u c , s c ) = s c ⋅ u c x_c = F_{scale}(u_c, s_c) = s_c \cdot u_c xc=Fscale(uc,sc)=sc⋅uc,最后一步就是点乘了,就是通道级乘法了,还原。
上面就是通道注意力机制的一个详细流程了,最开始看完我也只知道它的这个过程,但是不知道它这么做的意义是什么,自己捋了上面的流程后我发现:其实通道注意力机制的核心就是利用门控机制,因为通道注意力机制的中心是在通道上,每个通道上有重要的信息和不重要的信息,我们要过滤到不重要的信息,那么这里就是利用门控机制( s i g m o i d sigmoid sigmoid函数),那么这里的挤压的作用是什么呢?为什么要进行挤压?原文中也提到了:“每个学习到的滤波器仅在局部感受野内操作,因此变换输出 U U U的每个单元无法利用该区域之外的上下文信息,这一问题在网络的浅层尤为重要,因为这些层的感受野尺寸较小”。其实说到底还是感受野太小所导致的,我们使用平均全局池化后,也就是进行了压缩之后,这里就增大的感受野。
以上便是通道注意力机制的全部过程。
2. 空间注意力机制
参考文献
依旧从结构图入手。它分为三部分:首先是定位网络,它接收输入特征图,并通过若干隐藏层输出应施加于特征图的空间变换参数–这使得变换依赖于输入。然后,预测的变换参数被用于创建一个采样网格,这是一组点,表示应在输入图中采样的位置以生成变换后的输出。这一过程由网格生成器完成。最后,将特征图和采样网格作为输入传递给采样器,从输入特征图的网格点采样生成输出图,上面是原文的内容,蒟蒻一脸懵逼,先往下看。
- 定位网格(Localisation Network):原文中说了,定位网格它是接受输入的特征图,然后要使得后续的变化要依赖于输入, θ = f l o c ( U ) \theta = f_{loc}(U) θ=floc(U),这是原文中的公式, θ \theta θ表示的是应用于特征图变换的参数,这里的 f l o c ( ) f_{loc}() floc()是定位网络函数,它可以是采用任何形式,比如全连接网络或卷积网络,当应该包含一个最终的回归层,用于生成变换参数 θ \theta θ,也就是说通过回归层,将输入特征映射为具体的变换参数,使网络能够动态调整特征图的空间布局,提升目标的位置、姿态等变化。
- 参数化采样网格(Parameterised Sampling Grid):在这里,我们要对输入特征图进行变形,每个输出像素都是通过在输入特征图的特点位置应用一个采样和来计算,这里的像素是特征图中的一个元素。输出的图像被定义为了网格的形态,我们要逐点进行变化,下面是变换公式:
其中的 G i G_i Gi是网格中像素的位置, T θ T_\theta Tθ是变换参数, ( x i t , y i t ) (x_i^t, y_i^t) (xit,yit)是输出特征图中规则网格的目标坐标, ( x i s , y i s ) (x_i^s, y_i^s) (xis,yis)是输入特征图中的源坐标,用于定义采样点。 A θ A_\theta Aθ是放射变换矩阵。 - 可微分图像采样(Differentiable Image Sampling):我们要对输入特征图进行空间变换,那么采样器必须根据采样点集合 T θ ( G ) T_\theta(G) Tθ(G)和输入特征图生成采样后的特征图。在 T θ ( G ) T_\theta(G) Tθ(G)中的每个坐标定义了输入特征图的空间位置,在每个位置应用一个采样核以获取输出V中的特定像素的值。
- 空间变换网络(Spatial Transformer Networks):定位网络、网格生成器和采样器的结合构成了一个空间变换器。引入空间变换器,网络能够学习如何主动变换特征图,以帮助在训练过程中最小化整体损失函数。
以上差不多是原文的内容,我看完还是有点懵逼,空间注意力机制,它的重心肯定是在空间上,我们上面说到的通道注意力机制,它的重心是在每个通道上,它要找到每个通道之间的依赖关系,那么类似的,空间注意力机制就是要找到空间上的依赖关系,所以它将特征图看成了一个一个的像素点,通过每个像素点之间的关系,对特征图进行一些变换,然后得到变换后的特征图,那么空间注意力机制的重点就是这里像素点的变换了,论文中说到,变换有裁剪、平移、旋转、缩放和倾斜操作,也就是说,不重要的裁剪,类似的我们学习到了可以平移,有对称关系的我们可以旋转等这样的操作,这样我们就能够得到最终的特征图了。(这些是不是特征加强操作呀?)
3. 混合注意力机制
参考文献
为什么会有混合注意力机制?“在Squeeze-and-Excitation模块中,他们使用全局平均池化特征计算通道注意力。然而,我们发现这些特征在推断精细的通道注意力时并非最优,并建议同时使用最大池化特征。此外,他们忽略了空间注意力,而空间注意力觉得‘关注哪里’方面起着重要作用”,所以提出了混合注意力机制,下面是CBAM的结构图1:
下面是每个注意力子模块示意图2:
通道子模块利用最大池化输出和平均池化输出以及共享网络;空间子模块利用沿通道轴池化的类似两个输出,并将它们转发到卷积层。
我们先来看CBAM的整体步骤,如图1所示,这是整体框架图,可以发现先是通过通道注意力机制然后再通过空间注意力机制,最后得到输出的特征图,原文中说到,对于一个给定的中间特征图F作为输入,CBAM依次推断出一个1D的通道注意力图 M c M_c Mc和一个2D的空间注意力图 M s M_s Ms,整体过程为: F ′ = M c ( F ) ⨂ F , F ′ ′ = M s ( F ′ ) ⨂ F ′ F' = M_c(F)\bigotimes F, F''=M_s(F')\bigotimes F' F′=Mc(F)⨂F,F′′=Ms(F′)⨂F′,其中 ⨂ \bigotimes ⨂表示逐元素乘法,在乘法过程中,注意力值会相应地广播(复制):通道注意力值沿空间维度广播,反之亦然, F ′ ′ F'' F′′是最终的优化输出,上面是原文的内容。
为什么通道注意力图是1D的?空间注意力图的2D?
我最开始真的没有明白,因为我看的SEN文献里面的挤压-奖励模块的输出也是一个特征图,STN这篇文献中的输出也是一个特征图,1D就是 C × 1 × 1 C \times 1 \times 1 C×1×1,2D就是 1 × H × W 1 \times H \times W 1×H×W,其实也能想得通,通道注意力是将每个通道进行聚合,通道数不变,特征图的分辨率变了,而空间注意力要得到空间上的关系,那么就是聚合每个通道之间的关系了。简单来说:
- 通道注意力图(1D):目标是建模通道间的依赖关系,那么关注的是“哪些通道的特征更重要”,每个通道的权重是全局的,独立于具体的空间位置(也就是对整个通道的所有位置应用相同的权重)。也就是处理的信息维度是夸通道了,作用范围在全局,所有空间位置共享。
- 空间注意力图(2D):目标是建模空间位置的重要性,关注的是“哪些空间区域需要聚焦”,它需要为每个空间位置生成权重,而这些权重对所有通道是共享的,就是上面说到的,输入特征图经过通道维度压缩(比如通道取平均值或最大值),生成空间描述符(形状为 1 × H × W 1 \times H \times W 1×H×W),这些权重直接作用于空间维度,调整每个位置(像素)的响应强度,因此需要保留空间结构信息。也就是处理的信息维度是夸空间的,所有通道共享。
- Channel attention module:在文章中,作用首先对特征图同时应用平均池化和最大池化操作来聚合空间信息, 生成两个不同的空间上下文描述符: F c a v g 、 F c m a x F_c^{avg}、F_c^{max} Fcavg、Fcmax,分别表示平均池化和最大池化特征。然后将两个描述符传递到一个共享网络shared MLP,这个共享网络实际上就是一个多层感知机,然后进行逐元素加法合并输出特征向量,得到 M c M_c Mc,通道注意力的计算公式为: M c ( F ) = σ ( M L P ( A v g P o o l ( F ) ) + M L P ( M a x P o o l ( F ) ) ) , M c ( F ) = σ ( W 1 ( W 0 ( F c a v g ) ) + W 1 ( W 0 ( F c m a x ) ) ) M_c(F)= \sigma(MLP(AvgPool(F)) + MLP(MaxPool(F))), M_c(F) = \sigma(W_1(W_0(F_c^{avg})) + W_1(W_0(F_c^{max}))) Mc(F)=σ(MLP(AvgPool(F))+MLP(MaxPool(F))),Mc(F)=σ(W1(W0(Fcavg))+W1(W0(Fcmax))), W 0 和 W 1 W_0和W_1 W0和W1是多层感知机中的权重系数。
- Spatial attention module:在空间注意力模块中,作者首先沿通道轴应用平均出话和最大池化操作,并将它们的输出拼接以生成高校的特征描述符,然后应用一个标准卷积层,生成空间注意力图 M s ( F ) M_s(F) Ms(F),用于编码需要增强或抑制的位置,这里生成了两个2D图: F s avg ∈ R 1 × H × W F_s^{\text{avg}} \in \mathbb{R}^{1 \times H \times W} Fsavg∈R1×H×W和 F s max ∈ R 1 × H × W F_s^{\text{max}} \in \mathbb{R}^{1 \times H \times W} Fsmax∈R1×H×W,随后将它们拼接并通过一个 7 × 7 7 \times 7 7×7卷积核的卷积层处理,生成2D空间注意力图,计算公式为: M s ( F ) = σ ( f 7 × 7 ( [ A v g P o o l ( F ) ; M a x P o o l ( F ) ] ) ) = σ ( f 7 × 7 ( [ F s a v g ; F s m a x ] ) ) , M s (F)=σ(f 7×7 ([AvgPool(F);MaxPool(F)]))=σ(f 7×7 ([F s avg ;F s max ])), Ms(F)=σ(f7×7([AvgPool(F);MaxPool(F)]))=σ(f7×7([Fsavg;Fsmax])),这样我们变知道每个值对应的空间位置(像素)的重要性,通过逐元素乘法作用于原始特征图的所有通道。
“给定一个输入图像,通道注意力和空间注意力两个模块分别计算互补的注意力信息,前者聚焦于“什么 ”(特征重要性),后者聚焦于“哪里 ”(空间位置重要性)。基于此,这两个模块可以以并行 或串行 的方式排列。我们发现,串行排列 比并行排列的结果更好。对于串行排列的顺序,我们的实验结果表明,先通道后空间 的顺序略优于先空间后通道的顺序。”
参考文献:
- Squeeze-and-Excitation Networks
- Spatial Transformer Networks
- CBAM: Convolutional Block Attention Module