<模型匯總_2>深度學習加速神器-BNN

Binarized Neural Networks(BNN)是一種為了降低深度學習模型佔用內存,加速模型運算速度而誕生的一種深度學習網路,於2016年發表於Neural Information Processing Systems (NIPS 2016)的論文《Binarized Neural Networks》提出,作者還給公開了他們做實驗的源代碼,地址:MatthieuCourbariaux/BinaryNet。與傳統的深度學習模型,比如DNN(Deep Neural Networks)相比,BNN最大的不同在於它的weights和activation全都進行二值化了,以此來減少DNN運行速度和減少佔用的內存。論文指出,與32bit的DNN相比,BNN佔用的內存減少了32倍,在GPU上的運行速度提升了7倍之多。It is so amazing ! 那麼接下來就讓我們來看看它到底是怎麼做到的。

如何進行二值化?

作者提出了兩種對weights和activation進行二值化的函數function,第一種是Deterministic Binarization,即確定型二值化:

第二種是Stochastic Binarization,即隨機型二值化:

第一種方式看起來比較簡單,卻不如第二種看起來更合理。第二種雖然更合理,但是每次計算生成隨機數卻非常耗時,出於加速目的考慮,一般還是選擇第一種函數類似符號形式確定型函數。但是問題又來了,符號型函數導數處處為0,不能進行梯度計算反向傳播。因此,作者又提出想辦法。

通過離散化來進行梯度的反向傳播

借鑒Yoshua Benjio在2013年的時候通過「straight-through estimator」隨機離散化神經元來進行梯度計算和反向傳播的工作,提出了一種考慮激活函數飽和死區特性的「straight-through estimator」,簡單就是做了如下圖的處理:

使得函數在[-1,1]之間是可導的,且梯度恆為1。

梯度計算和累加求和:

模型進行梯度計算時候,採用的是高精度的實數值。因為梯度量級很小,假設梯度服從正太分布,通過梯度的累加效果可以過濾掉梯度中雜訊的影響。此外,對weights和activation的二值化,相當於對網路的參數引入雜訊,可以提高網路抗過擬合的能力,這可以看做是dropout的一種變形。

訓練演算法1:

有了以上幾條處理技巧,網路最難的求導問題得到解決,給出了一個包含BN(Batch-Normalization)的演算法;

這裡注意,

W(k)進行二值化之後,與上一層的輸出a(k-1)相乘再進行BN之後得到k層的輸出a(k),因為BN的參數θ(k)不是二值的,所以BN的輸出a(k)也不是二值的,需要在進行一次Binarize操作轉換成二值輸出。BN的作用是可以加速訓練,減少權重尺度大小影響,同時歸一化引入的雜訊也起到了正則化的作用。

但是,BN涉及很多矩陣運算(matrix multiplication),會降低運算速度,因此,提出了一種shift-based Batch Normalization。

shift-based Batch Normalization:

使用SBN來替換傳統的BN,SBN最大的優勢就是幾乎不需要進行矩陣運算,而且還不會對性能帶來損失。基於SBN,又提出了訓練演算法3:

Shift based AdaMax:ADAM是一種用於削弱權重大小對訓練影響的優化演算法。作者希望使用。但是ADAM和BN一樣涉及很多矩陣運算,又提出了Shift based AdaMax來加速網路訓練。

First Layer:整個網路出了第一層以外,其餘層的weights和輸出activation都是二值的。因此,只需要對第一層做一下處理就可以了,論文一圖像為例,轉換成一個8bit的固定輸入,提出演算法4:

理論分析,演算法設計做完之後,就是一些性能分析和實驗驗證,最終得出了我們上面所說的結論:與32bit的DNN相比,BNN佔用的內存減少了32倍,在GPU上的運行速度提升了7倍之多。深度學習模型權重和activation的二值化可以大大減少佔用內存,提升運行速度,使得深度學習模型可以嵌入移動設備運行(手機端,Ipad),確實是不錯的嘗試,也給我們提供實例參考。


推薦閱讀:

番外篇(4)——共軛梯度法入坑
《Teaching-to-Learn and Learning-to-Teach for Multi-label Propagation》閱讀筆記
深度學習進化編年大事記(1943-2016)
Python · 標準庫 collections

TAG:深度学习DeepLearning | 自然语言处理 | 机器学习 |