Abstract
本文是一篇经典的二值化weight和activations的文章,发表在ECCV2016.本文提出了两种有效二值化的框架: X N O R − N e t XNOR-Net XNOR−Net以及 B W N BWN BWN(Binary-Weight-Networks).在存储方面可以节省32倍的memory。在 X N O R − N e t XNOR-Net XNOR−Net上weights以及卷积层的input都是二值化的。在Imagenet数据集上用Alexnet做实验得到和全精度一样的accuracy。code地址: http://allenai.org/plato/xnornet.
Binary Convolutional Neural Network
设定一个三元组
<
I
,
W
,
∗
>
<I,W,*>
<I,W,∗>作为一个
L
L
L层的CNN框架,
I
=
I
l
(
l
=
1
,
.
.
.
,
L
)
I=I_{l(l=1,...,L)}
I=Il(l=1,...,L)是CNN第
l
l
l层的输入,
W
=
W
l
k
(
k
=
1
,
.
.
.
,
K
l
)
W=W_{lk(k=1,...,K^l)}
W=Wlk(k=1,...,Kl)是CNN第
l
l
l层第
k
k
k个滤波器的权重,
K
l
K^l
Kl是第
l
l
l层滤波器的数量,
∗
*
∗代表
I
I
I和
W
W
W的卷积操作,这里原文假设卷积核没有bias。
I
∈
R
c
×
w
i
n
×
h
i
n
I\in\mathbb R^{c\times w_{in}\times h_{in}}
I∈Rc×win×hin,
W
∈
R
c
×
w
×
h
W\in\mathbb R^{c\times w\times h}
W∈Rc×w×h,
w
≤
w
i
n
w\le w_{in}
w≤win,
h
≤
h
i
n
h\le h_{in}
h≤hin.本文提出的两种架构一一介绍。
1.Binary-Weight-Networks(BWN)
本文直接给出了真实值
W
W
W与目标二值化的
B
∈
{
+
1
,
−
1
}
c
×
w
×
h
B\in \{+1,-1\}^{c\times w\times h}
B∈{+1,−1}c×w×h之间的关系,用一个scaling factor
α
∈
R
+
\alpha \in \mathbb R^+
α∈R+来联系两个weight。
W
≈
α
B
W \approx \alpha B
W≈αB,一个卷积操作就可以近似为
I
∗
W
≈
(
I
⊕
B
)
α
(
1
)
I*W \approx (I\oplus B)\alpha \quad (1)
I∗W≈(I⊕B)α(1)
⊕
\oplus
⊕代表不带任何乘法的卷积操作。由于weight是二值化的,所以可以实现一个卷积操作转化为加法和减法。用
<
I
,
B
.
A
,
⊕
>
<I,B.A,\oplus>
<I,B.A,⊕>代表二值化weight的CNN,
B
=
B
l
k
B=B_{lk}
B=Blk是一个二值化的filter,
α
=
A
l
k
\alpha=A_{lk}
α=Alk,
W
l
k
≈
A
l
k
B
l
k
W_{lk}\approx A_{lk}B_{lk}
Wlk≈AlkBlk.
Estimating binary weights
为了让loss不失一般性,假设
W
,
B
∈
R
n
,
n
=
c
×
w
×
h
W,B\in \mathbb R^{n},n=c\times w \times h
W,B∈Rn,n=c×w×h都是矢量.对于
W
≈
α
B
W \approx \alpha B
W≈αB,为了找到最优解,本文提出以下优化目标函数:
J
(
B
,
α
)
=
∥
W
−
α
B
∥
2
J(B,\alpha)=\Vert W-\alpha B \Vert^2
J(B,α)=∥W−αB∥2
α
∗
,
B
∗
=
a
r
g
min
α
,
B
J
(
B
,
α
)
(
2
)
\alpha^*,B^*=arg\min\limits_{\alpha,B} J(B,\alpha) \quad (2)
α∗,B∗=argα,BminJ(B,α)(2)
展开公式(2):
J
(
B
,
α
)
=
α
2
B
T
B
−
2
α
W
T
B
+
W
T
W
(
3
)
J(B, \alpha)=\alpha^2B^TB - 2\alpha W^T B + W^TW \quad(3)
J(B,α)=α2BTB−2αWTB+WTW(3)
B
∈
{
+
1
,
−
1
}
n
,
B
T
B
=
n
B\in \{+1,-1\}^n,B^TB=n
B∈{+1,−1}n,BTB=n是一个常数。
W
T
W
W^TW
WTW也是一个常数由于
W
W
W是一个已经得变量,设定
c
=
W
T
W
c=W^TW
c=WTW,这样公式(3)就变为:
J
(
B
,
α
)
=
α
2
n
−
2
α
W
T
B
+
c
J(B, \alpha)=\alpha^2n-2\alpha W^TB+c
J(B,α)=α2n−2αWTB+c.
这样求**
B
B
B的最优解**就变为以下的约束公式:
B
∗
=
a
r
g
max
B
{
W
T
B
}
,
s
.
t
.
B
∈
{
+
1
,
−
1
}
n
(
4
)
B^*=arg\max\limits_B\{W^TB\}, \quad s.t.\quad B\in\{+1,-1\}^n \quad (4)
B∗=argBmax{WTB},s.t.B∈{+1,−1}n(4)
这个最优解就是:
B
i
=
+
1
  
