轉載自:http://blog.csdn.net/jackytintin/article/details/53445280
1. 動機
深度學習在圖像、語音、文本等領域都取得了巨大的成功,推動了一系列智能產品的落地。但深度模型存在着參數衆多,訓練和 inference 計算量大的不足。目前,基於深度學習的產品大多依靠服務器端運算能力的驅動,非常依賴良好的網絡環境。
很多時候,出於響應時間、服務穩定性和隱私方面的考慮,我們更希望將模型部署在本地(如智能手機上)。爲此,我們需要解決模型壓縮的問題——將模型大小、內存佔用、功耗等降低到本地設備能夠承受的範圍之內。
2. 方法
神經網絡具有分佈式的特點——特徵表徵和計算都分散於各個層、各個參數。因此,神經網絡在結構上天然具有冗餘的特點。冗餘是神經網絡進行壓縮的前提。
壓縮模型一般可以有幾種常見的方法:
2.1 使用小模型
設計小模型
可以直接將模型大小做爲約束,在模型結構設計和選擇時便加以考慮。對於全連接,使用 bottleneck 是一個有效的手段(如 LSTMP)。Highway,ResNet,DenseNet 等帶有 skip connection 結構的模型也被用來設計窄而深的網絡,從而減少模型整體參數量和計算量。對 CNN 網絡,SqueezeNet 通過引入1 x 1的小卷積核、減少 feature map 數量等方法,在分類精度與 AlexNet 相當的前提下,將模型大小壓縮在 1M 以內,而模型大小僅是 Alexnet 的50分之一。
模型小型化
一般而言,相比於小模型,大模型更容易通過訓練得到更優的性能。那麼,能否用一個較小的模型,“提煉”出訓練好的大模型的知識能力,從而使得小模型在特定任務上,達到或接近大模型的精度?Knowledge Distilling(e.g. 1、2)便嘗試解決這一問題。knowledge distilling 將大模型的輸出做爲 soft target 來訓練小模型,達到知識“凝練“的效果。實驗表明,distilling 方法在 MNIST 及聲學建模等任務上有着很好的表現。
2.2 利用稀疏性
我們也可以通過在模型結構上引入稀疏性,從而達到減少模型參數量的效果。
裁剪已有模型
將訓練好的模型進行裁剪的方法,至少可以追溯到90年代。 Optimal Brain Damage 和 Optimal Brain Surgeon 通過一階或二階的梯度信息,刪除不對性能影響不顯著的連接,從而壓縮模型規模。
學習稀疏結構
稀疏性也可以通過訓練獲得。更近的一系列工作(Deep compression: a、b 、c 及 HashedNets)在控制模型性能的前提下,學習稀疏的模型結構,從而極大的壓縮模型規模。
2.3 降低運算精度
不同傳統的高性能計算,神經網絡對計算精度的要求不高。目前,基本上所有神經網絡都採用單精度浮點數進行訓練(這在很大程度上決定着 GPU 的架構設計)。已經發布的 NVIDIA Pascal 架構的最大特色便是原生的支持半精度(half float)運算。在服務端,FPGA 等特殊硬件在許多數據中心得到廣泛應用,多采用低精度(8 bit)的定點運算。
參數量化
除了使用低精度浮點運算(float32, float16)外,量化參數是另一種利用簡化模型的有效方法。
將參數量化有如下二個優勢:
* 減少模型大——將 32 或 16 位浮點數量化爲 8 位甚至更少位的定點數,能夠極大減少模型佔用的空間;
* 加速運算——相比於複雜的浮點運算,量化後的定點運算更容易利用特殊硬件(FPGA,ASIC)進行加速。
上面提到的 Deep Compression 使用不同的位數量化網絡。Lin 等的工作,在理論上討論上,在不損失性能的前提下,CNN 的最優量化策略。此外,還有量化 CNN 和 RNN 權值的相關工作。
參數二值化
量化的極限是二值化,即每一個參數只佔用一個 bIt。本文討論的正是這個種壓縮模型的方法。
3. BinaryNet
BinaryNet [1] 研究對象是前饋網絡(全連接結構或卷積結構)(這方法在 RNN 上並不成功 [4])。這裏,我們更關心權值的二值化對 inference 的精度和速度的影響,而不關心模型的訓練速度(量化梯度以加速模型訓練的工作可以參見 [3])。
前饋模型(卷積可以看成是一種特殊的全連接)可以用如下公式表示:
其中,xk 成爲冗餘項,不再考慮。
3.1. 二值化權值和激活
首先,我們定義取符號操作:
在 BinaryNet 中,網絡權值爲 +1 或 -1,即可以用 1bit 表示,這一點與 BinaryConnect 相同。更進一步,BinaryNet 使用了輸出爲二值的激活函數,即:
這樣,除了第一層的輸入爲浮點數或多位定點數外,其他各層的輸入都爲 1 bit。
3.2. 訓練
BinaryNet 二值化權值和激活的思路很容易理解,但關鍵在於,如何有效地訓練網絡這樣一個二值網絡。
[1] 提出的解決方案是:權值和梯度在訓練過程中保持全精度(full precison),也即,訓練過程中,權重依然爲浮點數,訓練完成後,再將權值二值化,以用於 inference。
權值
在訓練過程中,權值爲 32 位的浮點數,且取值值限制在 [-1, 1] 之間,以保持網絡的穩定性。爲此,訓練過程中,每次權值更新後,需要對權值 W。
前向
前向運算時,我們首先得到二值化的權值:Wkb=sign(Wk),k=1,⋯,n
然後,用 Wkb:
其中,BN(⋅) 爲 Batch Normalization 操作。
後向
根據誤差反傳算法(Backpropagation,BP),由於 sign(⋅)。這樣,BinaryNet 就可以和序普通的實值網絡一樣,使用梯度下降法進行優化。
另外,如果激活值(二值化之前)的絕對值大於1,相應的梯度也要置零,否則會影響訓練效果。
3.4. 性能
模型精度
BinaryNet 在 MNIST (MLP) ,CIFAR10、SVHN(CNN)上取得了不錯的結果(表1第二列)。
數據集 | 論文結果 | squared hinge loss (同論文) | xent loss |
---|---|---|---|
MNIST (MLP) | 0.96% | 1.06% | 1.02% |
CIFAR10 (CNN) | 11.40% | 11.92% | 11.91% |
SVHN (CNN) | 2.80% | 2.94% | 2.82% |
表 1 不同數據集上錯誤率
壓縮效果
二值化網絡在運算速度、內存佔用、能耗上的優勢是顯而易見的,這也是我們對二值化感興趣的原因。[1] 中給出了這方面的一些分析,具體可以參見 [1](Section 3),此處不再贅述。
4. Source Code
4.1 訓練
BinaryNet[1]的作者給出了 theano 和 torch 兩個版本,兩者之間略有不同。theano 採用確定性(deterministic)的二值化方式,而 torch 是隨機化(stochastic)的二值化,並且 torch 版對 Batch Normalization 操作也進行了離散化處理。具體差異可以參見論文。
根據文章 theano 版本的實現,我們有基於 Keras 的實現。這個版本利用了一個 trick ,實現了梯度的 straight-through estimator。
理想情況下,theano 和 tensorflow 在做 Graph 優化時,應該能夠優化掉這個 trick 帶來的性能開銷,但對於MLP, tensorflow 的後端明顯比 theano 慢(~235s vs. ~195s),但不清楚是否是兩者對 Graph 優化能力差異造成的。
在 MNIST、CIFAR10 和 SVHN 數據集上,基本復現了文章的結果(見表1. 三、四列)
與文章聲稱的不同,目標函數分別選擇交叉熵(crossentropy, xent)與合葉損失(L2-SVM)時,在三個數據集上的性能幾乎沒有判別,甚至交叉熵還要略好一些。
另外,感興趣的讀者可以參考基於 pytorch 的實現。
4.2 Inference
正如上面介紹的,BinaryNet 的最大優點是可以 XNOR-計數 運算替代複雜的乘法-加法操作。[1] 給出了二值網絡 inference 的基於 CUDA 的 GPU 參考實現。另外,還有基於 CPU 的實現(其基於 tensorflow 的訓練代碼有些小問題)。[2] 報告了基於 FPGA 的實現及加速效果。
5. 結語
- 在小型任務上,BinaryNet 完全有希望滿足精度要求。目前手裏沒有真實應用的數據(如語音的靜音檢測),不能進一步驗證可行性。
- 至於 BinaryNet 在大型任務上的性能,從 [5][6] 報告的 ImageNet 準確率來看, 性能損失還是比較大的。更高的量化精度似是必須的[4][7]。
- 此外,根據實驗經驗,BinaryNet 的訓練不太穩定,需要較小的學習率,收斂速度明顯慢於實值網絡。
References
- Courbariaux et al. Binarized Neural Networks: Training Neural Networks with Weights and Activations Constrained to +1 or −1.
- Umuroglu et al. FINN: A Framework for Fast, Scalable Binarized Neural Network Inference.
- Lin et al. Neural Networks with Few Multiplications.
- Ott et al. Recurrent Neural Networks With Limited Numerical Precision.
- Zhou et al. DoReFa-Net: Training Low Bitwidth Convolutional Neural Networks with Low Bitwidth Gradients.
- Rastegari et al. XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks.
- Hubara et al. Quantized Neural Networks: Training Neural Networks with Low Precision Weights and Activations.
Further Readings
- Anderson et al. The High-Dimensional Geometry of Binary Neural Networks.
Reference:
文章閱讀筆記:http://blog.csdn.net/stdcoutzyx/article/details/50926174
文章閱讀筆記:http://www.infocool.net/kb/WWW/201705/351036.html
什麼是二值神經網絡,知乎:https://www.zhihu.com/question/41957384