Binarized Neural Networks笔记

来源:互联网 发布:孢子mac中文版下载 编辑:程序博客网 时间:2024/06/04 19:07

如今DNN大多在一个或几个运行速度快,功耗大的GPU上训练,导致在特定的低功耗硬件上运行DNN成为挑战。大量研究致力于加快DNN在通用或专用硬件上运行时的速度。

注:本文主要参考http://blog.csdn.net/stdcoutzyx/article/details/50926174和http://blog.csdn.net/linmingan/article/details/51008830两篇博文

摘要:

提出训练BNN的方法,运行时二值化权重和激活值。训练时二值权重和激活值用作计算参数梯度。前向传播过程,BNN减少内存和访问,用位移操作替代多数计算操作。为了证实BNN的高效,用Torch7 和Theano框架上实施了两组实验,实验在MNIST, CIFAR-10 和SVHN 数据集上均取得不错的效果,并且提交了在ImageNet数据集上的初步结果。最后,写了一个二进制矩阵乘法GPU核,预计在运行MNIST BNN时比未经优化的核快七倍,并且保证其分类精度。需要储存全精度权重是训练中的计算瓶颈。

 

 文章贡献:

Ø  提出一种方法训练BNN,在运行时权重和激活值均二值化,训练时进行梯度计算,用Torch7 和 Theano框架做了实验,证明了可以在MNIST, CIFAR-10 和SVHN数据集上训练BNN,效果蛮不错。

Ø  证明了在前向传播过程,BNN极大地减少了内存消耗(大小和访问次数),用位移操作代替多数计算操作。而且二值化CNN导致卷积核的重复。文献认为在专用的硬件上可以减少60%的时间复杂度。

Ø  写了一个二进制矩阵乘法GPU核,预计在运行MNISTBNN时比未经优化的核快七倍,并且保证其分类精度。

 

 

二值化方式:

决定式的二值化:正数是1,负数是-1

 

随机式的二值化:对x计算一个概率p,当p大于一个阙值(计算机随机产生)时为+1,否则为-1


第二种方法虽然看起来比第一种更合理,但是在实现时却有一个问题,那就是每次生成随机数会非常耗时,所以除了在文献试验中训练时的一些激活值一般使用第一种方法。

 

 

梯度计算和累加

虽然BNN的参数和各层的激活值是二值化的,但由于两个原因,导致梯度不得不用较高精度的实数而不是二值进行存储。两个原因如下:

  1.  实值梯度的值的量级很小
  2. l梯度都带有一定的噪音,而噪音一般认为是服从正态分布的,需要多次累加梯度把噪音平均消耗掉。

二值化的权重和激活值给梯度的计算添加了噪声,而这样的噪声具有正则化作用,可以防止模型过拟合。所以,二值化也可以被看做是Dropout的一种变形,Dropout是将激活值的一半变成0,从而造成一定的稀疏性,而二值化则是将另一半变成1,从而可以看做是进一步的Dropout。

 

离散化梯度传播

Sign函数的梯度几乎处处为0,而且大量损失函数的精确梯度在离散化前就是0,纵使使用随机量化也无法进行反向传播。Bengio研究了通过随机离散神经元估计和传播梯度的问题,他通过实验发现通过使用“straight-through estimator”可以获得最快的训练。本文使用类似的方法,但使用考虑饱和效应的“straight-through estimator”,使用决定式的而不是随机的采样点。

 

(STE下周详细看)

假设,损失函数是C,二值化操作函数如下:


如果C对q求导已经得到了,那么C对r的求导计算公式如下:


其中1|r|<=1的计算公式就是Htanh。

 

优化技巧:

Shiftbased Batch Normalization

BatchNormalization,简称BN。所谓的BN是指在数据经过一层进入下一层之前,需要对数据进行归一化,使之均值为0,方差为1。这样可以使得各层的参数量级上没有太大的差别。

优点:

  • 加速训练;
  • 减小权重的值的尺度的影响;
  •  归一化所带来的噪声也有模型正则化的作用;

SBN用位移操作替代计算操作,在实验中未观测到精度损失。AP2(x)的作用是求与x最接近的2的幂次方,如AP2(3.14)=4,AP2(2.5)=2;而操作就是位移操作

 

 Shift based AdaMax 

