1. 程式人生 > >BP神經網路計算過程詳解,用筆手算一遍弄懂反向傳播

BP神經網路計算過程詳解,用筆手算一遍弄懂反向傳播

手算BP神經網路

現在很多人都說,做it門檻很低,腦子靈活點,願意去熬的,培訓個幾個月就可以,無非是調調函式而已。
確實,現在一些程式設計師的工作,調調函式掌握得好的話,也是能夠勝任的。但是,想要更進一步,還得不斷提升自己,努力理解各種演算法結構。
(類)神經網路演算法在深度學習等領域應用十分廣泛。
而負反饋BP神經網路其中應用最多的一種,很多神經網路的演算法都是在BP神經網路上進行優化的。所以,理解一下BP神經網路是很有必要的。
關於神經網路的知識請自行谷歌。

神經網路結構主要包括:輸入層、隱藏層和輸出層

這裡寫圖片描述
BP(Back Propagation)神經網路分為兩個過程

  (1)工作訊號正向傳遞過程
  (2)誤差訊號反向傳遞過程

工作訊號正向傳遞過程(前向傳播):

四個步驟:

1、輸入層的每個節點,都要與的隱藏層每個節點做點對點的計算,計算的方法是加權求和+啟用

2、利用隱藏層計算出的每個值,再用相同的方法,和輸出層進行計算。

3、隱藏層用都是用Sigmoid作啟用函式,而輸出層用的是Purelin。這是因為Purelin可以保持之前任意範圍的數值縮放,便於和樣本值作比較,而Sigmoid的數值範圍只能在0~1之間。

4、起初輸入層的數值通過網路計算分別傳播到隱藏層,再以相同的方式傳播到輸出層,最終的輸出值和樣本值作比較,計算出誤差,這個過程叫前向傳播(Forward Propagation)。

誤差訊號反向傳遞過程

兩個步驟

BP演算法是一種計算偏導數的有效方法,它的基本原理是:

5、利用前向傳播最後輸出的結果來計算誤差的偏導數(前向傳播後求偏導),

6、再用這個偏導數和前面的隱藏層進行加權求和

7、如此一層一層的向後傳下去(隱藏層間偏導加權求和)

8、直到輸入層(不計算輸入層)(也就是第一隱藏層到輸入層的偏導加權求和)

9、最後利用每個節點求出的偏導數來更新權重。

為了便於理解,後面一律用“殘差(error term)”這個詞來表示誤差的偏導數。

輸出層→隱藏層:殘差 = -(輸出值-樣本值) * 啟用函式的導數
隱藏層→隱藏層:殘差 = (右層每個節點的殘差加權求和)* 啟用函式的導數

如果用Sigmoid(logsig)作啟用函式,那麼:Sigmoid導數 = Sigmoid*(1-Sigmoid)
輸出層→隱藏層:殘差 = -(Sigmoid輸出值-樣本值) * Sigmoid*(1-Sigmoid) = -(輸出值-樣本值)輸出值(1-輸出值)
隱藏層→隱藏層:殘差 = (右層每個節點的殘差加權求和)* 當前節點的Sigmoid*(1-當前節點的Sigmoid)

殘差全部計算好後,就可以更新權重了:
輸入層:權重增加 = 輸入值 * 右層對應節點的殘差 * 學習率
隱藏層:權重增加 = 當前節點的Sigmoid * 右層對應節點的殘差 * 學習率
偏移值的權重增加 = 右層對應節點的殘差 * 學習率
學習率是一個預先設定好的引數,用於控制每次更新的幅度。

此後,對全部資料都反覆進行這樣的計算,直到輸出的誤差達到一個很小的值為止。
以上介紹的是目前最常見的神經網路型別,稱為前饋神經網路(FeedForward Neural Network),由於它一般是要向後傳遞誤差的,所以也叫BP神經網路(Back Propagation Neural Network)。

文字的公式看上去有點繞,下面是一個詳細的計算過程(非機器封包直接計算):

1、問題描述+隨機生成初始權重

這裡寫圖片描述
問題描述中,x1、x2 是神經網路的兩個輸入值,而y就是實際輸出值
初始權重(層與層之間邊的值),是一個(-1,1) 的隨機數
可以通過Python 的random庫獲取

import random
print random.random()
print random.random()
print random.random()
print random.random()
print random.random()
print random.random()
#結果
0.543717672492
0.0976781735159
0.373970033901
0.596229996543
0.741053525016
0.0915456485905
[Finished in 0.2s]

2、對輸入層 ->隱藏層節點進行加權求和

這裡寫圖片描述

3、執行sigmoid啟用

這裡寫圖片描述

#這裡的計算還是藉助工具比較好
import math
print 1.0/(1+math.e**(-0.5))
print 1.0/(1+math.e**(-0.14))
#結果
0.622459331202
0.534942945158
[Finished in 0.2s]

4、對隱藏->輸出層節點進行加權求和

這裡寫圖片描述

5、執行輸出層的sigmoid啟用

這裡寫圖片描述

6、計算樣本的誤差、殘差

這裡寫圖片描述

7、開始反向傳播,對輸出層-> 隱藏層加權求和

這裡寫圖片描述

8、求隱藏層的殘差

這裡寫圖片描述

9、更新輸入層 ->隱藏層的權重

這裡寫圖片描述

10、更新 隱藏層->輸出層的權重

這裡寫圖片描述

至此,完成了一次的“學習”(也就是梯度下降)
後續就是一次次 往這個神經網路放進輸入值和輸出值,不斷更新權重。
足夠的學習次數之後,就是最終的結果。
有興趣可以動手試試。