单位:清华,南开(程明明团队)
ArXiv:https://arxiv.org/abs/2202.09741
Github: https://github.com/Visual-Attention-Network
导读:
今天了解一个卷积的新操作,即解耦卷积。说是新,其实旧,比如MobileNet为了高效率地推断,将一个标准的CNN看成一个Depth-wise CNN和Point-wise CNN,即解耦。本篇文章将一个更大的卷积核解耦成三个不同类型的CNN操作。虽然取得了超过众多SOTA的性能,但是在MLP中采用经典的DW-FFN,究竟是MLP带来了性能提升,还是大核注意力起了作用,有点存疑!
摘要
尽管初衷为自然语言理解而设计的,但最近自注意力机制已经席卷了计算机视觉各个领域。但是,图像的2D本质给自注意力机制应用到计算机视觉中带来三个挑战:
- 将图像看成1D序列,忽略了其2D结构;
- 对于高分辨率图像,具有平方复杂度的运算量;
- 仅仅抓捕空间注意力,但忽略了通道注意
本篇文章提出大核注意力(large kernel attention)模块,在避免上述问题的同时,实现了自注意力中自适应和长距离的相关性。基于LKA模块,设计了一个视觉注意力网络,即Visual Attention Network,VAN。VAN架构极其简洁,在广泛的实验中如识别、检测、语义分割、实例分割等任务中超过了当前SOTA的transformer架构,并且较大优势超过了CNN。
一、网络设计
1.1 CNN与Self-Attention
上面分析了自注意力的三个缺点,而CNN操作采用静态的权值而缺乏适应性,而适应性被证明起着关键的作用。Convolution operation adopts static weight and lacks adaptability, which has been proven critical [36,16].
本篇作者设计的LKA模块,结合了CNN和自注意力的优点,包括局部结构信息、长距离依赖性和适应性,并且避免了自注意力的缺点,对通道适应性也考虑进去。
1.2 大核注意力,LKA
S
t
a
n
d
a
r
d
C
N
N
=
D
W
C
N
N
+
D
i
l
a
t
e
d
C
N
N
+
P
W
C
N
N
Standard^{CNN} = DW^{CNN} + Dilated^{CNN} + PW^{CNN}
StandardCNN=DWCNN+DilatedCNN+PWCNN
分解LKA的一种范式。该范式显示了一个13×13的卷积能够解耦成一个5×5的DW-CNN,一个dilation=3的5×5 DW-CNN和一个PW-CNN。
如同MobileNet中,将一个标准的卷积解耦成两个部分,即depth-wise卷积和point-wise卷积,DW-CNN和PW-CNN;作者将一个卷积操作解耦成三部分,即DW-CNN、Dilated-CNN和PW-CNN。如上图所示,通过该方法能够有效解耦大核的卷积运算。
图(a)和图(b)的区别在于同位元素点乘。
1.3 几种注意力
LKA可以描述成:
其中
F
∈
R
C
×
H
×
W
F \in R^{C \times H \times W}
F∈RC×H×W是输入特征,
A
t
t
e
n
t
i
o
n
∈
R
C
×
H
×
W
Attention \in R^{C \times H \times W}
Attention∈RC×H×W表示注意力图。注意力图中的数值对应每个特征的重要程度。
⊗
\otimes
⊗指的是同位元素乘法。
通过上述表格,可以看出LKA考虑了局部上下文信息、长距离感受野、动态处理即通道适应性与空间适应性。而CNN和Self-Attention只考虑部分特性。
1.4 MLP,多层感知器
多层感知器,在CNN出来之前就非常流行,但是因为全连接的方式,运算量大、效率低而陷入低迷。最近,一些研究将标准的MLP解耦成一个空间MLP和通道MLP,使得性能提升。与作者的MLP比较相近的结构是gMLP(还没了解这个结构,暂且保留
)。gMLP有两个缺点:1)尺度敏感,只能处理固定尺度的图像;2)只考虑全局信息,而忽略了局部结构。而作者设计的结构能克服这两点。
class Mlp(nn.Module):
def __init__(self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop=0.):
super().__init__()
out_features = out_features or in_features
hidden_features = hidden_features or in_features
self.fc1 = nn.Conv2d(in_features, hidden_features, 1)
self.dwconv = DWConv(hidden_features)
self.act = act_layer()
self.fc2 = nn.Conv2d(hidden_features, out_features, 1)
self.drop = nn.Dropout(drop)
#方便看代码,隐去了初始化
def forward(self, x):
x = self.fc1(x)
x = self.dwconv(x)
x = self.act(x)
x = self.drop(x)
x = self.fc2(x)
x = self.drop(x)
return
对作者MLP的表达存疑,它就是一个常用扩展了DW-CNN的反馈网络。并且,DW-CNN的通道那么大,对结果肯定有提升。腐蚀实验里面,只对LKA对比分析了。那么,LKA起多大作用就不好说。
1.5 复杂度分析
作者采用通用的分析策略,即对比参数量和浮点运算次数,Floating point opertions (FLOPs)。为了简洁格式,计算过程省略了偏置,假设输入和输出特征尺度都为
H
×
W
×
C
H \times W \times C
H×W×C,那么参数量和运算量计算如下:
这里前提是参照上述解耦图,即一个
K
×
K
K \times K
K×K的卷积可以分解为一个dilation=d、卷积核为
K
d
\frac{K}{d}
dK的Depth-wise dilation convolution,一个
(
2
d
−
1
)
(
2
d
−
1
)
(2d-1)(2d-1)
(2d−1)(2d−1)的DW-CNN,以及一个
1
×
1
1 \times 1
1×1的PW-CNN。
Number of parameters for different forms of a 21×21 convolution. 该表格对比三种CNN在相同Kernel和Channel的参数量,即标准的CNN、MobileNet以及LKA。
二 实验
2.1 可视化
作者采用Grad-CAM可视化了Swin-T、ConvNext-T、VAN-Base的CAM,即class activation map,激活类热力图。
2.2 性能对比
这幅图将最近SOTA方法都做了比较,实验充分,在ImangNet val集上,在运算量(GFLOPs)和参数量(param)同等条件下取得了最好性能(Acc)。