反向傳播(BP)算法到底傳播了個啥?

反向傳播算法 BackPropagation ,簡稱BP算法。常用於訓練多層神經網絡,那麼它到底傳播了個啥?又是怎麼傳播的呢?

我們知道,對於一個機器學習算法,其最終預測出的值與實際值一般會存在差異,那麼我們定義這個差異爲誤差E。算法中有若干參數需要學習,那麼怎麼學習呢?以什麼策略去變化參數,使得預測值更接近真實值呢?

這就是採用BP算法的初衷,我們知道預測值是由所有參數與相連的輸入運算後得到的,也就是說預測值與真實值之間的誤差E其實是與每個參數相關的,可以認爲誤差是由每個參數造成的,因此我們試圖將誤差進行反向傳播,計算每個參數引起的誤差大小,以此爲依據來更新參數,使得重新進行前向傳播計算出的預測值越來越接近真實值,由此起到訓練的作用。

從西瓜書中摘取示例網絡的圖片來計算BP的過程:

注:該圖示中輸入層在最下面,輸出層在最上面。我們可能更習慣輸入層在左側,輸出層在右側。如下圖所示。

給定以上含一層隱層的神經網絡,有 𝑑 個輸入神經元、𝑞 個隱層神經元、𝑙個輸出神經元。
給定:
訓練集 D={(x1,y1),(x2,y2),...,(xm,ym)},xiRd,yiRlD=\left \{ (x_{1},y_{1}),(x_{2},y_{2}),..., (x_{m},y_{m})\right \},x_{i}\in \mathbb{R}^{d},y_{i}\in \mathbb{R}^{l},即輸入由 𝑑 個屬性描述(𝑑 個𝑥),輸出 𝑙 維實值向量(𝑙個𝑦)。
其中:
輸出層第 𝑗 個神經元的閾值(偏置)用θj\theta _{j}表示,
隱層第 ℎ 個神經元的閾值用γh\gamma _{h} 表示。
輸入層第 𝑖 個神經元與隱層第 ℎ 個神經元之間的連接權重爲vihv_{ih}
隱層第 ℎ 個神經元與輸出層第 𝑗 個神經元之間的連接權重爲wihw_{ih}
記隱層第 ℎ 個神經元接收到的輸入爲αh=i=1dvihxi\alpha _{h}=\sum_{i=1}^{d}v_{ih}x_{i}
輸出層第 𝑗 個神經元接收到的輸入爲βj=h=1qwhjbh\beta _{j}=\sum_{h=1}^{q}w_{hj}b_{h}
其中bhb_{h}爲隱層第 ℎ 個神經元的輸出,即bh=f(αhγh)b_{h}=f\left ( \alpha _{h}-\gamma _{h} \right )
假設隱層和輸出層的激活函數爲Sigmoid函數(注:Sigmoid函數求導特性良好,見公式6)。

對訓練集(xk,yk)(x_{k}, y_{k}),假定神經網絡的輸出爲y^k=(y^1k,y^2k,...,y^lk)\hat y_{k}=\left (\hat y_{1}^{k}, \hat y_{2}^{k}, ..., \hat y_{l}^{k} \right )
即:
y^lk=f(βjθj)(1)\hat y_{l}^{k}=f\left ( \beta _{j}-\theta _{j} \right )\tag{1}
則網絡在(xk,yk)(x_{k}, y_{k})上的均方誤差爲Ek=12j=1l(y^jkyjk)2(2)E_{k}=\frac{1}{2}\sum_{j=1}^{l}\left ( \hat y_{j}^{k}- y_{j}^{k} \right )^{2}\tag{2}
(注:加12\frac{1}{2}是爲了約掉平方求導得到的2。)

網絡中需要更新的參數個數爲(d+l+1)q+l\left ( d+l+1 \right )q+l個:輸入層到隱層的d×qd\times q個權值、隱層到輸出層的q×lq\times l個權值、 𝑞 個隱層神經元的閾值, 𝑙 個輸出層神經元的閾值。

BP是一個迭代學習算法,在迭代的每一輪中,採用廣義的感知機學習規則對參數進行更新估計。

對任意參數 𝑣 的更新公式爲 vv+Δvv\leftarrow v+\Delta v

BP算法基於梯度下降策略,以目標的負梯度方向對參數進行調整,對式子(2)的 EkE_{k},給定學習率 𝜂 ,有

Δwhj=ηEkwhj(3)\Delta w_{hj}=-\eta \frac{\partial E_{k}}{\partial w_{hj}}\tag{3}

注意到, whjw_{hj}先影響到第 𝑗 個輸出層神經元的輸入值 βj\beta _{j},再影響到其輸出值 y^jk\hat y_{j}^{k},然後影響到 EkE_{k},有

Ekwhj=Eky^jky^jkβjβjwhj(4)\frac{\partial E_{k}}{\partial w_{hj}}=\frac{\partial E_{k}}{\partial \hat y_{j}^{k}}\cdot \frac{\partial \hat y_{j}^{k}}{\partial \beta _{j}}\cdot \frac{\partial \beta _{j}}{\partial w_{hj}}\tag{4}

根據 βj\beta _{j}定義,有:

bh=βjwhj(5)b_{h}= \frac{\partial \beta _{j}}{\partial w_{hj}}\tag{5}

Sigmoid函數的導數爲:

f(x)=f(x)(1f(x))(6){f}'\left ( x \right )=f\left ( x \right )\left ( 1-f\left ( x \right ) \right ) \tag{6}

