反向傳播算法(過程及公式推導)

1、反向傳播的由來

在咱們開始DL的研究以前,須要把ANN—人工神經元網絡以及bp算法作一個簡單解釋。
關於ANN的結構,我再也不多說,網上有大量的學習資料,主要就是搞清一些名詞:
輸入層/輸入神經元,輸出層/輸出神經元,隱層/隱層神經元,權值,偏置,激活函數

接下來咱們須要知道ANN是怎麼訓練的,假設ANN網絡已經搭建好了,在全部應用問題中(無論是網絡結構,訓練手段如何變化)咱們的目標是不會變的,那就是網絡的權值和偏置最終都變成一個最好的值,這個值可讓咱們由輸入能夠獲得理想的輸出,因而問題就變成了y=f(x,w,b)(x是輸入,w是權值,b爲偏置,全部這些量均可以有多個,好比多個x1,x2,x3……最後f()就比如咱們的網絡它必定能夠用一個函數來表示,咱們不須要知道f(x)具體是怎樣的函數,從小咱們就認爲只要是函數就必定要是可表示的,像f(x)=sin(x)同樣,可是請擯棄這樣的錯誤觀念,咱們只須要知道一系列的w和b決定了一個函數f(x),這個函數讓咱們由輸入能夠計算出合理的y)

最後的目標就變成了嘗試不一樣的w,b值,使得最後的y=f(x)無限接近咱們但願獲得的值t

可是這個問題依然很複雜,咱們把它簡化一下,讓(y-t)^2的值儘量的小。因而原先的問題化爲了C(w,b)=(f(x,w,b)-t)^2取到一個儘量小的值。這個問題不是一個困難的問題,不論函數如何複雜,若是C下降到了一個沒法再下降的值,那麼就取到了最小值(假設咱們不考慮局部最小的狀況)html

如何降低?數學告訴咱們對於一個多變量的函數f(a,b,c,d,……)而言,咱們能夠求得一個向量,它稱做該函數的梯度,要注意的是,梯度是一個方向向量,它表示這個函數在該點變化率最大的方向(這個定理不詳細解釋了,能夠在高等數學教材上找到)因而C(w,b)的變化量ΔC就能夠表示成算法

其中網絡

是該點上的微小變化,咱們能夠隨意指定這些微小變化,只須要保證ΔC<0就能夠了,可是爲了更快的降低,咱們爲什麼不選在梯度方向上作變化呢?函數

事實上,梯度降低的思想就是這樣考慮的,咱們使得從而保證C一直遞減,而對於w來講只要每次更新便可。

ok,到這裏,彷佛全部的問題都解決了,讓咱們從新整理一下思緒,咱們將問題轉化了不少步:
網絡權值偏置更新問題 ==> f(x,w,b)的結果逼近t ==> C(w,b)=(f(x,w,b)-t)^2取極小值問題 ==> C(w,b)按梯度降低問題 ==>取到極小值,網絡達到最優

千萬別忘了一點!!推導基於一個前提:咱們已經提早知道了當前點的梯度。然而事實並不是如此!!
這個問題困擾了NN研究者多年,1969年M.Minsky和S.Papert所著的《感知機》一書出版,它對單層神經網絡進行了深刻分析,而且從數學上證實了這種網絡功能有限,甚至不能解決象"異或"這樣的簡單邏輯運算問題。同時,他們還發現有許多模式是不能用單層網絡訓練的,而對於多層網絡則沒有行之有效的低複雜度算法,最後他們甚至認爲神經元網絡沒法處理非線性問題。然而於1974年,Paul Werbos首次給出瞭如何訓練通常網絡的學習算法—back propagation。這個算法能夠高效的計算每一次迭代過程當中的梯度,讓以上咱們的推導得以實現!!
不巧的是,在當時整我的工神經網絡社羣中無人知曉Paul所提出的學習算法。直到80年代中期,BP算法才從新被David Rumelhart、Geoffrey Hinton及Ronald Williams、David Parker和Yann LeCun獨立發現,並得到了普遍的注意,引發了人工神經網絡領域研究的第二次熱潮。學習

 

2、原理的引入

上面已經提到,所謂反向傳播,就是計算梯度的方法。對於反向傳播,先不急着介紹它的原理,不少文章直接引入公式,反而使得咱們很難去理解。這裏先引入知乎上某位大神的回答。spa

 

來源:知乎https://www.zhihu.com/question/27239198?rf=24827633.net

假設輸入a=2,b=1,在這種狀況下,咱們很容易求出相鄰節點之間的偏導關係3d

利用鏈式法則:htm

\frac{\partial e}{\partial a}=\frac{\partial e}{\partial c}\cdot \frac{\partial c}{\partial a}以及\frac{\partial e}{\partial b}=\frac{\partial e}{\partial c}\cdot \frac{\partial c}{\partial b}+\frac{\partial e}{\partial d}\cdot \frac{\partial d}{\partial b}blog

 