i
f
  
W
i
≥
0
B_i=+1 \; if \;W_i \ge0
Bi=+1ifWi≥0以及
B
i
=
−
1
  
i
f
  
W
i
<
0
B_i=-1 \; if \; W_i <0
Bi=−1ifWi<0.因此最优解就是:
B
∗
=
s
i
g
n
(
W
)
B^*=sign(W)
B∗=sign(W).为了找到
α
∗
\alpha^*
α∗的最优解,可以求
J
J
J对
α
\alpha
α的导数并置0得:
α
∗
=
W
T
B
∗
n
(
5
)
\alpha^*=\frac{W^TB^*}{n}\quad (5)
α∗=nWTB∗(5)
带入
B
∗
=
s
i
g
n
(
W
)
B^*=sign(W)
B∗=sign(W)得:
α
∗
=
W
T
s
i
g
n
(
W
)
n
=
∑
∣
W
i
∣
n
=
1
n
∥
W
∥
l
1
(
6
)
\alpha^*=\frac{W^Tsign(W)}{n}=\frac{\sum|W_i|}{n}=\frac{1}{n}\Vert W \Vert_{l1}\quad (6)
α∗=nWTsign(W)=n∑∣Wi∣=n1∥W∥l1(6)
Training Binary-Weights-Networks
训练CNN的每一次迭代包含三个步骤:forward pass, backward pass and parameters update.这里要注意一点:在训练二值化weight(在卷积层)的时候,只在forward pass和backward propagation的时候二值化weight。对
s
i
g
n
(
r
)
sign(r)
sign(r),求导公式为
∂
s
i
g
n
∂
r
=
r
1
∣
r
∣
≤
1
\frac {\partial sign}{\partial r}=r1_{|r| \le 1}
∂r∂sign=r1∣r∣≤1.weight的导数就是:
∂
C
∂
W
i
=
∂
C
∂
W
~
i
(
1
n
+
∂
s
i
g
n
∂
W
i
α
)
\frac {\partial C}{\partial W_i}=\frac {\partial C}{\partial \widetilde W_i}(\frac {1}{n}+\frac {\partial sign}{\partial W_i}\alpha)
∂Wi∂C=∂W
i∂C(n1+∂Wi∂signα).对于update parameters来说,用全精度的weights,因为在梯度下降时,参数改变的很小,在更新完参数时,二值化可以忽略这些改变。
算法1展示了训练二值化weight的步骤:
首先:对于每一层先计算出B和A,然后使用二值化的weight进行前向,然后在进行反向,最后更新参数。
XNOR-Network
在BWN里面,用A和B来近似表示真实值,但是卷积层的输入仍然是真实值的。
1.Binary Dot Product
近似
X
∈
R
n
X\in \mathbb R^n
X∈Rn和
W
∈
R
n
W\in \mathbb R^n
W∈Rn的点乘:
X
T
W
≈
β
H
T
α
B
X^TW \approx \beta H^T \alpha B
XTW≈βHTαB,
H
,
B
∈
{
+
1
,
−
1
}
n
H,B \in \{+1, -1\}^n
H,B∈{+1,−1}n,
α
,
β
∈
R
+
\alpha, \beta \in \mathbb R^+
α,β∈R+, 优化以下目标函数:
α
∗
,
B
∗
,
β
∗
,
H
∗
=
a
r
g
min
α
,
B
,
β
,
H
∥
X
⊙
W
−
β
α
H
⊙
B
∥
(
7
)
\alpha^*,B^*, \beta^*, H^*=arg\min\limits_{\alpha,B,\beta,H} \Vert X \odot W -\beta \alpha H\odot B\Vert \quad (7)
α∗,B∗,β∗,H∗=argα,B,β,Hmin∥X⊙W−βαH⊙B∥(7)
⊙
\odot
⊙代表element-wise乘(对应元素相乘)。
设定
Y
∈
R
n
Y\in \mathbb R^n
Y∈Rn,
Y
i
=
X
i
W
i
,
C
∈
{
+
1
,
−
1
}
n
Y_i=X_iW_i, C\in\{+1,-1\}^n
Yi=XiWi,C∈{+1,−1}n,
C
i
=
H
i
B
i
,
γ
=
β
α
C_i=H_iB_i, \gamma=\beta \alpha
Ci=HiBi,γ=βα.公式(7)可以重写为:
γ
∗
,
C
∗
=
a
r
g
min
γ
,
C
∥
Y
−
γ
C
∥
(
8
)
\gamma^*, C^*=arg\min\limits_{\gamma, C} \Vert Y- \gamma C\Vert \quad (8)
γ∗,C∗=argγ,Cmin∥Y−γC∥(8)
根据公式(2),我们可以得到最优解:
C
∗
=
s
i
g
n
(
Y
)
=
s
i
g
n
(
X
)
⊙
s
i
g
n
(
W
)
=
H
∗
⊙
B
∗
(
9
)
C^*=sign(Y)=sign(X) \odot sign(W)=H^* \odot B^* \quad (9)
C∗=sign(Y)=sign(X)⊙sign(W)=H∗⊙B∗(9)
由于
∣
X
i
∣
|X_i|
∣Xi∣和
∣
W
i
∣
|W_i|
∣Wi∣是独立的,
Y
i
=
X
i
W
i
Y_i=X_iW_i
Yi=XiWi,所以
E
[
∣
Y
i
∣
]
=
E
[
∣
X
i
∣
∣
W
i
∣
]
=
E
[
∣
X
i
∣
]
E
[
∣
W
i
∣
]
E[|Y_i|]=E[|X_i||W_i|]=E[|X_i|]E[|W_i|]
E[∣Yi∣]=E[∣Xi∣∣Wi∣]=E[∣Xi∣]E[∣Wi∣],因此
γ
∗
=
∑
∣
Y
i
∣
n
=
∣
X
i
∣
∣
W
i
∣
n
≈
(
1
n
∥
X
∥
l
1
)
(
1
n
∥
W
∥
l
1
)
=
β
∗
α
∗
(
10
)
\gamma^* = \frac {\sum|Y_i|}{n}=\frac {|X_i||W_i|}{n} \approx (\frac {1}{n}\Vert X \Vert_{l1}) (\frac {1}{n}\Vert W \Vert_{l1})=\beta ^* \alpha^* \quad (10)
γ∗=n∑∣Yi∣=n∣Xi∣∣Wi∣≈(n1∥X∥l1)(n1∥W∥l1)=β∗α∗(10)
2.Binary Convolution
输入
I
∈
R
c
×
w
i
n
×
h
i
n
I\in \mathbb R^{c\times w_{in} \times h_{in}}
I∈Rc×win×hin在图二中有两个sub-tensors
X
1
X_1
X1和
X
2
X_2
X2。由于sub-tensors之间有很多重叠,导致有很多冗余的计算。为了克服这个冗余,首先计算出输入
I
I
I在channel的均方和,
A
=
∑
∣
I
:
,
:
,
i
  
