二值化神经网络主要针对于神经网络权重来进行二值化来加速神经网络运算和减少权重的内存消耗。但是二值化神经网络还不够快。对于嵌入式运算来说,没有最快只有更快,所以异或神经网络(XNOR Neural Network)应运而生。
相比于权重二值化神经网络,异或神经网络将网络的输入也转化为二进制值,所以,异或神经网络中的乘法加法(Multiplication andACcumulation)运算用按位异或(bitwise xnor)和数1的个数(popcount)来代替。从内存消耗上来看,对于相同的网络结构,异或神经网络和二值化神经网络存储相同大小的权重。从计算量来看,异或神经网络的运算速度是全精度卷积神经网络的58倍,是二值化神经网络的29倍。由于卷积运算被按位运算代替,速度提升非常显著,但是精度也会相应的降低,在ImageNet上,精度损失了大概1%。
这是二值化神经网络和异或神经网络的卷积操作的对比。对于二值化神经网络的卷积操作来说,实数输入与二值化权重进行卷积然后乘以实数尺度因子。对于异或神经网络卷积操作来说,二值化输入与二值化权重进行卷积然后乘以实数尺度因子和输入与卷积窗的缩放因子。二值化神经网络中卷积是用加法或者减法来执行的,异或神经网络中卷积是用按位异或和计数来实现的。
异或神经网络的权重二值化和二值化神经网络一样,用W的L1范数的平均来作为尺度因子。异或神经网络中的输入二值化会引入重复计算的问题(2),于是更高效的方法就是对输入求取均值得到A,c是通道个数。A与k进行卷积得到K(3),跟(2)的结果一致,但是计算上更高效了。(4)就是用异或计数(XNOR-Bitcount)来实现的卷积。对比全精度网络,32bit的卷积操作(MAC)就被1bit的卷积操作(XNOR-Bitcount)代替了,从而达到了几十倍的运算加速。
异或神经网络在网络结构上做了一些改动,以保证运算速度和计算精度。
全精度神经网络中,一个典型的模块是由卷积(Conv)->批标准化(BNorm)->激活(Activ)->池化(Pool)这样的顺序操作组成的。对于异或神经网络,设计出的模块是由批标准化(BNorm)->二值化激活(BinActiv)->二值化卷积(BinConv)->池化(Pool)的顺序操作完成。这样做的原因是批标准化以后,保证了输入均值为,然后进行二值化激活,保证了数据为-1或者+1,然后进行二值化卷积,这样能最大程度上减少特征信息的损失。
在ImageNet上进行了验证,对比了二值化神经网络和异或神经网络的训练曲线。
同时,在ImageNet上对比了权重二值化神经网络,权重输入二值化神经网络和全精度神经网络,得到的结果如下。
可以看到的是权重二值化神经网络和全精度神经网络的精确度几乎一样,但是异或神经网络相比而言,Top-1和Top-5都有1+%的损失。
尝试了不同的主干网络(Backbone Network),比如ResNet-18,结果看起来,准确率仍然比二值化神经网络低1%左右,比全精度神经网络低16-18%。
虽然速度上提升明显,但是是以精度的损失为代价的,这个就是一个tradeoffbetweenspeedandaccuracy。总体看来,异或神经网络的提出给低成本低功耗的移动端设备提供了一个可行的神经网络解决方案,但是如果对于精度要求很高的应用不太合适。目前也有很多的研究专注于低精度神经网络和网络压缩裁剪,以期在Edge computing中取得比较好的成果。
XNOR-Net是出自AllenInstitute for Artificial Intelligence,而且该团队成立了xnor.ai公司,有很多顶尖的Researcher和Coder供职,XNOR-Net在树莓派和Iphone上都做到了实时检测。
二值化神经网络和异或神经网络的卷积运算是很易于用硬件实现的,比如ASIC或者FPGA,下一节会就二值化神经网络的FPGA实现进行分析。
领取专属 10元无门槛券
私享最新 技术干货