XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks
这篇文章提出了两个二进制类的网络模型,一个叫做Binary-Weighted-Networks,一个叫做XNOR-Net。其中BWN只有filter是二进制的表达,而XNOR-Net在input和filter上都是二进制的表达。其中指出二进制的表达XNOR-Nets在执行卷积运算时能够提升58×的速度,而可以节省32×的内存空间,这为XNOR-Nets在CPU上运行提供了可能性。
Binary-Weighted-Networks
在进行卷积运算的时候,可以将乘法改成加法和减法,这可以提高2×左右的运行效率。BWNs已经可以嵌入更小、便携式的硬件中去了。
XNOR-Nets
当input和filter的输入都是二进制的时候,可以使用XNOR(异或)运算来代替乘法的运算,这使得XNOR-Nets近似的CNNs比起高精度的CNNs有了58×的速度提升,这使得XNOR-Nets能够高效地在CPU上进行实现。
1 Binary Convolutional Neural Networks
一些数学符号的意义直接贴图了......
1.1 Binary-Weighted-Neural-Networks
为了用二进制的filter去最好地近似高精度的filter,采用了一个非常直观的近似方法,为每一个filter找一个scaling factor:
为了更好地近似,我们选择使得近似前后的矩阵之间的欧氏距离最短,即:
展开之后得到:
其中一个特别好的性质就是,是一个常数n,而
是一个和α和B都无关的变量,所以最后和B有关的需要考虑的只有中间的式子,这就是一个非常naive的问题了,只需要使得:
之后我们只需要让W中为正数的项在B中为1,负数的项在B中为-1,就可以取得最大值。
最后考察α,求导之后求极值得到:
最后卷积的运算就可以表示成:
其中,⊕是不需要乘法的卷积运算符。
1.1.1 Training
在训练的时候,只在forward pass的时候binarize weights。
由于sign函数的梯度几乎处处为0,所以作者使用了STE(straight-forward-estimator)的方法来近似的估计梯度。
最终计算得到的梯度应当是:
注意的是,在gd的时候,使用的是全精度来更新权值,否则二进制的表示更新的幅度实在是太小了。
通过下面的伪码真的是一目了然:
一旦网络训好了之后,就不需要再保存全精度的数据了。
1.2 XNOR-Networks
当input和filter都是二进制的数的时候,卷积操作就可以视为不断地重复bit shift和dot product的过程,而这些操作都可以通过位运算实现。dot product就可以视为是异或的操作。
1.2.1 Binary Dot Product
在XNOR-Nets中,需要保证内积之间的差异最小,即:
其中α和β分别是input和filter的scaling factor。
用相似的思想可以得到一下的最优化结果:
1.2.2 Binary Convolution
作者发现要计算每一input中small patch的β包含非常多的冗余的计算,所以作者选择了使用卷积操作进行该项任务。
最终得到的近似的卷积的结果为:
1.2.3 Training XNOR-Networks
文章中指出将pooling放在binary input之后的会导致信息急剧地损失,因为弄出来的绝大多数都是1.
为了减少binarization带来的information loss,钻则了在binarization之前进行normalize,使得其均值为0.最终的卷积结构调整为:
其中BinActiv是用来计算矩阵K和sign(I)的;BinConv用来进行卷积运算;可以在卷积运算之后加上一个ReLU function。
同时文章中指出,为了计算的方便,在backward pass的时候也将input进行二值化。同时用绝对值的方法计算input的scaling factor,否则会有梯度消失的问题。
2 Experiments
2.1 Efficiency Analysis
通过和传统的convolution相比,速度的提升比例为:
可以发现,速度提升的比例和input size没有关系,之和channel数量以及filter size有关。
2.2 Image Classification