∣
c
A= \frac {\sum |I_{:,:,i}\;|}{c}
A=c∑∣I:,:,i∣, 将
A
A
A和一个2D的卷积核
k
∈
R
w
×
h
,
K
=
A
∗
k
,
k
i
j
=
1
w
×
h
,
∀
i
j
k\in \mathbb R^{w \times h}, K=A*k, k_{ij}=\frac {1}{w\times h},\forall ij
k∈Rw×h,K=A∗k,kij=w×h1,∀ij。
K
i
j
K_{ij}
Kij对应位置
i
j
ij
ij处的
β
\beta
β, 一旦得到
α
\alpha
α和
β
\beta
β:
I
∗
W
≈
(
s
i
g
n
(
I
)
⊛
s
i
g
n
(
W
)
)
⊙
K
α
(
11
)
I*W \approx (sign(I) \circledast sign(W))\odot K \alpha \quad (11)
I∗W≈(sign(I)⊛sign(W))⊙Kα(11)
⊛
\circledast
⊛表示一个卷积操作使用XNOR和bitcount操作。
3.Training XNOR-Networks
Fig.3 左图展示了典型的block,右图展示了XNOR-Net的block,binary activation layer(BinActiv)作用是计算出
K
K
K和
s
i
g
n
(
I
)
sign(I)
sign(I), BinConv层中,给定
K
K
K和
s
i
g
n
(
I
)
sign(I)
sign(I),根据公式(11),计算二值化的卷积。训练算法跟算法1一样。
4.Binary Gradient
Experiments