記錄對於wiki上的算法的理解過程。
鏈接:https://en.wikipedia.org/wiki/Backpropagation
參考:
https://en.wikipedia.org/wiki/Backpropagation
http://galaxy.agh.edu.pl/~vlsi/AI/backp_t_en/backprop.html
1、概念
對於任何一個網絡神經元節點j:
表示所有的上層節點到該j節點的輸入,
表示經過了激活函數的輸出,
總的表達式可以描述爲:
2、首先要確定cost函數(也有其他叫法)
where
E is the squared error,
t is the target output for a training sample, and
y is the actual output of the output neuron.
我們要根據這個形式來去最終推導權重更新的一般表達式。在中間計算過程中,我們可以簡單的以E來代表就可以了,到最後的時候,才展開計算。
3、激活函數的選擇
那麼其導函數爲:
爲什麼會需要導函數呢,在後面推導的時候需要用到。
4、最終目標函數
cost函數是計算得到的輸出(o)與期望的輸出(t)的差值,而期望輸出(t)是輸入樣本里的內容,沒什麼好說的;計算得到的輸出(o)的產生纔是重點。
總的來說,o由激活函數對該節點的輸入值進行計算得出,而該節點的輸入值又等於與該節點相連的所有上層節點(假設是全連接)的輸出乘於相應的連接權重的乘積的和,所以,我們可以知道o是與連接權重有關的函數計算出來的,因此cost函數(E)也是與連接權重有關的表達式,因此E對連接權重求導是有道理的。
分拆成3段的原因可以這樣理解(當然從數學上是由鏈式規則得出,但是爲什麼這樣拆的原因得說清楚):E依賴於o,而o依賴於net,net才直接依賴於w。
這個是一般的表達式,並不特指哪層或哪個節點,因此,只要我們得到了這個偏導數的具體形式,我們就可以有公式來更新權重了。
(右邊鏈式推導中,爲什麼不是下標爲i呢?由上面的說明也知道,受
wiki通過對這個展開後的公式的每一項的計算推導,得出最終的表達式。
1)最後一項
這個比較直接,直接計算就好了。
2)中間項
這個也好理解,同時也說了爲何選擇的激活函數需要可導的原因。
3)第一項
如果節點處於輸出層,則這個好計算:
但是對於處於非輸出層的,就不是那麼明顯了,也是這個推導的難處。
wiki上的兩段話:
“
However, if j is in an arbitrary inner layer of the network, finding the derivative E with respect to
Considering E as a function of the inputs of all neurons L = {u, v, \dots, w} receiving input from neuron j,
and taking the total derivative with respect to
”
如何理解,如何計算?
第一句話,是說考慮E是L層網元節點u,v,…w的輸入的函數,這些節點接收了上一層節點j的輸出作爲輸入(即
有。上面說了,最終計算出來的y是經過了層層網元的輸入輸出的,當然其E也是與各層網元有關的。
既然有依據,那麼對其後面的計算就是合理的。
那麼看它的計算過程。
E的變量有
左邊到中間項的計算。
再由中間演化到最右邊項,是因爲E對於net的關係不是直接的,而是經過了o的。
那
這個其實跟:
是一樣的道理。
從這個公式:
我們看到了什麼?
裏面有:
有
而且前者依賴於後者,說明什麼?爲了計算前一層(靠近輸入層)的這個偏導數,我們需要先計算出下一層的節點(與該上一層的節點有相連的)的偏導數,這就構成了一個遞歸的關係了:先計算出輸出層節點的偏導數,然後逐層往前計算。
5、最終簡化形式
其中:
到現在爲止,這個公式已經出來了,那麼更新權重的公式也可以得知了:
To update the weight
以上就是對wiki中backpropagation算法的理解記錄過程。
對於感知機(就是單層的網絡),其實就是這個的特殊情況,只有一層:輸出層,這個
https://en.wikipedia.org/wiki/Delta_rule
)。
這裏變成