AdderNet是北大和华为诺亚方舟实验室共同完成的一篇文章,被CVPR2020收录为Oral representation.
1 Introduction
深度神经网络中会使用大量的浮点数乘法运算,这些运算可以在GPU上进行提速并在多个计算机视觉领域取得了进步。但是GPU的高功率消耗使得一些算法无法应用在移动端。并且,虽然GPU只占用很小的卡片体积,但是它还需要很多额外支撑的硬件。因此,本文研究的是可以使用在移动端设备上的神经网络结构。
加减乘除是四种基本运算,并且加法比乘法速度更快。但是,目前深度神经网络中大量的运算是乘法运算。因此,目前的一个研究方向是对网络进行二值化,这样可以将乘法变成累加的运算,如BinaryConnect是对权值进行二值化,BNNs还对CNN中的激活值进行了归一化,Rastergari等对二值网络的优化进行了改进。
二值化网络可以减少计算消耗,但是也会牺牲性能,并且训练的过程不稳定,收敛速度较慢。为了解决这个问题,本文作者分析了CNN中的卷积运算,发现该运算实际上就是计算输入和滤波器权重的相似性。因此,本文主要研究了使用加法运算替代卷积运算中乘法运算的可行性。
这篇文章提出AdderNet,最大限度地使用加法运算替代卷积运算。首先,文章提出使用
l
1
l_1
l1距离度量输入和滤波器权重之间的相似性,
l
1
l_1
l1距离使用了加法运算(实际上是减法,但减法就是加上被减数的反码),因此该方法可以更有效率地构建神经网络。其次,针对
l
1
l_1
l1距离的计算方法,本文还提出了一种基于正则化梯度的反向传播算法,该算法可以保证参数的充分更新。再次,本文根据正则化梯度的特性,提出了自适应的学习率缩放策略,该策略可以加快网络的收敛速度。最后,AdderNet在多个数据集上均加快了推理速度,并且取得了和传统CNN相近的性能。
本文的贡献如下:(1)提出了
l
1
l_1
l1距离相似度度量替代卷积操作中的乘法相似度度量,这样可以使用加法替代大部分乘法操作,降低了计算资源的消耗。(2)提出了基于正则化梯度的反向传播算法和自适应的学习率缩放策略,这样可以加快网络收敛速度。(3)多个数据集的实验结果表明,AdderNet可以在保证性能的前提下,加快推理速度。
2 Methods
AdderNet的具体算法流程如Algorithm 1所示。
2.1 Adder Networks
对于输入
X
X
X和卷积滤波器
F
F
F,传统的卷积操作如式KaTeX parse error: Undefined control sequence: \eqref at position 1: \̲e̲q̲r̲e̲f̲{eq1}:
Y
(
m
,
n
,
t
)
=
∑
i
=
0
d
∑
j
=
0
d
∑
k
=
0
c
i
n
S
(
X
(
m
+
i
,
n
+
j
,
k
)
−
F
(
i
,
j
,
k
,
t
)
)
(1)
Y\left ( m,n,t\right )=\sum_{i=0}^{d}\sum_{j=0}^{d}\sum_{k=0}^{c_{in}}S\left ( X\left ( m+i,n+j,k\right )-F\left ( i,j,k,t\right )\right ) \tag{1}
Y(m,n,t)=i=0∑dj=0∑dk=0∑cinS(X(m+i,n+j,k)−F(i,j,k,t))(1)
式中,
S
S
S代表
X
X
X和
F
F
F之间的相似性度量。传统卷积相似性度量包含了乘法操作,作者提出用
l
1
l_1
l1距离度量相似性,具体方法如式(2),这样可以实现使用加法运算替代乘法运算。
Y
(
m
,
n
,
t
)
=
−
∑
i
=
0
d
∑
j
=
0
d
∑
k
=
0
c
i
n
∣
X
(
m
+
i
,
n
+
j
,
k
)
−
F
(
i
,
j
,
k
,
t
)
∣
(2)
Y\left ( m,n,t\right )=-\sum_{i=0}^{d}\sum_{j=0}^{d}\sum_{k=0}^{c_{in}}\left | X\left ( m+i,n+j,k\right )-F\left ( i,j,k,t\right )\right | \tag{2}
Y(m,n,t)=−i=0∑dj=0∑dk=0∑cin∣X(m+i,n+j,k)−F(i,j,k,t)∣(2)
式中的相似性度量计算结果都是负数,因此结果需要使用BN进行归一化,再使用激活函数提高特征非线性。
2.2 梯度回传
式(2)中输出
Y
Y
Y相对于滤波器
F
F
F的偏导数如式(3):
∂
Y
(
m
,
n
,
t
)
∂
F
(
i
,
j
,
k
,
y
)
=
s
g
n
(
X
(
m
+
i
,
n
+
j
,
k
)
−
F
(
i
,
j
,
k
,
t
)
)
(3)
\frac{\partial Y\left ( m,n,t\right )}{\partial F\left(i,j,k,y\right)}=sgn\left(X\left(m+i,n+j,k\right)-F\left(i,j,k,t\right)\right) \tag{3}
∂F(i,j,k,y)∂Y(m,n,t)=sgn(X(m+i,n+j,k)−F(i,j,k,t))(3)
式中sgn()代表符号函数,因此偏微分仅能取值
+
1
,
0
,
−
1
+1, 0, -1
+1,0,−1,这样的优化经常无法找到梯度下降最陡的方向,使得优化过程不稳定。因此,作者提出了全精度(full-precision)的梯度回传,即去掉外层的sgn函数。
另外,作者还发现输入
X
X
X的梯度对参数更新也很有用。由于
Y
Y
Y对于
X
X
X的偏导还会影响前面的层参数变化,因此产生的梯度值需要在[-1, 1]范围内进行截断,计算公式如下:
∂
Y
(
m
,
n
,
t
)
∂
X
(
m
+
i
,
n
+
j
,
k
)
=
H
T
(
F
(
i
,
j
,
k
,
t
)
−
X
(
m
+
i
,
n
+
j
,
k
)
)
(4)
\frac{\partial Y\left ( m,n,t\right )}{\partial X\left(m+i,n+j,k\right)}=HT\left(F\left(i,j,k,t\right) - X\left(m+i,n+j,k\right)\right) \tag{4}
∂X(m+i,n+j,k)∂Y(m,n,t)=HT(F(i,j,k,t)−X(m+i,n+j,k))(4)
其中,HT()代表HardTanh函数:
H
T
(
x
)
=
{
x
,
i
f
−
1
<
x
<
1
,
1
,
x
>
1
,
−
1
,
x
<
−
1.
HT\left ( x\right )=\left\{\begin{matrix} x, if -1 < x < 1,\\ 1, x > 1, \\ -1, x < -1. \end{matrix}\right.
HT(x)=⎩⎨⎧x,if−1<x<1,1,x>1,−1,x<−1.
2.3 自适应的学习率缩放
作者分别列出了传统CNN和AdderNet之间的方差表达式(5)和(6):
V
a
r
[
Y
C
N
N
]
=
∑
i
=
0
d
∑
j
=
0
d
∑
k
=
0
c
i
n
V
a
r
[
X
×
F
]
=
d
2
c
i
n
V
a
r
[
X
]
V
a
r
[
F
]
(5)
Var\left [ Y_{CNN}\right ]=\sum_{i=0}^{d}\sum_{j=0}^{d}\sum_{k=0}^{c_{in}}Var\left [ X \times F\right ] = d^2c_{in}Var\left[X\right]Var\left[F\right] \tag{5}
Var[YCNN]=i=0∑dj=0∑dk=0∑cinVar[X×F]=d2cinVar[X]Var[F](5)
V
a
r
[
Y
A
d
d
e
r
N
e
t
]
=
∑
i
=
0
d
∑
j
=
0
d
∑
k
=
0
c
i
n
V
a
r
[
∣
X
−
F
∣
]
=
(
1
−
2
π
)
d
2
c
i
n
(
V
a
r
[
X
]
+
V
a
r
[
F
]
)
(6)
Var\left [ Y_{AdderNet}\right ]=\sum_{i=0}^{d}\sum_{j=0}^{d}\sum_{k=0}^{c_{in}}Var\left [ \left |X-F\right|\right ] = (1-\frac{2}{\pi})d^2c_{in}\left(Var\left[X\right]+Var\left[F\right]\right) \tag{6}
Var[YAdderNet]=i=0∑dj=0∑dk=0∑cinVar[∣X−F∣]=(1−π2)d2cin(Var[X]+Var[F])(6)
通常实践中,网络权重的方差值
V
a
r
(
F
)
Var(F)
Var(F)较小。因此,相比较于式(5)中
V
a
r
(
X
)
×
V
a
r
(
F
)
Var(X) \times Var(F)
Var(X)×Var(F),AdderNet中的
V
a
r
(
X
)
+
V
a
r
(
F
)
Var(X) + Var(F)
Var(X)+Var(F)会带来更大的方差。
2.1节中提到,为了解决
l
1
l_1
l1距离相似性度量是负数的问题,AdderNet引入了BN操作。因此,loss对于输入
x
i
x_i
xi的求导如式(7):
∂
l
∂
x
i
=
∑
j
=
1
m
γ
m
2
σ
B
{
∂
l
∂
y
i
−
∂
l
∂
y
j
[
1
+
(
x
i
−
x
j
)
(
x
j
−
μ
B
)
σ
B
]
}
(7)
\frac{\partial l}{\partial x_i}=\sum_{j=1}^{m}\frac{\gamma}{m^2\sigma _B}\left\{\frac{\partial l}{\partial y_i} - \frac{\partial l}{\partial y_j}\left[1+\frac{\left (x_i-x_j\right)\left(x_j-\mu_B\right)}{\sigma_B}\right]\right \} \tag{7}
∂xi∂l=j=1∑mm2σBγ{∂yi∂l−∂yj∂l[1+σB(xi−xj)(xj−μB)]}(7)
结合式(5)~(7)可知,当Var(X)较大时,loss对于x的求导较小。根据链式法则,对于前面一层的滤波器参数的导数也就越小,具体 结果如Table1所示。
上述分析的结果表明AdderNet需要更大的学习率。由于网络中不同层的梯度大小不同,作者认为每一层都需要设定适合自身的学习率。因此,作者提出了自适应学习率缩放,对于第
l
l
l层的学习率计算如式(8):
Δ
F
l
=
γ
×
α
l
×
Δ
L
(
F
l
)
(8)
\Delta F_l=\gamma \times \alpha_l \times \Delta L\left(F_l\right) \tag{8}
ΔFl=γ×αl×ΔL(Fl)(8)
式中,
γ
\gamma
γ是全局学习率,
Δ
L
(
F
l
)
\Delta L(F_l)
ΔL(Fl)是第
l
l
l层的梯度,
α
l
\alpha_l
αl是第
l
l
l层的局部学习率,它由第
l
l
l层元素个数和超参数
η
\eta
η决定,具体公式如式(9):
α
l
=
η
k
∥
Δ
L
(
F
l
)
∥
2
(9)
\alpha_l=\frac{\eta\sqrt{k}}{\left \| \Delta L\left(F_l\right)\right \|}_2 \tag{9}
αl=∥ΔL(Fl)∥ηk2(9)
3 Experiments
4 Q & A
- 这篇文章也并不是纯加法网络,还有BN层的加法需要优化
- 感觉文章结论部分的几幅图画的不是特别solid或者是我的水平不够,对于图2~4解释我都不是特别明了。图2作者是想证明CNN和AdderNet的中间层特征相似么?可是这么小分辨率这么模糊的特征图,怎么证明是相似的?图3是想说明什么呢?是想说明ALR方法的收敛速度更快吗?可是蓝色的ILR收敛更快啊?文中对于图3的说明似乎只是在说性能的问题,如果只是说性能,为啥要画个这么复杂的图呢?而且文中对于Loss的那幅图似乎并没有提及。图4列出了AdderNet和CNN的权重分布,这里想说明的意思是AdderNet的权重分布满足 l 1 l_1 l1范数对应的Laplace分布,而CNN更接近 l 2 l_2 l2范数对应的高斯分布吗?这张图的意义在哪里呢?
- 这篇文章的实验都是在CPU上做的,在GPU上的实验并没有给出结果,作者也说了CUDA和cuDNN的优化还没有结束。但是,这样总感觉似乎少了点什么。
- 暂时还没有公布预训练模型。
- 可以实验一下该方法移植到目标检测上的性能。