一步一步推導反向傳播
假如我們由如下的網絡(這裏只給出最後兩層l和l+1)其中l+1是最後輸出:
其中有如下定義:
al+1=sigmoid(zl+1)……(1)
zl+1=wl∗al…………(2)
注意這裏的w、a、z都是矩陣或向量。其定義和吳恩達的一樣,比如ajl代表第l層的第j個節點。
因爲反向傳播是要求最後的損失對前面所有的權重的導數,然後再更新權重,所以我們的關鍵在於求出損失的權重的求導,上面的圖中最後的輸出是al+1,所以我們對應的損失如下:
J(θ)=−[ylogal+1+(1−y)log(1−al+1)] 我們將J(θ)寫作C。
我們的目的是要求∂wl∂C,我們可以通過鏈式運算:
首先由上面的損失公式,我們可以很直觀的看出來∂al+1∂C=al+1(1−al+1)al+1−y ,注意這裏省去了常數部分。
根據鏈式法則,我們可以得到∂zl+1∂C=∂al+1∂C∂zl+1∂al+1 ,然後再結合式1,因爲al+1=sigmoid(zl+1) ,並且f(x)=sigmoid(x)的導數爲f’(x)=f(x)(1−f(x)),所以∂zl+1∂al+1=al+1(1−al+1) ,最終我們得到如下:
∂zl+1∂C=∂al+1∂C∂zl+1∂al+1=al+1−y……(3)
我們離權重只剩下一步之遙了,同樣利用鏈式法則,我們可以得到∂wl∂C=∂zl+1∂C∂wl∂zl+1 ,結合式子2,因爲zl+1=wl∗al,所以∂wl∂zl+1=al到此爲止,我們得到了損失對wl的導數:
∂wl∂C=∂zl+1∂C∂wl∂zl+1=∂zl+1∂Cal=(al+1−y)∗al……(4)
看到這裏,可能心裏想,這如果要好幾百層怎麼推呀,其實我們可以發現當我們求第l層的時候,我們會用到l+1層的數據,所以如果能找到規律就好了,那麼我們再向下推一層看看,同理,根據鏈式法則,我們可以得到∂zl∂C=∂zl+1∂C∂zl∂zl+1 ,而zl+1=wlal=wlsigmoid(zl),所以∂zl∂zl+1=(wl)Tal(1−al),所以我們得到如下:
∂zl∂C=∂zl+1∂C(wl)Tal(1−al)……(5)
看看我們發現了什麼,我們發現第l層對z的導數和第l+1層對z的關係了,所以我們可以設∂zl∂C=δl,所以我們有:
δl=δl+1(wl)Tal(1−al)……(6)
再根據鏈式法則得到對權重的導數爲:
∂wl−1∂C=∂zl∂C∂wl−1∂zl=δlal−1……(7)
其中(zl=wl−1al−1)
按照(7)這種寫法,我們也可以將(4)改下如下:
∂wl∂C=∂zl+1∂C∂wl∂zl+1=δl+1al……(4_1)
所以我們就得到了我們的損失對於任意l層的權重的導數,也就是式子4_1,發現裏面只存在一個δ是未知的,而結合式子6,我們就能遞推求出所有層的δ。
比如我們最後一層是L層,根據δl的定義得到δL=∂zL∂C,因爲最後一層,所以結合損失,計算得到δL=∂zL∂C=aL−y,可以參考式子3的計算。當計算得到第L層的δ,那麼L−1,L−2...就可以遞推得到,進而帶入4_1,就能得到對所有層權重的導數,進而更新權重。