【Paper Reading】AdderNet: DoWe Really Need Multiplications in Deep Learning?

2020 CVPR
北大 华为

paper:https://arxiv.org/abs/1912.13200
code:https://github.com/huawei-noah/AdderNet

摘要

与廉价的加法运算相比,乘法运算具有更高的计算复杂度。在深度神经网络中被广泛使用的卷积使用互相关来度量输入特征与卷积滤波器之间的相似性,这涉及到浮点值之间的大量乘法。本文提出的AdderNets中,将滤波器与输入特性之间的L1距离作为输出响应。使用L1距离来度量神经网络中特征和滤波器之间的相关性。由于L1距离中只包含加法和减法,神经网络中大量的乘法运算可以被替换为加法和减法,从而大大减少了神经网络的计算代价。此外,文章设计了带有自适应学习率的改进的梯度计算方案,以确保滤波器的优化速度和更好的网络收敛。在CIFAR和ImageNet数据集上的结果表明AdderNet可以在分类任务上取得和CNN相似的准确率。

1 引言

深度卷积神经网络在计算机视觉任务中有着广泛的应用。然而由于神经网络常常具有较大的计算量,其无法被直接应用在例如手机、无人车等移动设备上。于是,如何压缩神经网络使得他们可以被应用在资源受限的设备上已成为研究的热点。

【Paper Reading】AdderNet: DoWe Really Need Multiplications in Deep Learning?
上图展示了加法和乘法在45nm元器件上的运算代价,可以看到,乘法的运算代价大大高于加法。然而现有的深度卷积神经网络包含着大量的乘法运算,带来了极大的运算代价。实际上,CNN中的卷积运算是计算特征和卷积核之间的互相关性。卷积被作为看作是从视觉数据中提取特征的默认操作,以往的工作引入各种方法来加速卷积。但是,几乎没有研究者尝试用另一种更有效的相似性度来量代替卷积。由于加法的计算复杂度比乘法低得多,因此本文研究卷积神经网络中用加法代替乘法的可行性。

2 实现方法

2.1 加法器网络

卷积神经网络的计算,神经网络的卷积核F(d * d * cin * cout),输入特征X(H * W * cin),则输出特征Y为:
【Paper Reading】AdderNet: DoWe Really Need Multiplications in Deep Learning?
其中S()是一种相似度度量函数,当使用互相关作为距离度量时,S(x,y)=x和y的卷积,事实上,除了互相关以外,还有很多其他的度量函数可以提取滤波器和输入特征之间的关系,但是,大部分的度量函数都包含乘法,因此带来了大量的计算代价。
因此,文章使用一种只具有加法的度量函数,即L1距离,来代替卷积神经网络中的卷积计算。通过使用L1距离,输出的特征可以被重新计算为:
【Paper Reading】AdderNet: DoWe Really Need Multiplications in Deep Learning?
L1距离代替欧氏距离。L1距离是求两点之间坐标差值的绝对值之和,因此全程不涉及乘法。
【Paper Reading】AdderNet: DoWe Really Need Multiplications in Deep Learning?
由于卷积操作是计算两个向量的内积,两个向量的相关性越大,卷积的结果越大,所以在卷积神经网络,提取的特征的二维可视化,特征的聚类为相似性的聚类,不同角度的分布。L1距离是求两点之间坐标差值的绝对值之和,是一种坐标上距离的度量,特征的二维分布为空间位置上的不同,下图为作者特征的可视化的结果:
【Paper Reading】AdderNet: DoWe Really Need Multiplications in Deep Learning?

2.2 参数优化方法

