轉自: https://blog.csdn.net/lyl771857509/article/details/78990215
神經網絡
好了,前面花了不少篇幅來介紹激活函數中那個暗藏玄機的e,下面可以正式介紹神經元的網絡形式了。
下圖是幾種比較常見的網絡形式:
- 左邊藍色的圓圈叫“輸入層”,中間橙色的不管有多少層都叫“隱藏層”,右邊綠色的是“輸出層”。
- 每個圓圈,都代表一個神經元,也叫節點(Node)。
- 輸出層可以有多個節點,多節點輸出常常用於分類問題。
- 理論證明,任何多層網絡可以用三層網絡近似地表示。
- 一般憑經驗來確定隱藏層到底應該有多少個節點,在測試的過程中也可以不斷調整節點數以取得最佳效果。
計算方法:
- 雖然圖中未標識,但必須注意每一個箭頭指向的連線上,都要有一個權重(縮放)值。
- 輸入層的每個節點,都要與的隱藏層每個節點做點對點的計算,計算的方法是加權求和+激活,前面已經介紹過了。(圖中的紅色箭頭指示出某個節點的運算關系)
- 利用隱藏層計算出的每個值,再用相同的方法,和輸出層進行計算。
- 隱藏層用都是用Sigmoid作激活函數,而輸出層用的是Purelin。這是因為Purelin可以保持之前任意范圍的數值縮放,便於和樣本值作比較,而Sigmoid的數值范圍只能在0~1之間。
- 起初輸入層的數值通過網絡計算分別傳播到隱藏層,再以相同的方式傳播到輸出層,最終的輸出值和樣本值作比較,計算出誤差,這個過程叫前向傳播(Forward Propagation)。
前面講過,使用梯度下降的方法,要不斷的修改k、b兩個參數值,使最終的誤差達到最小。神經網絡可不只k、b兩個參數,事實上,網絡的每條連接線上都有一個權重參數,如何有效的修改這些參數,使誤差最小化,成為一個很棘手的問題。從人工神經網絡誕生的60年代,人們就一直在不斷嘗試各種方法來解決這個問題。直到80年代,誤差反向傳播算法(BP算法)的提出,才提供了真正有效的解決方案,使神經網絡的研究絕處逢生。
BP算法是一種計算偏導數的有效方法,它的基本原理是:利用前向傳播最后輸出的結果來計算誤差的偏導數,再用這個偏導數和前面的隱藏層進行加權求和,如此一層一層的向后傳下去,直到輸入層(不計算輸入層),最后利用每個節點求出的偏導數來更新權重。
為了便於理解,后面我一律用“殘差(error term)”這個詞來表示誤差的偏導數。
輸出層→隱藏層:殘差 = -(輸出值-樣本值) * 激活函數的導數
隱藏層→隱藏層:殘差 = (右層每個節點的殘差加權求和)* 激活函數的導數
如果輸出層用Purelin作激活函數,Purelin的導數是1,輸出層→隱藏層:殘差 = -(輸出值-樣本值)
如果用Sigmoid(logsig)作激活函數,那么:Sigmoid導數 = Sigmoid*(1-Sigmoid)
輸出層→隱藏層:殘差 = -(Sigmoid輸出值-樣本值) * Sigmoid*(1-Sigmoid) = -(輸出值-樣本值)輸出值(1-輸出值)
隱藏層→隱藏層:殘差 = (右層每個節點的殘差加權求和)* 當前節點的Sigmoid*(1-當前節點的Sigmoid)
如果用tansig作激活函數,那么:tansig導數 = 1 - tansig^2
殘差全部計算好后,就可以更新權重了:
輸入層:權重增加 = 當前節點的Sigmoid * 右層對應節點的殘差 * 學習率
隱藏層:權重增加 = 輸入值 * 右層對應節點的殘差 * 學習率
偏移值的權重增加 = 右層對應節點的殘差 * 學習率
學習率前面介紹過,學習率是一個預先設置好的參數,用於控制每次更新的幅度。
此后,對全部數據都反復進行這樣的計算,直到輸出的誤差達到一個很小的值為止。
以上介紹的是目前最常見的神經網絡類型,稱為前饋神經網絡(FeedForward Neural Network),由於它一般是要向后傳遞誤差的,所以也叫BP神經網絡(Back Propagation Neural Network)。
BP神經網絡的特點和局限:
- BP神經網絡可以用作分類、聚類、預測等。需要有一定量的歷史數據,通過歷史數據的訓練,網絡可以學習到數據中隱含的知識。在你的問題中,首先要找到某些問題的一些特征,以及對應的評價數據,用這些數據來訓練神經網絡。
- BP神經網絡主要是在實踐的基礎上逐步完善起來的系統,並不完全是建立在仿生學上的。從這個角度講,實用性 > 生理相似性。
- BP神經網絡中的某些算法,例如如何選擇初始值、如何確定隱藏層的節點個數、使用何種激活函數等問題,並沒有確鑿的理論依據,只有一些根據實踐經驗總結出的有效方法或經驗公式。
- BP神經網絡雖然是一種非常有效的計算方法,但它也以計算超復雜、計算速度超慢、容易陷入局部最優解等多項弱點著稱,因此人們提出了大量有效的改進方案,一些新的神經網絡形式也層出不窮。
文字的公式看上去有點繞,下面我發一個詳細的計算過程圖。
參考這個:http://www.myreaders.info/03_Back_Propagation_Network.pdf 我做了整理
這里介紹的是計算完一條記錄,就馬上更新權重,以后每計算完一條都即時更新權重。實際上批量更新的效果會更好,方法是在不更新權重的情況下,把記錄集的每條記錄都算過一遍,把要更新的增值全部累加起來求平均值,然后利用這個平均值來更新一次權重,然后利用更新后的權重進行下一輪的計算,這種方法叫批量梯度下降(Batch Gradient Descent)。