多層前饋神經網絡及BP算法

1.多層前饋神經網絡
首先說下多層前饋神經網絡,BP算法,BP神經網絡之間的關係。多層前饋(multilayer feed-forward)神經網絡由一個輸入層、一個或多個隱藏層和一個輸出層組成,後向傳播(BP)算法在多層前饋神經網絡上面進行學習,採用BP算法的(多層)前饋神經網絡被稱爲BP神經網絡。給出一個多層前饋神經網絡的拓撲結構,如下所示:


圖1 多層前饋神經網絡
圖1 多層前饋神經網絡

神經網絡的拓撲結構包括:輸入層的單元數、隱藏層數(如果多於一層)、每個隱藏層的單元數和輸出層的單元數。神經網絡可以用於分類(預測給定元組的類標號)和數值預測(預測連續值輸出)等。


2.後向傳播(BP)算法詳解
(1)初始值權重
神經網絡的權重被初始化爲小隨機數,每個神經元都有一個相關聯的偏置,同樣也被初始化爲小隨機數。
(2)前向傳播輸入
以單個神經網絡單元爲例,如下所示:


這裏寫圖片描述
圖2 神經網絡單元

給定隱藏層或輸出層的單元 j ,到單元 j 的淨輸入 I j ,如下所示:

I j = i w i j O i + θ j

其中, w i j 是由上一層的單元 i 到單元 j 的連接的權重; O i 是上一層的單元 i 的輸出; θ j 是單元 j 的偏置。需要說明的是偏置充當閥值,用來改變單元的活性。
給定單元 j 的淨輸入 I j ,單元 j 的輸出 O j ,如下所示:
O j = 1 1 + e I j

(3)後向傳播誤差

  1. 對於輸出層單元 j ,誤差 E r r j 用下式計算:
    E r r j = O j ( 1 O j ) ( T j O j )

    其中, O j 是單元 j 的實際輸出,而 T j j 給定訓練元組的已知目標值。需要說明的是, O j ( 1 O j ) 是邏輯斯締函數的導數。
  2. 對於隱藏層單元 j ,它的誤差用下式計算:
    E r r j = O j ( 1 O j ) k E r r k w j k

    其中, w j k 是由下一較高層中單元 k 到單元 j 的連接權重,而 E r r j 是單元 k 的誤差。
  3. 權重更新,如下所示:
    Δ w i j = ( l ) E r r j O i w i j = w i j + Δ w i j

    其中, Δ w i j 是權重 w i j 的改變量,變量 l 是學習率,通常取0.0和1.0之間的常數值。
  4. 偏置更新,如下所示:
    Δ θ j = ( l ) E r r j θ j = θ j + Δ θ j

    其中, Δ θ j θ j 的改變量。
  5. 權重和偏置更新
    如果每處理一個樣本就更新權重和偏置,稱爲實例更新(case update);如果處理完訓練集中的所有元組之後再更新權重和偏置,稱爲週期更新(epoch update)。理論上,反向傳播算法的數據推導使用週期更新,但是在實踐中,實例更新通常產生更加準確的結果。

說明:誤差反向傳播的過程就是將誤差分攤給各層所有單元,從而獲得各層單元的誤差信號,進而修正各單元的權值,即權值調整的過程。

(4)終止條件
如果滿足條件之一,就可以停止訓練,如下所示:

  1. 前一週期所有的都太小,小於某個指定的閥值。
  2. 前一週期誤分類的元組百分比小於某個閥值。
  3. 超過預先指定的週期數。

實踐中,權重收斂可能需要數十萬個週期。神經網絡的訓練有很多的經驗和技巧,比如我們就可以使用一種稱爲模擬退火的技術,使神經網絡確保收斂到全局最優。

3.用BP訓練多層前饋神經網絡
舉個例子具體說明使用BP算法訓練多層前饋神經網絡的每個細節,如下所示:


這裏寫圖片描述
圖3 用BP算法訓練多層前饋神經網絡

設置學習率爲0.9,第一個訓練元組爲 X = { 1 , 0 , 1 } ,其類標號爲1。神經網絡的初始權重和偏置值如表1所示:


這裏寫圖片描述
表1 初始輸入、權重和偏置值

根據給定的元組,計算每個神經元的淨輸入和輸出,如表2所示:


這裏寫圖片描述
表2 淨輸入和輸出的計算

每個神經元的誤差值如表3所示:


這裏寫圖片描述
表3 每個節點誤差的計算

說明:從誤差的計算過程來理解反向(BP)傳播算法也許更加直觀和容易。
權重和偏置的更新如表4所示:


這裏寫圖片描述
表4 權重和偏置更新的計算

說明:將該神經網絡模型訓練好後,就可以得到權重和偏執參數,進而做二分類。

4.用Python實現BP神經網絡 [3]
神經網絡拓撲結構,如下所示:


這裏寫圖片描述
圖4 神經網絡拓撲結構

解析:
(1)第33和35行:l1和l2分別表示第1層和第2層神經元的輸出。(第0層表示元組輸入)
(2)第37行:l2_error與相對應。
(3)第40行:l2_delta與輸出層誤差相對應。
(4)第42行:l1_error與相對應。
(5)第43行:l1_delta與隱藏層誤差相對應。
(6)第45行:l1.T.dot(l2_delta)與相對應,而syn1與相對應。
(7)第46行:l0.T.dot(l1_delta)與相對應,而syn0與相對應。
說明:
一邊代碼,一邊方程,做到代碼與方程的映射。這是一個基礎的三層BP神經網絡,但是麻雀雖小五臟俱全。主要的不足有幾點:沒有考慮偏置;沒有考慮學習率;沒有考慮正則化;使用的是週期更新,而不是實例更新(一個樣本)和批量更新(m個樣本)。但是,足以理解前饋神經網絡和BP算法的工作原理。神經網絡和BP算法的詳細數學推導參考[5]。

參考文獻:
[1] 數據挖掘:概念與技術(第三版)
[2] 使用Python構造神經網絡:http://www.ibm.com/developerworks/cn/linux/l-neurnet/
[3] 一個11行Python代碼實現的神經網絡:http://python.jobbole.com/82758/
[4] 用BP人工神經網絡識別手寫數字:http://blog.csdn.net/gzlaiyonghao/article/details/7109898
[5] 反向傳導算法:http://ufldl.stanford.edu/wiki/index.php/%E5%8F%8D%E5%90%91%E4%BC%A0%E5%AF%BC%E7%AE%97%E6%B3%95