Abstract
本文是一篇经典的二值化weight和activations的文章,发表在ECCV2016.本文提出了两种有效二值化的框架:XNOR−Net以及BWN(Binary-Weight-Networks).在存储方面可以节省32倍的memory。在XNOR−Net上weights以及卷积层的input都是二值化的。在Imagenet数据集上用Alexnet做实验得到和全精度一样的accuracy。code地址: http://allenai.org/plato/xnornet.
Binary Convolutional Neural Network
设定一个三元组<I,W,∗>作为一个L层的CNN框架,I=Il(l=1,...,L)是CNN第l层的输入,W=Wlk(k=1,...,Kl)是CNN第l层第k个滤波器的权重,Kl是第l层滤波器的数量,∗代表I和W的卷积操作,这里原文假设卷积核没有bias。I∈Rc×win×hin, W∈Rc×w×h, w≤win,h≤hin.本文提出的两种架构一一介绍。

1.Binary-Weight-Networks(BWN)
本文直接给出了真实值W与目标二值化的B∈{+1,−1}c×w×h之间的关系,用一个scaling factor α∈R+来联系两个weight。W≈αB,一个卷积操作就可以近似为
I∗W≈(I⊕B)α(1)
⊕代表不带任何乘法的卷积操作。由于weight是二值化的,所以可以实现一个卷积操作转化为加法和减法。用<I,B.A,⊕>代表二值化weight的CNN,B=Blk是一个二值化的filter,α=Alk,Wlk≈AlkBlk.
Estimating binary weights
为了让loss不失一般性,假设W,B∈Rn,n=c×w×h都是矢量.对于W≈αB,为了找到最优解,本文提出以下优化目标函数:
J(B,α)=∥W−αB∥2
α∗,B∗=argminα,BJ(B,α)(2)
展开公式(2):
J(B,α)=α2BTB−2αWTB+WTW(3)
B∈{+1,−1}n,BTB=n是一个常数。WTW也是一个常数由于W是一个已经得变量,设定c=WTW,这样公式(3)就变为:
J(B,α)=α2n−2αWTB+c
.
这样求B的最优解就变为以下的约束公式:
B∗=argmaxB{WTB},s.t.B∈{+1,−1}n(4)
这个最优解就是:Bi=+1ifWi≥0以及Bi=−1ifWi<0.因此最优解就是:B∗=sign(W).为了找到α∗的最优解,可以求J对α的导数并置0得:
α∗=WTB∗n(5)
带入B∗=sign(W)得:α∗=WTsign(W)n=∑|Wi|n=1n∥W∥l1(6)
Training Binary-Weights-Networks
训练CNN的每一次迭代包含三个步骤:forward pass, backward pass and parameters update.这里要注意一点:在训练二值化weight(在卷积层)的时候,只在forward pass和backward propagation的时候二值化weight。对sign(r),求导公式为∂sign∂r=r1|r|≤1.weight的导数就是:∂C∂Wi=∂C∂W˜i(1n+∂sign∂Wiα).对于update parameters来说,用全精度的weights,因为在梯度下降时,参数改变的很小,在更新完参数时,二值化可以忽略这些改变。
算法1展示了训练二值化weight的步骤:

首先:对于每一层先计算出B和A,然后使用二值化的weight进行前向,然后在进行反向,最后更新参数。
XNOR-Network
在BWN里面,用A和B来近似表示真实值,但是卷积层的输入仍然是真实值的。
1.Binary Dot Product
近似X∈Rn和W∈Rn的点乘:XTW≈βHTαB, H,B∈{+1,−1}n, α,β∈R+, 优化以下目标函数:
α∗,B∗,β∗,H∗=argminα,B,β,H∥X⊙W−βαH⊙B∥(7)
⊙代表element-wise乘(对应元素相乘)。
设定Y∈Rn, Yi=XiWi,C∈{+1,−1}n, Ci=HiBi,γ=βα.公式(7)可以重写为:
γ∗,C∗=argminγ,C∥Y−γC∥(8)
根据公式(2),我们可以得到最优解:
C∗=sign(Y)=sign(X)⊙sign(W)=H∗⊙B∗(9)
由于|Xi|和|Wi|是独立的,Yi=XiWi,所以E[|Yi|]=E[|Xi||Wi|]=E[|Xi|]E[|Wi|],因此
γ∗=∑|Yi|n=|Xi||Wi|n≈(1n∥X∥l1)(1n∥W∥l1)=β∗α∗(10)
2.Binary Convolution

输入I∈Rc×win×hin在图二中有两个sub-tensorsX1和X2。由于sub-tensors之间有很多重叠,导致有很多冗余的计算。为了克服这个冗余,首先计算出输入I在channel的均方和,A=∑|I:,:,i|c, 将A和一个2D的卷积核k∈Rw×h,K=A∗k,kij=1w×h,∀ij。Kij对应位置ij处的β, 一旦得到α和β:
I∗W≈(sign(I)⊛sign(W))⊙Kα(11)
⊛表示一个卷积操作使用XNOR和bitcount操作。
3.Training XNOR-Networks

Fig.3 左图展示了典型的block,右图展示了XNOR-Net的block,binary activation layer(BinActiv)作用是计算出K和sign(I), BinConv层中,给定K和sign(I),根据公式(11),计算二值化的卷积。训练算法跟算法1一样。
4.Binary Gradient
Experiments





