作者‖ flow
前言
本文针对当下深度学习模型太大的问题进行了技术改进,首次提出了XNOR-Net的概念。文章提出二值网络的两个版本,Binary-Weight-Network及XNOR-Net,可以通过二值化神经网络的技术方法,对网络规模进行压缩,节省32倍的存储空间,进而使神经网络在便携设备上运行成为可能。并且由于浮点数权重被二值化,运算得到了约58倍的速度加成,这使得网络在CPU上的实时运行成为可能。
值得一提的是,该篇文章的创作团队于2017年在美国西雅图成立了AI公司XNOR.AI,并得到了微软联合创始人Paul Allen个人的种子轮投资。代码开源,值得大家学习下。
论文信息及当前被引量: Rastegari M, Ordonez V, Redmon J, et al. Xnor-net: Imagenet classification using binary convolutional neural networks[C]//European conference on computer vision. Springer, Cham, 2016: 525-542.
【当前被引:3646】
1. 概述
在本文中,有:
- 文章提出了二值网络的两个版本,分别叫Binary-Weight-Network以及XNOR-Net。其中,XNOR-Net的输入以及卷积核的参数都是二值的,Binary-Weight-Network只有卷积核的参数是二值的;
- 该方法相对于之前的SOTA来说,最大的改变有两个,一个是提出了尺度因子,再一个是改变了CNN基础block的顺序;
- 对卷积进行近似的二值表达,使得文章所提的网络有在CPU上跑实时的潜力;
- 首次尝试在大数据集上进行二值网络的评估,具体为ImageNet分类任务。在该任务中,AlexNet的Binary-Weight-Network版本几乎不掉点;
- 相对于SOTA代表BinaryConnect以及BinaryNets,文章所提出的方法在ImageNet上的top1指标高出它们16个点;
2. 二值卷积神经网络
不妨设L层的CNN架构为,是一系列tensor的集合,对于中的每一个元素,表示第层网络的输入,如Fig. 1中的绿色三维体所示。也是一系列tensor的集合,但其中的每一个元素表示,表示第层的第个权重,则是第层的卷积核的个数。表示与之间的卷积操作,在该文章中,假设卷积操作不包含偏置。具体地,,而。
文章提供二值CNN的两个变种,分别为:
- Binary-weights: 中的元素为二值;
- XNOR-Networks: 与都是二值。
2.1 Binary-Weight-Networks
为了使得Binary-Weight-Networks能够拥有二值的权重,文章首先通过一个二值滤波器,以及一个尺度因子估计出浮点数的权重,使得,进而,卷积操作可以近似为:
其中,表示不使用任何矩阵乘法的卷积操作。
不妨使用表示有二值权重的CNN,其中表示一系列的二值,表示一系列正的浮点数的标量,进而,表示二值的卷积核,则为所谓的尺度因子,且有。
2.1.1 二值权重估计
我们现在假设,均为的向量,其中。
我们希望,约等式的两边尽可能地相等,换成数学表达,即为求解下式的最优解:
对上式进行展开,有:
由于, 为一个常数。此外,由于是已知的变量,因此的结果同样也是一个常数,我们不妨假设。进而,式(3)可以被改写为:
有了式(4)后,我们如何调整,使得整体式子的值最小呢?由于为正值,为常数,因此我们可以通过最大化以下的约束优化问题,即:
上式的调整是比较好解决的,因为只能是或者,所以我们直接在时令,反之则令。简洁一点讲,求解最佳的方式就是。
至于最佳的尺度因子的估计,我们可以求对的偏导,并将该结果设为0,即:
将上式中的替换成,则有:
即,最优的尺度因子就是权重绝对值的平均值。
2.1.2 二值权重网络的训练
CNN的一次训练基本包含三个步骤,即前向推理,反向传播,参数更新。
为了训练一个权重为二值的CNN,我们仅仅在前向推理与反向传播的时候对二值进行传播。为了计算符号函数的梯度,我们遵循Denil等(2013)的方法,即,经过尺度矫正后的函数在反向传播时的梯度计算为:
至于参数的更新,由于梯度下降的程度往往是微小的,因此我们使用高精度的浮点数的权值对参数进行更新。Denil等(2013)以及Courbariaux等(2015)同样也采用了这样的训练策略,具体见以下算法:
该算法具体地描述了如何使用二值权重对CNN进行训练。首先,我们通过计算和对卷积核进行二值化。其次,我们使用二值化的权重及其对应的尺度因子进行前向传播。再次,我们通过计算卷积核的梯度进行反向传播的调用。最后,进行参数以及学习率的更新。
一旦网络训练结束,就不必要留着浮点数的权重,因为我们的前向推理只需要二值的权重。
2.2 XNOR-Networks
尽管我们现在找到了二值权重以及尺度因子的估计方式,进而尽可能地模拟真实的浮点数权重。但输入卷积网络的值仍然是实数的。如果我们能够使得输入也是二值的,那么整个网络就可以变得更加的高效,仅仅使用一些和的操作就可以完成网络的推理。
基于这样的思想,我们进一步地将输入也为二值的网络称之为网络。为了限制一个卷积网络既有二值的权重,又有二值的输入,我们需要在卷积操作的每一步中都强制进行二值操作。卷积本身包括了重复的位移操作以及点积。如果我们将点积表达为二值操作的形式,那么卷积就可以近似地变成一种二值操作。
在两个二值向量之间的点积可以使用-的方式进行等效替代。
在这一小节中,将会介绍如何通过两个取值为的向量之间的点乘来近似两个在空间的向量的点乘。
其次,将介绍如何使用这样的近似方式来估计两个之间的卷积操作。
2.2.1 二值点积
为了能够近似之间的点积,我们使得约等式的两边尽可能的相等,其中,,且。这也就相当于求解以下的优化式:
其中,表示逐点的乘法,我们定义:
- ,其中
- ,其中
- ,且
进而,可以将式(9)改写为:
而在式(2)中,我们可以知道:
由于以及都是独立的,且,那么自然有:
进而有:
2.2.2 二值卷积
对于卷积核,以及输入tensor,需要对中的每一个子tensor(大小与卷积核一致)都计算对应的尺度因子。在下图中的第二行,用以及示意了两个子tensor。由于子tensor之间的重叠,对所有可能的子tensor进行尺度因子的计算的时候将会导致大量的冗余计算。
针对该问题,首先,文章计算了矩阵,物理含义为输入中跨通道的元素的绝对值的平均值。然后,我们对矩阵进行2D的卷积,2D核的表达为。
包含了所有的子tensor的尺度因子,对应了子tensor中心位置在的对应尺度因子。
该过程如下图的第三行所示:
一旦我们得到了对应于权重的尺度因子以及对应于所有子tensor的尺度因子,我们就可以使用二值操作来近似地估计输入以及卷积核权重 之间的卷积操作,具体为:
其中,$XNORbitcount$的卷积操作。该操作的示意图可见上图中的最后一行。
2.2.3 训练网络
对于CNN来说,典型的block包括:卷积、BN、激活、池化,如Fig3. 中的左图所示。
实际上在二进制输入上进行池化,会导致严重的信息丢失,因此,我们将池化层放在卷积的后面。为了进一步减少二值化所引入的信息损失,我们在进行二值化之前对输入进行归一化,这样的好处是使得数据尽可能地保持零均值,进而减少量化误差。二值化CNN的block如下图中的右图所示。
二值激活层计算以及符号函数。对于下一层来说,已经给定了以及,即可以计算二值卷积。最后一层,即层,则直接应用池化操作。此外,我们也可以在二值卷积后插入非线性的激活层,比如说。
一旦我们构建出基本的CNN架构后,就可以使用与二值权重网络训练一致的方式进行网络训练。
2.2.3.1 二值梯度
在反向传播过程中的计算瓶颈是:计算卷积核与输入的梯度之间的卷积。类似于前向传播过程中的二值化,我们也可以在反向传播过程中对进行二值化,这样的二值化会导致非常高效的训练过程。为了保持所有梯度下降时在所有维度上的最大变化,我们使用作为尺度因子。
2.2.3.2 k比特的量化
到目前为止,前面介绍的都是一比特的量化。其实这个过程可以很方便地推广至其他比特的量化的,只要将函数替换成:$q_{k}(x)=2\left(\frac{\left[\left(2{k}-1\right)\left(\frac{x+1}{2}\right)\right]}{2{k}-1}-\frac{1}{2}\right) [.]roundingx \in [-1,1]$。
3. 实验
3.1 效率分析
在一个标准卷积中,总操作次数为,其中为通道数,, 。
值得注意的是,一些现代的cpu可以将乘法和加法融合为单个循环操作。在这些cpu上,二进制权重网络不能提供速度提升。
文章所提出的网络的二值近似有个二进制运算和个非二进制运算。在现在的CPU中,我们可以在一个CPU时钟时间内中执行64个二进制运算,因此加速的倍数可以通过该式进行计算:
显然,加速与通道数以及卷积核的大小有关系,与输入的尺寸没有关系。
在Fig4中的(b)和©中,为不同数量的通道以及卷积核尺寸输入所带来的加速比的区别。当对一个参数进行改变的时候,我们修正了其他的参数为: (对于ResNet来说,大多数的卷积都是这样的参数)。
使用这种卷积的近似结构,理论上能够获得62.27倍的加速,实际上考虑到内存分配还有访存的一些时间消耗,真正在一个卷积操作中得到的加速倍数为58倍。
对于比较小的通道()以及比较小的卷积核大小来说,加速没有那么好。这使得我们不由地想到,对于第一层和最后一层,是不是没有必要进行二值化。第一层的通道数通常是3,而最后一层的卷积核大小通常是1 * 1 。在BNN(Courbariaux等, 2016)中,也采用了类似的策略。
在Fig 4(a)中,表示了对于AlexNet、VGG-19、ResNet-18三种CNN的网络结构分别进行二值量化所需要的内存占用与不进行量化所需要的内存占用的对比。显然,Binary-weight-networks非常非常的小,可以轻易的适应便携式设备。在Fig 4中,给出了二值卷积的计算效率以及内存占用的分析。这样的分析也适用于BNN(Courbariaux等, 2016)和BinaryConnect(Courbariaux等,2015)。
而该文与之前方法的主要区别就在于使用了尺度因子,在不增加计算负担的前提下,大大地提高了精度。
3.2 影像分类任务
文章评估了二值化方法在图像分类任务上的性能。
当时,二值网络已经在比较小的数据集(如CIFAR-10、MNIST、SVHN)上给出了对应的评估结果。
为了与SOTA进行比较,文章首次在大型的数据集ImageNet (ILSVRC2012)上进行方法的评估。ImageNet有大约1.2 M的训练图像,其来自1K个类别,且有着50k张验证图像。与CIFAR和MNIST这些小数据集相比,ImageNet中的图像是分辨率较高的自然图像。
实验使用Top-1和Top-5来作为评估指标。
实验采用三种不同的CNN架构作为二值化的基本架构,分别是AlexNet(Krizhevsky 等, 2012)、ResNet(He等,2015)以及GoogLenet(Szegedy等,2015)的一个变体。
实验比较了文章所提出的二值权重网络(Binary-weight-network, 简称BWN)、BinarvConnect(简称BC)、文章所提出的XNOR-Networks(XNOR-Net)以及BinaryNeuralNet(简称BNN)这几个方法之间的性能。
BC在正向推理和反向传播过程中均使用二值权值训练深度神经网络。与文章所提出的方法类似,BC在参数更新步骤中保留了浮点数的权值。然而,文章所采用的二值化方法和BC不同。在BC中,二值化可以是确定性的,也可以是随机的,而在本对比实验中,对BC采用了确定性二值化的方式,因为随机二值化并非很有效,关于随机化二值化为什么不好用的原因,在BNN中是有所讨论的。
BNN是一种在推理时采用二值的权重与激活,且在训练的时候进行梯度计算的二值化方法。概念上来看,这是一种类似于XNOR-Network的方法,但BNN中的二值化方法和以及网络结构与XNOR-Net。其训练算法与BC类似,在评估时同样使用了确定性二值化。
3.2.1 CIFAR-10数据集结果
BC和BNN在CIFAR-10、MNIST、SVHN上的表现已经是SOTA了。
当BWN和XNOR-Net采用与BC和BNN相同的网络结构时,在CIFAR-10上的错误率分别为9.88%和10.17%。
在接下来的实验中,则探索了在一个更大、更具挑战性的数据集(ImageNet)上获得SOTA效果的可能性。
3.2.2 AlexNet
AlexNet有5个卷积层和2个全连接层。这个架构是第一个在ImageNet分类任务中体现CNN强大能力的架构。网络有约61 M个参数。
实验将AlexNet与BN层结合使用。
- 训练: 在每次迭代中,图像先沿着较短的边resize为256,然后再随机裁剪成224 x 224大小,作为训练图像。使用训练算法训练了共16轮,bs为512。实验使用输出的softmax上的负对数似然作为分类损失函数。
在AlexNet的复现中,没有使用Local-Response-Normalization (LRN) 层。用于更新BWN和BC参数的优化器采用了带动量的SGD,动量设为0.9。对于XNOR-Net和BNN,优化器采用ADAM ,因为ADAM收敛更快,而且对于二值的输入往往也能达到更好的精度。学习率调整策略为,从0.1开始,每隔4轮学习率衰减0.01。 - 推理结果:使用224 x224的图像进行前向推理。
Figure 5展示了在训练和推理时的top-1和top-5变化曲线:
虚线表示训练精度,实线表示验证精度。在所有轮,文章所提的方法都大大超过了BC和BNN(~17%)。下表将文章所提方法的最终精度与BC和BNN进行了比较:
表中可见,权重的尺度因子比输入的尺度因子似乎有效的多。
3.2.3 ResNet以及GoogleNet 变种
在ResNet与GoogleNet变种实验中,具体的训练细节与推理细节与AlexNet类似,详见原论文,在此仅贴出对比结果,具体见下图及下表:
3.3 消融实验
该方法与以往的二值化方法有两个关键的区别:
- 二值化技术;
- 二值化CNN中的block结构。
对于二值化,在每次训练迭代中找到最优的缩放因子。对于block结构,对其中的层进行了重排序,目的是减少训练XNOR-Net的量化损失。
在消融实验中,评估了这两个关键区别对二进制网络性能的影响:
- 不使用公式(7)计算缩放因子,直接将视为网络参数。换句话说,二进制卷积之后的层使用每个卷积核的标量参数乘以卷积的输出。这类似于在BN中计算仿射参数。表3a比较了二值网络中这两种计算比例因子的效果。
- 表3b比较了标准块结构C-B-A-P (卷积,BN ,激活,池化)和文章所采用的结构B-A-C-P(A为二值的激活)
4. 结论
本文介绍了一个简单、有效和精确的神经网络二值化的方式,这在理论上使得网络的规模减少了近32倍,进而提供了将神经网络加载到内存有限的便携设备的可能性。此外,文章所提出的XNOR-Net,其使用按位操作的方式来近似卷积,进而提供了约58倍的速度加成,这使得网络在CPU上的实时运行成为可能。