量化神经网络:QNN论文阅读笔记

论文:《Quantized Neural Networks: Training Neural Networks with Low Precision Weights and Activations》

连接:https://arxiv.org/pdf/1609.07061v1.pdf

 

摘要

    我们介绍一种训练量化神经网络(QNN)的方法,在运行时具有极低精度(例如1bit)权重和激活的神经网络。在训练时期,量化的权重和激活值被用于计算参数梯度在前向传递期间,QNN大大减少了内存大小和访问,并用按位运算代替了大多数算术运算。结果,预期功耗将大大降低。我们通过MNIST,CIFAR-10,SVHN和ImageNet数据集训练了QNN。由此产生的QNN可以达到与32-bit同类网络相当的预测精度。例如,我们的AlexNet量化版本具有1-bit权重和2-bit激活,可实现51%的top-1准确性。此外,我们还将参数梯度量化为6-bit,这使得仅使用按位运算就可以进行梯度计算。在Penn Treebank数据集上对量化的递归神经网络进行了测试,并仅使用4-bit就获得了与32-bit相当的准确性。最后但并非最不重要的一点是,我们对二进制矩阵乘法GPU内核进行了编程,与未优化的GPU内核相比,使用它可以使MNIST QNN的运行速度快7倍,而不会降低分类精度。 QNN代码已开源。

1,引言

    深度神经网络(DNN)在很多任务上都大大推动了人工智能(AI)的局限,包括但不限于从图像中识别目标,语音识别,统计机器翻译,Atari和Go游戏,甚至计算机生成的抽象艺术。

    由于计算神经元输入的加权求和需要大量的乘法累加运算(MAC),因此在常规通用数字硬件(冯·诺依曼体系结构)上进行训练,甚至仅使用神经网络(NN)算法,效率极低 。 如今,DNN几乎只接受一个或多个非常快速且耗电的图形处理单元(GPU)的训练(Coates等,2013)。 结果,在目标低功率设备上运行DNN常常是一个挑战,并且投入了大量的研究工作来加速DNN在通用在和专用两种计算机硬件上的运行速度。

    最常见的方法是压缩经过训练的(全精度)网络。 HashedNets(Chen et al。,2015)通过使用哈希函数将连接权重随机分组并强制它们共享单个参数值来减小模型大小、 龚等,(2014年)使用矢量量化压缩深层卷积,仅导致1%的精度损失。 但是,这两种方法都只关注全连接层。 Han和Dally(2015)的最新工作成功修剪了几个最先进的大规模网络,并显示参数数量可以减少一个数量级。

    最近的工作表明,可以通过在训练阶段对一些参数进行量化来构建计算效率更高的DNN。在大多数情况下,使用反向传播(BP)或相关的梯度下降方法通过最小化某些误差函数来训练DNN。但是,如果将权重限制为二进制值,则无法直接应用这种方法。 Soudry等。 Soudry(2014年)使用均值场和中心极值近似的变分贝叶斯方法来计算权重的后验分布(每个权重的概率为+1或-1)。在推论阶段(测试阶段),他们的方法从该分布中抽取一个二进制网络样本,并将其用于预测测试集的目标(也可以使用多个二进制网络)。 Courbariaux等(2015b)类似地使用了两组权重,即真实值和二进制。但是,他们通过使用通过对二进制权重集(通过将实数值权重量化为+1和-1而获得)进行正向和反向传播而计算出的梯度,来更新权重的实际值版本。

    本文究提出了一种更先进的技术,称为量化神经网络(QNN)用于在推理和训练过程中量化神经元和权重在这样的网络中,所有的MAC操作都可以用XNOR和population 计数(即,以二进制数计算一个的数目)来代替。 这对于精度极低的QNN尤其有用。 例如,每个权重和激活仅使用1-bit,则为二进制神经网络(BNN)。 所提出的方法对于实现神经元权重比例非常大的大型卷积网络特别有利。

    本文的主要贡献如下:
    •我们介绍了一种训练量化神经网络的方法,在运行时以及在训练时计算参数梯度时,神经网络具有低精度的权重和激活值。在极端情况下,QNN每个权重和激活仅使用1-bit(即Binarized NN;请参见第2节)。

    •我们进行了两组实验,每组实验都在不同的框架(即Torch7和Theano)上实施,这表明可以在MNIST,CIFAR-10和SVHN上训练BNN,并获得接近start-of-the-art的结果(请参见 第4节)。 此外,我们使用二进制权重/激活及其量化版本(大于1-bit)报告具有挑战性的ImageNet数据集的结果。

    •我们提出了有关量化梯度的初步结果,并表明仅使用6-bit,而精度下降很小。

    •我们使用语言模型(原始RNN和LSTM)展示了Penn Treebank数据集的结果,并显示了具有4-bit权重和激活的循环QNN与32-bit浮点版本具有相似的精度。

    •我们表明,在前向遍历(运行时和训练时)中,QNN大大减少了内存消耗(大小和访问次数),并用按位运算代替了大多数算术运算。 结果,有望大大提高能源效率(请参阅第5节)。 而且,二值化的CNN可以导致二进制卷积核的重复。 我们认为专用硬件可以将时间复杂度降低60%。

    •最后但并非最不重要的一点是,我们对二进制矩阵乘法GPU内核进行了编程,使用它可以使MNIST BNN的运行速度比未优化的GPU内核快7倍,而不会损失分类精度(请参见第6节)。

    •我们的BNN的训练代码可以在线获得(Theano 1和Torch框架2)

