[CVPR2020] AdderNet阅读笔记

AdderNet是北大和华为诺亚方舟实验室共同完成的一篇文章,被CVPR2020收录为Oral representation.

1 Introduction

  深度神经网络中会使用大量的浮点数乘法运算,这些运算可以在GPU上进行提速并在多个计算机视觉领域取得了进步。但是GPU的高功率消耗使得一些算法无法应用在移动端。并且,虽然GPU只占用很小的卡片体积,但是它还需要很多额外支撑的硬件。因此,本文研究的是可以使用在移动端设备上的神经网络结构。
  加减乘除是四种基本运算,并且加法比乘法速度更快。但是,目前深度神经网络中大量的运算是乘法运算。因此,目前的一个研究方向是对网络进行二值化,这样可以将乘法变成累加的运算,如BinaryConnect是对权值进行二值化,BNNs还对CNN中的**值进行了归一化,Rastergari等对二值网络的优化进行了改进。
  二值化网络可以减少计算消耗,但是也会牺牲性能,并且训练的过程不稳定,收敛速度较慢。为了解决这个问题,本文作者分析了CNN中的卷积运算,发现该运算实际上就是计算输入和滤波器权重的相似性。因此,本文主要研究了使用加法运算替代卷积运算中乘法运算的可行性。
  这篇文章提出AdderNet,最大限度地使用加法运算替代卷积运算。首先,文章提出使用l1l_1距离度量输入和滤波器权重之间的相似性,l1l_1距离使用了加法运算(实际上是减法,但减法就是加上被减数的反码),因此该方法可以更有效率地构建神经网络。其次,针对l1l_1距离的计算方法,本文还提出了一种基于正则化梯度的反向传播算法,该算法可以保证参数的充分更新。再次,本文根据正则化梯度的特性,提出了自适应的学习率缩放策略,该策略可以加快网络的收敛速度。最后,AdderNet在多个数据集上均加快了推理速度,并且取得了和传统CNN相近的性能。
  本文的贡献如下:(1)提出了l1l_1距离相似度度量替代卷积操作中的乘法相似度度量,这样可以使用加法替代大部分乘法操作,降低了计算资源的消耗。(2)提出了基于正则化梯度的反向传播算法和自适应的学习率缩放策略,这样可以加快网络收敛速度。(3)多个数据集的实验结果表明,AdderNet可以在保证性能的前提下,加快推理速度。

2 Methods

  AdderNet的具体算法流程如Algorithm 1所示。
[CVPR2020] AdderNet阅读笔记

2.1 Adder Networks

   对于输入XX和卷积滤波器FF,传统的卷积操作如式KaTeX parse error: Undefined control sequence: \eqref at position 1: \̲e̲q̲r̲e̲f̲{eq1}
Y(m,n,t)=i=0dj=0dk=0cinS(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}
式中,SS代表XXFF之间的相似性度量。传统卷积相似性度量包含了乘法操作,作者提出用l1l_1距离度量相似性,具体方法如式(2),这样可以实现使用加法运算替代乘法运算。
Y(m,n,t)=i=0dj=0dk=0cinX(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}
式中的相似性度量计算结果都是负数,因此结果需要使用BN进行归一化,再使用**函数提高特征非线性。

2.2 梯度回传

  式(2)中输出YY相对于滤波器FF的偏导数如式(3):
Y(m,n,t)F(i,j,k,y)=sgn(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}
式中sgn()代表符号函数,因此偏微分仅能取值+1,0,1+1, 0, -1,这样的优化经常无法找到梯度下降最陡的方向,使得优化过程不稳定。因此,作者提出了全精度(full-precision)的梯度回传,即去掉外层的sgn函数。
  另外,作者还发现输入XX的梯度对参数更新也很有用。由于YY对于XX的偏导还会影响前面的层参数变化,因此产生的梯度值需要在[-1, 1]范围内进行截断,计算公式如下:
Y(m,n,t)X(m+i,n+j,k)=HT(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}
其中,HT()代表HardTanh函数:
HT(x)={x,if1<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.

2.3 自适应的学习率缩放

   作者分别列出了传统CNN和AdderNet之间的方差表达式(5)和(6):
Var[YCNN]=i=0dj=0dk=0cinVar[X×F]=d2cinVar[X]Var[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[YAdderNet]=i=0dj=0dk=0cinVar[XF]=(12π)d2cin(Var[X]+Var[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(F)Var(F)较小。因此,相比较于式(5)中Var(X)×Var(F)Var(X) \times Var(F),AdderNet中的Var(X)+Var(F)Var(X) + Var(F)会带来更大的方差。
   2.1节中提到,为了解决l1l_1距离相似性度量是负数的问题,AdderNet引入了BN操作。因此,loss对于输入xix_i的求导如式(7):
lxi=j=1mγm2σB{lyilyj[1+(xixj)(xjμ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}
结合式(5)~(7)可知,当Var(X)较大时,loss对于x的求导较小。根据链式法则,对于前面一层的滤波器参数的导数也就越小,具体 结果如Table1所示。
[CVPR2020] AdderNet阅读笔记
  上述分析的结果表明AdderNet需要更大的学习率。由于网络中不同层的梯度大小不同,作者认为每一层都需要设定适合自身的学习率。因此,作者提出了自适应学习率缩放,对于第ll层的学习率计算如式(8):
ΔFl=γ×αl×ΔL(Fl)(8) \Delta F_l=\gamma \times \alpha_l \times \Delta L\left(F_l\right) \tag{8}
式中,γ\gamma是全局学习率,ΔL(Fl)\Delta L(F_l)是第ll层的梯度,αl\alpha_l是第ll层的局部学习率,它由第ll层元素个数和超参数η\eta决定,具体公式如式(9):
αl=ηkΔL(Fl)2(9) \alpha_l=\frac{\eta\sqrt{k}}{\left \| \Delta L\left(F_l\right)\right \|}_2 \tag{9}

3 Experiments

[CVPR2020] AdderNet阅读笔记
[CVPR2020] AdderNet阅读笔记

4 Q & A

  1. 这篇文章也并不是纯加法网络,还有BN层的加法需要优化
  2. 感觉文章结论部分的几幅图画的不是特别solid或者是我的水平不够,对于图2~4解释我都不是特别明了。图2作者是想证明CNN和AdderNet的中间层特征相似么?可是这么小分辨率这么模糊的特征图,怎么证明是相似的?图3是想说明什么呢?是想说明ALR方法的收敛速度更快吗?可是蓝色的ILR收敛更快啊?文中对于图3的说明似乎只是在说性能的问题,如果只是说性能,为啥要画个这么复杂的图呢?而且文中对于Loss的那幅图似乎并没有提及。图4列出了AdderNet和CNN的权重分布,这里想说明的意思是AdderNet的权重分布满足l1l_1范数对应的Laplace分布,而CNN更接近l2l_2范数对应的高斯分布吗?这张图的意义在哪里呢?
  3. 这篇文章的实验都是在CPU上做的,在GPU上的实验并没有给出结果,作者也说了CUDA和cuDNN的优化还没有结束。但是,这样总感觉似乎少了点什么。
  4. 暂时还没有公布预训练模型。
  5. 可以实验一下该方法移植到目标检测上的性能。