詳解神經網路的前向傳播和反向傳播(從頭推導)

2022-09-09 19:51:33 字數 4295 閱讀 8798

詳解神經網路的前向傳播和反向傳播

本篇部落格是對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)的偏導表示式∂c∂w∂c∂w和∂c∂b∂c∂b。這些表示式描述了代價函式值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的值取決於上一層神經元的啟用:

alj=σ(∑kwljkal−1k+blj)(1)

(1)ajl=σ(∑kwjklakl−1+bjl)

將上式重寫為矩陣形式:

al=σ(wlal−1+bl)(2)

(2)al=σ(wlal−1+bl)

為了方便表示,記 zl=wlal−1+blzl=wlal−1+bl為每一層的權重輸入, (2)(2)式則變為 al=σ(zl)al=σ(zl)。

利用 (2)(2)式一層層計算網路的啟用值,最終能夠根據輸入 xx得到相應的輸出y^y^。

反向傳播過程

反向傳播過程中要計算∂c∂w∂c∂w和∂c∂b∂c∂b,我們先對代價函式做兩個假設,以二次損失函式為例:

c=12n∑x∥y(x)−al(x)∥2(3)

(3)c=12n∑x‖y(x)−al(x)‖2

其中 nn為訓練樣本xx的總數, y=y(x)y=y(x)為期望的輸出,即ground truth, ll為網路的層數,al(x)al(x)為網路的輸出向量。

假設1:總的代價函式可以表示為單個樣本的代價函式之和的平均:

c=1n∑xcx  cx=12∥y−al∥2(4)

(4)c=1n∑xcx  cx=12‖y−al‖2

這個假設的意義在於,因為反向傳播過程中我們只能計算單個訓練樣本的 ∂cx∂w∂cx∂w和 ∂cx∂b∂cx∂b,在這個假設下,我們可以通過計算所有樣本的平均來得到總體的 ∂c∂w∂c∂w和 ∂c∂b∂c∂b

假設2:代價函式可以表達為網路輸出的函式 costc=c(al)costc=c(al),比如單個樣本 xx的二次代價函式可以寫為:

cx=12∥y−al∥2=12∑j(yj−alj)2(5)

(5)cx=12‖y−al‖2=12∑j(yj−ajl)2

反向傳播的四個基本方程

權重ww和偏置bb的改變如何影響代價函式cc是理解反向傳播的關鍵。最終,這意味著我們需要計算出每個∂c∂wljk∂c∂wjkl和∂c∂blj∂c∂bjl,在討論基本方程之前,我們引入誤差δδ的概念,δljδjl表示第ll層第jj個單元的誤差。關於誤差的理解,《neural network and deep learning》書中給了乙個比較形象的例子。

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

δlj=∂c∂zlj

δjl=∂c∂zjl

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

1. 輸出層的誤差方程

δlj=∂c∂zlj=∂c∂alj∂alj∂zlj=∂c∂aljσ′(zlj)(bp1)

(bp1)δjl=∂c∂zjl=∂c∂ajl∂ajl∂zjl=∂c∂ajlσ′(zjl)

如果上面的東西你看明白了,這個方程應該不難理解,等式右邊第一項 ∂c∂alj∂c∂ajl衡量了代價函式隨網路最終輸出的變化快慢,而第二項 σ′(zlj)σ′(zjl)則衡量了啟用函式輸出隨 zljzjl的變化快慢。當啟用函式飽和,即 σ′(zlj)≈0σ′(zjl)≈0時,無論 ∂c∂alj∂c∂ajl多大,最終 δlj≈0δjl≈0,輸出神經元進入飽和區,停止學習。

(bp1)方程中兩項都很容易計算,如果代價函式為二次代價函式 c=12∑j(yj−alj)2c=12∑j(yj−ajl)2,則 ∂c∂alj=alj−yj∂c∂ajl=ajl−yj,同理,對啟用函式 σ(z)σ(z)求 zljzjl的偏導即可求得 σ′(zlj)σ′(zjl)。將(bp1)重寫為矩陣形式:

δl=∇ac⊙σ′(zl)(bp1a)

(bp1a)δl=∇ac⊙σ′(zl)

⊙⊙為hadamard積,即矩陣的點積。

2. 誤差傳遞方程

