十分鐘看懂神經網絡反向傳輸算法

昨天面試被問到如何推導BP(反向傳輸)算法,頓時矇住了,大致是知道反向傳輸算法的過程的,可是用語言描述出來,確實有些困難。回來後看了些博文,發現有的博文中公式推導過於複雜,不易理解,遂綜合了網絡中其餘博文和斯坦福大學CS231n課程中的內容,整理了一份反向傳輸算法的通俗解釋,若有錯誤,請各位網友指出。html

1、反向傳輸(BP)算法的做用是什麼?

首先咱們要知道咱們的優化目標是什麼,對於神經網絡模型的優化實質上就是對總體損失函數 L(成本函數) 的優化面試

其中 L爲樣本集中第 i 個樣本的損失值,(xi,yi)爲第i個樣本。算法

損失函數 L 的自變量是網絡中全部的參數,訓練的目的是找到一組參數,使得損失函數 L 達到最小值(或者局部最小值)。一般使用梯度降低算法進行優化參數,對於具體的優化算法,這裏再也不敘述,具體能夠參看深度學習——優化器算法Optimizer詳解BGDSGDMBGDMomentumNAGAdagradAdadeltaRMSpropAdam一文。這些算法都是闡述瞭如何更好的使用梯度信息來快速優化成本函數、找到最有解,但這些算法的前提都是得到了成本函數的梯度值,對於深度網絡可能有上億的參數須要優化,如何高效的求解出 L 對這上億參數的偏導數,便成爲一個難題,反向傳輸(BP)算法即用來高效的計算這些參數的偏導數,進而得出成本函數(損失函數L)的梯度。網絡

補充:

對於欲優化的代價函數,爲權重的函數C=C(W),是一個很是複雜的複合函數,直接使用鏈式法則對各參數求偏導很是複雜。若是使用導數定義進行樹數值求導,一個很明顯的計算方式是使用近似:機器學習

其中是一個大於零的小正數。換句話說,咱們能夠經過計算兩個差距很小的wj的代價,而後利用上式來估計。這個方法看起來很不錯,使用的是導數的定義求法,可是計算過於複雜,設想咱們的神經網絡中有100萬個待優化的參數,計算一次梯度就要重複計算100萬次。進而對於每個樣本,都要在神經網絡中向前傳播100萬次。並且還須要計算C(W),至關於要一百萬零一次前向傳播。函數

反向傳播的優勢在於他盡力用一次前向傳播加一次反向傳播就能夠同時計算出全部的偏導數,大體來說,反向傳播所須要的總計算量與前向傳播的計算量基本相等,緣由在於前向傳播時主要的計算量在於權重矩陣的乘法計算,反向傳播時主要的計算量在於權重矩陣轉置的乘法,很明顯,它們的計算量差很少。利用反向傳播算法求成本函數的梯度,大大減少了計算量,使神經網絡優化更快!學習

舉個例子:優化

2、反向傳輸算法過程

1.鏈式求導

首先咱們回顧一下微積分中對於複合函數的求導過程,對於任意複合函數,例如:spa

這就是咱們常說的鏈式求導法則。反向傳輸算法正是利用了這種鏈式求導法則。3d

2.用計算圖來解釋幾種求導方法

2.1 計算圖

式子 e=(a+b)*(b+1) 能夠用以下計算圖表達:

 

令a=2,b=1則有:

如何在計算圖上表達「求導」呢? 導數的含義是因變量隨自變量的變化率,例如 \frac{\partial y }{\partial x} = 3  表示當x變化1個單位,y會變化3個單位。 微積分中已經學過:加法求導法則是 \frac{\partial}{\partial a}(a+b) = \frac{\partial a}{\partial a} + \frac{\partial b}{\partial a} = 1 乘法求導法則是 \frac{\partial}{\partial u}uv = u\frac{\partial v}{\partial u} + v\frac{\partial u}{\partial u} = v 。 咱們在計算圖的邊上表示導數或偏導數:\frac{ \partial e }{ \partial c } , \frac{ \partial e }{ \partial d }, \frac{ \partial c }{ \partial a }, \frac{ \partial c }{ \partial b }, \frac{ \partial d }{ \partial b } 以下圖

