神經網絡的前向傳播和反向傳播公式詳細推導
本篇博客是對Michael Nielsen所著的《Neural Network and Deep Learning》第2章內容的解讀,有興趣的朋友可以直接閱讀原文Neural Network and Deep Learning。
對神經網絡有些了解的人可能都知道,神經網絡其實就是一個輸入XX到輸出YY的映射函數:f(X)=Yf(X)=Y,函數的系數就是我們所要訓練的網絡參數WW,只要函數系數確定下來,對於任何輸入xixi我們就能得到一個與之對應的輸出yiyi,至於yiyi是否符合我們預期,這就屬於如何提高模型性能方面的問題了,本文不做討論。
那么問題來了,現在我們手中只有訓練集的輸入XX和輸出YY,我們應該如何調整網絡參數WW使網絡實際的輸出f(X)=Y^f(X)=Y^與訓練集的YY盡可能接近?
在開始正式講解之前,讓我們先對反向傳播過程有一個直觀上的印象。反向傳播算法的核心是代價函數CC對網絡中參數(各層的權重ww和偏置bb)的偏導表達式。這些表達式描述了代價函數值CC隨權重ww或偏置bb變化而變化的程度。到這里,BP算法的思路就很容易理解了:如果當前代價函數值距離預期值較遠,那么我們通過調整ww和bb的值使新的代價函數值更接近預期值(和預期值相差越大,則ww和bb調整的幅度就越大)。一直重復該過程,直到最終的代價函數值在誤差范圍內,則算法停止。
BP算法可以告訴我們神經網絡在每次迭代中,網絡的參數是如何變化的,理解這個過程對於我們分析網絡性能或優化過程是非常有幫助的,所以還是盡可能搞透這個點。我也是之前大致看過,然后發現看一些進階知識還是需要BP的推導過程作為支撐,所以才重新整理出這么一篇博客。
前向傳播過程
在開始反向傳播之前,先提一下前向傳播過程,即網絡如何根據輸入XX得到輸出YY的。這個很容易理解,粗略看一下即可,這里主要是為了統一后面的符號表達。


記wljkwjkl為第l−1l−1層第kk個神經元到第ll層第jj個神經元的權重,bljbjl為第ll層第jj個神經元的偏置,aljajl為第ll層第jj個神經元的激活值(激活函數的輸出)。不難看出,aljajl的值取決於上一層神經元的激活:

將上式重寫為矩陣形式:

為了方便表示,記
為每一層的權重輸入,(2)(2)式則變為al=σ(zl)al=σ(zl)。
利用(2)(2)式一層層計算網絡的激活值,最終能夠根據輸入XX得到相應的輸出Y^Y^。
反向傳播過程

反向傳播的四個基本方程


如上圖所示,假設有個小惡魔在第ll層第jj個單元搗蛋,他讓這個神經元的權重輸出變化了ΔzljΔzjl,那么這個神經元的激活輸出為,然后這個誤差向后逐層傳播下去,導致最終的代價函數變化了
。現在這個小惡魔改過自新,它想幫助我們盡可能減小代價函數的值(使網絡輸出更符合預期)。假設
一開始是個很大的正值或者負值,小惡魔通過選擇一個和
方向相反的ΔzljΔzjl使代價函數更小(這就是我們熟知的梯度下降法)。隨着迭代的進行,
會逐漸趨向於0,那么ΔzljΔzjl對於代價函數的改進效果就微乎其微了,這時小惡魔就一臉驕傲的告訴你:“俺已經找到了最優解了(局部最優)”。這啟發我們可以用
來衡量神經元的誤差:

下面就來看看四個基本方程是怎么來的。

反向傳播為什么快
回答這個問題前,我們先看一下普通方法怎么求梯度。以計算權重為例,我們將代價函數看成是權重的函數C=C(w)C=C(w),假設現在網絡中有100萬個參數,我們可以利用微分的定義式來計算代價函數對其中某個權重wjwj的偏導:
