XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks
2016 ECCV
华盛顿大学 Mohammad Rastegari
论文链接:https://arxiv.org/abs/1603.05279
代码链接:http://allenai.org/plato/xnornet
基于Pythoch的代码地址:https://github.com/cooooorn/Pytorch-XNOR-Net
引言
随着卷积神经网络在目标分类和目标检测方面的发展,这些有趣的进展已经在向虚拟现实、增强现实和智能可穿戴设备发展,现在是时候为智能便携设备配备最先进的识别系统了。然而,基于cnn的识别系统需要大量的内存和计算能力。虽然它们在昂贵的、基于gpu的机器上表现良好,但由于体积、算力、功耗的限制,它们通常不适合用于手机和嵌入式电子设备等小型设备。该文章想通过对卷积神经网络的权值或中间结果进行二值化,是模型需要更小的内存和更少的浮点预算,但同时达到与标准全精度网络相当的精度。提出了两种方法:Neural networks with binary weights(BWN)和XNOR Networks.

BWN是只对网络的权重进行二值化,XNOR-Net是对权重和输入都进行二值化,相比CNN,他们将多bit的的浮点数用低bit的数表示,节省内存。BWN,由于权重量化成了{+1,-1},输入和量化权重进行卷积实际就变成输入参数之间的加减了,但由于输入还是浮点数, 所以运算速度还是不够快,速度提示只有2倍。XNOR-Net是将权值和输入都进行了二值化,二进制矩阵时间的卷积可以直接用二进制位运算,所以速度提示很多,能够提升58倍。主网络采用的是AlexNet,在ImageNet数据集上,精度损失不是很多。
方法
该文章是在Binary-weight-network(BWN)和BinaryConnect(BC)两篇文章基础上做出改进。主要改进有两点:
- 1.在对权重进行{-1,+1}量化的同时,加入了尺度因子α;
- 2.除了对权重进行量化,还对特征值进行了量化,同样引入了尺度因子β,不过作者在后面的分析中证明β因子重要性不及α。
Binary-Weight-Networks
I 代表某层的输入,W 代表某层的权重,此处我们希望把权重量化成矩阵 B ∈ {-1,+1} 和一个尺度因子α的乘积,即:
每一层都包含读个卷积核,具体到某一层的卷积操作,用如下的式子表示:
(lk表示第l层的第k个卷积核)
权重量化后的卷积操作中的加减乘法操作只剩矩阵之间的加减法操作和矩阵与α之间的乘法操作:
其中,⊕代表没有乘法的卷积运算,只有加减法。
要是量化后结果尽可能的近似于原来的值,应该让W和αb尽可能相等,将矩阵W和B变换成向量,也就是W和B的维度是1n,这里n=cwh,为了后面推导的方便,采用L2范数,应该满足以下式子:
最优解应该是使J(B, α)最小,将二范数展开如下式:
因为B是一个1n的向量,里面的值要么是-1,要么是1,所以:
W是已知的,
所以可以得到:
可以求的B的最优解满足的约束为:
可以看出B的最优值应该就是W的值的符号,这样才能够使WTB最大。
知道了B的最优值,接下来就是求a的最优值。这里采用上面第2个J函数表达式对a求导,并让求导结果等于0,从而得到最优值。式子如下:
用上式来替代为:
a的最优值是W的每个元素的绝对值之和的均值
网络的训练过程如下:
两个for循环把矩阵量化了,第一层为遍历所有层,第二层为遍历该层所有的卷积核,同时还偷偷保留了一份未量化的权重(原始权重),先用量化后的权重得到loss,反向传播时得到的实际时对量化权重的梯度
把梯度换成原始权重应该更新的权重,然后使用SGD或这Adam优化算法去更新原始权重。下次epoch时又再把权重量化,不断重复以上步骤。
XNOR-Networks
Binary-weights是将权重W的值都用二值表示,而接下来要介绍的XNOR-Networks不仅将权重W用二值表示,而且也将输入用二值表示。
这里是用βH近似表示输入X,得到如下优化式子:
用Y代替XW,C代替HB,γ=βa:
这个式子就和BWN优化的式子一样了。
下图是具体的二值操作:
- 权值的二值化
- 输入的二值化:存在重复计算,因为卷积核的stride一般为1,这样实际上两次位移对应位置的X有很大一部分是重叠的,而我们又需要求每个X的平均值,这实际上进行了许多重复求平均操作。该算法是先算出每个位置(X)的β和H,但实际上H矩阵就是对原矩阵进行sign操作而已,根本没必要对每个位置(X)求对应的H,直接对输入 I 实际上是一个更为简洁的做法。既然如此,何不直接先算出每个位置对应的β,形成一个β矩阵,然后β矩阵和sign(I)就代表输入的量化了。
- 高效的输入的二值化,求β矩阵,由于 β = (1 / n)* || X ||(X的L1范数) ,所以先把输入绝对值化,在channel这一维求平均,得到A矩阵,然后再对A矩阵用k滤波器进行均值滤波, A矩阵和均值滤波器k 卷积 对A矩阵均值滤波后得到K矩阵,K矩阵的每个元素实际就是每个位置(X)对应的β,具体实现看上图第三行。因此可以得到最终公式
【Paper Reading】XNOR-Net 尽量防止信息丢失,需要对网络结果进行调整:【Paper Reading】XNOR-Net 【Paper Reading】XNOR-Net
实验
压缩效果分析
分类精度分析
在ImageNet数据库上和其他算法的对比,full-precision代表原始准确率,网络采用AlexNet
将ResNet-18和GoogLeNnet二值化的精度比较
探究α和β的重要性
作者后面补充实验发现,其实没有β因子,对结果影响不大,α的作用还是很显著的。
结论
这篇文章的关键是在二值化量化的过程中加了一个尺度因子,效果比BC和BNN要好,在AlexNet上,效果还不错,精度损失很小,但在ResNet-18和GoogLeNet上,精度损失还是挺大的。现在的二值化网络还是只适用于网络结构比较简单的网络,对于更深的网络,精度损失很大,但他的加速效果和模型的压缩还是很明显的,对于任务比较简单的任务,使用简单的网络结构,我觉的XNOR-Net还是可以一试。
参考资料
XNOR-Net论文理解
XNOR-Net算法详解