论文:XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks
Github:https://github.com/allenai/XNOR-Net
yolo的作者Joseph Redmon 作为三作的论文,论文提出了二值网络(Binary-Weight-Networks(BWN)) 的改进版异或网络(XNOR-Net)
上图对比了传统的卷积网络和BWN网络和XNOR网络。XNOR网络使用位运算和异或运算替代了加减运算,实现了速度的大幅提升。
论文贡献:
模型压缩的相关方法:
(1)Shallow networks
使用浅层的网络结构
(2)Compressing pre-trained deep networks
包括Hessian 矩阵分解,哈夫曼编码Huffman coding ,哈希网络HashedNets ,矩阵因式分解Matrix factorization
(3)Designing compact layers
包括使用global average pooling替换全连接层,分解3*3的卷积为2个1*1的卷积,使用1*1卷积来替换3*3卷积。
(4)Quantizing parameters
将32位浮点参数量化为8位参数
(5)Network binarization
包括BinaryConnect,BinaryNet
二值化啊网络Binary-Weight-Networks(BWN):
第一个式子表示了正常卷积网络的输入I和网络权值W和卷积操作*
第4个式子将一个正常的网络权值W近似为a*B的操作,其中a属于实数,B属于二值的矩阵。
最后一个式子实现了将一个传统的卷积过程转化为二值的计算过程,中间的圆圈+号表示没有乘法的卷积运算。
得出下面的式子,
然后对上面式子两边做差,得到优化函数J(B,a)
整个优化过程就是最小化J(B,a),
经过上面的变量替换后,得到看最新的J(B,a)函数,由于a,n,c都是正值,要使得J(B,a)最小,就得最大化WTB,
然后对J(B,a)求导,得到
由于
使用sign(w)替换B*最终得到下面的式子,
训练过程如下,
基本思路就是,先计算二值的卷积的参数A,B,然后使用二值的卷积进行前向运算,使用二值的卷积参数进行梯度返向传播,更新float类型的卷积的参数和学习率。如此循环训练。
异或网络XNOR-Networks :
类似上面的权值二值化的思想,将输入特征也进行了二值化,从而得到上面的最小化公式,
其中圆圈点表示elentment-wise乘积
基于下面的式子,进行替换后得到最终的优化函数
要最小化上面的式子,就是使得Y=rC,最终得到最优化的C*
然后基于C*得到r*
最终得到异或卷积的公式如下,
其中,圆圈*表示位运算或者异或运算,I表示输入特征,W表示filter权值特征,K表示输入的scale的float值,a表示filter的scale的float值。
上图表示了几种卷积操作的对比,
模块对比:
第一个传统卷积模块(conv+BN+relu+pooling),第二个为XNOR网络卷积模块(BN+relu+XNOR conv+pooling)。可以看出XNOR网络首先对输入进行了BN归一化操作,才进行异或卷积操作。
实验结果:
总结:
论文提出了压缩网络结构XNOR-Net,模型参数有32X压缩,速度有58X提升,精度下降也比较严重,而二值网络BWN对精度损失则很少。可以根据实际环境进行取舍