【论文阅读笔记】---二值神经网络(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  对于如何对浮点型的神经网络进行二值化,文章给出两种方法:

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

        

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

 

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

  1.2 梯度计算与累加

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

 1.3 离散化梯度传播

    已知二值化操作(即前向传播过程)如下:

                            

    符号函数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算法时,没有观察到精度损失。



猜你喜欢

转载自blog.csdn.net/u012101561/article/details/80054963