# BinaryConnect: Training Deep Neural Networks with binary weights during propagations 作者:Matthieu Courbariaux, Yoshua Bengio, Jean-Pierre David 論文連結:https://arxiv.org/abs/1511.00363 整理by: [chewei](https://hackmd.io/@WTuIbJANSB26DiAX-WL4Sg) - - - - - ## 0. 論文貢獻 本篇論文提出了BinaryConnect的 ***"方法"*** 來實現把在訓練中forward跟back propagations的權重以**二元化**後**累加**(accumulated)的方式代替**乘法**運算(multiply-accumulate operations) $\Rightarrow$大量降低耗電(power-hungry)及空間(space)使用率 ## 1. 本篇論文的研究基石 ***Noisy weights:*** 指的是權重參數加入隨機性的情況,這種隨機性可能來自於訓練數據的內在噪聲、初始化過程、或是訓練過程中使用的某些正則化技術。這種噪聲有時可以幫助模型避免過度適應訓練數據(overfitting)。 在Stochastic Gradient Descent (SGD)中,***保持期望值的高精度比高精度來的重要***,也就是只要權重的***期望值***相同,加入Noisy weights是可以有效防止overfitting發生的。 回到論文主題Binarize來看,其實這種二元化就是將權重離散化,跟Noisy weights概念相似,因此也是可以達到防止***overfitting且提高效率***的效果。 ## 2. Deterministic vs stochastic binarization >此部份與下一篇BNNs相同,在BNNs中將會探討何者較適合被用在架構內 ***Deterministic function(AKA Sign function):*** $$x^b = \text{Sign}(x) = \begin{cases} +1 & \text{if } x \geq 0, \\ -1 & \text{otherwise}, \end{cases} $$ $x^b$ 是binarized後的變數 x 是轉換前的真實變數 ***Stochastic function:*** $$x^b = \begin{cases} +1 & with \, probability \,\, p=\sigma(x),\\ -1 & with \, probability \,\, 1-p, \end{cases} $$ ***$\sigma$是"hard sigmoid" 函式:*** $$ \sigma(x)=\text{clip}( \frac{x+1}{2} \quad,0,1)= \text{max}(0,\text{min}(1,\frac{x+1}{2})) $$ ## 3. Propagations vs updates > 探討在"參數傳遞"和"SGD更新參數"時是否皆有必要進行離散化(二元化)。 **前向傳播(forward-propagation):** 給定DNN的輸入後,一層一層**計算單元**(unit)**的激活函數**(activations)直到最後一層。 **後向傳播(back-propagation):** 給定DNN的輸出後,一層一層往前**計算梯度**(gradient)直到第一層。 **參數更新(parameter update):** 在每一層計算完梯度後,會以剛才1.**計算好的梯度**2.**先前的參數值**用來**更新參數**(update parameter)。 $\rightarrow$ 作者根據以下演算法各步驟拆分開來看,發現在**更新參數**(parameter update)時,SGD所需的較高的精度來進行細微的改變(這些微小的改變是通過梯度下降獲得的),因此在這個部份的參數**不會被Binarize**。 $\rightarrow$ 只有在**前向傳播(forward-propagation)**,**後向傳播(back-propagation)** 時的參數會做**Binarize** <details> <summary>SGD with BinaryConnect演算法</summary> **Requitre:** 1. minibatch 的輸入及目標 2. 前一個參數$w_{t-1}$(weights) 3. $b_{t-1}$(biases) 4. 學習率$\eta$ **Ensure:** 更新後參數$w_t$和$b_t$ 1.**前向傳播(forward-propagation):** $$ \begin{align*} & w_b\leftarrow\text{binarize}(w_{t-1}) \\ & \text{ For } k=1 \text{ to } \text{ L ,}\text{ compute } a_k \text{ knowing } a_{k-1},w_b \text{ and } B_{t-1} \end{align*} $$ 2.**後向傳播(back-propagation):** $$ \begin{align*} & \text{Initialize output layer's activations gradient}\frac{\partial C}{\partial a_L} \\ & \text{For k=L to 2 ,compute}\frac{\partial C}{\partial a_{k-1}}\text{ Knowing }\frac{\partial C}{\partial a_k}\text{ and }w_b \end{align*} $$ 3.**參數更新(parameter update):** $$ \begin{align*} & \text{Compute}\frac{\partial C}{\partial w_b}\text{ and }\frac{\partial C}{db_{t-1}}\text{Knowing}\frac{\partial C}{\partial a_k}\text{and}a_{k-1} \\ & w_t\leftarrow\text{clip}(w_{t-1}-\eta\frac{\partial C}{\partial w_b}) \\ & b_t\leftarrow b_{t-1}-\eta\frac{\partial C}{\partial b_{t-1}} \end{align*} $$ </details> ## 4.Clipping 在每次**參數更新後**對其做clipping達到正則化效果,並把參數限制在+/-1,其作法如第2.點公式。 ![image](https://hackmd.io/_uploads/H1a-AcHT6.png) ## 5.實驗 1.以Deterministic function的方式做二元化,並且在inference時使用**二元化後的參數進行檢測** 。 2.以Stochastic function的方式做二元化,但此二元化計算完後會將權重**轉換回real-valued的權重進行檢測** 。 結果如下圖: ![image](https://hackmd.io/_uploads/r1ch9iHTp.png) $$\text{Error Rate}$$ > 二元化後的準確率不減反增,作者認為這是因為二元化可視為一種Dropout ## Reference Dropout DropConnect