2. 二值化神经网络

    在本节中,我们将详细介绍二值化函数,展示如何使用它来计算参数梯度,以及如何反向传播。

2.1 确定性和随机性二值化

    在训练BNN时,我们将权重和激活都限制为+1或-1。 正如我们在第6节中所述,从硬件角度来看,这两个值非常有优势。为了将实值变量转换为这两个值,我们使用了两个不同的二值化函数,如Courbariaux等人所提出的。 (2015a)。 第一个二值化函数是确定性的:

 

    其中  是二值化变量(权重或激活),而 x 是实数值变量。 它非常容易实现,并且在实践中效果很好。 第二个二值化函数是随机的:

    其中σ是“hard Sigmoid”函数:

    从理论上讲,这种随机二值化比符号函数更具吸引力(请参见第4节),但由于在量化时需要硬件生成随机位,因此实现起来有些困难(Torii等,2016)。 结果,除了我们在某些实验中在训练时激活外,我们大多使用确定性二值化函数(即符号函数)。

2.2 梯度计算和累加

    尽管我们的BNN训练方法利用二进制权重和激活来计算参数梯度,但是权重的实际值梯度会根据算法1累积在实值变量中。随机梯度下降(SGD)可能需要实值权重才能 工作。 SGD会以较小且具有噪声的步长探索参数的空间,并通过每个权重中积累的随机梯度贡献来平均噪声。 因此,重要的是要为这些累加器保持足够的分辨率,乍一看这表明绝对需要高精度。

此外,在计算参数梯度时向权重和激活添加噪声提供了一种正则化,可以帮助更好地泛化,如先前使用可变权重噪声(Graves,2011),Dropout(Srivastava et al。,2014)和DropConnect( Wan等,2013)。 我们训练BNN的方法可以看作是Dropout的一种变体,其中,在计算参数梯度时,我们将激活和权重二值化,而不是将激活的一半随机设置为零。

2.3 梯度离散传播

    符号函数的导数几乎在任何地方都为零,这显然与反向传播不兼容,因为相对于离散化之前(预激活或权重)量化确切梯度的代价为零。 注意,即使使用随机量化,此限制仍然存在。 Bengio(2013)研究了通过随机离散神经元估计或传播梯度的问题。 他发现,使用直通估计器可以获得最快的训练,“先前在Hinton的讲座中介绍过(Hinton,2012)。我们采用类似的方法,但使用考虑到饱和度的直通估计器版本效果,并且确实使用确定性而非随机采样的bit。考虑符号函数量:

    并假定已经获得了梯度的估计量(在需要时使用直通估计器)。 然后,梯度的直通估计器的就是:

 
    注意,这会保留梯度信息,并在 r 太大时取消梯度。 当 r 太大时不取消梯度会明显降低性能。 为了更好地理解直通估计器为何运作良好,请考虑方程(2)中的随机二值化方案。 并重写,其中是众所周知的“hard tanh“ 函数,

   

在这种情况下,下一层的输入具有以下形式:

    这里我们使用的期望实事是:是对 的表示 (请参见等式(2)和(5)),并将定义为均值等于零的二值化噪声。 当层很宽时,我们希望确定性平均项占主导地位,因为噪声项  是来自上一层中所有神经元的许多独立二值化的总和。 因此,我们认为在反向传播阶段进行微分时可以忽略二值化噪声 。 因此,我们将(无法计算)替换为:

    这正是公式(4)中定义的直通估算器。 算法1中说明了这种直接估算器的用法。

    •按照算法1将每个实值权重投影到[-1,1],即在训练过程中裁剪权重。否则,实值权重会很大,而对二进制权重没有任何影响。
    •使用权重时,使用对其进行量化。 
    根据等式(4),将权重投影到[-1,1]与j时的梯度消除一致。 

2.4 基于移位的Batch Normalization

    Batch Noemalization(BN)(Ioffe and Szegedy,2015)加快了训练速度并减轻了权重缩放的总体影响(Courbariaux等人,2015a)。normalization过程还可以帮助规范模型。但是,在训练时,BN需要进行许多乘法运算(计算标准差并除以标准差,即除以运行方差,即运行集激活方差的加权平均值)。尽管缩放计算的次数与神经元的数目相同,但对于ConvNets,此数目非常大。例如,在CIFAR-10数据集(使用我们的结构)中,仅由128×3×3个filters组成的第一卷积层将尺寸为3×32×32的图像转换为尺寸为128×28×28的图像。比权重的数量大了两个数量级(准确地说是87.1)。为了获得BN可以获得的结果,我们使用了算法2中介绍的基于移位的批处理归一化(SBN)技术。SBN几乎无需乘法即可近似BN。定义为 z 的近似2的幂(即最高有效位(MSB)的索引),并定义<<>>为左和右二进制移位。 SBN用2的乘方幂近似和移位运算代替了几乎所有乘法:


    唯一不是二进制移位或加法的运算是反平方根运算(即平方根的倒数)(请参见归一化运算法则2)。 从Lomont(2003)的早期工作中我们知道,平方反比运算的运算复杂度与乘法运算大致相同。 还有一些更快速的方法,这些方法通常涉及查表技巧,这些技巧通常会降低准确性(这可能不是问题,因为我们的过程已经增加了很多噪音)。 但是,我们应用反平方运算的值的数量相当少,因为它是在计算方差之后进行的,即在求平均值之后进行的(有关更精确的计算,请参见Lin et al。(2015b )。此外,标准偏差向量的大小相对较小,例如,这些值仅占我们在Cifar-10网络的实验中,使用0.3%的网络大小(即可学习参数的数量)。

    在实验中,我们发现使用基于位移的BN算法而不是原始BN算法时,准确性没有损失。

2.5 基于移位的AdaMax

    ADAM学习方法(Kingma和Ba,2014b)还减少了权重尺度的影响。 由于ADAM需要许多乘法运算,因此我们建议改用算法3中概述的基于位移的AdaMax。在实验中,我们观察到,使用基于位移的AdaMax算法而不是原始的ADAM算法时,精度没有损失。

2.6 第一层

    在BNN中,在所有计算中仅使用权重和激活的二值化值。 由于当前层的输出是下一层的输入,因此除第一层外,所有层的输入均为二进制。 但是,我们认为这不是主要问题。 首先,在计算机视觉中,输入表示通常比内部表示(例如512)具有少得多的通道(例如,红色,绿色和蓝色)。 因此,就参数和计算而言,ConvNet的第一层通常是最小的卷积层(Szegedy等,2014)。 其次,以m-bits精度将连续值输入作为定点数来处理相对容易。 例如,在8-bit定点输入的常见情况如下:

    其中 x 是1024个8-bit输入的向量, 是第一个输入的最高有效位,是1024个1-bit权重的向量,而 s 是结果加权和。 此方法在算法4中使用。

    算法1训练BNN。 C是最mini-batch的代价函数,λ是学习率衰减因子,L是层数。 (◦)代表逐元素乘法。 函数Binarize(·)指定如何(随机或确定性)对激活和权重进行二值化,以及Clip()如何限制权重。 BatchNorm()指定如何使用Batch Normalization(Ioffe和Szegedy,2015)或其在算法2中描述的基于移位的变种对激活进行Batch Normalization。BackBatchNorm()指定如何通过归一化进行反向传播。 Update()指定使用ADAM(Kingma和Ba,2014b)或我们在算法3中描述的基于位移的AdaMax来在已知其梯度时更新参数。

 

    算法2:基于移位的Batch Normalization变换,在mini-batch上用于激活x。 是2的近似幂,并且<<>>代表左右二进制移位。

    算法3:基于移位的AdaMax学习规则(Kingma and Ba,2014b)。 表示元素的平方。 好的默认设置为。 向量上的所有操作都是按元素进行的。 对于,我们将表示为幂 t。

2.6 第一层

3. 量化后的神经网络-高于1-bit

    观察式 (8),我们可以看到使用2-bit激活仅会使我们运行XnorPopCount内核所需的次数增加一倍(即,与激活位宽成正比)。 Zhou等人最近提出了这个想法。(在我们的初步技术报告发布后不久在arXive上发布)。 但是,与Zhou等人相反,我们发现用通过训练具有全精度权重的网络获得的权重初始化网络不是有用的。 此外,周等, 网络没有量化第一个卷积层和最后一个完全连接层的权重,而我们将两者进行了二值化。 我们遵循了Miyashita等人提出的量化方案。 (2016),即线性量化:

    其中minV和maxV分别是最小和最大尺度范围。 如第2.4节所述,其中是x的近似2的幂。 在我们的实验(在第4节中详细介绍)中,我们将上述量化方案应用于权重,激活和梯度,并在更具挑战性的ImageNet数据集上进行了测试。

4. 基准结果

4.1 MNIST,SVHN和CIFAR-10上的结果

    我们执行了两组实验,每组实验都基于不同的框架,即Torch7和Theano。 除了框架之外,两组实验非常相似:
    •在这两组实验中,我们都使用MNIST,CIFAR-10和SVHN基准数据集上的BNN获得了近乎state-of-the-art的结果。
    •在我们的Torch7实验中,在训练时激活是随机二值化的,而在我们的Theano实验中,是确定性二值化的。
    •在我们的Torch7实验中,我们使用基于移位的BN和AdaMax变体,在算法2和算法3中对此进行了详细说明,而在Theano实验中,我们使用了原始的BN和ADAM。

    结果报告在表1中。实施细节报告在附录A中。

    MNIST是图像分类基准数据集(LeCun等,1998)。 它由60K的训练集和10K的28×28灰度图像的测试集组成,代表从0到9的数字。我们在MNIST上训练的多层感知器(MLP)包含3个隐藏层。 在Theano实现中,我们使用大小为4096的隐藏层,而在Torch实现中,我们使用的大小为2048小得多。这种差异说明了两种实现之间的精度差距。

    CIFAR-10 CIFAR-10是图像分类基准数据集。 它由大小为50K的训练集和大小为10K的测试集组成,其中实例为32×32彩色图像,分别表示飞机,汽车,鸟类,猫,鹿,狗,青蛙,马,船和卡车。 两种实现都具有与附录A中所述相同的结构。由于Torch的实现使用了随机二值化,因此取得了更好的效果。

    SVHN 街景门牌号码(SVHN)也是图像分类基准数据集。 它由大小为604K的示例训练集和大小为26K的测试集组成,其中实例为32×32彩色图像,表示从0到9的数字。这里,我们再次通过使用随机二值化方案对性能进行了小幅改进。

    表1:在MNIST(全连接结构),CIFAR-10和SVHN(convnet)上训练的DNN的分类测试错误率。 没有使用非监督的预训练或数据扩充。
 

   图1:CIFAR-10数据集上不同方法的训练曲线。 虚线表示培训损失(平方hinge loss),而虚线表示相应的验证错误率。 尽管BNN的训练速度较慢,但其准确性几乎与32位浮点DNN一样。

4.2 ImageNet上的结果

    为了测试我们方法的强度,我们将其应用于具有挑战性的ImageNet分类任务,这可能是最重要的分类基准数据集。它由大小为1.2M的样本训练集和大小为50K的测试集组成。每个实例都标记有1000种类别之一,包括目标,动物,场景,甚至某些抽象形状。在ImageNet上,习惯性地报告两个错误率:top-1和top-5,其中top-x错误率是测试图像中未正确标记不在模型认为最可能的x标签中的部分。在保持高精度的同时,有关压缩ImageNet体系结构的研究也很多。先前的方法包括使用矩阵分解技术(Zhang等,2015)将权重接近零(Gong等,2014; Han等,2015a),使用共享权重量化权重(Gupta等,2015)。 (Chen et al。,2015)和霍夫曼编码(Han et al。,2015a)等。

    据我们所知,在arXive上发表该论文的第一版之前,还没有人报道过成功量化网络激活的信息。相反,最近的一项工作(Han等人,2015a)表明,当尝试对低于4-bit的卷积层权重进行量化时,精度会大大降低(FC层对量化的鲁棒性更高,仅使用2-bit就可以很好地工作) 。在当前的工作中,我们试图解决将权重和激活二值化的艰巨任务。我们采用著名的AlexNet和GoogleNet架构,运用我们的技术,并使用AlexNet分别达到41.8%的top-1和67.1%的top-5准确性,以及使用GoogleNe的47.1%top-1和69.1%的top-5t准确性。尽管这些性能结果留有改进的余地(相对于全精度网络),但它们比以前使用小于4-bit精度的权重压缩ImageNet架构的所有尝试要好得多。此外,在实现二值化神经元激活的同时实现了这一优势。

4.3 扩大“hard tanh”边界

    我们发现,训练网络后,扩大“hard tanh”边界并重新训练网络非常有用,如第2.3节所述,直通估计器(可以写为“hard tanh”)消除了神经元绝对值高于1的梯度 。因此,在最后一次训练迭代中,大多数梯度值均为零,权重值停止更新。 通过扩大“hard tanh”边界,我们允许更多的梯度在反向传播阶段流动,并使用原始BNN在AlexNet拓扑上将top-1精度提高1.5%。

4.4 2-bit激活

    在ImageNet数据集上训练BNN时,我们注意到我们不能强迫训练集错误率收敛到零。实际上,训练错误率与验证错误率相当接近。该观察结果使我们研究了更灵活的激活量化(大于1-bit)。如表2所示,结果非常令人印象深刻,并说明了仅使用1-bit权重和2-bit激活,相对于浮点表示,性能(top-1精度)下降了大约5:6%。继宫下等。 (2016年),我们还尝试对梯度进行量化,发现只有对数量化有效。使用6-bit梯度,我们实现了46.8%的衰减。这些结果目前是最好的,超过了通过DoReFa网络获得的结果(Zhou等人,2016)。与DoReFa相反,我们使用确定性的量化过程,而不是随机的过程。此外,重要的是要注意,在量化梯度时,DoReFa在mini-batch处理中为每个实例分配其自己的缩放因子,这会增加MAC操作的数量。

表2:经过ImageNet 1000分类任务训练的AlexNet模型的分类测试错误率。 没有使用非监督的预训练或数据增强。

     尽管可以很容易地压缩AlexNet,但由于参数数量少,因此压缩GoogleNet困难得多(压缩小网络比较难)。 当使用原始BNN时,我们发现top-1个结果有很大的下降。 但是,通过使用具有4-bit权重和激活的QNN,我们能够实现66.5%的top-1精度(与32-bit浮点架构相比,性能仅下降5.5%)。 GoogleNet上最新的压缩结果。 此外,通过使用具有6-bit权重,激活和梯度的QNN,我们达到了66.4%的top-1精度。 附录A.6中报告了我们实验的完整实施细节。

表3:GoogleNet模型在ImageNet 1000分类任务上训练的的分类测试错误率。 没有使用非监督的预训练或数据增强。

4.5 语言模型

    与前馈网络相比,递归神经网络(RNN)对内存和计算能力的要求很高。 Hochreiter和Schmidhuber(1997)引入的长期短期记忆网络(LSTM)有各种各样的递归模型,它们是最受欢迎的模型。 LSTM是一种特殊的RNN,能够使用独特的门控机制来学习长期依赖关系。最近,Ott等人。 (2016年)尝试使用第2节中所述的类似技术对RNN权重矩阵进行量化。他们发现,权重二值化方法不适用于RNN。但是,通过使用2-bit(即-1, 0, 1),它们已经能够在多个数据集上实现相似甚至更高的精度。在这里,我们通过尝试在Penn Treebank数据集上评估训练的量化递归模型的准确性来报告量化权重和激活的首次尝试。宾夕法尼亚州树库语料库(Marcus等,1993)包含10K个唯一单词。我们遵循与(Mikolov and Zweig,2012)中相同的设置,这导致训练集产生18.55K个单词,验证集和测试集中分别产生14.5K和16K个单词。我们对原始RNN和LSTM进行了实验。对于我们的普通RNN模型,我们使用大小为2048和ReLU的一个隐藏层作为激活函数。对于我们的LSTM模型,我们使用1个大小为300的隐藏层。我们的RNN实现被构造为预测下一个字符,因此使用每字符位数(BPC)度量标准来衡量性能。在LSTM模型中,我们试图预测下一个单词,因此使用每个单词的困惑度(PPW)度量标准来衡量性能。与(Ott等人,2016)相似,我们的初步结果表明,权重矩阵的二值化会导致较大的精度下降。但是,如表4所示,通过4-bit激活和权重,我们可以获得与32-bit浮点对应物相似的精度。

表4:语言模型在Penn Treebank数据集上的结果。 FP代表32位浮点

5.正向传递过程中的高功率效率

    表5:乘积的能源消耗; 参见霍洛维兹(2014)

    表6:内存访问的能耗; 参见霍洛维兹(2014)

    第一层和最后一层没有二值化(即使用32位精度权重和激活)

    图2:从第一层卷积采样的二进制权重filter。 由于我们只有个唯一的2D filters(其中k是filter大小),因此filter重复非常高。 例如,在我们的CIFAR-10 ConvNet上,只有42%的filter是唯一的。

    内存大小和访问  提高计算性能一直是并且仍然是一个挑战。 在过去十年中,功率一直是性能的主要限制因素(Horowitz,2014年)。 这就是为什么要致力于减少神经网络能耗的大量研究工作的原因。 Horowitz(2014)提供了计算消耗的能量的粗略数字(给定的数字是针对45nm技术),如表5和6所示。重要的是,我们可以看到,内存访问通常比算术运算消耗更多的能量,而内存访问成本随内存大小而增加。 与32-bitDNN相比,BNN需要32倍小的内存大小和32倍更少的内存访问。 预计这将大大降低能耗(即,降低32倍以上)。

    XNOR-Count 应用DNN主要涉及卷积和矩阵乘法。 因此,深度学习的关键算术运算是乘法累加运算。 人工神经元基本上是乘法累加器,用于计算其输入的加权和。 在BNN中,激活和权重都被限制为-1或+1。 结果,大多数32-bit浮点乘法累加被1-bitXNOR-count操作代替。 这可能会对专用深度学习硬件产生重大影响。 例如,一个32-bit浮点乘法器的成本约为200 Xilinx FPGA Slice(Govindu等人,2004; Beauchamp等人,2006),而1-bitXNOR门仅需花费一个slice。

    当使用具有二进制权重的ConvNet体系结构时,唯一filter的数量受filter大小(size)的限制。例如,在我们的实现中,我们使用大小为3×3的filter,因此唯一2Dfilter的最大数量为 2^9 =512。但是,这不应阻止将特征图的数量扩展到该数量之外,因为实际filter 是3D的矩阵。假设在第  卷积层中有个filters,我们必须存储大小为的4D权重矩阵。因此,唯一filter的数量为。必要时,我们在特征图上应用每个filter,并执行所需的乘法累加(MAC)操作(在我们的示例中,使用XNOR和popcount操作)。由于我们现在有了二进制filter,因此许多大小为 k×k 的2Dfilter会重复它们自己。通过使用专用的硬件/软件,我们只能在每个特征图上应用唯一的2D filter,并对结果求和以接收每个3D filter的卷积结果。注意,逆filter(即[-1, 1, -1]是[1, -1, 1]的逆)也可以视为重复;它只是原始滤波器乘以-1的乘积。例如,在经过CIFAR-10基准训练的ConvNet架构中,平均每层只有42%的唯一filter。因此,我们可以将XNOR-popcount操作的数量减少3。

    QNN的复杂度随每次权重/激活的位数(bits)线性增加,因为它需要多次使用XNOR内核(请参阅第3节)。 到目前为止,QNN仍提供最佳的压缩精度比。 此外,对梯度进行量化允许我们将XNOR内核用于反向传递,从而导致具有低位宽的完全定点层。 通过加快训练过程,QNN可以在未来的高功率任务中发挥重要作用。

6。 运行时在GPU上快7倍

    通过使用有时被称为寄存器(SWAR)内的SIMD(单指令,多个数据)的方法,可以加快QNN的GPU实现。 SWAR的基本思想是将32个二进制变量的组连接到32位寄存器中,从而在按位操作(例如XNOR)上获得32倍的加速。 使用SWAR,仅需3条指令就可以评估32个连接:

    其中  是结果加权和,而和  是串联的输入和权重。 在最近的Nvidia GPU上,这3条指令(累加,popcount,xnor)占用1 + 4 + 1 = 6个时钟周期(如果它们成为融合指令,则只需一个时钟周期)。 因此,我们获得的Nvidia GPU理论上的加速比为32 / 6 ≈ 5.3。 实际上,由于存储器带宽与计算的比率也增加了6倍,因此这种加速非常容易实现。

    为了验证这些理论结果,我们编写了两个GPU内核:
    •未经优化的矩阵乘法内核作为baseline。
    •XNOR内核,几乎与baseline相同,不同之处在于,它使用SWAR方法,如公式(11)所示。

    当两个GPU内核的输入被限制为-1或+1(但不是其他情况)时,它们将返回相同的输出。 如图3所示,XNOR内核比baseline内核快23倍,比cuBLAS快3.4倍,最后但同样重要的是,第4节中的MLP在XNOR内核下的运行速度比baseline内核快7倍,而没有遭受分类准确性的损失(见图3)。 由于MNIST的图像不是二进制图像,因此第一层的计算始终由baseline内核执行。 最后三列显示MLP准确性不取决于使用哪个内核。

    图3:前三列显示了在GTX750 Nvidia GPU上执行8192×8192×8192(二进制)矩阵乘法所花费的时间,具体取决于所使用的内核。 接下来的三列显示了在完整的MNIST测试集上运行第3节中的MLP所花费的时间。 最后三列显示MLP accuracy 不依赖内核

7. 讨论和相关工作

    直到最近,人们仍认为使用极低精度的网络(在极端情况下为二进制)会大大降低网络性能(Courbariaux等人,2014)。 Soudry等。 (2014)和Cheng等。 (2015年)通过证明即使所有神经元和权重被二值化为±1也可以实现良好的性能,证明了相反的结果。 这是通过使用期望反向传播(EBP)(一种变型贝叶斯方法)完成的,该方法通过更新权重的后验分布来推断具有二元权重和神经元的网络。 这些分布通过反向传播(BP)算法通过区分其参数(例如平均值)来更新。 Esser等。 (2015年)使用非常类似于EBP的方法在运行时实施了一个完全二进制的网络,显示了能源效率的显着提高。 EBP的缺点是二值化参数仅在推断期间使用。

    EBP背后的概率思想在Courbariaux等人的BinaryConnect算法中得到了扩展。 (2015a)。在BinaryConnect中,权重的实值版本被保存,并用作二值化过程的关键参考。二值化噪声在不同权重之间是独立的,无论是通过构造(通过使用随机量化)还是通过假设(通常是简化的方法;请参见Spang和Schultheiss,1962)。噪声对下一个神经元的输入几乎没有影响,因为该输入是许多加权神经元的总和。因此,可以通过简单地忽略更新中的二值化噪声,使用反向传播误差来更新实值版本。用这种方法,Courbariaux等。 (2015a)是第一个将CNN权重二值化的人,并且在几个数据集上都取得了近乎最新的性能。他们还认为,噪声权重提供了一种正则化形式化,这可能有助于提高泛化性,如Wan等以前的研究表明。 (2013)。该方法将权重二值化,同时仍保持完全精确的神经元。

   Lin等,继承了Courbariaux等人的工作,通过量化网络每一层的表示进行反向传播过程,通过将神经元的值限制为2的整数次幂,将剩余的一些乘法转换为二进制移位。 Lin等。 的工作和我们的工作似乎具有相似的特征。但是,他们的方法在测试阶段继续使用全精度权重。 此外,林等。 (2015a)仅在反向传播过程中量化神经元,而不在正向传播过程中量化。

    其他研究(Baldassi等人,2015)表明,在具有随机输入的一系列机器中,可以进行完整的二进制训练和测试,其中仅调整一个权重层。 龚等, (2014年)旨在通过使用量化或矩阵分解方法来压缩经过充分训练的高精度网络。 这些方法需要使用完全精确的权重和神经元训练网络,因此需要进行大量的MAC操作(所提出的QNN算法避免了此操作)。 Hwang和Sung(2014)专注于定点神经网络设计,并实现了几乎与浮点架构相同的性能。 Kim和Smaragdis(2016)用二进制权重和激活重新训练了神经网络。

    据我们所知,在arXive上发表该论文的第一版之前,在深度网络的推理阶段和整个训练阶段,都没有成功地对权重和神经元进行二值化。这是在当前工作中实现的。我们依赖于二值化可以随机完成,也可以近似为随机噪声的想法。以前是由Courbariaux等人为权重完成的。 (2015a),但我们的BNN将其扩展到激活。请注意,二进制激活对于ConvNets特别重要,因为ConvNets中的神经元通常多于自由权重。这样就可以在运行时以及训练过程中的正向传播阶段高效地对二值化DNN进行操作。而且,我们的训练方法几乎没有乘法,因此可以在专用硬件中有效地实现。但是,我们必须保存全精度权重的值这是训练过程中仍然存在的计算瓶颈,因为这是一项耗能的操作。

    在arXiv上发布了第一版论文后不久,几篇论文试图对其进行改进和扩展。 Rastegari等。 (2016年)对我们的算法进行了小修改(即将二进制权重和输入乘以L1范数),并在ImageNet数据集上发布了可喜的结果。请注意,他们的名为Xnor-Net的方法需要为每个样本中的每个patch额外乘以不同的比例因子(Rastegari等,2016)3.2等式。 10和图2)。这本身需要进行许多乘法运算,并且妨碍了XnorNet在已知硬件设计上的有效实现。此外,(Rastegari等人,2016年)没有对第一层和最后一层进行量化,因此XNOR-Net只是部分二值化的NN。 Miyashita等。 (2016年)建议对权重和激活都采用更宽松的量化(大于1-bit)。他们的想法是量化两者并像我们的等式中那样使用移位运算。 (4)。他们提出以非均匀的,以2为底的对数表示来量化参数。这个想法是受以下事实启发的:训练好的网络中的权重和激活自然具有不均匀的分布。他们还表明,他们还可以将梯度量化为6-bit,而不会显着降低性能(在Cifar-10数据集上)。 (2016年)对ImageNet数据集应用了类似的想法,并表明通过使用1-bit权重,2-bit激活和6-bit梯度,他们可以使用AlexNet体系结构实现46.1%的top-1精度。他们将此方法命名为DoReFa net。在这里,我们优于DoReFa网络,使用1-2-6 bit量化方案(权重,激活,梯度)达到46.8%,使用1-2-32量化方案达到51%。这些结果证实,即使多次使用Xnor内核,我们也可以在大型数据集上取得可比的结果。 Merolla等。 (2016年)表明,DNN不仅可以实现权重二值化,还可以提供更强大的功能。他们对权重应用了几种不同的对比,包括加性和乘性噪声以及一类非线性投影,这被证明可以提高对其他失真的鲁棒性甚至提高结果。 Zheng和Tang尝试将我们的二值化方案应用于递归神经网络进行语言建模,并取得了可比的结果。安德里(Andri)等人。 (2016)甚至创建了硬件实现来加速BNN。

