编辑:Happy
首发:AIWalker
原创文章,未经授权,禁止二次转载
paper: https://arxiv.org/pdf/2103.13425.pdf
code: https://github.com/DingXiaoH/DiverseBranchBlock
本文是清华大学&旷视科技的丁霄汉博士在“过参数化”卷积方面继ACNet、RepVGG之后的又一次探索,它创造性的将Inception的多分支、多尺度思想与过参数化思想进行了一次组合,得到了本文所提出的DBB。本文从卷积的两种线性特性(同质、加法)出发,设计了两种可组合的变换,在此基础上了结合Inception思想设计了动态多分支结构DBB。作为一种“等价嵌入”模块,它可以显著提升现有ConvNet的性能,比如在ImageNet任务上,最高可以带来1.9%的性能提升。
Abstract
本文提出一种可以提升CNN性能且“推理耗时无损”的通用模块组件,我们将其称之为Diverse Branch Block(DBB)
,它通过组合不同尺度、不同复杂度的分支(不同分支采用卷积序列、多尺度卷积或者均值池化)丰富特征空间的多样性达到提升单个卷积(注:推理时合并为单个卷积)表达能力的目的。一旦完成训练,一个DBB可以等价地转换为单个卷积以方便布署。
不同于ConvNet架构的推成出新,DBB在训练时采用了复杂的“微结构”且保持网络整体结构不边;而在推理/部署时,DBB这种复杂结构可以等价转换为单个卷积。这使得DBB可以作为一种“等价嵌入”的模块直接嵌入到现有任意架构中。
通过这种训练-推理时的“异构”,所得模型可以在训练时以更高的复杂度达到更高的性能;而在训练时又可以等价折叠为原始模型以方便布署。在ImageNet数据集上,DBB可以提升模型精度高达1.9%top-1精度;同时对于目标检测以及语义分割均有一定性能提升。
本文主要贡献包含以下几点:
- 提出一种包含丰富信息的“微结构”且可以作为”即插即用“模块直接嵌入到现有ConvNet(保持模型的”宏观结构“不变)中提升模型性能;
- 提出了一种通用模块组件DBB,它将六种矩阵变换等价转为为单个卷积,做到了“推理耗时无损”;
- 提出了一种特征表达方式类似Inception的DBB模块,它可以直接嵌入到ConvNet并取得了显著的性能提升,比如在ImageNet上取得了1.9%的top-1精度提升。
Method
在介绍具体结构之前,我们先来看一下卷积的线性特性;然后再介绍本文所设计的多分支模块。
Linearity of Convolution
我们假设卷积输入通道数为C,输出通道数为D,卷积尺寸为
K
×
K
K \times K
K×K,那么其卷积核为
F
∈
R
D
×
C
×
K
×
K
F \in R^{D \times C \times K \times K}
F∈RD×C×K×K,偏置参数
b
∈
R
D
b \in R^D
b∈RD可选。为方便后续的合并,我们将偏置参数表示为
R
E
P
(
b
)
∈
R
D
×
H
×
W
REP(b) \in R^{D \times H \times W}
REP(b)∈RD×H×W,此时卷积可以表示如下:
O
=
I
∗
F
+
R
E
P
(
b
)
O = I * F +REP(b)
O=I∗F+REP(b)
输出通道的每个值可以表示如下:
O
j
,
h
,
w
=
∑
c
=
1
∑
u
=
1
∑
v
=
1
F
j
,
c
,
u
,
v
X
(
c
,
h
,
w
)
u
,
v
+
b
j
O_{j,h,w} = \sum_{c=1}\sum_{u=1}\sum_{v=1} F_{j,c,u,v} X(c,h,w)_{u,v} + b_j
Oj,h,w=c=1∑u=1∑v=1∑Fj,c,u,vX(c,h,w)u,v+bj
卷积的线性特性可以从上述沟通推导得到,包含同质特性与加法特性:
I
∗
(
p
F
)
=
p
(
I
∗
F
)
,
∀
p
∈
R
I
∗
F
(
1
)
+
I
∗
F
(
2
)
=
I
∗
(
F
(
1
)
+
F
(
2
)
)
I*(pF) = p(I*F), \forall p \in R \\ I*F^{(1)} + I*F^{(2)} = I*(F^{(1)} + F^{(2)})
I∗(pF)=p(I∗F),∀p∈RI∗F(1)+I∗F(2)=I∗(F(1)+F(2))
注:加法特性只有当两个滤波器满足相同配置(比如通道数量、卷积核尺寸、stride、padding等等)时才满足。
Convolution for Diverse Branches
上图给出了本文所设计的包含六种变换的DBB模块,它包含分支加法组合、深度拼接组合、多尺度操作、均值池化以及卷积序列等。在上述多分支模块合并时会设计到这样几个变换:(1) Conv-BN的合并:(2)分支合并;(3) 卷积序列合并;(4) 深度拼接合并;(5) 均值池化转换;(6) 多尺度卷积转换等。接下来,我们分别针对这六种变换进行介绍。
Transform1: Conv-BN 一般而来,卷积与BN这对“基友”会同时出现,而两者在推理时又可以合并为单一卷积。那么如何合并呢?这个比较简单,公式如下:
O
j
,
:
,
:
=
(
(
I
∗
F
)
j
,
:
,
:
−
μ
j
)
γ
j
σ
j
+
β
j
O_{j,:,:} = ((I*F)_{j,:,:} - \mu_j) \frac{\gamma_j}{\sigma_j} + \beta_j
Oj,:,:=((I∗F)j,:,:−μj)σjγj+βj
这里利用了卷积的同质特性进行合并。变换后的卷积参数如下:
F
j
,
:
,
:
,
:
′
←
γ
j
σ
j
F
j
,
:
,
:
,
:
b
j
′
←
−
μ
j
γ
j
σ
j
+
β
j
F^{'}_{j,:,:,:} \leftarrow \frac{\gamma_j}{\sigma_j} F_{j,:,:,:} \\ b^{'}_{j} \leftarrow - \frac{\mu_j \gamma_j}{\sigma_j} + \beta_j
Fj,:,:,:′←σjγjFj,:,:,:bj′←−σjμjγj+βj
Transform2: Branch Addition 分之合并利用了卷积的加法特性,两个卷积的参数合并方式如下:
F
′
←
F
(
1
)
+
F
(
2
)
b
′
←
b
(
1
)
+
b
(
2
)
F^{'} \leftarrow F^{(1)} + F^{(2)} \\ b^{'} \leftarrow b^{(1)} + b^{(2)}
F′←F(1)+F(2)b′←b(1)+b(2)
Transform3: Conv Sequential 我们可以将连续的
1
×
1
1\times 1
1×1卷积与
K
×
K
K \times K
K×K卷积合并为单个
K
×
K
K \times K
K×K卷积。注:这里假设卷积的groups=1,groups大于1的情况可参考Transform4。此时
1
×
1
1\times 1
1×1与
K
×
K
K \times K
K×K两个卷积的卷积核分别为
D
×
C
×
1
×
1
D\times C \times 1 \times1
D×C×1×1与
E
×
D
×
K
×
K
E\times D \times K \times K
E×D×K×K(注:D可以是任意整数,所以这里可以极大的提升FLOPs,比如把D设置为10000,哈哈)。这两个卷积核的合并方法也是非常简单,公式如下:
F
′
←
F
(
2
)
∗
T
R
A
N
S
(
F
(
1
)
)
F^{'} \leftarrow F^{(2)} * TRANS(F^{(1)})
F′←F(2)∗TRANS(F(1))
注:
T
R
A
N
S
(
F
(
1
)
)
TRANS(F^{(1)})
TRANS(F(1))表示将
F
(
1
)
F^{(1)}
F(1)为
R
C
×
D
×
1
×
1
R^{C\times D \times 1 \times 1}
RC×D×1×1空间。
Transform4: Depth Concatenation Inceptioin采用了深度拼接方式组合不同的分之,当这些分支包含相同配置的卷积时,我们可以通过核参数的拼接进行等价变换,示意图如下。
组合的公式也是非常的简单,描述如下:
C
O
N
C
A
T
(
I
∗
F
(
1
)
+
R
E
P
(
b
(
1
)
)
,
I
∗
F
(
2
)
+
R
E
P
(
b
(
2
)
)
)
=
I
∗
F
′
+
R
E
P
(
b
′
)
CONCAT(I*F^{(1)} + REP(b^{(1)}), I*F^{(2)} + REP(b^{(2)})) = I*F^{'} + REP(b^{'})
CONCAT(I∗F(1)+REP(b(1)),I∗F(2)+REP(b(2)))=I∗F′+REP(b′)
此时
F
′
∈
R
(
D
1
+
D
2
)
×
C
×
K
×
K
,
b
′
∈
R
D
1
+
D
2
F^{'} \in R^{(D_1 +D_2) \times C \times K \times K}, b^{'} \in R^{D_1 +D_2}
F′∈R(D1+D2)×C×K×K,b′∈RD1+D2。这里的组合是一种通用变换,可以将两个分之的卷积变换成组卷积形式。注:在这个情况下,该分支的卷积序列应当具有相同的groups参数。
Transform5: Average Pooling 均值池化到卷积的变换就更简单了,看公式:
F
d
,
c
,
:
,
:
′
=
{
1
K
2
if
d
=
c
0
elsewise
F^{'}_{d,c,:,:} = \begin{cases} \frac{1}{K^2} \text{ if } d=c \\ 0 \text{ elsewise} \end{cases}
Fd,c,:,:′={K21 if d=c0 elsewise
Transform6: Multi-scale Conv 考虑到 k h × k w ( k h ≤ K , k w ≤ K ) k_h \times k_w(k_h \le K, k_w \le K) kh×kw(kh≤K,kw≤K)可以通过零padding等价变换为 K × K K \times K K×K卷积,因此 1 × 1 , 1 × K , K × 1 1\times1, 1\times K, K\times 1 1×1,1×K,K×1可以等价的转换,这也就是ACNetV1的本质所在。下图给出另一个等价转换的可视化图。
Inception-like DBB
上图给出了本文所设计的DBB结构示意图。类似Inception,它采用 1 × 1 , 1 × 1 − K × K , 1 × 1 − A V G 1\times1, 1\times 1-K\times K, 1\times 1-AVG 1×1,1×1−K×K,1×1−AVG等组合方式对原始 K × K K \times K K×K卷积进行增强。对于 1 × 1 − K × K 1\times 1-K \times K 1×1−K×K分支,我们设置中间通道数等于输入通道数并将 1 × 1 1\times 1 1×1卷积初始化为Identity矩阵;其他分支则采用常规方式初始化。此外,在每个卷积后都添加BN层用于提供训练时的非线性,这对于性能提升很有必要。
Experiments
为验证所提方案的有效性,我们在CIFAR、ImageNet、Cityscapes、COCO等数据集上进行相关实验对比。下表提供了不同数据集、不同任务上的超参配置。
我们先来看一下CIFAR与ImageNet上的性能对比,结果见上表。可以看到:
- 在CIFAR10与CIFAR100数据及上,DBB可以提升VGG16性能高达0.67%与1.67%;
- 在ImageNet数据集上,DBB可以提升AlexNet性能达1.96%;可以提升MobileNet0.99%;可以提升ResNet18/50达到1.45%/0.57%。
- 相比DBB的一个特例ACNet,DBB性能提升更明显。这意味着:采用类似Inception方式组合多路径不同复杂度的分支可能比简单的多尺度卷积更有益于提升模型性能。
与此同时,我们还从权值幅值角度分之了不同分支的重要性。可以看到:
- K × K , 1 × 1 , 1 × 1 − K × K K \times K , 1\times 1, 1\times 1-K\times K K×K,1×1,1×1−K×K三个分之的重要性相当;
- 对于stride=2的DBB, 1 × 1 − A v g 1\times 1-Avg 1×1−Avg更为重要,这意味着:均值池化对于下采样很有用。
- 对于stride=1的DBB, 1 × 1 1\times 1 1×1卷积很有益处。DBB的这种多分支方式可以自适应的组合学习不同尺度的信息。
我们再来看一下目标检测(CenterNet)与语义分割(PSPNet)方面的性能对比,见上表。可以看到:DBB同样可以带来显著的性能提升。
最后,我们再来看一个DBB的各个分支的消融实验分析,结果见上表。从中可以看到:
- 移除任意一个分之都会导致性能的下降,这意味每个分支都很重要;
- 从训练高效角度出发, 1 × 1 , 1 × 1 − A V G 1\times 1, 1\times 1-AVG 1×1,1×1−AVG会是一个不错的选择;
- 相比多个同尺寸卷积的并行,多分支、不同尺寸、不同模式的DBB设计可以取得更佳的性能提升。这意味着:特征表达能力的提升不仅源自参数量,同时还与分之特征的灵活性有关。
最后的最后,我们附上几个DBB的变种,见下图,注:这几种变种的性能均不及前述DBB结构。
全文到此结束,更多消融实验与分析建议各位同学查看原文。