论文地址:https://arxiv.org/abs/1603.05279
code:http://allenai.org/plato/xnornet
这篇论文的动机是解决DNN在移动端的部署困难的问题,其实这也是量化的主要目的之一。作者提出了两种二值化网络:Binary-Weight-Networks(BWN)和XNOR-Network。其中BWN是将权重量化为1bit(+1,-1),而XNOR-Net则是进一步对权重和激活值都量化为1bit。(激活值就是卷积层的输入)
下图是这两种网络和普通网络的实验结果比较(Alex-Net):
Binary-Weight-Networks
BWN思想和BNN一样,不过只量化权重,更新参数是也是使用实数值(精度高)。
设输入为
I
I
I,权重为
W
W
W,维度为
c
∗
w
∗
h
c*w*h
c∗w∗h,二值化后的权重为
B
∈
{
+
1
,
−
1
}
B \in \{+1,-1 \}
B∈{+1,−1},放缩系数为
α
\alpha
α,即
W
≈
α
B
W \approx \alpha B
W≈αB,则卷积操作可转转换为只有加减的卷积操作:
对于权重
W
W
W的近似,肯定越接近越好,于是就转化为优化问题:
展开得:
设
n
=
c
∗
w
∗
h
n=c*w*h
n=c∗w∗h,显然,
B
T
B
B^TB
BTB和
W
T
W
W^TW
WTW均为正的常数,且
B
T
B
=
n
B^TB= n
BTB=n。设
W
T
W
=
c
W^TW=c
WTW=c,则目标函数为:
要使目标函数最小,只要
W
T
B
W^TB
WTB最大即可。于是优化问题就转化为:
即B的最优值为:
对于
α
\alpha
α的最优值,直接对目标函数进行求导即可得到:
即
具体的算法为:
XNOR-Network
XNOR-Net是对权重和激活值都二值化(XNOR即同或门),主要利用XNOR和bitcount操作。卷积运算可以看作是由移位操作和点积操作组成,而对于二值化的权重和激活值,点积操作可由XNOR和bitcount来近似代替。
对于输入X,权重W,有:
和BWN相同,求最优近似值,故有优化问题:
然后和BWN一样的做法,
因为
∣
X
i
∣
|X_i|
∣Xi∣和
∣
W
i
∣
|W_i|
∣Wi∣相互独立,所以有:
具体的二值化的卷积操作如下图:
第一、二行就是上面的最优化过程,但是对于输入的二值化存在重复计算(stride=1),效率不高,所以采用第三行的方法。因为原算法是对每个位置的X都算出
β
\beta
β和H,但是H就是对X进行sign操作,因此只需要对整个输入矩阵I进行sign操作就可以。第三行就是这样,对输入矩阵的绝对值在channel维度上取平均:
然后用k滤波器均值滤波:
得到的K就是各个位置上的
β
\beta
β。因此得到最终的公式(第四行):
需要注意的是,还要对网络结构进行调整:
实验
在ImageNet数据集上与其他量化方法进行对比:
在不同网络上对比:
注:作者在实验中发现, β \beta β似乎对准确率的影响很小。