结论

    我们已经引入了BNN,它可以对深度神经网络进行二值化处理,从而可以显着提高功耗和计算速度。 在正向传递过程中(在运行时和训练时),BNN都会大大减少内存大小和访问量,并用按位运算代替大多数算术运算。 我们的估计表明,电源效率可以提高一个以上的数量级(请参阅第5节)。 在速度方面,我们对二进制矩阵乘法GPU内核进行了编程,该内核使MNIST datset上运行MLP的速度提高了7倍(比未优化的GPU内核快),而没有任何精度损失(请参阅第6节)。

    我们已经证明,BNN可以处理MNIST,CIFAR-10和SVHN,同时达到近乎state-of-the-art的准确性。 尽管我们针对具有挑战性的ImageNet的结果不能与使用全精度网络获得的最佳结果相提并论,但它们显着改善了以前所有压缩ImageNet功能架构的尝试。 此外,通过将权重和激活量化到1-bit以上(即QNN),我们已经能够获得与32位浮点架构相当的结果(请参见第4.4节和补充材料-附录B)。 一个主要的开放研究途径将是进一步改善我们在ImageNet上的结果。 在此方向上取得实质性进展可能对促进DNN在手机等低功率仪器中的可用性大有帮助。
 

 

 

 


 

 

 

  • 7
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Cirq是Google开发的一个用于量子计算的Python库,它提供了一种方便的方式来构建、操作和优化量子电路。Cirq还支持构建量子神经网络QNN),这是一种使用量子计算来执行机器学习任务的方法。以下是一个简单的Cirq量子神经网络的例子: ```python import cirq import numpy as np # 定义一个简单的量子神经网络 qubits = [cirq.GridQubit(0, i) for i in range(3)] circuit = cirq.Circuit( cirq.H(qubits[0]), cirq.CNOT(qubits[0], qubits[1]), cirq.CNOT(qubits[1], qubits[2]), cirq.rx(np.pi/4).on_each(qubits) ) # 定义一个量子神经网络层 class QNNLayer(cirq.Gate): def __init__(self, theta): super().__init__() self.theta = theta def _num_qubits_(self): return 3 def _unitary_(self): return np.array([ [np.cos(self.theta/2), -1j*np.sin(self.theta/2), 0, 0, 0, 0, 0, 0], [-1j*np.sin(self.theta/2), np.cos(self.theta/2), 0, 0, 0, 0, 0, 0], [0, 0, np.cos(self.theta/2), -1j*np.sin(self.theta/2), 0, 0, 0, 0], [0, 0, -1j*np.sin(self.theta/2), np.cos(self.theta/2), 0, 0, 0, 0], [0, 0, 0, 0, np.cos(self.theta/2), -1j*np.sin(self.theta/2), 0, 0], [0, 0, 0, 0, -1j*np.sin(self.theta/2), np.cos(self.theta/2), 0, 0], [0, 0, 0, 0, 0, 0, np.cos(self.theta/2), -1j*np.sin(self.theta/2)], [0, 0, 0, 0, 0, 0, -1j*np.sin(self.theta/2), np.cos(self.theta/2)] ]) # 将量子神经网络层添加到电路中 circuit.append(QNNLayer(np.pi/2)(qubits)) # 打印电路 print(circuit) # 在模拟器上运行电路 simulator = cirq.Simulator() result = simulator.simulate(circuit) # 打印结果 print(result) ``` 该例子定义了一个简单的量子神经网络,其中包含一个Hadamard门和两个CNOT门,然后添加了一个自定义的量子神经网络层。最后,使用Cirq模拟器运行电路并打印结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值