1. 程式人生 > >python實現反向傳播的神經網路演算法

python實現反向傳播的神經網路演算法

吳恩達機器學習在講神經網路的時候講的不是很清楚,而且視訊中的公式有很多錯誤,結合課後的材料和參考別人的實現之後才終於理清了反向傳播演算法的脈絡,下面簡單的說一下反向傳播演算法的原理和相關公式。

第一步:前向傳播

最簡單的神經網路結構就是如下的三層結構,i為輸入層,h為隱藏層,o為輸出層。每一層包含兩個神經元,其中輸入層和隱藏層額外包括一個偏置單元b,偏置單元恆等於1,類似於一個常數項。
這裡寫圖片描述
其中,每個神經元的結構如下,每個神經元主要包含兩個元素,一個是輸入值input(圖上的net),一個是輸出值output(圖上的out),output是通過input帶入啟用函式算出來的,神經網路常見的啟用函式是sigmoid函式,即output=sigmoid(input),通過sigmoid可以把output的值限定在(0,1)之間,以便於分類。
這裡寫圖片描述


通過上一層神經元的output值以及相應的權重weight,可以算出下一層神經元的input值。假設l-1層有m個神經元,l層有n個神經元,那麼l層的input向量可由下面的公式算得,其中l-1層因為有一個偏置單元,因此實際參與計算的神經元是m+1個。
這裡寫圖片描述
其中
(1) 這裡寫圖片描述
代表l層的第i個神經元到l+1層第j個神經元的權重,值得一提的是,因為l層的偏置單元和l+1層的偏置單元之間並沒有權重,因此i=0的時候代表l層的偏置單元,但是j=0的時候代表的是l+1層的第一個神經元而非偏置單元
(2)這裡寫圖片描述
output為一個行向量,output(0,i)代表l層第i個神經元的輸出值,i=0時為偏置單元,也就是output(0,0)=1。
(3)這裡寫圖片描述

input為一個行向量,input(0,j)代表l層第j個神經元的輸入值,j=0時為第一個神經元而不是偏置單元

得到input值之後,再根據sigmoid函式計算output值,之後,還需要向output向量的頭部新增一個值為1的偏置單元才可以用於下一層的計算。
這裡寫圖片描述
輸入層的output向量就是訓練樣本的輸入值加上偏置單元1組成,通過上述公式一層一層的往後遞推,最後便可以算出輸出層的output值,由sigmoid函式的特性可知,輸出層的output值是介於(0,1)之間的,這邊是01分類的最後結果。

第二步:反向傳播

前向傳播的時候,我們通過輸入層的值最後推出了輸出層神經元的值,反向傳播算的不是神經元的值,而是神經元的誤差。很容易算出輸出層的誤差,再通過類似的演算法將輸出層的誤差反向傳遞到第一層隱藏層(輸入層沒有誤差),再根據誤差調節權重。本文只放公式,不再推導公式,文末再貼上公式推導的部落格。

  • cost function
    這裡寫圖片描述
    其中,k是訓練樣本數量,o是輸出向量的維度,sl是l層神經元的數量,target是訓練樣本中已標註好的分類結果,值得注意的是,這裡的正則項並沒有包含偏置單元的權重。
  • 輸出層神經元誤差
    這裡寫圖片描述
    其中,點乘代表向量對應位置相乘,而不是矩陣乘法
  • 隱藏層神經元誤差
    這裡寫圖片描述
    這裡的誤差其實是指神經元input的偏導值,其中,隱藏層l的偏置單元的誤差項也被算了出來,但偏置單元的誤差並不會參與反向傳播的計算,因此,如果在實現演算法的時候用的是矩陣的計演算法則,還需要將偏置單元的誤差從誤差向量中刪掉,讓其變成一個1*m的行向量,不然和權重矩陣的維度對不上。

  • 權重的誤差
    這裡寫圖片描述
    反向傳播的目的實際上就是為了算出權重的偏導值,之前已經算出了神經元的偏導,權重的偏導實際就等於權重箭頭尾部神經元的output值乘上權重箭頭頭部神經元的偏導值。當然,這只是一個樣本的偏導值,吳恩達公開課中採用的是批量梯度下降,因此還需要將所有樣本的偏導累加取平均值,累加項如下所示。
    這裡寫圖片描述
    但上面的還不是最終調整的值,因為cost function裡面還含有為了防止過擬合的正則項,不過正則項的偏導很容易算,因此最終調整的delta值用D表示,如下
    這裡寫圖片描述
    這裡寫圖片描述
    其中,k是訓練樣本的數量,這裡之所以會判斷i=0的真假,是因為cost function裡面正則項是沒有包含偏置單元的權重的,因此偏置單元權重的偏導是不包含對正則項求導的項的。
    最後只要按照如下公式調整權重即可
    這裡寫圖片描述
    其中,alpha是學習速率。通過多次迭代梯度下降,當滿足某個條件時停止迭代,即是最終模型,相關python實現程式碼我已經放在我的github上。
    python程式碼實現
    吳恩達機器學習神經網路程式碼
    參考部落格:
    反向傳播公式推導及舉例
    吳恩達機器學習隨堂材料