反向傳播算法 BackPropagation ,簡稱BP算法。常用於訓練多層神經網絡,那麼它到底傳播了個啥?又是怎麼傳播的呢?
我們知道,對於一個機器學習算法,其最終預測出的值與實際值一般會存在差異,那麼我們定義這個差異爲誤差E。算法中有若干參數需要學習,那麼怎麼學習呢?以什麼策略去變化參數,使得預測值更接近真實值呢?
這就是採用BP算法的初衷,我們知道預測值是由所有參數與相連的輸入運算後得到的,也就是說預測值與真實值之間的誤差E其實是與每個參數相關的,可以認爲誤差是由每個參數造成的,因此我們試圖將誤差進行反向傳播,計算每個參數引起的誤差大小,以此爲依據來更新參數,使得重新進行前向傳播計算出的預測值越來越接近真實值,由此起到訓練的作用。
從西瓜書中摘取示例網絡的圖片來計算BP的過程:
注:該圖示中輸入層在最下面,輸出層在最上面。我們可能更習慣輸入層在左側,輸出層在右側。如下圖所示。
給定以上含一層隱層的神經網絡,有 𝑑 個輸入神經元、𝑞 個隱層神經元、𝑙個輸出神經元。
給定:
訓練集 D={(x1,y1),(x2,y2),...,(xm,ym)},xi∈Rd,yi∈Rl,即輸入由 𝑑 個屬性描述(𝑑 個𝑥),輸出 𝑙 維實值向量(𝑙個𝑦)。
其中:
輸出層第 𝑗 個神經元的閾值(偏置)用θj表示,
隱層第 ℎ 個神經元的閾值用γh 表示。
輸入層第 𝑖 個神經元與隱層第 ℎ 個神經元之間的連接權重爲vih,
隱層第 ℎ 個神經元與輸出層第 𝑗 個神經元之間的連接權重爲wih。
記隱層第 ℎ 個神經元接收到的輸入爲αh=∑i=1dvihxi,
輸出層第 𝑗 個神經元接收到的輸入爲βj=∑h=1qwhjbh,
其中bh爲隱層第 ℎ 個神經元的輸出,即bh=f(αh−γh)。
假設隱層和輸出層的激活函數爲Sigmoid函數(注:Sigmoid函數求導特性良好,見公式6)。
對訓練集(xk,yk),假定神經網絡的輸出爲y^k=(y^1k,y^2k,...,y^lk)
即:
y^lk=f(βj−θj)(1)
則網絡在(xk,yk)上的均方誤差爲Ek=21j=1∑l(y^jk−yjk)2(2)
(注:加21是爲了約掉平方求導得到的2。)
網絡中需要更新的參數個數爲(d+l+1)q+l個:輸入層到隱層的d×q個權值、隱層到輸出層的q×l個權值、 𝑞 個隱層神經元的閾值, 𝑙 個輸出層神經元的閾值。
BP是一個迭代學習算法,在迭代的每一輪中,採用廣義的感知機學習規則對參數進行更新估計。
對任意參數 𝑣 的更新公式爲 v←v+Δv,
BP算法基於梯度下降策略,以目標的負梯度方向對參數進行調整,對式子(2)的 Ek,給定學習率 𝜂 ,有
Δwhj=−η∂whj∂Ek(3)
注意到, whj先影響到第 𝑗 個輸出層神經元的輸入值 βj,再影響到其輸出值 y^jk,然後影響到 Ek,有
∂whj∂Ek=∂y^jk∂Ek⋅∂βj∂y^jk⋅∂whj∂βj(4)
根據 βj定義,有:
bh=∂whj∂βj(5)
Sigmoid函數的導數爲:
f′(x)=f(x)(1−f(x))(6)
於是根據式子(1)和(2),取出式(4)中的前兩項並取負後設爲gj(注:此處設爲gj是爲了後面繼續往前一層求導時複用此結果值,見式12第三行),有
gj=−∂y^jk∂Ek⋅∂βj∂y^jk=−(y^jk−yjk)⋅f′(βj−θj)=(yjk−y^jk)⋅y^jk(1−y^jk)=y^jk(1−y^jk)(yjk−y^jk)(7)
將式(5)、(7)代入式子(4),再代入式(3)得到BP算法中關於whj的更新公式:
Δwhj=ηgjbh(8)
根據y^lk=f(βj−θj)可以看出偏置θj更新公式的計算方法與whj類似,只需要特別注意相比Δwhj的式子(8)少了bh而多了一個負號(f(βj−θj)中的−θj),即:
Δθj=−ηgj(9)
又有:
Δvih=−η∂vih∂Ek(10)
其中:
∂vih∂Ek=j=1∑l(∂y^jk∂Ek⋅∂βj∂y^jk⋅∂bh∂βj)⋅∂αh∂bh⋅∂vih∂αh=j=1∑l(∂βj∂Ek⋅∂bh∂βj)⋅∂αh∂bh⋅∂vih∂αh=j=1∑l(−gj⋅whj)⋅f′(αh−γh)⋅∂vih∂αh=−j=1∑l(whjgj)⋅bh(1−bh)⋅xi(11)
注:∑j=1l是因爲輸出層的各個元素都與bh相連,需要綜合影響。這也是式子(7)中設gj的原因,保存中間值,加速上一層的計算,避免重複計算。另外,∂αh∂bh=f′(αh−γh)=bh(1−bh)
將式子(11)中的部分值抽出來設爲:
eh=bh(1−bh)j=1∑lwhjgj(12)
則得到Δvih:
Δvih=ηehxi(13)
同理得到,
Δγh=−ηeh(14)
注:需要特別注意的就是運算過程中的符號,是否需要∑,中間結果的保存。
對於每一個訓練樣本,BP算法執行的步驟爲:先將輸入樣本提供給輸入層神經元,然後逐層將信號前傳,指導產生輸出層的結果;然後計算出輸出層的誤差,再將誤差逆向傳播到隱層神經元,最後根據隱層神經元的誤差來對連接權重和閾值(偏量)進行調整。該過程爲循環進行,直到滿足某一過程爲止。
如果直接能推理懂西瓜書中的內容,那就最好了。不過由於這個官方配圖其實不太符合習慣而且沒有標明偏置,所以我自己重新畫了一遍並將原推理過程中省略的部分加上了,避免過程跳躍太快帶來疑惑。
參考:
[1] 周志華, 機器學習, 北京: 清華大學出版社, 2016年1月.