1. 程式人生 > >深度學習演算法實踐8---BP演算法詳解

深度學習演算法實踐8---BP演算法詳解

BP演算法是關於誤差的反向傳播演算法,就是從輸出層開始,將結果與預期結果相比較,求出誤差,然後按照梯度最大下降方向,調整神經元的聯接權值,然後依次逐層調整各層之間的連線權值,對於批量學習方式而言,不斷重複上述過程,直到誤差達到足夠小時為止。

對於輸出層而言,我們可以直接使用在上一篇博文中關於感知器模型的演算法,BP演算法的難點在於,如何處理隱藏層,因為隱藏層沒有正確的輸出資訊用來計算誤差。

下面我們將從輸出層開始,推匯出BP演算法。在rwy推導演算法之前,我們先來定義一下表示方法,和原來一樣,我們用i來表示輸入(前一層)訊號的序號,我們用上標n來是第n個訓練樣本,我們用下標j來表示輸出層(後一層)的神經元編號,當前層用l來表示,前一層用l-1來表示。

我們先來看輸出層,對於輸出層,由於我們知道每個訓練樣本對應的希望輸出,所以我們可以很容易定義出對於每個訓練樣本的誤差:

 式8.1

式中j為輸出層神經元序號,L為輸出層神經元數量。我們假設輸出層為l層,其前一層為隱藏層記為l-1層,則從l-1層第i個節點到l層(輸出層)第j個節點的連線權值記為,我們的目標就是根據誤差值士求出的調整量。

對輸出層每個神經元,我們先求誤差對於每個節點的偏導:

 式8.2

求誤差對每個輸出節點輸入量的偏導:

 式8.3

求誤差對每個連線權值的偏導:

 式8.4

可以通過將式8.3帶入到式8.4求出其值,因為有公式:

 式8.5

即可以求出所有輸出層相關的連線權值的調整值。

這樣我們就完成了輸出層的處理,下面我們來看與輸出層直接相連的前一層l-1,其神經元序號為i,我們也首先對每個神經元求誤差對於輸出量的偏導:

 式8.6

式8.6中的最後一項,在我們處理輸出層時已經計算出來了,這時可以直接使用。

接下來我們求誤差對於輸入量的偏導:

 式8.7

其中最後一項已經由式8.6式計算出來。

求誤差對每個連線權值的偏導:

 式8.8

式8.8中最後一項在式8.7中已經計算完成,因此權值調整公式為:

 式8.9

將式8.8代入到式8.9中,即可計算出輸出層前一層l-1層所有連線權值的調整量。

其實上述公式已經完全匯出了BP演算法,但是為了直觀起見,我們再求一下l-2層的計算公式,這是隱藏層的最典型形式。假設l-2層神經元的序號為h。

首先對l-2層每個神經元,求出誤差對輸出量的偏導:

式8.10

式8.10中的最後一項,在第l-1層時已經計算完成,在這裡可以直接使用。

接著我們求出誤差對l-2層的輸入量的偏導:

 式8.11

式8.11的最後一項可以通過式8.10計算得到。

接著求誤差對第個連線權值的偏導:在這裡我們假設l-3層的神經元序號為g

 式8.12

式8.12的最後一項可以通過式8.11計算得到,因此權值調整公式為:

 式8.13

至此,我們已經將多層網路的BP演算法推導過程完全做完了,可以看出,既使是最簡單的神經網路演算法,也需要複雜的推導過程。而且,細心的讀者也許可以發現,我們上面的推導過程,實際上只針對線上學習方式,既針對每個訓練樣本的誤差調整網路連線權值。我們知道這種方式可能會有權值調整太隨機而且低效,因此需要採用批量學習方式,那麼上棕推導過程還會更加複雜,在這裡就不進行推導了,因為數學並不是我們關注的焦點。

其實這裡還沒完,對於數學家來說,這個演算法雖然出來了,還需要證明採用這種方法,在有限次迭代內,可以達到全域性最優解,既需要證明其收斂性,太難了,就不涉及了。

在下一篇博文中,我們將採用Theano框架,實現一個簡單的多層前向網路,大家來可以看一下,理論與實際是如何結合在一起的。