论文题目:XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks_ECCV2016
引用量:1346
code:https://github.com/allenai/XNOR-Net,
https://github.com/jiecaoyu/XNOR-Net-PyTorch
这篇论文主要提出了两个网络:Binary-Weight-Networks(BWN)和XNOR-Net,BWN只对权重参数二值化,XNOR-Net对权重和激活都做了二值化,内存节省32倍,并且卷积操作速度提高58倍,简单、高效、精度高,对比前两篇BNN和Binaryconnect二值化论文精度有很大的提升(16%).
XNOR-Net方法(量化策略):
设定一个三元组 < 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.本文提出的两种架构一一介绍。
原
始
网
络
,
B
W
N
以
及
X
n
o
r
−
N
e
t
在
M
e
m
o
r
y
,
C
o
m
p
u
t
a
t
i
o
n
,
A
c
c
u
r
a
c
y
对
比
原始网络,BWN以及Xnor-Net在Memory,Computation,Accuracy对比
原始网络,BWN以及Xnor−Net在Memory,Computation,Accuracy对比
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,所以BWN中权重的取值就是{
−
α
,
+
α
-\alpha, +\alpha
−α,+α}.一个卷积操作就可以近似为
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.
所以本文量化变成了一个最优化问题,优化问题是公式2,找到最优的
α
,
B
\alpha,B
α,B使得量化权重与浮点权重的差值最小。 为了让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α).
关于weight求导更全的解释在: https://github.com/jiecaoyu/XNOR-Net-PyTorch/blob/master/notes/notes.pdf
对于update parameters来说,用全精度的weights,因为在梯度下降时,参数改变的很小,在更新完参数时,二值化可以忽略这些改变。
算法1展示了训练二值化weight的步骤:
首先:对于每一层先计算出B和A,然后使用二值化的weight进行前向,然后在进行反向,最后更新参数。
XNOR-Net
-
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) -
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操作。 -
Training XNOR-Networks
[外链图片转存失败(img-MA62hQ8X-1565881501736)(https://i.loli.net/2019/08/12/pWsnkR27iKE5ImX.png)]
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一样。
Result
- Efficiency Analysis
[外链图片转存失败(img-ffynAyHe-1565881501738)(https://i.loli.net/2019/08/12/F3NXbaUROYQiJEs.png)]
图 a 是 比 较 不 同 网 络 d o u b l e 和 b i n a r y 之 间 m e m o r y 的 对 比 , b 和 c 指 的 是 不 同 c h a n n e l 和 f i l t e r s i z e 对 s p e e d u p 的 影 响 图a是比较不同网络double和binary之间memory的对比,b和c指的是不同channel和filter size对speedup的影响 图a是比较不同网络double和binary之间memory的对比,b和c指的是不同channel和filtersize对speedup的影响
在标准卷积中,计算操作总数是 c N W N I cN_WN_I cNWNI, c是通道数, N W = w h , N I = w i n h i n N_W=wh,N_I=w_{in}h_{in} NW=wh,NI=winhin。一些现代CPU可以将乘法和加法融合在一个时钟周期,但是BWN不会有加速,公式11表明XNOR有 c N W N I cN_WN_I cNWNI个二值操作,有 N I N_I NI个非二值操作,在这些CPU可以在一个时钟内实现64个二值操作,因此加速比就是: S = c N W N I 1 64 c N W N I + N I = 64 c N W c N W + 64 S=\frac{cN_WN_I}{\frac{1}{64}cN_WN_I+N_I}=\frac{64cN_W}{cN_W+64} S=641cNWNI+NIcNWNI=cNW+6464cNW.
加速取决于通道大小和卷积核大小,但不取决于输入大小。在更改一个参数时,我们固定其他参数如下: c = 256 , n I = 1 4 2 和 n W = 3 2 c = 256,n_I = 14^2和n_W = 3^2 c=256,nI=142和nW=32(ResNet架构中的大多数卷积都有此结构体)。使用我们的近似卷积,获得了62.27倍的理论加速,但在我们的CPU实现中,所有开销,我们在一个卷积中实现了58倍的加速(不包括内存分配和内存访问的过程)。设置小通道尺寸(c = 3)和卷积核尺寸(NW = 1×1)的加速效果不是很好。这促使我们避免在CNN的第一层和最后一层进行二值化。在第一层中,chanel大小为3,在最后一层中,卷积核大小为1×1。 - Image Classification
BinaryConnect(BC)是一种在前向和后向传播期间训练具有二值化权重的深度神经网络的方法。与我们的方法类似,它们在更新参数步骤期间保持实际权重值。我们的二值化与BC不同。 BC中的二值化可以是确定性的也可以是随机的。我们在比较中使用BC的确定性二值化,因为随机二值化效率不高。 BNN中使用和讨论了相同的评估设置。- CIFAR-10
BC和BNN在CIFAR-10,MNIST和SVHN数据集上表现出近乎最先进的性能。 CIFAR-10上的BWN和XNOR-Net使用与BC和BNN相同的网络架构,错误率分别为9.88%和10.17%。 - AlexNet
AlexNet有61M参数量,这里使用带BN的ALexNet[1].
training: 在每次训练迭代中,图像被调整大小以在其较小维度上具有256个像素,然后选择224×224的随机裁剪用于训练。 我们运行训练算法16个epoch,Batch Size为512,我们在输出的soft-max上使用负对数似然作为我们的分类损失函数。 我们不使用本地响应规范化(LRN)层来实现AlexNet。 我们使用momentum=0.9的SGD来更新BWN和BC中的参数。 对于XNOR-Net和BNN,我们使用ADAM。 ADAM收敛速度更快,通常可以实现二进制输入的更高精度[2]。 学习率从0.1开始,我们每4个epoch应用学习衰减速率=0.01。
testing: 在前向传播时,我们使用中心裁剪的224×224输入图片进行前向传播。
比 较 B W N , X N O R 和 B C , B N N 的 T o p − 1 , T o p 5 准 确 率 ( 大 概 相 差 17 % ) 比较BWN,XNOR和BC,BNN的Top-1,Top5准确率(大概相差17\%) 比较BWN,XNOR和BC,BNN的Top−1,Top5准确率(大概相差17%)
[外链图片转存失败(img-u8o5HCfc-1565881501741)(https://i.loli.net/2019/08/12/pWeHwOcAfqCK5Ul.png)]
本文发现权重的缩放因子 α \alpha α比输入的缩放因子 β \beta β更有效,去除 β \beta β只会让准确率降低一点(不到1%).
二进制梯度:使用具有二进制梯度的XNOR-Net,top-1的精度将仅下降1.4% - Residual Net
这里使用ResNet-18.
training:在每次训练迭代中,图像在较小维度上在256和480像素之间随机调整大小,然后选择224×224的随机裁剪进行训练。我们运行58个epoch的训练算法,批量大小等于256个图像。 学习率从0.1开始,我们分别在30个epoch和40epoch时使用0.01的学习率衰减。
testing:在测试时,我们使用224×224的中心裁剪进行前向传播。
- GoogLenet Variant
我们尝试使用一个变种GoogLenet做实验,它与原网络有相似数量的参数和连接,但只有简单的卷积,没有分支。 它有21个卷积层,卷积核大小在1×1和3×3之间交替。
training:在较小的维度上,图像在256和320像素之间随机调整大小,然后选择224×224的随机裁剪进行训练。 我们运行80个历元的训练算法,批量大小为128。学习率从0.1开始,我们使用多项式速率衰减,β= 4。
testing:在测试时,我们使用224×224的中心裁剪进行前向传播。
- CIFAR-10
- Ablation Studies
α \alpha α影响很大,不同块结构也影响很大(自己做实验调查为什么)。
本文贡献:
- 提出了一个二值化网络权值和二值化输入的网络XNOR-Net,减少了网络的模型大小大约32X,加快推理速度大约58X。
- 本文是第一个在大数据ImageNet上检验二值化的。与BNN和BinaryConnect不同的是,本文提出了一个filter-wise scaling factor,它保留了weights和activations的平均magnitudes信息,最终的表现的结果比BNN和BinaryConnect好很多。
不足:
- 精度下降比较严重(与原始float比较,大概下降12%)
- 而且也增加了高精度的除法器(由于需要平均操作)。
- GoogleNet,ResNet结果不太好,1x1卷积结果也不太好。
参考文献:
[1] Ioffe, S., Szegedy, C.: Batch normalization: Accelerating deep network training by reducing internal covariate shift. arXiv preprint arXiv:1502.03167 (2015)
[2] Courbariaux, M., Bengio, Y.: Binarynet: Training deep neural networks with weights and activations constrained to +1 or -1. CoRR (2016)