一种改进学习算法,貌似是有随机梯度下降算法,用位移操作替代计算(具体文章以后再读)

 

第一层:

第一层的输入是8位二进制,权重和其他层输入均为一位。

第一层的计算操作如下:

 

n是每个8位二进制输入都取从右往左的第n位,还原原像素,相当于

 

由于第一层的乘法的耗费很小,作者并没有采用这个操作,而是直接用普通的乘法。


popcount计算一串二进制串1的个数,xnor(代码里面是xor)对两个二进制串按位取异或。

eg:

假设某一层隐藏层的激活向量二值化后a=[1,-1, 1, 1, -1],同时又有二值化后的权值W=[-1,1,1,-1,-1]。在程序中是以a=[1,0,1,1,0],W=[0,1,1,0,0]表示的。

正常乘法:

a1*w1+a2*w2+a3*w3+a4*w4+a5*w5=1*-1+-1*1+1*1+1*-1+-1*-1=-1

本文操作:

a^W=[1^0,0^1,1^1,1^0,0^0]=11010

Popcount(a^w)=3

-(2*Popcount(a^w)-5) = -1

5是a^W长度

 

性能分析

Ø  内存和计算耗能

相对于32位的DNN,BNN内存需求量减少为原来的1/32还少,使得能耗减少31/32。 

Ø  XNOR-Count

BNN中计算都变成位移操作,一个32位的乘法损耗200个单位,而一个位操作只损耗1个单位。

Ø  重复的核

    通过使用专用的软硬件,可以在每个特征图上使用不同的2D核并求和达到3D核卷积的效果,因此可以减少XNOR-popcount操作的数量。

 

实现优化

·        对于位操作而言,可以使用SWAR中的SIMD并行化指令来进行加速。即将32个二值化变量存储在一个32位的寄存器中,从而获得32倍的加速。

·        神经网络的传播过程中,可以使用SWAR技术来使用3个指令计算32个Connection,如下,从而原先32个时间单元的事情现在(accumulation,popcount,xnor)=1+4+1=6个单元就可以完成,提升5.3倍 

为了验证上述理论,实现了两个GPU计算核,一个是没有优化的乘法(baseline),一个是使用上面公式的SWAR技术实现的(XNOR)。结果:

 

 

 

相关工作

直到最近,低精度网络被认为无法保证精度。

Soudry et al. (2014) and Cheng etal. (2015)证明所有的神经元和权重二值化后也可以取得不错的表现,采用EBP(一种变分方法),在权重上更新后验分布的二值网络,这些分布更新是通过反向传播算法区分其参数来实现。Esser et al. (2015)使用和EBP相似的方法实现了全二值网络,展示出了极大的性能改进,缺点是只在inference二值化参数。EBP后的概率思想在Binary Connect算法中拓展,实值权重被储存用作二值化过程的依据,二值化带来的噪声在不同的权重之间是独立的。这些噪声由于神经元之间的加权对下一个神经元的输入影响不大,因此,实值可以在反向传播的过程中通过忽略二值化带来的噪声被更新。

Courbariauxet al.(2015)使用这种方法第一次二值化了CNN的权重,并在几个数据集上取得了不错的效果,但仍然保留全精度的神经元。

Lin et al. (2015)通过量化表示每一层网络把Courbariauxet al. (2015)的工作完善到反向传播,将神经元的值限制为二值以用位移操作代替计算,但在测试时仍然使用全精度权重,而且只在反向传播过程中量化神经元。

Baldassi et al. (2015)证明在一组带有随机输入的committeemachines实现全二值训练和测试的可能性,其中只有一层权重可调整。Gong et al. (2014)尝试使用量化或矩阵分解方法压缩一个全精度网络。这些用全精度的权重和神经元训练网络的方法需要大量MAC操作,而BNN不需要。Hwang & Sung (2014)着眼于定点神经网络的设计,与浮点框架表现几乎一致。Kim & Smaragdis (2016) 重训练了二值权重和激活值的网络。

 


 

阅读全文
0 0
原创粉丝点击