背景
反向傳播(Backpropagation)是訓練神經網絡最通用的方法之一,網上有許多文章嘗試解釋反向傳播是如何工作的,但是很少有包括真實數字的例子,這篇博文嘗試通過離散的數據解釋它是怎樣工作的。
Python實現的反向傳播
你能使用Python來實現反向傳播,我曾經在this Github repo上實現了反向傳播算法。
反向傳播的可視化
顯示神經網絡學習時相互作用的可視化,檢查我的Neural Network visualization。
另外的資源
如果你發現這個教程對你有用並且想繼續學習神經網絡以及它的應用,我強烈建議你看Adrian Rosebrock優秀的教程 Getting Started with Deep Learning and Python。
概述
對於這個教程,我們將使用2個輸入神經元、2個隱含層神經元以及2個輸出層神經元組成一個神經網絡,另外,隱含層和輸出層神經元各包含一個偏差。
這是基本結構:
目的讓神經網絡工作,我們對權重、偏差和訓練的輸入/輸出設置一個初始值:
反向傳播的目的是優化權重,以便於讓神經網絡學習怎樣正確的把任意的輸入映射到輸出中。
這篇教程的剩余部分我們將要和單一的訓練集工作:輸入0.05和0.10,我們想要神經網絡輸出0.01和0.99。
前向反饋
為了開始,當前給定權重和偏差以及輸入值0.05和0.10,神經網絡預測結果是什么,我們需要把輸入值向前傳給網絡。
我們知道全部的輸入值傳到每個隱含層神經元中,使用激活函數擠壓全部的輸入值(在這里,我們使用logistic函數),對輸出層神經元重復這一過程。
計算
的輸入:
然后我們利用logistic函數把
擠壓到
的輸出:
對
進行相同的操作:
對輸出層神經元重復操作,使用隱含層神經元的輸出作為輸出層神經元的輸入。
這是
的輸出:
對
進行相同操作:
計算整體誤差
利用平方和誤差,我們能計算每個輸出層神經元的誤差:
例如,目標輸出
是0.01,但是神經網絡輸出是0.75136507,因此誤差是:
對
重復這個過程:
神經網絡整體誤差:
反向傳播
反向傳播的目的是更新網絡中每個權重,以便他們真實的輸出值是接近目標輸出,從而最小化輸出層神經元的誤差。
輸出層
考慮 ,我們想要知道 怎樣影響整體誤差,即
應用鏈式規則:
可視化我們正在做的:
我們需要理解這個公式的每一步。
首先,output怎樣改變整體誤差?
下一步,net input怎樣改變
輸出?
logistic函數的偏導數是輸出乘以1減輸出:
最后,
怎樣改變
的net input?
把它們結合起來:
你常常能看到delta rule的結合形式:
我們利用
和
來重寫
,我們使用這個重新上面的表達式:
因此:
為了減少誤差,我們從當前權重減去這個值(乘以一個學習率,設置成0.5):
我們能重復這個過程得到新的權重
,
和
:
當我們繼續下面的反向傳輸算法時,我們使用初始權重,而不是更新過的權重。
隱含層
下一步,我們將繼續向后計算
,
,
和
新值,這是我們需要理解的:
可視化:
我們將要對隱含層神經元使用相似的過程,但是稍微不同的是,每個隱含層神經元的輸出貢獻到多個輸出層神經元中。我們知道 影響 和 ,因此 需要考慮兩個輸出層神經元的影響:
先計算 :
使用稍早前計算的值來計算 :
等於 :
合在一起:
對 做相同的處理:
因此:
現在我們有 ,我們還需要計算 ,然后對每個權重計算 :
我們計算 對 的偏導數:
把它們結合起來:
你也可以如下寫:
現在我們能更新 :
對 , 和 重復上面過程:
最后,我們更新所有權重,當我們把輸入0.05和0.1向前反饋,神經網絡的誤差為0.298371109,在一次反向傳播后,整體誤差降到0.291027924,它看似不多,但是重復10000次之后,誤差大幅下降到0.000035085,在這之后,我們把輸入0.05和0.1向前反饋,那么輸出的2個神經元生成0.015912196(vs 目標0.01)和0.984065734(vs 目標0.99)。
轉https://blog.csdn.net/shaomingliang499/article/details/50587300