於是根據式子(1)和(2),取出式(4)中的前兩項並取負後設爲gjg_{j}(注:此處設爲gjg_{j}是爲了後面繼續往前一層求導時複用此結果值,見式12第三行),有

gj=Eky^jky^jkβj=(y^jkyjk)f(βjθj)=(yjky^jk)y^jk(1y^jk)=y^jk(1y^jk)(yjky^jk)(7)\begin{aligned}g_{j} &=-\frac{\partial E_{k}}{\partial \hat y_{j}^{k}}\cdot \frac{\partial \hat y_{j}^{k}}{\partial \beta _{j}}\\ &=-\left ( \hat y_{j}^{k}- y_{j}^{k}\right )\cdot{f}'\left ( \beta _{j}-\theta _{j} \right )\\ &=\left ( y_{j}^{k} -\hat y_{j}^{k}\right ) \cdot\hat y_{j}^{k}\left ( 1- \hat y_{j}^{k}\right ) \\&=\hat y_{j}^{k}\left ( 1- \hat y_{j}^{k}\right )\left ( y_{j}^{k} -\hat y_{j}^{k}\right ) \end{aligned} \tag{7}
將式(5)、(7)代入式子(4),再代入式(3)得到BP算法中關於whjw_{hj}的更新公式:

Δwhj=ηgjbh(8)\Delta w_{hj}=\eta g_{j}b_{h}\tag{8}

根據y^lk=f(βjθj)\hat y_{l}^{k}=f\left ( \beta _{j}-\theta _{j} \right )可以看出偏置θj\theta _{j}更新公式的計算方法與whjw_{hj}類似,只需要特別注意相比Δwhj\Delta w_{hj}的式子(8)少了bhb_{h}而多了一個負號(f(βjθj)f(\beta _{j}-\theta _{j})中的θj-\theta _{j}),即:
Δθj=ηgj(9)\Delta \theta _{j}=-\eta g_{j}\tag{9}
又有:
Δvih=ηEkvih(10)\Delta v _{ih}=-\eta \frac{\partial E_{k}}{\partial v _{ih}}\tag{10}
其中:
Ekvih=j=1l(Eky^jky^jkβjβjbh)bhαhαhvih=j=1l(Ekβjβjbh)bhαhαhvih=j=1l(gjwhj)f(αhγh)αhvih=j=1l(whjgj)bh(1bh)xi(11)\begin{aligned} \frac{\partial E_{k}}{\partial v _{ih}}&=\sum_{j=1}^{l}(\frac{\partial E_{k}}{\partial \hat y_{j}^{k}}\cdot \frac{\partial \hat y_{j}^{k}}{\partial \beta _{j}}\cdot \frac{\partial \beta _{j}}{\partial b_{h}})\cdot \frac{\partial b_{h}}{\partial \alpha_{h}}\cdot \frac{\partial \alpha _{h}}{\partial v _{ih}} \\ &=\sum_{j=1}^{l}(\frac{\partial E_{k}}{\partial \beta _{j}}\cdot \frac{\partial \beta _{j}}{\partial b_{h}})\cdot \frac{\partial b_{h}}{\partial \alpha_{h}}\cdot \frac{\partial \alpha _{h}}{\partial v _{ih}} \\&=\sum_{j=1}^{l}(-g_{j}\cdot w_{hj})\cdot{f}'\left ( \alpha _{h}-\gamma _{h} \right )\cdot \frac{\partial \alpha _{h}}{\partial v _{ih}} \\&=-\sum_{j=1}^{l}(w_{hj}g_{j})\cdot b_{h}\left ( 1- b_{h}\right )\cdot x_{i} \end{aligned}\tag{11}

注:j=1l\sum_{j=1}^{l}是因爲輸出層的各個元素都與bhb_{h}相連,需要綜合影響。這也是式子(7)中設gjg_{j}的原因,保存中間值,加速上一層的計算,避免重複計算。另外,bhαh=f(αhγh)=bh(1bh)\frac{\partial b_{h}}{\partial \alpha_{h}}={f}'\left ( \alpha _{h}-\gamma _{h} \right )=b_{h}\left ( 1- b_{h}\right)

將式子(11)中的部分值抽出來設爲:
eh=bh(1bh)j=1lwhjgj(12)\begin{aligned}e_{h} =b_{h}\left ( 1- b_{h}\right )\sum_{j=1}^{l}w_{hj}g_{j}\end{aligned}\tag{12}
則得到Δvih\Delta v _{ih}
Δvih=ηehxi(13)\Delta v _{ih}=\eta e_{h}x_{i}\tag{13}
同理得到,
Δγh=ηeh(14)\Delta \gamma _{h}=-\eta e_{h} \tag{14}

注:需要特別注意的就是運算過程中的符號,是否需要\sum,中間結果的保存。

對於每一個訓練樣本,BP算法執行的步驟爲:先將輸入樣本提供給輸入層神經元,然後逐層將信號前傳,指導產生輸出層的結果;然後計算出輸出層的誤差,再將誤差逆向傳播到隱層神經元,最後根據隱層神經元的誤差來對連接權重和閾值(偏量)進行調整。該過程爲循環進行,直到滿足某一過程爲止。

如果直接能推理懂西瓜書中的內容,那就最好了。不過由於這個官方配圖其實不太符合習慣而且沒有標明偏置,所以我自己重新畫了一遍並將原推理過程中省略的部分加上了,避免過程跳躍太快帶來疑惑。

參考:
[1] 周志華, 機器學習, 北京: 清華大學出版社, 2016年1月.
周志華 著. 機器學習,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章