二值化神经网络系列一:二值化神经网络介绍

二值化神经网络以其高模型压缩率和快计算速度的潜在优势,近些年成为深度学习的热门研究方向。本篇博文将对二值化神经网络做一个详细的介绍。

尊重原创,转载请注明: 
http://blog.csdn.net/tangwei2014/article/details/55077172

1. 二值化神经网络简介

  二值化神经网络,是指在浮点型神经网络的基础上,将其权重矩阵中权重值和各个激活函数值同时进行二值化得到的神经网络。二值化神经网络具有很好的特性,具体体现在:

  • 通过将权重矩阵二值化,一个权重值只占用一个比特,相比于单精度浮点型权重矩阵,网络模型的内存消耗理论上能减少32倍,因此二值化神经网络在模型压缩上具有很大的优势。
  • 当权重值和激活函数值同时进行二值化之后,原来32个浮点型数的乘加运算,可以通过一次异或运算(xnor)和一次popcnt运算解决,在模型加速上具有很大的潜力。

  通过以上分析可以看出,二值化神经网络在模型压缩和模型加速方面都具有非常明显的优势。研究二值化神经网络对解决当前浮点型神经网络模型应用到嵌入式或移动场景下 (例如手机端、可穿戴设备、自动驾驶汽车等) 存在的模型过大,计算密度过高等问题,具有很重大的意义。一种全连接的二值化神经网络示例如图1所示。二值化神经网络中的二值化通常指将权重值和激活函数值二值化到+1和-1实现。

二值化神经网络系列一:二值化神经网络介绍_第1张图片
图一: 全连接二值化神经网络示例

2. 神经网络的二值化方法

  二值化神经网络以其高的模型压缩率和在前传中计算速度上的优势,近几年格外受到重视和发展,成为神经网络模型研究中的非常热门的一个研究方向。 第一篇真正意义上将神经网络中的权重值和激活函数值同时做到二值化的是Bengio组2016年发表的名为《Binarynet: Training deep neural networks with weights and activations constrained to +1 or -1》的一篇论文。这篇论文第一次给出了关于如何对网络进行二值化和如何训练二值化神经网络的方法。

  如何对浮点型的神经网络进行二值化? BinaryNet这篇文章提供了两种思路,第一种思路是概率化的方式


即首先将权重值或者激活函数值通过例如sigmoid函数转为一种概率,然后按照概率采样为+1或者-1。

  另一种思路是采用决定化的方式


即直接由浮点型权重值或者激活函数值的正负号决定二值化为+1还是-1。 由于频繁的采样在面临大量参数的网络和大量的输入数据时非常耗时,所以这篇论文推荐使用决定化的方式。

3. 训练二值化神经网络

  如何训练二值化神经网络? BinaryNet这篇论文提出了在用BP算法训练神经网络时,前传和反传区别进行的方式,即在整个训练过程中,即保留浮点型的权重值,又保留二值化的权重值。

  在前传过程中,根据浮点型的权重值和浮点型的激活函数值分别利用决定化的方式对其进行二值化,利用二值化后的权重值和激活函数值进行运算。即前传过程如下: 

二值化神经网络系列一:二值化神经网络介绍_第2张图片

  在反传过程中,对决定化方式中的Sign函数进行松弛化,即前传中是: 


反传中对已知q的梯度对r求梯度时,Sign函数松弛为:


即当r的绝对值小于等于1时,r的梯度等于q的梯度,否则r的梯度为0。 最后求得各层浮点型权重值对应的梯度和浮点型激活函数值对应的残差,然后用SGD方法或者其他梯度更新方法对浮点型的权重值进行更新,以此不断的进行迭代,直到loss不再继续下降。

求各层梯度方式如下: 

二值化神经网络系列一:二值化神经网络介绍_第3张图片

梯度更新方式如下: 

二值化神经网络系列一:二值化神经网络介绍_第4张图片

你可能感兴趣的:(二值化神经网络系列一:二值化神经网络介绍)