詳解 誤差反向傳播算法推導

誤差反向傳播算法誤差

反向傳播算法(back propagation,簡稱BP模型)是1986年由Rumelhart和McClelland爲首的科學家提出的概念,是一種按照誤差逆向傳播算法訓練的多層前饋神經網絡,是目前應用最廣泛的神經網絡。

誤差反向傳播算法系統的解決了多層神經網絡隱含層連接權學習問題,人們把採用這種算法進行誤差校正的多層前饋網絡稱爲BP網。BP神經網絡具有任意複雜的模式分類能力和優良的多維函數映射能力,解決了簡單感知器不能解決的異或(Exclusive OR,XOR)和一些其他問題。

從結構上講,BP網絡具有輸入層、隱藏層和輸出層;
從本質上講,BP算法就是以網絡誤差平方爲目標函數、採用梯度下降法來計算目標函數的最小值。

因此學習誤差反向傳播算法對於深度學習的深造起到非常重要的作用,這也是本篇博客的主題。

由於梯度下降法需要求解相鄰層的梯度,這就要求網絡中需要處處可導,也就是需要激活函數也必須支持可導性。M-P模型中使用step函數作爲激活函數,只能輸出0或1,不連續所以不可導。爲了使誤差能夠順利傳播,科學家們提出了可導函數sigmoid作爲激活函數f(u)f(u),但是在後期的使用中發現sigmoid函數也存在一定的問題(梯度飽和問題),於是發展出了ReLU函數及其變形激活函數,想深入瞭解激活函數的小夥伴可以查看下這篇博客:https://blog.csdn.net/ViatorSun/article/details/82418578

1) 以單層感知器入

反向傳播算法便於大家理解,下面先解釋下單層感知器的梯度下降法。由複合函數求導法則可以知道,誤差函數求導如下所示:

Ewi=Eyywi\frac{\partial E}{\partial w_i} = \frac{\partial E}{\partial y}\frac{\partial y}{\partial w_i}

y=f(u)y=f(u),求誤差函數 EEwiw_i 的導數爲:

Ewi=(ry)ywi=(ry)f(u)wi\frac{\partial E}{\partial w_i} = -(r-y)\frac{\partial y}{\partial w_i} = -(r-y)\frac{\partial f(u)}{\partial w_i}

f(u)f(u)的導數就是對複合函數求導

Ewi=(ry)f(u)uuwi\frac{\partial E}{\partial w_i} = -(r-y)\frac{\partial f(u)}{\partial u} \frac{\partial u}{\partial w_i}

uuwiw_i求導的結果只和xix_i相關:uwi=xi\frac{\partial u}{\partial w_i} = x_i 整理下上面兩個式子,得到:

Ewi=(ry)xif(u)u\frac{\partial E}{\partial w_i} = -(r-y)x_i\frac{\partial f(u)}{\partial u}

在此,我們對激活函數SigmoidSigmoidσ(x)=11+ex\sigma(x) = \frac {1}{1+e^{-x}}函數求導:

σ(x)x=ex(1+ex)2 \frac{\partial \sigma(x)}{\partial x} = \frac {e^{-x}}{(1+e^{-x})^2}

ex=ue^{-x} = u 則導函數爲:

f(u)u=f(u)(1f(u))\frac{\partial f(u)}{\partial u} = f(u)(1-f(u))

將激活函數的導數代入上面整理結果得到:

Ewi=(ry)xif(u)(1f(u))\frac{\partial E}{\partial w_i} = -(r-y)x_i f(u)(1-f(u))

由於輸出結果y=f(u)y=f(u),所以單層感知器的權重調整值爲(其中η\eta爲學習率):

Δwi=ηEwi=η(ry)y(1y)xi\Delta w_i = - \eta\frac{\partial E}{\partial w_i} = \eta(r-y)y(1-y)x_i

至此,這就是單層感知器權重的調節量。


2)多層感知器的反傳傳播算法

接下來,我們再分析下多層感知器。多層感知器的誤差函數EE等於個輸出單元的誤差總和。E=12j=1q(rjyj)2E = \frac{1}{2} \sum_{j=1}^q (r_j - y_j)^2

對誤差函數求導得:

Ewij=Eyjyjwij\frac{\partial E}{\partial w_{ij}} = \frac{\partial E}{\partial y_j} \frac{\partial y_j}{\partial w_{ij}}

其中,wijw_{ij}代表xix_iyjy_j之間的連接權重,對EE求導的結果只和yjy_j相關,如下所示:

Ewij=(rjyj)yjwij\frac{\partial E}{\partial w_{ij}} = -(r_j - y_j) \frac{\partial y_j}{\partial w_{ij}}

與單層感知相同,對上式展開後對複合函數求導:

Ewij=(rjyj)yjujujwij\frac{\partial E}{\partial w_{ij}} = -(r_j - y_j) \frac{\partial y_j}{\partial u_j} \frac{\partial u_j}{\partial w_{ij}}

下面與單層感知器一樣,對誤差函數求導得:

