後向傳播算法“backpropragation”詳解
為什麽要使用backpropagation?
梯度下降不用多說,如果不清楚的可以參考http://www.cnblogs.com/yangmang/p/6279054.html。
神經網絡的參數集合theta,包括超級多組weight和bais。
要使用梯度下降,就需要計算每一個參數的梯度,但是神經網絡常常有數以萬計,甚至百萬的參數,所以需要使用backpropagation來高效地計算梯度。
backpropagation的推導
backpropagation背後的原理其實很簡單,就是求導的鏈式法則。
我們從上面的公式開始推導。以其中一個神經元為例。
如上面的紅框中所示,根據鏈式法則,l對w的偏導數,等於z對w的偏導數乘以l對z的偏導數。
l對w的梯度可以分為兩部分:
前向傳播:對所有參數求梯度;
後向傳播:對所有激活函數的輸入z求梯度;
前向傳播的梯度求法簡單,就z對w求偏導數,直接求出就是對應的輸入xi。
後向傳播比較復雜,需要再使用鏈式法則,如紅框中所示。l/z的梯度分解為a/z和l/a的梯度。
a對z的導數圖像如上所示,現在關鍵就是求l對a的偏導數。
為了求出l對a的偏導數,繼續使用鏈式法則,關聯上後面的兩個神經元。
現在問題就轉化成了,求紅框中的兩個問號的梯度/
現在假設兩個問號梯度已知,就可以求出之前l對z的梯度了。
現在來看看怎麽可以求出l對z的梯度。
第一種情況:當z‘和z’‘為輸出層時。根據鏈式法則,y/z和l/y的梯度都是可解的,這樣問題就解決了。
第二種情況:不是輸出層。就是說還有後續的神經元幾點連接。
循環計算l對z的梯度,直到輸出層,出現case1的情況,問題也就解決了。
所以,我們就可以從輸出層開始,反向計算l對每層z的梯度,在結合前向傳播得到的梯度,就可以計算出梯度下降所需的梯度了。
而且,反向傳播的復雜度和前向傳播是一樣的,這樣就大大提升了梯度計算的效率。
最後結果就是這樣的:
後向傳播算法“backpropragation”詳解