XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks
2016 ECCV
華盛頓大學 Mohammad Rastegari
論文連結:https://arxiv.org/abs/1603.05279
代碼連結:http://allenai.org/plato/xnornet
基于Pythoch的代碼位址:https://github.com/cooooorn/Pytorch-XNOR-Net
引言
随着卷積神經網絡在目标分類和目标檢測方面的發展,這些有趣的進展已經在向虛拟現實、增強現實和智能可穿戴裝置發展,現在是時候為智能便攜裝置配備最先進的識别系統了。然而,基于cnn的識别系統需要大量的記憶體和計算能力。雖然它們在昂貴的、基于gpu的機器上表現良好,但由于體積、算力、功耗的限制,它們通常不适合用于手機和嵌入式電子裝置等小型裝置。該文章想通過對卷積神經網絡的權值或中間結果進行二值化,是模型需要更小的記憶體和更少的浮點預算,但同時達到與标準全精度網絡相當的精度。提出了兩種方法:Neural networks with binary weights(BWN)和XNOR Networks.

BWN是隻對網絡的權重進行二值化,XNOR-Net是對權重和輸入都進行二值化,相比CNN,他們将多bit的的浮點數用低bit的數表示,節省記憶體。BWN,由于權重量化成了{+1,-1},輸入和量化權重進行卷積實際就變成輸入參數之間的加減了,但由于輸入還是浮點數, 是以運算速度還是不夠快,速度提示隻有2倍。XNOR-Net是将權值和輸入都進行了二值化,二進制矩陣時間的卷積可以直接用二進制位運算,是以速度提示很多,能夠提升58倍。主網絡采用的是AlexNet,在ImageNet資料集上,精度損失不是很多。
方法
該文章是在Binary-weight-network(BWN)和BinaryConnect(BC)兩篇文章基礎上做出改進。主要改進有兩點:
- 1.在對權重進行{-1,+1}量化的同時,加入了尺度因子α;
- 2.除了對權重進行量化,還對特征值進行了量化,同樣引入了尺度因子β,不過作者在後面的分析中證明β因子重要性不及α。
Binary-Weight-Networks
I 代表某層的輸入,W 代表某層的權重,此處我們希望把權重量化成矩陣 B ∈ {-1,+1} 和一個尺度因子α的乘積,即:
每一層都包含讀個卷積核,具體到某一層的卷積操作,用如下的式子表示:
(lk表示第l層的第k個卷積核)
權重量化後的卷積操作中的加減乘法操作隻剩矩陣之間的加減法操作和矩陣與α之間的乘法操作:
其中,⊕代表沒有乘法的卷積運算,隻有加減法。
要是量化後結果盡可能的近似于原來的值,應該讓W和αb盡可能相等,将矩陣W和B變換成向量,也就是W和B的次元是1n,這裡n=cwh,為了後面推導的友善,采用L2範數,應該滿足以下式子:
最優解應該是使J(B, α)最小,将二範數展開如下式:
因為B是一個1n的向量,裡面的值要麼是-1,要麼是1,是以:
W是已知的,
是以可以得到:
可以求的B的最優解滿足的限制為:
可以看出B的最優值應該就是W的值的符号,這樣才能夠使WTB最大。
知道了B的最優值,接下來就是求a的最優值。這裡采用上面第2個J函數表達式對a求導,并讓求導結果等于0,進而得到最優值。式子如下:
用上式來替代為:
a的最優值是W的每個元素的絕對值之和的均值
網絡的訓練過程如下:
兩個for循環把矩陣量化了,第一層為周遊所有層,第二層為周遊該層所有的卷積核,同時還偷偷保留了一份未量化的權重(原始權重),先用量化後的權重得到loss,反向傳播時得到的實際時對量化權重的梯度
把梯度換成原始權重應該更新的權重,然後使用SGD或這Adam優化算法去更新原始權重。下次epoch時又再把權重量化,不斷重複以上步驟。
XNOR-Networks
Binary-weights是将權重W的值都用二值表示,而接下來要介紹的XNOR-Networks不僅将權重W用二值表示,而且也将輸入用二值表示。
這裡是用βH近似表示輸入X,得到如下優化式子:
用Y代替XW,C代替HB,γ=βa:
這個式子就和BWN優化的式子一樣了。
下圖是具體的二值操作:
- 權值的二值化
- 輸入的二值化:存在重複計算,因為卷積核的stride一般為1,這樣實際上兩次位移對應位置的X有很大一部分是重疊的,而我們又需要求每個X的平均值,這實際上進行了許多重複求平均操作。該算法是先算出每個位置(X)的β和H,但實際上H矩陣就是對原矩陣進行sign操作而已,根本沒必要對每個位置(X)求對應的H,直接對輸入 I 實際上是一個更為簡潔的做法。既然如此,何不直接先算出每個位置對應的β,形成一個β矩陣,然後β矩陣和sign(I)就代表輸入的量化了。
- 高效的輸入的二值化,求β矩陣,由于 β = (1 / n)* || X ||(X的L1範數) ,是以先把輸入絕對值化,在channel這一維求平均,得到A矩陣,然後再對A矩陣用k濾波器進行均值濾波, A矩陣和均值濾波器k 卷積 對A矩陣均值濾波後得到K矩陣,K矩陣的每個元素實際就是每個位置(X)對應的β,具體實作看上圖第三行。是以可以得到最終公式
【Paper Reading】XNOR-Net 盡量防止資訊丢失,需要對網絡結果進行調整:【Paper Reading】XNOR-Net 【Paper Reading】XNOR-Net
實驗
壓縮效果分析
分類精度分析
在ImageNet資料庫上和其他算法的對比,full-precision代表原始準确率,網絡采用AlexNet
将ResNet-18和GoogLeNnet二值化的精度比較
探究α和β的重要性
作者後面補充實驗發現,其實沒有β因子,對結果影響不大,α的作用還是很顯著的。
結論
這篇文章的關鍵是在二值化量化的過程中加了一個尺度因子,效果比BC和BNN要好,在AlexNet上,效果還不錯,精度損失很小,但在ResNet-18和GoogLeNet上,精度損失還是挺大的。現在的二值化網絡還是隻适用于網絡結構比較簡單的網絡,對于更深的網絡,精度損失很大,但他的加速效果和模型的壓縮還是很明顯的,對于任務比較簡單的任務,使用簡單的網絡結構,我覺的XNOR-Net還是可以一試。
參考資料
XNOR-Net論文了解
XNOR-Net算法詳解