《Binarized Neural Networks: Neural Networks with Weights Constrained to +1 or −1 》阅读笔记

转载请注明出处:西土城的搬砖日常
论文链接:Binarized Neural Networks: Training Neural Networks with Weights and Activations Constrained to +1 or −1

标题:Binarized Neural Networks: Training Neural Networks with Weights and Activations Constrained to +1 or −1

来源:arxiv

源代码:itayhubara/BinaryNet

问题:使用浮点计算的神经网络要求的大存储空间和大计算量,严重阻碍了其在移动设备上的应用,本文提出的二值神经网络设法让计算主要在正1或负1间进行,降低了网络大小和计算量,且使得网络的预测准确率接近于“实用”水平。

相关工作:

1、模型压缩方法

(1)模型小型化

减小参数规模,诸如将全连接层改为skip connection,将卷积核的个数或者size减少。或者用类似最近很火的teacher-student network,用较小的模型去学大模型的输出,达到知识的凝练。

(2)裁剪已有模型

由于神经网络对弱权重的低敏感性,可以考虑将部分不对性能有显著影响的连接删除,从而压缩模型规模,理解可参见tensorflow可视化体验平台Tensorflow — Neural Network Playground

(3)降低运算精度

减小浮点数的精度或者将参数量化,量化即把原始参数划为定点数,例如0-1之间的实数划0-9的整数。量化的极限是二值化即本文方法。

2、二值化方法

(1)Deterministic方法

output大于0就为+1,小于0则为-1。

(2)Stochastic方法

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

由于Stochastic方法需要由硬件生成随机数,这比较难实施。所以论文中的实验用的是Deterministic方法。

主要内容:

本文的二值化网络只是将网络的参数和激活值二值化,并没有改变网络结构,且输出层的概率输出依旧是浮点型。因此我们重点介绍它的前馈过程和如何进行反向参数更新。

1、BinaryNet的前馈模型可以用如下公式表示

xk 为第k 层的输入,Wk 为第 k 层的权值矩阵,σ(⋅) 为非线性激活函数。


2、二值化的激活函数

这样,除了第一层的输入为浮点数或多位定点数外,其他各层的输入都为 1bit。

3、完整的训练过程

由于网络参数已经二值化,直接正向或者负向调整会导致模型震荡 ,因此不能直接进行更新,为了解决这个问题,所以权值和梯度在训练过程中保持全精度。

(1)前馈过程

先将实数型权值参数二值化得到二值型权值参数,即W_{k}^{b}  = sign(W_{k} )。然后利用二值化后的参数计算得到实数型的中间向量,该向量再通过Batch Normalization操作,得到实数型的隐藏层激活向量。如果不是输出层的话,就将该向量二值化。

其中,BN(⋅) 为 Batch Normalization 操作。

(2)反向更新

由于 sign(⋅) 的导数(几乎)处处为零,因此,W 通过 BP 得到的误差 ΔW 为零 ,因此不能直接用来更新权值。

为解决这个问题采用 straight-through estimator的方法,该方法其实是一种妥协方法,将sign(x)进行宽松。这样,函数就变成可以求导的了,求导近似函数如下,其实就是在-1和1之间加一个线性变化过程。

用链式法则求解loss在k+1层的误差值即\frac{\partial C}{\partial a_{k+1} } ,由于二值网络中,除了输出层,其他隐藏层都经过二值化,所以先求得二值化输出a_{k}^{b} 的梯度g_{a_{k}^{b} } ,因为a_{k}^{b} =sign(a_{k} )所以如果直接求a_{k} 的梯度又变成0了。因而g_{a_{k} } 近似计算如下

其中1_{\left| a_{k}  \right| <=1 } 就是Htanh(x).得到每一层实值输出的残差后即可和传统网络一样得到权值的梯度g_{w} ,注意该梯度只用来直接更新实值权重。并且在进行参数更新时,要时时刻刻把超出[-1,1]的部分给裁剪了。即权重参数始终是[-1,1]之间的实数。

实验结果:

与实值网络相比准确率并没有太多降低,时间复杂度却可以降低60%。相对于32bit的DNN,BNN内存需求量减少为原来的1/32。

总结:

1、在小型任务上,BinaryNet 完全有希望满足精度要求。且将网络应用到移动平台上

2、BNN除了在训练过程需要保存实值参数外,在预测阶段只需要存储二值化参数,降低了在模型部署的参数存储,但是对于前馈过程,依旧需要进行相同层数的计算,只是整数的乘法相比浮点数的乘法速度更快,所以有优化提高但是优化结果并不明显。

3、BinaryNet 的训练不太稳定,需要较小的学习率,收敛速度明显慢于实值网络,如果学习率高了容易造成网络震荡。

编辑于 2017-01-08

文章被以下专栏收录