1. 程式人生 > >二值化神經網路系列一:二值化神經網路介紹

二值化神經網路系列一:二值化神經網路介紹

二值化神經網路以其高模型壓縮率和快計算速度的潛在優勢,近些年成為深度學習的熱門研究方向。本篇博文將對二值化神經網路做一個詳細的介紹。

1. 二值化神經網路簡介

  二值化神經網路,是指在浮點型神經網路的基礎上,將其權重矩陣中權重值和各個啟用函式值同時進行二值化得到的神經網路。二值化神經網路具有很好的特性,具體體現在:

  • 通過將權重矩陣二值化,一個權重值只佔用一個位元,相比於單精度浮點型權重矩陣,網路模型的記憶體消耗理論上能減少32倍,因此二值化神經網路在模型壓縮上具有很大的優勢。
  • 當權重值和啟用函式值同時進行二值化之後,原來32個浮點型數的乘加運算,可以通過一次異或運算(xnor)和一次popcnt運算解決,在模型加速上具有很大的潛力。

  通過以上分析可以看出,二值化神經網路在模型壓縮和模型加速方面都具有非常明顯的優勢。研究二值化神經網路對解決當前浮點型神經網路模型應用到嵌入式或移動場景下 (例如手機端、可穿戴裝置、自動駕駛汽車等) 存在的模型過大,計算密度過高等問題,具有很重大的意義。一種全連線的二值化神經網路示例如圖1所示。二值化神經網路中的二值化通常指將權重值和啟用函式值二值化到+1和-1實現。

圖一: 全連線二值化神經網路示例

2. 神經網路的二值化方法

  二值化神經網路以其高的模型壓縮率和在前傳中計算速度上的優勢,近幾年格外受到重視和發展,成為神經網路模型研究中的非常熱門的一個研究方向。 第一篇真正意義上將神經網路中的權重值和啟用函式值同時做到二值化的是Bengio組2016年發表的名為

《Binarynet: Training deep neural networks with weights and activations constrained to +1 or -1》的一篇論文。這篇論文第一次給出了關於如何對網路進行二值化和如何訓練二值化神經網路的方法。

  如何對浮點型的神經網路進行二值化? BinaryNet這篇文章提供了兩種思路,第一種思路是概率化的方式


即首先將權重值或者啟用函式值通過例如sigmoid函式轉為一種概率,然後按照概率取樣為+1或者-1。

  另一種思路是採用決定化的方式


即直接由浮點型權重值或者啟用函式值的正負號決定二值化為+1還是-1。 由於頻繁的取樣在面臨大量引數的網路和大量的輸入資料時非常耗時,所以這篇論文推薦使用決定化的方式。

3. 訓練二值化神經網路

  如何訓練二值化神經網路? BinaryNet這篇論文提出了在用BP演算法訓練神經網路時,前傳和反傳區別進行的方式,即在整個訓練過程中,即保留浮點型的權重值,又保留二值化的權重值。

  在前傳過程中,根據浮點型的權重值和浮點型的啟用函式值分別利用決定化的方式對其進行二值化,利用二值化後的權重值和啟用函式值進行運算。即前傳過程如下: 


  在反傳過程中,對決定化方式中的Sign函式進行鬆弛化,即前傳中是: 


反傳中對已知q的梯度對r求梯度時,Sign函式鬆弛為:
即當r的絕對值小於等於1時,r的梯度等於q的梯度,否則r的梯度為0。 最後求得各層浮點型權重值對應的梯度和浮點型啟用函式值對應的殘差,然後用SGD方法或者其他梯度更新方法對浮點型的權重值進行更新,以此不斷的進行迭代,直到loss不再繼續下降。

求各層梯度方式如下: 


梯度更新方式如下: