1. 程式人生 > >深度學習之反向傳播算法

深度學習之反向傳播算法

操作 隨機梯度下降 並且 網絡 bili 方法 如何 ide 想象

直觀理解反向傳播

反向傳播算法是用來求那個復雜到爆的梯度的。

上一集中提到一點,13000維的梯度向量是難以想象的。換個思路,梯度向量每一項的大小,是在說代價函數對每個參數有多敏感。

技術分享圖片

如上圖,我們可以這樣裏理解,第一個權重對代價函數的影響是是第二個的32倍。

我們來考慮一個還沒有被訓練好的網絡。我們並不能直接改動這些激活值,只能改變權重和偏置值。但記住,我們想要輸出層出現怎樣的變動,還是有用的。


技術分享圖片

技術分享圖片

我們希望圖像的最後分類結果是2,我們期望第3個輸出值變大,其余輸出值變小,並且變動的大小應該與現在值和目標值之間的差成正比。舉個例子,增大數字2神經元的激活值,就應該‘比減少數字8神經元的激活值來得重要,因為後者已經很接近它的目標了。

進一步,就來關註數字2這個神經元,想讓它的激活值變大,而這個激活值是把前一層所有激活值的加權和加上偏置值。

技術分享圖片

所以要增加激活值,我們有3條路可以走,一增加偏置,二增加權重,或者三改變上一層的激活值。

先來看如何調整權重,各個權重它們的影響力各不相同,連接前一層最亮的神經元的權重,影響力也最大,因為這些權重與大的激活值相乘。增大這幾個權重,對最終代價函數造成的影響,就比增大連接黯淡神經元的權重所造成的影響,要大上好多倍。

請記住,說到梯度下降的時候,我們並不只看每個參數是增大還是變小,我們還看改變哪個參數的性價比最大。

不過別忘了,從全局上看,只只不過是數字2的神經元所期待的變化,我們還需要最後一層其余的每個輸出神經元,對於如何改變倒數第二層都有各自的想法。

技術分享圖片

我們會把數字2神經元的期待,和別的輸出神經元的期待全部加起來,作為如何改變倒數第二層的指示。這些期待變化不僅是對應的權重的倍數,也是每個神經元激活值改變量的倍數。

我們對其他的訓練樣本,同樣的過一遍反向傳播,記錄下每個樣本想怎樣修改權重和偏置,最後再去一個平均值。

技術分享圖片

這裏一系列的權重偏置的平均微調大小,不嚴格地說,就是代價函數的負梯度,至少是其標量的倍數。

技術分享圖片

實際操作中,我們經常使用隨機梯度下降法。

首先把訓練樣本打亂,然後分成很多組minibatch,每個minibatch就當包含了100個訓練樣本好了。然後你算出這個minibatch下降的一步,這不是代價函數真正的梯度,然而每個minibatch會給一個不錯的近似,計算量會減輕不少。

反向傳播的微積分原理

我們從一個最簡單的網絡講起,每層只有一個神經元,圖上這個網絡就是由三個權重和三個偏置決定的,我們的目標是理解代價函數對這些變量有多敏感。這樣我們就知道怎麽調整這些變量,才能使代價函數下降的最快。

我們先來關註最後兩個神經元,我們給最後一個神經元一個上標L,表示它處在第L層。

技術分享圖片

給定一個訓練樣本,我們把這個最終層激活值要接近的目標叫做y,y的值為0/1。那麽這個簡易網絡對於單個訓練樣本的代價就等於$(a^{(L)}-y)^2$。對於這個樣本,我們把這個代價值標記為$C_0$。

之前講過,最終層的激活值公式:$a^{(L)} = \sigma (w^{(L)}a^{(L-1)}+b^{(L)})$

換個標記方法:

$$z^{(L)} = (w^{(L)}a^{(L-1)}+b^{(L)})$$

$$a^{(L)} = \sigma (z^{(L)})$$

整個流程就是這樣的:

技術分享圖片

當然了,$a^{(L-1)}$還可以再向上推一層,不過這不重要。

這些東西都是數字,我們可以想象,每個數字都對應數軸上的一個位置。我們第一個目標是來理解代價函數對權重$w^{(L)}$的微小變化有多敏感。換句話說,求$C_0$對$w^{(L)}$的導數。

技術分享圖片

根據鏈式法則:

$$\frac{\partial C_0}{\partial w^{(L)}} = \frac{\partial z^{(L)}}{\partial w^{(L)}}\frac{\partial a^{(L)}}{\partial z^{(L)}}\frac{\partial C_0}{\partial a^{(L)}}\\\frac{\partial C_0}{\partial a^{(L)}}=2(a^{(L)}-y)\\\frac{\partial a^{(L)}}{\partial z^{(L)}}={\sigma }‘ (z^{(L)})\\\frac{\partial z^{(L)}}{\partial w^{(L)}}=a^{(L-1)}\\$$

所以

$$\frac{\partial z^{(L)}}{\partial w^{(L)}}\frac{\partial a^{(L)}}{\partial z^{(L)}}\frac{\partial C_0}{\partial a^{(L)}}=a^{(L-1)}{\sigma }‘ (z^{(L)})2(a^{(L)}-y)\\$$

$$\frac{\partial C}{\partial w^{(L)}} = \frac{1}{n}\sum _{k=0}^{n-1}\frac{\partial C_k}{\partial w^{(L)}}$$

當然了,對偏置求導數也是同樣的步驟。

$$\frac{\partial C_0}{\partial b^{(L)}} = \frac{\partial z^{(L)}}{\partial b^{(L)}}\frac{\partial a^{(L)}}{\partial z^{(L)}}\frac{\partial C_0}{\partial a^{(L)}}=1{\sigma }‘ (z^{(L)})2(a^{(L)}-y)\\$$

到這裏,我們可以看每層不止一個神經元的情況了。

技術分享圖片

技術分享圖片


技術分享圖片

參考鏈接:

  • Vedio
  • Blog

深度學習之反向傳播算法