网络使用反向传播来计算参数的梯度,再通过梯度下降来对网络中的参数进行优化。在Adder Net中,输出特征Y对滤波器F的偏导数为:
【Paper Reading】AdderNet: DoWe Really Need Multiplications in Deep Learning?
可以看到,偏导数的输出结果为+1,0或-1,仅有三个值的输出,不能很好的反应输入特征X和滤波器F之间的距离关系,也不利于滤波器的优化。计算导数,采用计算L2范数的梯度来计算:
【Paper Reading】AdderNet: DoWe Really Need Multiplications in Deep Learning?
使用改进方式计算的梯度更能表达输入特征和滤波器之间的距离大小关系,也更加有利于梯度的优化。由于使用改进梯度计算出的结果的量级可能大于1,如果不对X进行截断,多层的反向传播会使得改进梯度的量级和真实梯度的量级有着很大的累计误差,导致梯度爆炸。在对输入特征X求偏导数时,对其进行截断:
【Paper Reading】AdderNet: DoWe Really Need Multiplications in Deep Learning?

2.3 自适应学习率的调整

在传统CNN中,我们常常希望每一层之间的输出分布相似,使得网络的计算更加稳定,考虑输出特征的方差,假设X和F都为均值0的标准正态分布,在CNN中的方差为:
【Paper Reading】AdderNet: DoWe Really Need Multiplications in Deep Learning?
传统的CNN中,对卷积核F给定一个很小的方差作为初始化通过使F的反差为d2cin,输出特征Y的方差可以被控制为和输入特征X相似。
在AdderNet中,输出特征的方差被计算为:
【Paper Reading】AdderNet: DoWe Really Need Multiplications in Deep Learning?
无法给定一个F的方差使得输出特征的方差维持不变,于是输出特征的量级会大大的高于输入的特征,如果不对其进行归一化,将会导致输出的数量级随着网络的深度爆炸。
传统的CNN中,使用批归一化来控制每层的特征量级的相似,给定训练批次B ={x1、x2……},BN的输出为:

【Paper Reading】AdderNet: DoWe Really Need Multiplications in Deep Learning?
BN层的梯度被计算为:
【Paper Reading】AdderNet: DoWe Really Need Multiplications in Deep Learning?
由于AdderNet的方差很大,计算出的偏导数的量级会很小,于是,AdderNet对滤波器的梯度将会变的很小。表1展示了不同层L2范数的梯度的大小,AdderNet远小于CNN。
【Paper Reading】AdderNet: DoWe Really Need Multiplications in Deep Learning?
采用一个自适应的学习率:
【Paper Reading】AdderNet: DoWe Really Need Multiplications in Deep Learning?
γ是全局学习率,α是第l层的局部的学习率,▲L是第l层的梯度。
由于AdderNet计算的是特征和滤波器之间的减法,它们的量级大小应该相似从而有利于特征的提取,由于每层的特征都进行了归一化,其量级都近似一样,所以每层的滤波器的量级也应该相似。基于此考虑,我们将每层的学习率计算为:
【Paper Reading】AdderNet: DoWe Really Need Multiplications in Deep Learning?
K为Fl中元素的个数,η是超参。
从而整个参数的优化过程如下:
【Paper Reading】AdderNet: DoWe Really Need Multiplications in Deep Learning?

3 实验

3.1 分类精度

【Paper Reading】AdderNet: DoWe Really Need Multiplications in Deep Learning?

【Paper Reading】AdderNet: DoWe Really Need Multiplications in Deep Learning?

4 结论

在基准数据集上的实验表明,加法器网络可以在几乎没有乘法的情况下取得和相同结构CNN几乎一样的准确率,提出了一种新的网络的训练方法。由于没有通过量化,网络的表达能力核CNN一样,是很强的,不像二值化网络的表达能力很弱,所以其模型的准确度比现有的最好的二值化网络要高。但是其浮点数的加法计算复杂度相比二值化的位运算计算复杂度还是很高。作者在项目主页中说,由于AdderNet是用加法过滤器实现的,因此推理速度较慢,需要用CUDA编写才能提高速度。这与作者希望提高神经网络运算速度的初衷还有一段距离,但确实提出了一种神经网络的新的思路。