论文地址: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一样,不过只量化权重,更新参数是也是使用实数值(精度高)。
设输入为III,权重为WWW,维度为c∗w∗hc*w*hc∗w∗h,二值化后的权重为B∈{+1,−1}B \in \{+1,-1 \}B∈{+1,−1},放缩系数为α\alphaα,即W≈αBW \approx \alpha BW≈αB,则卷积操作可转转换为只有加减的卷积操作:
对于权重WWW的近似,肯定越接近越好,于是就转化为优化问题:
展开得:
设n=c∗w∗hn=c*w*hn=c∗w∗h,显然,BTBB^TBBTB和WTWW^TWWTW均为正的常数,且BTB=nB^TB= nBTB=n。设WTW=cW^TW=cWTW=c,则目标函数为:
要使目标函数最小,只要WTBW^TBWTB最大即可。于是优化问题就转化为:
即B的最优值为:
对于α\alphaα的最优值,直接对目标函数进行求导即可得到:
即
具体的算法为:
XNOR-Network
XNOR-Net是对权重和激活值都二值化(XNOR即同或门),主要利用XNOR和bitcount操作。卷积运算可以看作是由移位操作和点积操作组成,而对于二值化的权重和激活值,点积操作可由XNOR和bitcount来近似代替。
对于输入X,权重W,有:
和BWN相同,求最优近似值,故有优化问题:
然后和BWN一样的做法,
因为∣Xi∣|X_i|∣Xi∣和∣Wi∣|W_i|∣Wi∣相互独立,所以有:
具体的二值化的卷积操作如下图:
第一、二行就是上面的最优化过程,但是对于输入的二值化存在重复计算(stride=1),效率不高,所以采用第三行的方法。因为原算法是对每个位置的X都算出β\betaβ和H,但是H就是对X进行sign操作,因此只需要对整个输入矩阵I进行sign操作就可以。第三行就是这样,对输入矩阵的绝对值在channel维度上取平均:
然后用k滤波器均值滤波:
得到的K就是各个位置上的β\betaβ。因此得到最终的公式(第四行):
需要注意的是,还要对网络结构进行调整:
实验
在ImageNet数据集上与其他量化方法进行对比:
在不同网络上对比:
注:作者在实验中发现,β\betaβ似乎对准确率的影响很小。