反向傳播訓練(Backpropagation)一個神經網絡是一種常見的方法。網上並不缺乏介紹反向傳播是如何工做的論文。但不多包括一個用實際數字的例子。這篇文章是我試圖解釋它是如何工做的和一個具體的例子。
你們能夠對比本身的計算,以確保他們正確理解反向傳播。php
您能夠到 Github 嘗試我寫的一個反向傳播算法Python腳本。python
一個交互式可視化顯示神經網絡學習過程, 能夠看看個人神經網絡可視化網站。git
果你發現本教程有用,想繼續學習神經網絡及其應用,我強烈推薦看看Adrian Rosebrock的優秀教程Getting Started with Deep Learning and Pythongithub
對於本教程,咱們將使用一個有 2 個輸入神經元、2 個隱藏的神經元和 2 個輸出神經元的神經網絡。此外,隱藏層和輸出層將包括一個 誤差神經元(Bias)。
這裏的基本結構:
算法
讓咱們看看目前神經網絡給定的誤差、權重和輸入的0.05和0.10。爲此咱們要養活這些輸入提早雖然網絡。網絡
咱們算出每一個隱藏神經元的總輸入,再利用總輸入做爲激活函數(這裏咱們使用 Sigmoid 函數)的變量,而後在輸出層神經元重複這一步驟。函數
這是咱們如何計算h1
總輸入:學習
而後使用 Sigmoid 函數計算h1
輸出:優化
同理得h2
輸出:網站
咱們對輸出層神經元重複這個過程,使用隱層神經元的輸出做爲輸入。
這是o1
的輸出:
同理得o2
輸出:
咱們如今能夠計算每一個輸出神經元平方偏差和:
例如,o1
預期輸出爲 0.01,但實際輸出爲0.75136507,所以他的偏差是:
重複這個過程獲得o2
(預期輸出是0.99)的偏差是
所以,神經網絡的總偏差爲
反向傳播的目標是更新鏈接的權重以使每一個神經元的實際輸出更加接近預期輸出,從而減小每一個神經元以及整個網絡的偏差。
考慮一下ω5
,咱們但願知道ω5
的改變對偏差的影響有大多,稱爲
ω5
求偏導數)
o1
的輸出變化對總偏差的影響有多大?
咱們用總偏差對
求偏導數時, ![]()
的值變爲 0 ,由於 ![]()
不會影響 ![]()
o2
的偏差。
下一步,o1
總輸入的變化對於o1
的輸出的影響有多大?
最後,計算 ω5
的變化對o1
總輸入的影響有多大?
將這三者放在一塊兒:
Delta規則——權值的修正量等於偏差乘以輸入
咱們也能夠將這個計算過程組合成 δ規則 的形式:(1) ![]()
令(2) ![]()
由於![]()
因此(3) ![]()
聯立(1)(2)(3)得
![]()
![]()
爲了減小偏差,咱們從當前權重減去這個值(學習率可自定義,這裏咱們設置爲0.5):
重複這個過程,咱們能夠獲得權重 ω6
, ω7
, 和 ω8
:
咱們在獲得新的隱藏層神經元的輸入權重以後再更新 ω6
, ω7
, 和 ω8
(也就是說,在進行反向傳播的時候咱們使用舊的權重值)
接下來,咱們將繼續向後傳播,計算新值ω1
, ω2
, ω3
, 和 ω4
。
全局來講,咱們須要計算
out_h1
將同時影響
out_o1
和
out_o2
(爲方便表示,這裏用下劃線表示下標,下同)。所以
out_h1
對每一個輸出神經元的影響:
先從
而後
ω5
,由於:
講二者代入
同理得:
所以,
如今咱們計算好了
而後咱們計算
接下來咱們計算h1
的總輸入對ω1
求偏導數:
綜上所述,
你也能夠這麼寫
![]()
![]()
![]()
如今咱們能夠更新ω1
了:
重複該過程計算 ω1
, ω2
, 和 ω3
:
最後,咱們已經更新全部的權重! 咱們最初提出 0.05 和 0.1 的輸入,網絡上的偏差爲 0.298371109 。第一輪反向傳播以後,如今總偏差降至 0.291027924 。它可能看起來沒有調整太多。可是在這個過程重複 10000 次以後,好比說,偏差降到0.000035085。在這一時刻,當咱們輸入0.05和0.1時,兩個輸出神經元分別輸出0.015912196 ( vs 預期 0.01) and 0.984065734 (vs 預期 0.99) 。
若是你作到這一步,發現任何錯誤或者能想到更通俗易懂的說明方法,請加我公衆號 jinkey-love 交流。