那麼 \frac{ \partial e  }{ \partial b } 如何求呢? \frac{\partial c }{ \partial b} = 1 告訴咱們1個單位的b變化會引發1個單位的c變換,\frac{\partial e }{ \partial c} = 2告訴咱們 1 個單位的c變化會引發2個單位的e變化。因此 \frac{ \partial e  }{ \partial b } =   \frac{ \partial c }{ \partial b } * \frac{ \partial e  }{ \partial c }   = 1*2 =2 嗎? 答案必然是錯誤。由於這樣作只考慮到了下圖橙色的路徑,全部的路徑都要考慮:\frac{ \partial e  }{ \partial b } =   \frac{ \partial c }{ \partial b } * \frac{ \partial e  }{ \partial c }  +  \frac{ \partial d  }{ \partial b }  *  \frac{ \partial e  }{ \partial d }  =1*2 + 1 * 3 = 5

因此上面的求導方法總結爲一句話就是: 路徑上全部邊相乘,全部路徑相加。不過這裏須要補充一條頗有用的合併策略:

例如:下面的計算圖若要計算\frac{\partial Z}{\partial X}就會有9條路徑:\frac{\partial Z}{\partial X} = \alpha\delta + \alpha\epsilon + \alpha\zeta + \beta\delta + \beta\epsilon + \beta\zeta + \gamma\delta + \gamma\epsilon + \gamma\zeta

若是計算圖再複雜一些,層數再多一些,路徑數量就會呈指數爆炸性增加。可是若是採用合併策略:\frac{\partial Z}{\partial X} = (\alpha + \beta + \gamma)(\delta + \epsilon + \zeta) 就不會出現這種問題。這種策略不是 對每一條路徑都求和,而是 「合併同類路徑」,「分階段求解」。先求X對Y的總影響 (\alpha + \beta + \gamma) 再求Y對Z的總影響 (\delta + \epsilon + \zeta) 最後綜合在一塊兒。

2.2 兩種求導模式:前向模式求導( forward-mode differentiation) 反向模式求導(reverse-mode differentiation)

上面提到的求導方法都是前向模式求導( forward-mode differentiation) :從前向後。先求X對Y的總影響 (\alpha + \beta + \gamma) 再乘以Y對Z的總影響 (\delta + \epsilon + \zeta) 。

另外一種,反向模式求導(reverse-mode differentiation) 則是從後向前。先求Y對Z的影響再乘以X對Y的影響。

前向求導模式追蹤一個輸入如何影響每個節點(對每個節點進行 \frac{\partial}{\partial X}操做)反向求導模式追蹤每個節點如何影響一個輸出(對每個節點進行 \frac{\partial Z}{\partial}操做)。通俗點理解,前向求導模式和反向求導模式只是求導順序的不一樣,可是順序不一樣運算複雜度也不相同。

2.3 反向求導模式(反向傳播算法)的重要性

讓咱們再次考慮前面的例子:

若是用前向求導模式:關於b向前求導一次

 

 

若是用反向求導模式:向後求導

前向求導模式只獲得了關於輸入b的偏導 \frac{\partial e}{\partial b} ,還須要再次求解關於輸入a的偏導\frac{\partial e}{\partial a} (運算2遍)。而反向求導一次運算就獲得了e對兩個輸入a,b的偏導\frac{\partial e}{\partial a}, \frac{\partial e}{\partial b} (運算1遍)。上面的比較只看到了2倍的加速。但若是有1億個輸入1個輸出,意味着前向求導須要操做1億遍才獲得全部關於輸入的偏導,而反向求導則只需一次運算,1億倍的加速。

當咱們訓練神經網絡時,把「損失「 看做 」權重參數「 的函數,須要計算」損失「關於每個」權重參數「的偏導數(而後用梯度降低法學習)。 神經網絡的權重參數能夠是百萬甚至過億級別。所以反向求導模式(反向傳播算法)能夠極大的加速學習。

用更通俗易懂的話來描述反向傳輸算法,從目標函數開始,逐層向前求解每一層每一個結點(運算)的局部梯度,根據鏈式法則可知,整個網絡中成本函數對於某一個參數的偏導數,從成本函數流經本參數全部指路上的偏導數乘積疊加,這樣一次運算就能夠得到全部參數的偏導數,即成本函數的梯度。梯度從後向前逐層傳遞。

經過計算流圖對該算法進行簡要解釋:


 

 附錄:機器學習經常使用求導公式

 X是向量,W是與X無關的矩陣

後兩個很重要!!!

相關文章
相關標籤/搜索