Binarized Neural Networks: Training Neural Networks withWeights and Activations Constrained to +1 or -1
论文链接:https://arxiv.org/abs/1602.02830
代码地址:https://github.com/MatthieuCourbariaux/BinaryNet
2016 NIPS
蒙特利尔 以色列理工
背景
深度神经网络(DNNs)在很大程度上推动了人工智能的发展,但如今DNNs几乎只能在快速和高功耗的GPU上进行训练,神经网洛由于采用浮点计算,需要较大的存储空间和计算量,严重阻碍在移动端的应用,而二值化神经网络有着高模型压缩率和快计算速度的潜在优势。文章介绍了训练二元神经网络(BNNs)的方法,二进制的权值和激活,前向传播的计算以及在方向传播中参数如何的更新,如何利用二进制位操作实现GPU加速计算的。
方法
二值化方法
确定性方法:基于符号函数Sign的确定性(deterministic )方法,即大于0就为+1,小于0则为-1。
随机二值化(stochastic )方法:基于概率的方法,当x在-1到1之间,取1和-1的是按照一定概率存在的,这和上一篇文章的随机舍入是一个思想。
随机二值化比符号函数更具吸引力,但难以实现,二值化的目的就是为了实现在嵌入式设备上部署模型,但随机二值化需要硬件在产生随机比特,这比较难实施。所以论文中的实验用的是确定性方法。
前向计算
前向计算过程和一般网络模型的计算差不多,只是多了一个权重二值化和激活二值化的过程。由于现在是权重是二值化的值,在“卷积”计算和批量归一化的计算上,有了更简便快捷的方法。
XNOR(同或运算)代替卷积运算
(在计算机的存储中,1bit值其实只能是0或1,这里所说的“-1”,在计算机里表示就是0)
卷积=-(2×Popcount(a^w)-len)
举个例子:a=[1,-1, 1, 1, -1],b=[-1,1,1,-1,-1]
正常卷积计算:W=ab= a1b1+a2b2+a3b3+a4b4+a5b5=1(-1)+(-1)1+11+1*(-1)±(1)(-1)=-1
同或计算:先计算a和b的按位异或运算,统计其中1的个数,把“0”看作为-1,1的个数为Popcount(a^w),-1的个数为:5- Popcount(aw),累加为:2*Popcount(aw)-5,由于我们算的应该是异或的累加,取反就是同或的累加,得到为-1.
ab=[10,01,11,10,00]=[1,1,0,1,0]
Popcount(a^w)=3
W=-(2Popcount(a^w)-5) = -1
用移位操作进行批量归一化运算
用移位操作近似代替乘法
AP2(x)的作用是求与x最接近的2的幂次方,如AP2(3.14)=4,AP2(2.5)=2;而<<>>操作就是位移操作
反向传播
梯度计算,由于Sign(x)函数的梯度,几乎处处为0,这显然不利于反向传播,作者采用尺度缩放的策略
权值更新,权重和激活值的更新并不是二值的,因为如果这样做的话误差会很大
基于移位的AdaMax
ADAM能减少权重尺度的影响,由于ADAM需要多次乘法运算,因此作者建议使用算法AdaMax。作者在实验中发现,使用基于移位的AdaMax算法而不是使用vanilla ADAM算法时,没有观察到精度损失。
实验
精度损失
内存和计算能耗
• 内存访问耗时比计算耗时要多
• 相对于32bit的DNN,BNN内存需求量减少为原来的1/32还少,使得能源使用减少31/32
结论
二值化网络对于一些简单的应用和简单的网络结构,应该还是可以有很高的精度,能够大大减小内存的占用和功耗的损失,但对于复杂的应用和更深的网络结构,精度损失会很严重。
参考资料
【深度学习——BNN】:二值神经网络BNN——学习与总结
深度学习【6】二值网络(Binarized Neural Networks)学习与理解