Training Neural Networks with Weights and Activations Constrained to +1 or -1論文閱讀
確定性與隨機二值化
決定式的二值化:
隨機式的二值化:
第二種方法雖然看起來比第一種更合理,但是在實現時卻有一個問題,那就是每次生成隨機數會非常耗時,所以一般使用第一種方法。
梯度計算與累積(梯度計算與累加)
雖然BNN的引數和各層的啟用值是二值化的,但梯度不得不用較高精度的實數而不是二值進行儲存。
通過離散化傳播梯度(離散化梯度傳播)
如何對權和啟用進行二值化。如下圖左,二值化函式很簡單,就是一個符號函式。但是作者就想了啊,符號函式不好進行梯度的反向傳播啊,因此就把它近似成了右邊的Htanh(X)的函式,這樣在[-1,1]區間內導數就等於1。
在具體的演算法使用中於隱含層單元:
啟用值,直接使用決定式的二值化函式得到二值化的值。
對於權重:
在更新引數時,要把超出[-1,1]的部分給裁剪了。即權重引數始終在[-1,1]之間。
在使用引數時,要將引數進行二值
前向傳播:
那麼除第一層(輸入層)以外,每一層的前向傳播過程如下:
首先權重WK 經過二值化,然後與上層二值化後的啟用值ABK - 1 相乘,再進項BatchNormalization得到這一層的啟用值AK ,由於BatchNorm的引數θk的不是二值的,因此AK 也不是二值的,我們需要再對它做二值化得到二值化後的啟用值
向後傳播:
然後反向傳播過程如下,要注意的是權重和啟用值的更新並不是二值的,因為如果這樣做的話誤差會很大。
第一層
儘管所有的層次的啟用和引數都是二值化的,但第一層的輸入卻是連續值的,因為是畫素。若要整個網路都是二值化的,只需將輸入變化一下即可。
使用8位數字來表示一個畫素,那麼輸入就是一個img_height×img_width×8的向量,而權重引數是一個img_height×img_width的全1向量。比如minist:28x28的影象,輸入就是28x28x8bit位寬的向量。
各層計算流程如下:
Batch Normalization
參考:https://blog.csdn.net/whitesilence/article/details/75667002
BN 最大的作用就是加速學習,減少權重尺度影響,帶來一定量的正則化,可以提高網路效能,但是,BN 涉及很多矩陣運算(matrix multiplication),會降低運算速度,因此,提出了一種 shift-based Batch Normalization。
因為BN的引數θ(k)不是二值的,所以BN的輸出a(k)也不是二值的,需要在進行一次Binarize操作轉換成二值輸出。
shift-based Batch Normalization:
使用SBN來替換傳統的BN,SBN最大的優勢就是幾乎不需要進行矩陣運算,而且還不會對效能帶來損失。(AP2:2的冪次。)
Hardware implementation of AP2 is as simple as extracting the index of the most significant bit from the number’s binary representation
在FPGA上實現是利用閾值判斷,目前還不清楚具體怎麼提取閾值!
結論:
二值神經網路在深度神經網路的正向傳播的過程中將所有的實數權重值量化為-1或者1,並利用符號運算操作(Sign Operation)來代替卷積層和全連線層中的乘法操作,但在權重更新時仍然利用保留的實數形式的權重來進行梯度的積累以保證模型的收斂。