【论文阅读笔记】---二值神经网络(BNN)

       如今神经网络通常采用浮点计算,须要较大的存储空间和计算量,严重阻碍在移动端的应用。二值化神经网络以其高模型压缩率和快计算速度的潜在优点,近些年成为深度学习的热门研究方向。本文就是对《Binarized Neural Networks: Training Neural Networks with Weights and Activations Constrained to +1 or -1》的一些解读 。算法

        二值网络是将权值W隐藏层激活值二值化为1或者-1。经过二值化操做,使模型的参数占用更小的存储空间(内存消耗理论上减小为原来的1/32倍,从float32到1bit);同时利用位操做来代替网络中的乘加运算,大大下降了运算时间。因为二值网络只是将网络的参数和激活值二值化,并无改变网络的结构。所以咱们主要关注如何二值化,以及二值化后参数如何更新。同时关注一下如何利用二进制位操做实现GPU加速计算的。网络

     1  对于如何对浮点型的神经网络进行二值化,文章给出两种方法:
app

          第一种是基于符号函数Sign的肯定性(deterministic )方法,即大于0就为+1,小于0则为-1函数

        

          第二种是随机二值化(stochastic )方法,
性能

 

          随机二值化比符号函数更具吸引力,但难以实现,由于它须要硬件在产生随机比特,这比较难实施。因此论文中的实验用的是肯定性方法,即公式(1)学习

  1.2 梯度计算与累加测试

      虽然BNN训练方法使用二值化的权值和激活值来计算参数梯度梯度不得不用其高精度的实际值,由于随机梯度降低(SGD)计算的梯度值量级很小,并且在累加过程当中具备噪声,这种噪声是服从正态分布的,所以这种算子须要保持足够高的精度。此外,在计算梯度的时候给权值和激活值添加噪声具备正则化做用,能够防止过拟合。二值神经网络能够看作是Dropout的一种变形。atom

 1.3 离散化梯度传播spa

    已知二值化操做(即前向传播过程)以下:orm

                            

    符号函数sign的导数为零,显然进没法行反向传播运算。所以,在反传过程当中 须要对符号函数进行松弛求解

假设q的梯度为:                       

                                  =

       其中,C为损失函数,已知q的梯度,那么r的梯度,即C对r的求导公式以下:

                               

       其中 ,1|r|<=1  的计算公式为Htanh,这也是函数变得可求导的缘由,具体以下

               

   即当r的绝对值小于1时,r的梯度等于q的梯度,不然r的梯度为0。能够用下图表示


在具体的算法使用中,对于隐含层单元:

  • 激活值,直接使用决定式的二值化函数获得二值化的值。
  • 对于权重, 
    • 更新参数时,要把超出[-1,1]的部分给裁剪了。即权重参数始终在[-1,1]之间。
    • 使用参数是,要将参数进行二值

BNN的训练过程

 前传过程以下:

    

      首先将权重二值化,而后与前一层二值化后的激活值相乘,再进项BatchNormalization获得这一层的激活值ak 。因为BatchNorm的参数不是二值的,所以也不是二值,咱们须要再对它作二值化,获得二值化后的激活值

      反传过程当中,各层梯度计算方式以下:


   权重和激活值的更新并非二值的,由于若是这样作的话偏差会很大


梯度更新方式以下:


1.4 Shift based Batch Normalization

batch normalization嘛,就是“批规范化”,简称BN,即在每次SGD时,经过mini-batch来对相应的activation作规范化操做,使得数据进入下一层以前,(输出信号各个维度)的均值为0,方差为1.


     BN能够加速训练,提升收敛速度,归一化所带来的噪声也有模型正则化的做用。


1.5 Shift based AdaMax

      相似sgd,Adam是一种学习规则,它彷佛也能减小权重尺度的影响,因为ADAM须要屡次乘法运算,所以做者建议使用算法AdaMax,细节以下。做者在实验中发现,使用基于移位的AdaMax算法而不是使用vanilla ADAM算法时,没有观察到精度损失。





----------------------------------------------------------------------------------------------------------------------------------------

后记

二值神经网络在深度神经网络的正向传播的过程当中将全部的实数权重值量化为-1 或者 1,并利用符号运算操做(Sign Operation)来代替卷积层和全链接层中的乘法操做,但在权重更新时仍然利用保留的实数形式的权重来进行梯度的积累以保证模型的收敛。二值化的思想仅仅适用于神经网络的训练过程,由于若是在模型推断过程当中仍然将权重二值化会致使模型性能较大幅度的降低。在二值网络的基础上,相关学者作了进一步的探索和研究,发现部分网络层中大量实数权重分布在 0 附近,提出了三值网络,并尝试在后向传播过程当中采用位操做来加速网络的训练过程。与二值网络类似,三值网络也面临着没法有效地加速网络的测试推断过程的问题。