1. 程式人生 > >caffe中的backward理解

caffe中的backward理解

1. 在本質上backward解決的是導數計算的問題,用的就是BP演算法,所謂的BP演算法就是使用當前層權重對於當前誤差加權然後傳遞到下層節點的一個流程。下圖是caffe的doc中示意的,這裡面有兩部分,一個部分就是向下傳遞的對於g的偏導數,這個數值就是反向傳播的輸出;另外一部分就是在當前層中對於當前權重的求導。


caffe <wbr>study(2) <wbr>關於forward和backward <wbr>- <wbr>backward


2. 下面將通過一個簡單的三層網路來說明一下caffe的backward過程所傳遞的內容的具體形式。


a. 如下圖所示,這是一個簡單的NN的結構,其輸出層就一個節點。其中x代表輸入資料,a代表每一層的啟用值,對應h。在下面的描述中採用z來對應g。

caffe <wbr>study(2) <wbr>關於forward和backward <wbr>- <wbr>backward


在加入正則項之後,loss形式為

caffe <wbr>study(2) <wbr>關於forward和backward <wbr>- <wbr>backward

b.  對於輸入層net的求導


對於第n_{l} 輸出層 的每個輸出單元i ,我們根據以下公式計算對於z的導數,把z看成一個區域性net的話,這個就是對於net進行的求導。

caffe <wbr>study(2) <wbr>關於forward和backward <wbr>- <wbr>backward
其中s_{nt}為當前輸出層的神經元的個數,a為第j個神經元的啟用值,這個值是通過啟用函式f計算得到(如的logistic函式),f的輸入就是z。因為當  i != j  的時候,導數為0,因此得到了第三行的求導結果。

c. 對於非輸入層net的求導 caffe <wbr>study(2) <wbr>關於forward和backward <wbr>- <wbr>backward
根據基本的鏈式法則可以推導到倒數第二行,裡面的導數部分就變成了當前層的每一個神經元z_{j}對於下一層的z_{i}求導的一個過程,將z_{j}做一個展開,就是z_{i}層啟用的一個加權和,如b所示,得到了最終的對於非輸入層的導數。其中W_{ji}指的的是輸出層和隱藏層之間的權重連結。
這個導數分為兩部分,一部分就是括號內的,是上層導數在當前層節點上的加權和,這個定義了誤差專遞的方式,也就是反向傳播的一個核心;第二項就是當前層啟用函式對於net的導數。這樣就得到了一個反向轉播的遞推公式。caffe中backward的就是在傳遞每一個節點的導數的計算值。

d. 在傳遞完