一、为什么要提出动态卷积?
为了更好的将模型部署在边端设备上,需要设计轻量级网络模型。轻量级卷积网络因其较低的运算而限制了CNN的深度(卷积层层数)和宽度(通道数),限制了模型的表达能力,使得模型性能下降。
如何在不增加网络宽度和深度的情况下增加模型的表达能力,成为待解决的问题。在CVPR2020年,动态卷积的概念被提出,它的设计初衷就是,在不显著增加模型参数量或计算复杂度的前提下,动态卷积可以提升模型在诸如分类、检测等任务上的准确率。
二、参数量、FLOPs的理解以及计算方式
参数量:指的是模型中所有需要学习的参数总和,这包括但不限于卷积层的权重、全连接层的权重以及偏置项等。参数量直接关系到模型的存储需求和训练时的内存消耗。
计算参数量的计算公式如下:
参数量
=
(
K
h
×
K
w
×
C
i
n
)
×
C
o
u
t
+
C
o
u
t
参数量=(K_h\times K_w\times C_{in})\times C_{out}+C_{out}
参数量=(Kh×Kw×Cin)×Cout+Cout
其中
C
i
n
C_{in}
Cin表示输入通道数,
C
o
u
t
C_{out}
Cout表示输出通道数,
K
h
×
K
w
K_h\times K_w
Kh×Kw表示卷积核的大小。
(
K
h
×
K
w
×
C
i
n
)
×
C
o
u
t
(K_h\times K_w\times C_{in})\times C_{out}
(Kh×Kw×Cin)×Cout表示卷积核的权重参数。
C
o
u
t
C_{out}
Cout表示偏置项的参数。
输入通道、输出通道数以及卷积数之间的关系图如下:
FLOPs: FLOPs衡量的是模型在进行前向传播时执行的浮点运算次数,包括加法、减法、乘法和除法等。它是评估模型运行时计算成本的一个指标。
FLOPs的计算公式如下:
F
L
O
P
s
=
2
×
(
K
h
×
K
w
×
C
i
n
×
H
o
u
t
×
W
o
u
t
×
C
o
u
t
)
FLOPs = 2\times (K_h\times K_w\times C_{in}\times H_{out}\times W_{out}\times C_{out})
FLOPs=2×(Kh×Kw×Cin×Hout×Wout×Cout)
其中
H
o
u
t
、
W
o
u
t
H_{out}、W_{out}
Hout、Wout表示输出特征图的大小。之所以乘上
H
o
u
t
、
W
o
u
t
H_{out}、W_{out}
Hout、Wout而不是乘上
H
i
n
、
W
i
n
H_{in}、W_{in}
Hin、Win是因为并不是每一次卷积都得到和原始图像一样的大小的图像,但是输出特征图大小一定是卷积计算的次数。
三、什么是动态卷积?
动态卷积的基本思路是根据输入数据,自适应地的调整卷积参数。即做采用的卷积核与输入相关,不同的输入有着不同的卷积核。
对于一个卷积神经网络,可被下面的公式进行表示:
y
=
g
(
W
T
x
+
b
)
y=g(W^Tx+b)
y=g(WTx+b)
具有动态卷积的卷积神经网络,可被定义为如下式:
y
=
g
(
W
~
T
(
x
)
x
+
b
(
x
)
)
W
~
(
x
)
=
∑
k
=
1
K
π
k
(
x
)
W
~
k
,
b
~
(
x
)
=
∑
k
=
1
K
π
k
(
x
)
b
~
k
s
.
t
.
0
≤
π
k
(
x
)
≤
1
,
∑
k
=
1
K
π
k
(
x
)
=
1
y=g(\tilde{W}^T(x)x+b(x))\\ \tilde{W}(x)=\sum_{k=1}^{K}\pi_k(x)\tilde{W}_k,\ \tilde{b}(x)=\sum_{k=1}^K\pi_k(x)\tilde{b}_k \\ s.t. \ 0\leq\pi_k(x)\leq1, \sum_{k=1}^{K}\pi_k(x)=1
y=g(W~T(x)x+b(x))W~(x)=k=1∑Kπk(x)W~k, b~(x)=k=1∑Kπk(x)b~ks.t. 0≤πk(x)≤1,k=1∑Kπk(x)=1
其中
π
k
(
x
)
\pi_k(x)
πk(x)表示第k个线性函数
W
~
k
T
x
+
b
~
\tilde{W}^T_kx+\tilde{b}
W~kTx+b~的attention的权重,这个权重随着不同的输入x的不同而变化。因此在给定输入的情况下,动态卷积会给出符合该输入的最佳线性组合。
动态卷积的结构为:
相较于原来的固定卷积核,现在可以变为可以根据输入自适应的改变注意力的卷积核。相较于原来的一个固定卷积核,现在这一个固定卷积是由K个卷积核加权定义。参数量相较于原来的卷积核提升了K倍,提升了模型的表达能力。
四、动态卷积的参数量和FLOPs
从Figure 3中可以看到,相较于普通卷积,动态卷积额外增加两部分计算:(1)注意力权值计算;(2)动态权值融合。
attention部分的计算步骤为:输入
x
x
x先经过全局平均池化将
H
×
W
×
C
i
n
H\times W\times C_{in}
H×W×Cin的大小转为
1
×
1
×
C
i
n
1\times 1\times C_{in}
1×1×Cin; 然后通过第一个FC层将维度缩小至原来的4倍,即维度变为
1
×
1
×
C
i
n
4
1\times 1\times \frac{C_{in}}{4}
1×1×4Cin; 然后经过第二个FC将维度变为
1
×
1
×
K
1\times 1\times K
1×1×K; 最后经过softmax将这K维数据映射为[0,1]之间的概率分布。
attention部分的计算复杂度(FLOPs):
H
W
C
i
n
+
C
i
n
C
i
n
4
+
C
i
n
4
K
HWC_{in}+C_{in}\frac{C_{in}}{4}+\frac{C_{in}}{4}K
HWCin+Cin4Cin+4CinK
动态权值融合部分的计算步骤为:每个卷积核的权重与其对应的卷积核参数相乘,然后将所有这些加权后的卷积核参数相加,得到最终的卷积核参数。这个过程可以表示为:
W
~
=
∑
k
=
1
K
W
~
k
×
π
k
\tilde{W} = \sum_{k=1}^{K} \tilde{W}_k \times \pi_k
W~=k=1∑KW~k×πk
其中,
W
~
\tilde{W}
W~是第k个卷积核的注意力权重,
π
k
\pi_k
πk 是第k个卷积核的参数。
动态权重融合部分的计算复杂度:对于每个输出位置,需要对 𝐾个卷积核的对应元素与它们的权重 π k \pi_k πk进行逐元素乘法,然后求和。这个操作的复杂度是 K D K 2 C i n C o u t + K C o u t KD_K^2C_{in}C_{out}+KC_{out} KDK2CinCout+KCout因为每个元素都要参与 𝐾次乘法和 K次加法。
这两部分的计算开销都远小于静态卷积中的计算复杂度( H W C i n C o u t D k 2 HWC_{in}C_{out}D_k^2 HWCinCoutDk2)。