1.多層前饋神經網絡
首先說下多層前饋神經網絡,BP算法,BP神經網絡之間的關係。多層前饋(multilayer feed-forward)神經網絡由一個輸入層、一個或多個隱藏層和一個輸出層組成,後向傳播(BP)算法在多層前饋神經網絡上面進行學習,採用BP算法的(多層)前饋神經網絡被稱爲BP神經網絡。給出一個多層前饋神經網絡的拓撲結構,如下所示:
神經網絡的拓撲結構包括:輸入層的單元數、隱藏層數(如果多於一層)、每個隱藏層的單元數和輸出層的單元數。神經網絡可以用於分類(預測給定元組的類標號)和數值預測(預測連續值輸出)等。
2.後向傳播(BP)算法詳解
(1)初始值權重
神經網絡的權重被初始化爲小隨機數,每個神經元都有一個相關聯的偏置,同樣也被初始化爲小隨機數。
(2)前向傳播輸入
以單個神經網絡單元爲例,如下所示:
給定隱藏層或輸出層的單元
,到單元
的淨輸入
,如下所示:
說明:誤差反向傳播的過程就是將誤差分攤給各層所有單元,從而獲得各層單元的誤差信號,進而修正各單元的權值,即權值調整的過程。
(4)終止條件
如果滿足條件之一,就可以停止訓練,如下所示:
實踐中,權重收斂可能需要數十萬個週期。神經網絡的訓練有很多的經驗和技巧,比如我們就可以使用一種稱爲模擬退火的技術,使神經網絡確保收斂到全局最優。
3.用BP訓練多層前饋神經網絡
舉個例子具體說明使用BP算法訓練多層前饋神經網絡的每個細節,如下所示:
設置學習率爲0.9,第一個訓練元組爲
,其類標號爲1。神經網絡的初始權重和偏置值如表1所示:
根據給定的元組,計算每個神經元的淨輸入和輸出,如表2所示:
每個神經元的誤差值如表3所示:
說明:從誤差的計算過程來理解反向(BP)傳播算法也許更加直觀和容易。
權重和偏置的更新如表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