Ewij=(rjyj)yj(1yj)xi\frac{\partial E}{\partial w_{ij}} = -(r_j - y_j) y_j (1-y_j)x_i

則權重的調節值爲(其中η\eta爲學習率):

Δwij=η(rjyj)yj(1yj)xi\Delta w_{ij} = \eta(r_j - y_j )y_j (1-y_j)x_i

由此可見,多層感知器中,只需要使用與連接權重wijw_{ij}相關的輸入xix_i和輸出yjy_j,即可計算出連接權重的調節值。

將神經網絡分解開可以更清晰的分析,再將最後一列各變量之間的偏導數累成就是整個鏈式法則的體現。


3) 帶中間層的多層感知器的反向傳播算法

最後我們再解釋下帶中間層的多層感知器的梯度下降法。由於中間層的加入,層之間的權重下標我們增加到三個,其中ii表示輸入層單元,jj表示中間層單元,kk表示輸出層單元 。如下圖所

首先考慮輸出層與中間層之間的連接權重w2jkw_{2jk}的調整。對權重w2jkw_{2jk}求導:

Ew2jk=Eykyku2ku2kw2jk\frac{\partial E}{\partial w_{2jk}} = \frac{\partial E}{\partial y_k} \frac{\partial y_k}{\partial u_{2k}} \frac{\partial u_{2k}}{\partial w_{2jk}}

經過誤差函數EE對輸出yky_k求導,輸出yky_k求導,輸出yky_k對激活值u2ku_{2k}求導,激活值u2ku_{2k}對連接權重w2jkw_{2jk}求導之後,得到:

Ew2jk=(rkyk)yk(1yk)zj\frac{\partial E}{\partial w_{2jk}} = -(r_k - y_k) y_k ( 1-y_k) z_j

所以,即便是輸出層有多個單元,只要對每個輸出單元分別求導後,也能得到誤差函數對中間層權重的偏導數接下來計算輸入層和中間層之間的連接權重w1ijw_{1ij}的偏導數:

Ew1ij=k=1q[Eykyku2ku2kw1ij]\frac{\partial E}{\partial w_{1ij}} = \sum_{k=1}^q[ \frac{\partial E}{\partial y_k} \frac{\partial y_k}{\partial u_{2k}} \frac{\partial u_{2k}}{\partial w_{1ij}}]

中間層的單元jj和輸出層的所有單元相連,所以如上式所示,誤差函數EE對連接權重W1ijW_{1ij}求偏導,就是對所有輸出單元的導數進行加權和,實際使用的是所有輸出單元連接權重的總和。將sigmoidsigmoid函數的導數和誤差函數代入到上式,得:

Ew1ij=k=1q[(rkyk)yk(1yk)u2kw1ij]\frac{\partial E}{\partial w_{1ij}} = -\sum_{k=1}^q[ (r_k - y_k)y_k(1-y_k) \frac{\partial u_{2k}}{\partial w_{1ij}}]

由於連接權重w1ijw_{1ij}只對中間層zjz_j的狀態產生影響,所以上式中剩餘部分求導後的結果如下:

u2kw1ij=u2kzjzjw1ij\frac{\partial u_{2k}}{\partial w_{1ij}} = \frac{\partial u_{2k}}{\partial z_j } \frac{\partial z_j}{\partial w_{1ij}}

激活值u2ku_{2k}zjz_j求導得到連接權重w2jkw_{2jk},結合下式就可以求出輸入層與中間層之間的連接權重w1ijw_{1ij}的調整值:

zjw1ij=zju1ju1jw1ij=zj(1zj)xi\frac{\partial z_j}{\partial w_{1ij}} = \frac{\partial z_j}{\partial u_{1j}} \frac{\partial u_{1j}}{\partial w_{1ij}} = z_j ( 1- z_j) x_i Δw1ij=ηk=1q[(rkyk)yk(1yk)w2jk]zj(1zj)xi\Delta w_{1ij} = \eta \sum_{k=1}^q [ (r_k - y_k) y_k ( 1- y_k) w_{2jk} ] z_j (1-z_j) x_i

具體推導過程可以參考下列公式

在此需要注意zj=f(uj)z_j=f(u_j),輸入層與中間層之間的權重調整值是相關單元在中間層與輸出層之間的權重調整值的總和。

4)小結

至此,誤差反向傳播算法的講解就全部結束了,其中包含了大量的公式,理解起來可能會有一些難度,但是這是必過的檻。如果實在不理解過程的話,只記住最後那張圖也可以,那張圖便是整個算法的精髓所在。除此之外,在實際應用過程中可能還會遇到一個問題,那就是激活函數使用SigmoidSigmoid或者tanhtanh函數的時候,如果xx趨向正負無窮的時候,會出現偏導數爲零的情況,見下圖,左側爲SigmoidSigmoid函數圖像,右側爲其導函數的圖像。這時候,由於權重調整值趨近於0,所以無法調整連接權重,權重所在的單元也就不再起作用。

這就是誤差反向傳播算法中的梯度消失導致無法調整連接權重的問題,對於這個問題,需要在訓練的過程中合理地調整學習率η\eta,以防止梯度消失。

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