\frac{\partial e}{\partial a}的值等於從a到e的路徑上的偏導值的乘積,而\frac{\partial e}{\partial b}的值等於從b到e的路徑1(b-c-e)上的偏導值的乘積加上路徑2(b-d-e)上的偏導值的乘積。也就是說,對於上層節點p和下層節點q,要求得\frac{\partial p}{\partial q},須要找到從q節點到p節點的全部路徑,而且對每條路徑,求得該路徑上的全部偏導數之乘積,而後將全部路徑的 「乘積」 累加起來才能獲得\frac{\partial p}{\partial q}的值。

這種狀況下偏導很容易求得,由於咱們已經知道網絡的函數關係式,e=(a+b)*(b+1),這是一個沒有權值干預,已知輸入與輸出之間關係的網絡。實際當中咱們只是知道e與輸出之間的關係,就是上面說的C=(y-t)^2,並且會有成千上萬的權值和偏置干預求導的過程。那麼換個思路,能不能求輸出對結果的偏導呢?

再利用上圖的關係。節點c對e偏導2並將結果堆放起來,節點d對e偏導3並將結果堆放起來,至此第二層完畢,求出各節點總堆放量並繼續向下一層發送。節點c向a發送2*1並對堆放起來,節點c向b發送2*1並堆放起來,節點d向b發送3*1並堆放起來,至此第三層完畢,節點a堆放起來的量爲2,節點b堆放起來的量爲2*1+3*1=5, 即頂點e對b的偏導數爲5。簡要的歸納,就是從最上層的節點e開始,以層爲單位進行處理。對於e的下一層的全部子節點,將1乘以e到某個節點路徑上的偏導值,並將結果「堆放」在該子節點中。等e所在的層按照這樣傳播完畢後,第二層的每個節點都「堆放"些值,而後咱們針對每一個節點,把它裏面全部「堆放」的值求和,就獲得了頂點e對該節點的偏導。而後將這些第二層的節點各自做爲起始頂點,初始值設爲頂點e對它們的偏導值,以"層"爲單位重複上述傳播過程,便可求出頂點e對每一層節點的偏導數。

3、一個很好的例子

如今,咱們再把權值考慮進去,如下是一個很好的例子,有助於咱們去理解反向傳播

假設,你有這樣一個網絡層:

第一層是輸入層,包含兩個神經元i1,i2,和截距項b1;第二層是隱含層,包含兩個神經元h1,h2和截距項b2,第三層是輸出o1,o2,每條線上標的wi是層與層之間鏈接的權重,激活函數咱們默認爲sigmoid函數。

  如今對他們賦上初值,以下圖:

  其中,輸入數據  i1=0.05,i2=0.10;

     輸出數據 o1=0.01,o2=0.99;

     初始權重  w1=0.15,w2=0.20,w3=0.25,w4=0.30;

           w5=0.40,w6=0.45,w7=0.50,w8=0.88

 

  目標:給出輸入數據i1,i2(0.05和0.10),使輸出儘量與原始輸出o1,o2(0.01和0.99)接近。

 

  Step 1 前向傳播

  1.輸入層---->隱含層:

  計算神經元h1的輸入加權和:

 

神經元h1的輸出o1:(此處用到激活函數爲sigmoid函數):

 

同理,可計算出神經元h2的輸出o2:

2.隱含層---->輸出層:

  計算輸出層神經元o1和o2的值:

  

 

這樣前向傳播的過程就結束了,咱們獲得輸出值爲[0.75136079 , 0.772928465],與實際值[0.01 , 0.99]相差還很遠,如今咱們對偏差進行反向傳播,更新權值,從新計算輸出。

 Step 2 反向傳播

1.計算總偏差

總偏差:(square error)

可是有兩個輸出,因此分別計算o1和o2的偏差,總偏差爲二者之和:

 

2.隱含層---->輸出層的權值更新:

以權重參數w5爲例,若是咱們想知道w5對總體偏差產生了多少影響,能夠用總體偏差對w5求偏導求出:(鏈式法則)

下面的圖能夠更直觀的看清楚偏差是怎樣反向傳播的:

 


 

如今咱們來分別計算每一個式子的值:

計算

計算

(這一步實際上就是對sigmoid函數求導,比較簡單,能夠本身推導一下)

 

計算

最後三者相乘:

這樣咱們就計算出總體偏差E(total)對w5的偏導值。

回過頭來再看看上面的公式,咱們發現:

爲了表達方便,用來表示輸出層的偏差:

所以,總體偏差E(total)對w5的偏導公式能夠寫成:

若是輸出層偏差計爲負的話,也能夠寫成:

最後咱們來更新w5的值:

(其中,是學習速率,這裏咱們取0.5)

同理,可更新w6,w7,w8:

 

3.隱含層---->隱含層的權值更新:

 方法其實與上面說的差很少,可是有個地方須要變一下,在上文計算總偏差對w5的偏導時,是從out(o1)---->net(o1)---->w5,可是在隱含層之間的權值更新時,是out(h1)---->net(h1)---->w1,而out(h1)會接受E(o1)和E(o2)兩個地方傳來的偏差,因此這個地方兩個都要計算。

 

 

