Towards Accurate Binary Convolutional Neural Network

Towards Accurate Binary Convolutional Neural Network


文章鏈接 2017年11月30日

視頻鏈接 (youtube)

Introduction

主要的工作:

1:使用多種binary weight base進行線性組合來接近全精度的權值

2:引入多種binary activations。這個將BNNs在Image上的精度提升了將近5%

Realted Work

We relied on the idea of finding the best approximation of full-precision convolution using multiple binary operations, and employing multiple binary activations to allow more information passing through.

Binarization methods

Weight approximation

(w,h,cin,cout)(w,h,c_{in},c_{out})表示一個層的tensors。有兩種不同的量化方法:1) approximate weights as a whole and 2) approximate weights channel-wise

Approximate weights as a whole

使用MM個二值化的濾波器B1,B2,,BM{1,+1}w×h×cin×coutB_1,B_2,\cdots,B_M \in \{-1, +1\}^{w\times h\times c_{in}\times c_{out}}來逼近實值的權重WRw×h×cin×coutW\in \mathbb{R}^{w\times h\times c_{in}\times c_{out}},如Wα1B1+α2B2++αMBMW \approx \alpha_1B_1+\alpha_2B_2+\dots+\alpha_MB_M。一個直接方法是解下面的這個問題:
minα,BJ(α,B)=wBα2 s.t. Bij{1,+1}(1) \min _{\boldsymbol{\alpha}, \boldsymbol{B}} J(\boldsymbol{\alpha}, \boldsymbol{B})= {{||\boldsymbol{w}-\boldsymbol{B}\boldsymbol{\alpha}||}^2 \text{ s.t. } \boldsymbol{B}_{i j} \in\{-1,+1\} }\tag{1} 式中,B=[vec(B1),vec(B2),,vec(BM)],w=vec(W) and α=[α1,α2,,αM]T\boldsymbol{B}=\left[\operatorname{vec}\left(\boldsymbol{B}_{1}\right), \operatorname{vec}\left(\boldsymbol{B}_{2}\right), \cdots, \operatorname{vec}\left(\boldsymbol{B}_{M}\right)\right], \boldsymbol{w}=\operatorname{vec}(\boldsymbol{W}) \text { and } \boldsymbol{\alpha}=\left[\alpha_{1}, \alpha_{2}, \cdots, \alpha_{M}\right]^{\mathrm{T}}vec()\operatorname{vec}(\cdot)表示的是向量化。假設用mean(W)\operatorname{mean}(\boldsymbol{W})std(W)\operatorname{std}(\boldsymbol{W})分別表示W\boldsymbol{W}的均值和方差,那麼將BiB_i改爲:
Bi=Fui(W):=sign(W+uistd(W)),i=1,2,,M(2) \boldsymbol{B}_{i}=F_{u_{i}}(\boldsymbol{W}):=\operatorname{sign}\left(\overline{\boldsymbol{W}}+u_{i} \operatorname{std}(\boldsymbol{W})\right), i=1,2, \cdots, M\tag{2}式中,W=Wmean(W)\overline{\boldsymbol{W}}=\boldsymbol{W}-\operatorname{mean}(\boldsymbol{W})uiu_i是一個滑動因子。例如,將uiu_i設定爲ui=1+(i1)2M1,i=1,2,,Mu_i=-1+(i-1){2 \over M-1},i=1,2,\cdots,M來覆蓋的整個[std(W),std(W)][-\operatorname{std}(\boldsymbol{W}),\operatorname{std}(\boldsymbol{W})]範圍,或者通過網絡去學習。

一旦Bi\boldsymbol{B}_i選定之後,上面的問題就變成了一個線性迴歸問題:
minαJ(α)=wBα2(3) \min _{\boldsymbol{\alpha}} J(\boldsymbol{\alpha})=\|\boldsymbol{w}-\boldsymbol{B} \boldsymbol{\alpha}\|^{2}\tag{3} 式中,Bi\boldsymbol{B}_i是the bases in the design/dictionary matrix。然後使用STE更新Bi\boldsymbol{B}_i。假定cc是代價函數,A\boldsymbol{A}O\boldsymbol{O}分別是卷積的輸入輸出tensor,前向和反向就可以按照如下的形式計算:
 Forward: B1,B2,,BM=Fu1(W),Fu2(W),,FuM(W) Solve (3) for αO=m=1MαmConv(Bm,A) Backward: cW=cO(m=1MαmOBmBmW)= sTE cO(m=1MαmOBm)=m=1MαmcBm \begin{array}{l}{\text { Forward: } B_{1}, B_{2}, \cdots, B_{M}=F_{u_{1}}(W), F_{u_{2}}(W), \cdots, F_{u_{M}}(W)} \\ {\text { Solve }(3) \text { for } \alpha} \\ {\qquad \begin{aligned} O=& \sum_{m=1}^{M} \alpha_{m} \operatorname{Conv}\left(B_{m}, A\right) \\ \text { Backward: } \frac{\partial c}{\partial W} &=\frac{\partial c}{\partial O}\left(\sum_{m=1}^{M} \alpha_{m} \frac{\partial O}{\partial B_{m}} \frac{\partial B_{m}}{\partial W}\right) \stackrel{\text { sTE }}{=} \frac{\partial c}{\partial O}\left(\sum_{m=1}^{M} \alpha_{m} \frac{\partial O}{\partial B_{m}}\right)=\sum_{m=1}^{M} \alpha_{m} \frac{\partial c}{\partial B_{m}} \end{aligned}}\end{array}