δl=((wl+1)tδl+1)⊙σ′(zl)(bp2)

(bp2)δl=((wl+1)tδl+1)⊙σ′(zl)

這個方程說明我們可以通過第 l+1l+1層的誤差 δl+1δl+1計算第 ll層的誤差δlδl,結合(bp1)和(bp2)兩個方程,我們現在可以計算網路中任意一層的誤差了,先計算 δlδl,然後計算 δl−1δl−1, δl−2δl−2,…,直到輸入層。

證明過程如下:

δlj=∂c∂zlj=∑k∂c∂zl+1k∂zl+1k∂zlj=∑kδl+1k∂zl+1k∂zlj

δjl=∂c∂zjl=∑k∂c∂zkl+1∂zkl+1∂zjl=∑kδkl+1∂zkl+1∂zjl

因為 zl+1k=∑jwl+1kjalj+bl+1k=∑jwl+1kjσ(zlj)+bl+1kzkl+1=∑jwkjl+1ajl+bkl+1=∑jwkjl+1σ(zjl)+bkl+1,所以 ∂zl+1k∂zlj=wl+1kjσ′(zlj)∂zkl+1∂zjl=wkjl+1σ′(zjl),因此可以得到(bp2),

δlj=∑kwl+1kjδl+1kσ′(zlj)

δjl=∑kwkjl+1δkl+1σ′(zjl)

3. 代價函式對偏置的改變率

∂c∂blj=∂c∂zlj∂zlj∂blj=∂c∂zlj=δlj(bp3)

(bp3)∂c∂bjl=∂c∂zjl∂zjl∂bjl=∂c∂zjl=δjl

這裡因為 zlj=∑kwljkal−1k+bljzjl=∑kwjklakl−1+bjl所以 ∂zlj∂blj=1∂zjl∂bjl=1

4. 代價函式對權重的改變率

∂c∂wljk=∂c∂zlj∂zlj∂wljk=∂c∂zljal−1k=al−1kδlj(bp4)

(bp4)∂c∂wjkl=∂c∂zjl∂zjl∂wjkl=∂c∂zjlakl−1=akl−1δjl

可以簡寫為

∂c∂w=ainδout(6)

(6)∂c∂w=ainδout

,不難發現,當上一層啟用輸出接近0的時候,無論返回的誤差有多大, ∂c∂w∂c∂w的改變都很小,這也就解釋了為什麼神經元飽和不利於訓練。

從上面的推導我們不難發現,當輸入神經元沒有被啟用,或者輸出神經元處於飽和狀態,權重和偏置會學習的非常慢,這不是我們想要的效果。這也說明了為什麼我們平時總是說啟用函式的選擇非常重要。

當我計算得到∂c∂wljk∂c∂wjkl和∂c∂blj∂c∂bjl後,就能愉悅地使用梯度下降法對引數進行一輪輪更新了,直到最後模型收斂。

神經網路前向傳播與反向傳播

神經網路 神經網路可以理解為乙個輸入x到輸出y的對映函式,即f x y,其中這個對映f就是我們所要訓練的網路引數w,我們只要訓練出來了引數w,那麼對於任何輸入x,我們就能得到乙個與之對應的輸出y。只要f不同,那麼同乙個x就會產生不同的y,我們當然是想要獲得最符合真實資料的y,那麼我們就要訓練出乙個最...

前向傳播和反向傳播 手撕 神經網路反向傳播

神經網路前向傳播一般用於搭建整個神經網路的結構框架,形成整個網路的邏輯通路。反向傳播用於更新每層之間的權重,減少損失,進而提公升 準確度。下面是乙個神經網路的結構圖 第一層是輸入層,包含兩個神經元i1,i2,和截距項b1 第二層是隱含層,包含兩個神經元h1,h2和截距項b2,第三層是輸出o1,o2,...

神經網路 前向,反向傳播過程

x,資料集矩陣。每一行的元素代表了乙個樣例的特徵值x1,x2,x3.共有n行,說明資料集一共n個樣例 theta,引數矩陣 行數 要生成的神經元個數 列數 上一層的輸入個數 每一行的元素代表了對樣例各個特徵值的權重 以資料集為x 5 3 使用上圖的網路結構為例 輸入層 x 5 3 說明資料集有5個樣...