計算

先計算

同理,計算出:

二者相加獲得總值:

再計算

再計算

最後,三者相乘:

 爲了簡化公式,用sigma(h1)表示隱含層單元h1的偏差:

最後,更新w1的權值:

同理,額可更新w2,w3,w4的權值:

這樣偏差反向傳播法就完成了,最後咱們再把更新的權值從新計算,不停地迭代,在這個例子中第一次迭代以後,總偏差E(total)由0.298371109降低至0.291027924。迭代10000次後,總偏差爲0.000035085,輸出爲[0.015912196,0.984065734](原輸入爲[0.01,0.99]),證實效果仍是不錯的

4、最通常的狀況

 
        上圖是一個三層人工神經網絡,layer1至layer3分別是輸入層、隱藏層和輸出層。如圖,先定義一些變量:
         表示第l-1層的第 k個神經元鏈接到第 l層的第 j個神經元的權重;
         表示第 l層的第 j個神經元的偏置;
         表示第 l層的第 j個神經元的輸入,即
         
         表示第l 層的第 j個神經元的輸出,即
         
        其中 表示激活函數。
L表示神經網絡的最大層數,也能夠理解爲輸出層。
將第l層第 j個神經元中產生的錯誤(即實際值與預測值之間的偏差)定義爲:
         
代價函數,依然用C來表示
 

以上4個方程中,第一個方程其實不難理解,就是求輸出對估價函數C的偏導。

惟一比較困難的,就是第二個方程,它給出了根據下一層的錯誤量δl+1計算δl的等式。爲證實該等式,咱們先依據δkl+1=∂C/∂zkl+1從新表達下等式δlj =∂C/∂zlj。這裏能夠應用鏈式法則:

在最後一行,咱們互換了下表達式右側的兩項,並取代了 δkl+1的定義。爲了對最後一行的第一項求值,注意:
做微分,咱們獲得

代回 (42) 咱們獲得

 這就是以份量形式呈現的 (BP2)。後兩式在完成了BP2證實以後就不太難了,留給讀者來證實。

 

 

4、證實

反向傳播算法(Backpropagation)是目前用來訓練人工神經網絡(Artificial Neural Network,ANN)的最經常使用且最有效的算法。其主要思想是:
(1)將訓練集數據輸入到ANN的輸入層,通過隱藏層,最後達到輸出層並輸出結果,這是ANN的前向傳播過程;
(2)因爲ANN的輸出結果與實際結果有偏差,則計算估計值與實際值之間的偏差,並將該偏差從輸出層向隱藏層反向傳播,直至傳播到輸入層;
(3)在反向傳播的過程當中,根據偏差調整各類參數的值;不斷迭代上述過程,直至收斂。
 
 
        反向傳播算法的思想比較容易理解,但具體的公式則要一步步推導,所以本文着重介紹公式的推導過程。
 
 

1. 變量定義

 
        上圖是一個三層人工神經網絡,layer1至layer3分別是輸入層、隱藏層和輸出層。如圖,先定義一些變量:
         表示第 層的第 個神經元鏈接到第 層的第 個神經元的權重;
         表示第 層的第 個神經元的偏置;
         表示第 層的第 個神經元的輸入,即
         表示第 層的第 個神經元的輸出,即
        其中 表示激活函數。
 

2. 代價函數

        代價函數被用來計算ANN輸出值與實際值之間的偏差。經常使用的代價函數是二次代價函數(Quadratic cost function):
        其中, 表示輸入的樣本, 表示實際的分類, 表示預測的輸出, 表示神經網絡的最大層數。
 

3. 公式及其推導

        本節將介紹反向傳播算法用到的4個公式,並進行推導。 若是不想了解公式推導過程,請直接看第4節的算法步驟。
        首先,將第 層第 個神經元中產生的錯誤(即實際值與預測值之間的偏差)定義爲:
 
 
        本文將以一個輸入樣本爲例進行說明,此時代價函數表示爲:
 
公式1(計算最後一層神經網絡產生的錯誤):
 
 
        其中, 表示Hadamard乘積,用於矩陣或向量之間點對點的乘法運算。公式1的推導過程以下:
 
 
公式2(由後往前,計算每一層神經網絡產生的錯誤):
 
 
        推導過程:
 
 
公式3(計算權重的梯度):
 
 
        推導過程:
 
 
公式4(計算偏置的梯度):
 
 
        推導過程:
 
 

4. 反向傳播算法僞代碼

 
  • 輸入訓練集
 
  • 對於訓練集中的每一個樣本x,設置輸入層(Input layer)對應的激活值
    • 前向傳播:
, 
    • 計算輸出層產生的錯誤:
    • 反向傳播錯誤:
 
  • 使用梯度降低(gradient descent),訓練參數:
 
 
 
相關文章
相關標籤/搜索