背景
反向傳播是訓練神經網絡的經常使用方法,以前對此一直了解的不夠完全,這篇文章算是讓我完全搞懂了反向傳播的細節。算法
概觀
對於本教程,咱們將使用具備兩個輸入,兩個隱藏的神經元,兩個輸出神經元的神經網絡。此外,隱藏和輸出神經元將包括一個偏見。網絡
基本結構以下:併發
爲了使用一些數字,下面是最初的權重,偏見和培訓輸入/輸出:wordpress
反向傳播的目標是優化權重,以便神經網絡能夠學習如何正確映射任意輸入到輸出。函數
對於本教程的其他部分,咱們將使用單個訓練集:給定輸入0.05和0.10,咱們但願神經網絡輸出0.01和0.99。學習
前進通行證
首先,讓咱們看看神經網絡目前預測的是什麼,給定0.05和0.10的權重和誤差。爲此,咱們將經過網絡向前饋送這些輸入。優化
咱們計算出淨輸入總到每一個隱藏層神經元,壁球使用的總淨輸入激活功能(在這裏咱們使用的邏輯功能),而後重複上述過程與輸出層的神經元。.net
如下是咱們計算總淨投入的方法:
而後咱們使用邏輯函數對其進行壓縮以得到如下輸出:
執行相同的過程,咱們獲得:
咱們重複這個過程爲輸出層神經元,使用隱藏層神經元的輸出做爲輸入。
如下是輸出:
並執行相同的過程,咱們獲得:
計算總偏差
如今咱們可使用平方偏差函數來計算每一個輸出神經元的偏差,並將它們相加獲得總偏差:
![\壓裂{1} {2} \壓裂{1} {2}](http://static.javashuo.com/static/loading.gif)
例如,目標輸出爲0.01,但神經網絡輸出爲0.75136507,所以其偏差爲:
重複這個過程(記住目標是0.99),咱們獲得:
神經網絡的總偏差是這些偏差的總和:
向後傳遞
咱們使用反向傳播的目標是更新網絡中的每一個權重,使它們使實際輸出更接近目標輸出,從而最大限度地減小每一個輸出神經元和整個網絡的偏差。
輸出層
考慮一下。咱們想知道變化
會影響總偏差,也就是說
。
![\ frac {\ partial E_ {total}} {\ partial w_ {5}} \ frac {\ partial E_ {total}} {\ partial w_ {5}}](http://static.javashuo.com/static/loading.gif)
![E_ {}總 E_ {}總](http://static.javashuo.com/static/loading.gif)
![W_ {5} W_ {5}](http://static.javashuo.com/static/loading.gif)
![W_ {5} W_ {5}](http://static.javashuo.com/static/loading.gif)
經過應用鏈式規則,咱們知道:
在視覺上,這是咱們正在作的事情:
咱們須要找出這個方程中的每一部分。
首先,總偏差相對於輸出的變化有多大?
![- (目標出) - (目標出)](http://static.javashuo.com/static/loading.gif)
![超出目標 超出目標](http://static.javashuo.com/static/loading.gif)
![OUT_ {} O1 OUT_ {} O1](http://static.javashuo.com/static/loading.gif)
![\ frac {1} {2}(target_ {o2} - out_ {o2})^ {2} \ frac {1} {2}(target_ {o2} - out_ {o2})^ {2}](http://static.javashuo.com/static/loading.gif)
![OUT_ {} O1 OUT_ {} O1](http://static.javashuo.com/static/loading.gif)
接下來,相對於其總淨投入的變化輸出多少?
最後,關於變化的總淨投入是
多少?
把它放在一塊兒:
爲了減小偏差,咱們從當前權重中減去這個值(可選地乘以一些學習率eta,咱們將其設置爲0.5):
咱們能夠重複這個過程當中得到新的權重,
以及
:
在咱們將新權重引入隱含層神經元以後,咱們執行神經網絡中的實際更新(即,當咱們繼續下面的反向傳播算法時,咱們使用原始權重,而不是更新的權重)。
隱藏層
接下來,咱們將繼續爲新的計算值,向後傳遞,
,
,和
。
大圖片,這是咱們須要弄清楚的:
視覺:
咱們將使用與輸出層相似的過程,但略有不一樣,以說明每一個隱藏層神經元的輸出對多個輸出神經元的輸出(並所以產生偏差)的貢獻。咱們知道這影響到二者
,
所以
須要考慮它對兩個輸出神經元的影響:
從如下開始:
咱們能夠使用咱們以前計算的值來計算:
而且等於
:
將它們插入:
按照相同的過程,咱們獲得:
所以:
如今,咱們有,咱們須要弄清楚
,而後
每個權重:
咱們計算總淨投入的偏導數,與
咱們對輸出神經元所作的相同:
把它放在一塊兒:
你也能夠看到這寫成:
咱們如今能夠更新:
重複這些,
和
最後,咱們已經更新了全部的重量!當咱們最初輸入0.05和0.1的輸入時,網絡上的偏差爲0.298371109。在第一輪反向傳播以後,總偏差如今降至0.291027924。它可能看起來並很少,可是在重複這個過程10,000次後,錯誤會直線降低到0.0000351085。此時,當咱們提早0.05和0.1時,兩個輸出神經元產生0.015912196(vs 0.01目標)和0.984065734(vs 0.99目標)。
若是你已經作到了這一點,並發現上述任何錯誤,或者能夠想出任何方法使將來的讀者更清楚,不要猶豫,給我一個筆記。謝謝!