1.多層前饋神經網絡
首先說下多層前饋神經網絡,BP算法,BP神經網絡之間的關係。多層前饋(multilayer feed-forward)神經網絡由一個輸入層、一個或多個隱藏層和一個輸出層組成,後向傳播(BP)算法在多層前饋神經網絡上面進行學習,採用BP算法的(多層)前饋神經網絡被稱爲BP神經網絡。給出一個多層前饋神經網絡的拓撲結構,如下所示:
圖1 多層前饋神經網絡
神經網絡的拓撲結構包括:輸入層的單元數、隱藏層數(如果多於一層)、每個隱藏層的單元數和輸出層的單元數。神經網絡可以用於分類(預測給定元組的類標號)和數值預測(預測連續值輸出)等。
2.後向傳播(BP)算法詳解
(1)初始值權重
神經網絡的權重被初始化爲小隨機數,每個神經元都有一個相關聯的偏置,同樣也被初始化爲小隨機數。
(2)前向傳播輸入
以單個神經網絡單元爲例,如下所示:
圖2 神經網絡單元
給定隱藏層或輸出層的單元 ,到單元 的淨輸入 ,如下所示:
其中, 是由上一層的單元 到單元 的連接的權重; 是上一層的單元 的輸出; 是單元 的偏置。需要說明的是偏置充當閥值,用來改變單元的活性。
給定單元 的淨輸入 ,單元 的輸出 ,如下所示:
(3)後向傳播誤差
- 對於輸出層單元 ,誤差 用下式計算:
其中, 是單元 的實際輸出,而 是 給定訓練元組的已知目標值。需要說明的是, 是邏輯斯締函數的導數。 - 對於隱藏層單元 ,它的誤差用下式計算:
其中, 是由下一較高層中單元 到單元 的連接權重,而 是單元 的誤差。 - 權重更新,如下所示:
其中, 是權重 的改變量,變量 是學習率,通常取0.0和1.0之間的常數值。 - 偏置更新,如下所示:
其中, 是 的改變量。 - 權重和偏置更新
如果每處理一個樣本就更新權重和偏置,稱爲實例更新(case update);如果處理完訓練集中的所有元組之後再更新權重和偏置,稱爲週期更新(epoch update)。理論上,反向傳播算法的數據推導使用週期更新,但是在實踐中,實例更新通常產生更加準確的結果。
說明:誤差反向傳播的過程就是將誤差分攤給各層所有單元,從而獲得各層單元的誤差信號,進而修正各單元的權值,即權值調整的過程。
(4)終止條件
如果滿足條件之一,就可以停止訓練,如下所示:
- 前一週期所有的都太小,小於某個指定的閥值。
- 前一週期誤分類的元組百分比小於某個閥值。
- 超過預先指定的週期數。
實踐中,權重收斂可能需要數十萬個週期。神經網絡的訓練有很多的經驗和技巧,比如我們就可以使用一種稱爲模擬退火的技術,使神經網絡確保收斂到全局最優。
3.用BP訓練多層前饋神經網絡
舉個例子具體說明使用BP算法訓練多層前饋神經網絡的每個細節,如下所示:
圖3 用BP算法訓練多層前饋神經網絡
設置學習率爲0.9,第一個訓練元組爲 ,其類標號爲1。神經網絡的初始權重和偏置值如表1所示:
表1 初始輸入、權重和偏置值
根據給定的元組,計算每個神經元的淨輸入和輸出,如表2所示:
表2 淨輸入和輸出的計算
每個神經元的誤差值如表3所示:
表3 每個節點誤差的計算
說明:從誤差的計算過程來理解反向(BP)傳播算法也許更加直觀和容易。
權重和偏置的更新如表4所示:
表4 權重和偏置更新的計算
說明:將該神經網絡模型訓練好後,就可以得到權重和偏執參數,進而做二分類。
4.用Python實現BP神經網絡 [3]
神經網絡拓撲結構,如下所示:
解析:
(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