Multiple binary activations and bitwise convolution

爲了實現bitwise操作,必須將激活值也量化掉,因爲它們將作爲卷積的輸入。激活函數表示爲h(x)[0,1]h(x)\in [0,1]
hv(x)=clip(x+v,0,1)(4) h_v(x)=\operatorname{clip}(x+v,0,1)\tag{4} 式中,vv是滑動因子。量化的函數爲:
Hv(R):=2Ihv(R)0.51(5) H_{v}(\boldsymbol{R}):=2 \mathbb{I}_{\boldsymbol{h}_{v}(\boldsymbol{R}) \geq 0.5}-1\tag{5} 式中,I\mathbb{I}是標誌函數,activation的前向和反向就可以這麼計算:
 Forward: A=Hv(R) Backward: cR=cAI0Rv1 (using STE)  \begin{array}{l}{\text { Forward: } A=H_{v}(\boldsymbol{R})} \\ \\ \\ {\text { Backward: } \frac{\partial c}{\partial \boldsymbol{R}}=\frac{\partial c}{\partial \boldsymbol{A}} \circ \mathbb{I}_{0 \leq \boldsymbol{R}-v \leq 1} \text { (using STE) }}\end{array}
其中o\operatorname{o}表示Hadamard product。
首先,讓激活值的分佈保持相對穩定,使用了batch normalization,把它放在激活函數之前。然後,使用NN個額二值激活值的線性組合逼近實值Rβ1A1+β2A2++βNANR\approx \beta_1\boldsymbol{A}_1+\beta_2\boldsymbol{A}_2+\dots+\beta_N\boldsymbol{A}_N,其中,
A1,A2,,AN=Hv1(R),Hv2(R),,HvN(R)(6) \boldsymbol{A}_1,\boldsymbol{A}_2,\dots,\boldsymbol{A}_N=H_{v1}(\boldsymbol{R}),H_{v2}(\boldsymbol{R}),\dots,H_{vN}(\boldsymbol{R}) \tag{6} 式中,βn\beta_nvnv_n是可以訓練的,在測試時固定,用來學習數據的分佈。最後整個卷積操作變爲:
Conv(W,R)Conv(m=1MαmBm,n=1NβnAn)=m=1Mn=1NαmβnConv(Bm,An)(7) \operatorname{Conv}(\boldsymbol{W}, \boldsymbol{R}) \approx \operatorname{Conv}\left(\sum_{m=1}^{M} \alpha_{m} \boldsymbol{B}_{m}, \sum_{n=1}^{N} \beta_{n} \boldsymbol{A}_{n}\right)=\sum_{m=1}^{M} \sum_{n=1}^{N} \alpha_{m} \beta_{n} \operatorname{Conv}\left(\boldsymbol{B}_{m}, \boldsymbol{A}_{n}\right)\tag{7} 這也意味着它能夠並行地計算M×NM\times N bitwise convolutions 。

Training algorithm

作者說一般的層的連接順序爲ConvBNActivationPooling\text{Conv}\rightarrow \text{BN}\rightarrow \text{Activation}\rightarrow \text{Pooling},但是在實際過程中,經過最大值池化會將大量的值都變爲+1,造成準確度下降。因此,將max-pooling放在BN層之前。具體的訓練過程在補充材料當中。

Experiment results

Experiment results on ImageNet dataset

使用Resnet作爲基網絡,圖片放縮成224*224大小。

Effect of weight approximation
使用Resnet-18作爲基網絡,BWN表示Binary-Weights-Network,FP表示全精度網絡,結果對比如下:
在這裏插入圖片描述
Comparison with the state-of-the-art
在這裏插入圖片描述

Discussion

Why adding a shift parameter works?
作者說這個可以像BN層中的mean和std一樣,學習數據的分佈。

Advantage over the fixed-point quantization scheme
作者說一個K個二值化的量化方案比K-bit的量化方案好,原因在於1)可以用bitwise操作;2)K個1-bit的乘法器比一個K-bit的乘法器消耗的資源更少;3)保留了脈衝響應

看看視頻還是能更好地理解文章的想法的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章