二值化神经网络(BNN)基础学习(一)

时间:2023-03-09 22:07:24
二值化神经网络(BNN)基础学习(一)

1.简介

​ 二值化神经网络,在浮点型(权重值和激活函数值存储类型,32bit)神经网络的基础,将其权重和激活函数值进行二值化(+1,-1存储,只需1bit)得到的神经网络。[1]

​ BNN可用于嵌入式或移动场景(例如手机端、可穿戴设备、自动驾驶汽车等)[1],这些场景都没有GPU且计算能力和存储容量相对较弱且限制较大,具有研究的价值和意义。

二值化神经网络(BNN)基础学习(一)
二值化神经网络示例

2.优点

​ 既然参数值存储位数变少,其运算速度和存储空间必然能较原来神经网络有所提升,同时在训练效果上有所提升。

  • 存储空间上,通过将权重矩阵二值化,一个权重值只占用一个比特,相比于单精度浮点型权重矩阵,网络模型的内存消耗理论上能减少32倍,因此BNN在模型压缩上具有很大的优势。[1]

  • 运算速度上,权重值和激活函数值进行二值化之后,原来32位浮点型数的乘加运算,可以通过一次异或运算和一次popcnt(population count 统计有多少个为1的位)运算解决,在模型加速上具有很大的潜力。[1]

  • 训练效果上,有的时候二值网络的训练效果甚至会超越全精度网络,因为二值化过程给神经网络的权重和激活值带来了noise,像dropout一样,反而是一种regularization,可以部分避免网络的overfitting。[2]

3.基本原理

​ 方法来自于Bengio组2016年发表《Binarynet: Training deep neural networks with weights and activations constrained to +1 or -1》

3.1 权重和激活值二值化[3]

Deterministic(确定法):大于等于0,取+1;否则,取-1

二值化神经网络(BNN)基础学习(一)

Stochastic(统计法):以一定的概率二值化神经网络(BNN)基础学习(一),取+1,或-1

二值化神经网络(BNN)基础学习(一)

​ 作者采用确定法,在前向传播过程中,经过Sign函数,可以将实数型的权值和激活值量化成+1,-1,当用于预测时,参数值仅为+1或-1,可以减小参数的内存占用和运算量;但是,训练时,仍需要对实数型的权值和激活值计算梯度,并以此更新权值。论文中说到这里如果不是实际值的话,梯度处处为0,无法进行梯度下降。

3.2 乘法优化

用Xnor代替乘法的可行性:

假如用0表示-1,那么原来的二值乘法运算,与Xnor的真值表一样,所以,用Xnor代替乘法是合理、可行的。
二值化神经网络(BNN)基础学习(一)

例:a=[1,-1, 1, 1, -1],W=[-1,1,1,-1,-1]

正常乘法操作:a1xw1+a2xw2+a3xw3+a4xw4+a5xw5 =1x-1+-1x1+1x1+1x-1+-1x-1=-1

转成Xnor的计算方式:在程序中,a=[1,0,1,1,0],W=[0,1,1,0,0]表示的,

a^W=[1^0,0^1,1^1,1^0,0^0]=[1,1,0,1,0]

Popcount(a^w)=3

用vec_len表示向量元素个数的话,那么用xnor代替正常的乘累加(卷积),可以用通式:-(2Popcount(a^w)-vec_len)来计算,此例结果为 -(2Popcount(a^w)-5) = -1

3.3 权重和激活值更新

网络前向传播算法:

二值化神经网络(BNN)基础学习(一)

​ 对所有层循环,符合函数对当前权重Wk二值化,记为Wbk ,然后与上层激活值abk-1相乘在进行BN得本层激活值ak ,如果不是最后一层,则ak进行二值化。

网络反向传播算法:

二值化神经网络(BNN)基础学习(一)

​ 对所有层循环(倒序),如果k不是第一层,则计算梯度gak ,其中1|ak|含义:

二值化神经网络(BNN)基础学习(一)

图片来源于[3]

, 这里表示当|r|<=1时,Sign(r)的梯度等于1;否则,均为0。可见,这样处理,既保留了梯度信息,当r太大时,又取消梯度,加速网络的收敛。这就相当于,用HTanh(x)代替Sign(x)[3]