https://www.jianshu.com/p/f9b015cc4514
https://github.com/hpi-xnor/BMXNet BMXNet:基於MXNet的開源二值神經網絡實現
Index
- Introduction
- Related Works
- Binary Neural Networks
- XNOR-Net
- Conclusion
Introduction
神經網絡模型的壓縮是一個很有前景的方向。由於神經網絡需要較大的計算量,目前來說,我們通常在服務器上對神經網絡進行訓練或是計算的。移動端的神經網絡在斷網的情況下就失去了作用。通過一些壓縮神經網絡的方法,我們能夠縮小神經網絡的規模,並且提高計算速度。這對於實現移動端人工智能來說很有意義。
本文基於< XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks>介紹了神經網絡模型壓縮的一些相關工作,以及二值化卷積神經網絡BWN,還有XNOR-Net的工作原理。XNOR-Net的實現代碼:[此處應有鏈接,等我寫完初步的demo將會上傳]。(由於Tensorflow暫時不支持bit操作,所以代碼只作為研究用,並不能真正實現bit操作。)
Related Works
- Shallow Networks淺層網絡:用更淺的網絡來表示訓練好的網絡。很多時候,神經網絡會存在冗余的參數和層數,這個方法通過使用更淺的網絡,達到相同的效果,減少參數加快計算。
- Compressing pre-trained networks壓縮訓練好的模型:Deep Compression就是這樣的方法。通過對模型參數進行剪枝,量化,哈夫曼編碼等技巧,能夠壓縮模型。關於Deep Compression的介紹可以看我前幾篇文章(文末有鏈接)。
- Designing compact layers設計更簡潔層: Residual layers就是一種壓縮的手段。
- Quantizing parameters量化參數:目前浮點數通常使用32bit表示,量化可以用更少的位數來表示參數,但是會損失一定精度。
- Network binarization網絡二值化:二值化是將網絡完全使用+1, -1來表示,這樣就可以用1bit來表示網絡。Binary Weight Network 和XNOR-Net都是二值化的網絡。網絡二值化后,卷積可以表示為簡單的加法減法,且可以大大減小計算時間。
Binary Neural Networks
Binary Neural Networks由Bengio團隊在< BinaryNet: Training Deep Neural Networks with Weights and Activations Constrained to +1 or −1 >一文中提出。
其原理很簡單:

其中I為Input輸入,W為weight,B為二值化的weight,alpha為縮放因子。
由上式可知,一個kernel對輸入進行卷積的結果,可以由二值化的weight對輸入進行⊕后,再乘縮放因子得到。其中⊕表示沒有乘法的卷積運算。
證明:

由上式可知,J最小時,alpha和B有最優值。
展開一式:

令c = WT W, n=BTB,得到:

易得alpha和B的最優解:


可知B = Sign(W), alpha=L1norm(W)/n. 其中n=cwh,c,w,h分布為kernel的輸入通道數,寬,高。
可以通過以下算法對網絡進行訓練:

值得注意的是,我們在前向計算時使用B和alpha,而在后向傳播時使用實數W進行參數更新。這是由於梯度的量級通常很小,直接對B進行更新時,求導后值為0。
在網絡中加入Batch Normalization可以提升網絡性能。
XNOR-Net
XNOR-Net與BWN不同的地方在於,XNOR-Net不僅將kernel進行二值化,還將input二值化。
由於證明過程與BWN相似,在這里不進行累述。

如上圖,將輸入進行二值化時,由於計算L1norm時存在很多冗余的計算,XNOR-Net采用了更有效的方式:將輸入在channel維度計算norm得到A,用k(k為w h大小的卷積核,其值為1/wh)對A進行卷積得到K。
之后只需要將Sign(I)與Sign(W)進行卷積,再乘K和alpha即可。
由於Sign(I)和Sign(W)都是二值化的,卷積可以通過XNOR和bit-count表示。

XNOR-Net的block表示如上圖。
Conclusion
總的來說,神經網絡壓縮是一個很有前景的方向。目前存在的問題主要是精度損失的問題。文章中將AlexNet進行壓縮后,精度損失了2.9%,這對於某些任務來說是不可接受的。其次在於現在很多硬件沒有成熟的二值運算。
未來我可能會開源一個基於Tensorflow的神經網絡壓縮的代碼。由於目前Tensorflow底層代碼沒有支持二值運算,所以里面使用的實際上還是浮點數。因此只能作為研究或者提取訓練好的參數到其他平台。
Neural Networks compression系列文章包括:
- 漫談Deep Compression
- XNOR-Net:二值化卷積神經網絡
作者:Efackw13
鏈接:https://www.jianshu.com/p/f9b015cc4514
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。