深度神經網絡(DNN)模型與反向傳播算法

博文出自:http://www.javashuo.com/article/p-wrofbqww-bh.htmlphp

另一篇博文,輔助理解公式推導:http://deeplearning.stanford.edu/wiki/index.php/反向傳導算法html

深度神經網絡(DNN)模型與前向傳播算法中,咱們對DNN的模型和前向傳播算法作了總結,這裏咱們更進一步,對DNN的反向傳播算法(Back Propagation,BP)作一個總結。算法

1. DNN反向傳播算法要解決的問題

    在瞭解DNN的反向傳播算法前,咱們先要知道DNN反向傳播算法要解決的問題,也就是說,何時咱們須要這個反向傳播算法? 網絡

    回到咱們監督學習的通常問題,假設咱們有m個訓練樣本:{(x1,y1),(x2,y2),...,(xm,ym)}{(x1,y1),(x2,y2),...,(xm,ym)},其中xx爲輸入向量,特徵維度爲n_inn_in,而yy爲輸出向量,特徵維度爲n_outn_out。咱們須要利用這m個樣本訓練出一個模型,當有一個新的測試樣本(xtest,?)(xtest,?)來到時, 咱們能夠預測ytestytest向量的輸出。 機器學習

    若是咱們採用DNN的模型,即咱們使輸入層有n_inn_in個神經元,而輸出層有n_outn_out個神經元。再加上一些含有若干神經元的隱藏層。此時咱們須要找到合適的全部隱藏層和輸出層對應的線性係數矩陣WW,偏倚向量bb,讓全部的訓練樣本輸入計算出的輸出儘量的等於或很接近樣本輸出。怎麼找到合適的參數呢?函數

    若是你們對傳統的機器學習的算法優化過程熟悉的話,這裏就很容易聯想到咱們能夠用一個合適的損失函數來度量訓練樣本的輸出損失,接着對這個損失函數進行優化求最小化的極值,對應的一系列線性係數矩陣WW,偏倚向量bb即爲咱們的最終結果。在DNN中,損失函數優化極值求解的過程最多見的通常是經過梯度降低法來一步步迭代完成的,固然也能夠是其餘的迭代方法好比牛頓法與擬牛頓法。若是你們對梯度降低法不熟悉,建議先閱讀我以前寫的梯度降低(Gradient Descent)小結學習

    對DNN的損失函數用梯度降低法進行迭代優化求極小值的過程即爲咱們的反向傳播算法。測試

2. DNN反向傳播算法的基本思路

    在進行DNN反向傳播算法前,咱們須要選擇一個損失函數,來度量訓練樣本計算出的輸出和真實的訓練樣本輸出之間的損失。你也許會問:訓練樣本計算出的輸出是怎麼得來的?這 個輸出是隨機選擇一系列W,bW,b,用咱們上一節的前向傳播算法計算出來的。即經過一系列的計算:al=σ(zl)=σ(Wlal−1+bl)al=σ(zl)=σ(Wlal−1+bl)。計算到輸出層第LL層對應的aLaL即爲前向傳播算法計算出來的輸出。優化

    回到損失函數,DNN可選擇的損失函數有很多,爲了專一算法,這裏咱們使用最多見的均方差來度量損失。即對於每一個樣本,咱們指望最小化下式:htm

J(W,b,x,y)=12||aL−y||22J(W,b,x,y)=12||aL−y||22

    其中,aLaL和yy爲特徵維度爲n_outn_out的向量,而||S||2||S||2爲S的L2範數。

    損失函數有了,如今咱們開始用梯度降低法迭代求解每一層的W,bW,b。

    首先是輸出層第LL層。注意到輸出層的W,bW,b知足下式:

aL=σ(zL)=σ(WLaL−1+bL)aL=σ(zL)=σ(WLaL−1+bL)

    這樣對於輸出層的參數,咱們的損失函數變爲:

J(W,b,x,y)=12||aL−y||22=12||σ(WLaL−1+bL)−y||22J(W,b,x,y)=12||aL−y||22=12||σ(WLaL−1+bL)−y||22

    這樣求解W,bW,b的梯度就簡單了:

∂J(W,b,x,y)∂WL=∂J(W,b,x,y)∂zL∂zL∂WL=(aL−y)⊙σ′(zL)(aL−1)T∂J(W,b,x,y)∂WL=∂J(W,b,x,y)∂zL∂zL∂WL=(aL−y)⊙σ′(zL)(aL−1)T

∂J(W,b,x,y)∂bL=∂J(W,b,x,y)∂zL∂zL∂bL=(aL−y)⊙σ′(zL)∂J(W,b,x,y)∂bL=∂J(W,b,x,y)∂zL∂zL∂bL=(aL−y)⊙σ′(zL)

    注意上式中有一個符號⊙⊙,它表明Hadamard積,對於兩個維度相同的向量A(a1,a2,...an)TA(a1,a2,...an)T和B(b1,b2,...bn)TB(b1,b2,...bn)T,則A⊙B=(a1b1,a2b2,...anbn)TA⊙B=(a1b1,a2b2,...anbn)T。

    咱們注意到在求解輸出層的W,bW,b的時候,有公共的部分∂J(W,b,x,y)∂zL∂J(W,b,x,y)∂zL,所以咱們能夠把公共的部分即對zLzL先算出來,記爲:

δL=∂J(W,b,x,y)∂zL=(aL−y)⊙σ′(zL)δL=∂J(W,b,x,y)∂zL=(aL−y)⊙σ′(zL)

    如今咱們終於把輸出層的梯度算出來了,那麼如何計算上一層L−1L−1層的梯度,上上層L−2L−2層的梯度呢?這裏咱們須要一步步的遞推,注意到對於第ll層的未激活輸出zlzl,它的梯度能夠表示爲:

δl=∂J(W,b,x,y)∂zl=∂J(W,b,x,y)∂zL∂zL∂zL−1∂zL−1∂zL−2...∂zl+1∂zlδl=∂J(W,b,x,y)∂zl=∂J(W,b,x,y)∂zL∂zL∂zL−1∂zL−1∂zL−2...∂zl+1∂zl

    若是咱們能夠依次計算出第ll層的δlδl,則該層的Wl,blWl,bl很容易計算?爲何呢?注意到根據前向傳播算法,咱們有:

zl=Wlal−1+blzl=Wlal−1+bl

    因此根據上式咱們能夠很方便的計算出第l層的Wl,blWl,bl的梯度以下:

∂J(W,b,x,y)∂Wl=∂J(W,b,x,y)∂zl∂zl∂Wl=δl(al−1)T∂J(W,b,x,y)∂Wl=∂J(W,b,x,y)∂zl∂zl∂Wl=δl(al−1)T

∂J(W,b,x,y)∂bl=∂J(W,b,x,y)∂zl∂zl∂bl=δl∂J(W,b,x,y)∂bl=∂J(W,b,x,y)∂zl∂zl∂bl=δl

    那麼如今問題的關鍵就是要求出δlδl了。這裏咱們用數學概括法,第LL層的δLδL上面咱們已經求出, 假設第l+1l+1層的δl+1δl+1已經求出來了,那麼咱們如何求出第ll層的δlδl呢?咱們注意到:

δl=∂J(W,b,x,y)∂zl=∂J(W,b,x,y)∂zl+1∂zl+1∂zl=δl+1∂zl+1∂zlδl=∂J(W,b,x,y)∂zl=∂J(W,b,x,y)∂zl+1∂zl+1∂zl=δl+1∂zl+1∂zl

    可見,用概括法遞推δl+1δl+1和δlδl的關鍵在於求解∂zl+1∂zl∂zl+1∂zl。

    而zl+1zl+1和zlzl的關係其實很容易找出:

zl+1=Wl+1al+bl+1=Wl+1σ(zl)+bl+1zl+1=Wl+1al+bl+1=Wl+1σ(zl)+bl+1

    這樣很容易求出:

∂zl+1∂zl=(Wl+1)T⊙(σ′(zl),..,σ′(zl))nl+1∂zl+1∂zl=(Wl+1)T⊙(σ′(zl),..,σ′(zl))⏟nl+1

    將上式帶入上面δl+1δl+1和δlδl關係式咱們獲得:

δl=δl+1∂zl+1∂zl=(Wl+1)Tδl+1⊙σ′(zl)δl=δl+1∂zl+1∂zl=(Wl+1)Tδl+1⊙σ′(zl)

    如今咱們獲得了δlδl的遞推關係式,只要求出了某一層的δlδl,求解Wl,blWl,bl的對應梯度就很簡單的。

3. DNN反向傳播算法過程

    如今咱們總結下DNN反向傳播算法的過程。因爲梯度降低法有批量(Batch),小批量(mini-Batch),隨機三個變種,爲了簡化描述,這裏咱們以最基本的批量梯度降低法爲例來描述反向傳播算法。實際上在業界使用最多的是mini-Batch的梯度降低法。不過區別僅僅在於迭代時訓練樣本的選擇而已。

    輸入: 總層數L,以及各隱藏層與輸出層的神經元個數,激活函數,損失函數,迭代步長αα,最大迭代次數MAX與中止迭代閾值ϵϵ,輸入的m個訓練樣本{(x1,y1),(x2,y2),...,(xm,ym)}{(x1,y1),(x2,y2),...,(xm,ym)}

    輸出:各隱藏層與輸出層的線性關係係數矩陣WW和偏倚向量bb

    1) 初始化各隱藏層與輸出層的線性關係係數矩陣WW和偏倚向量bb的值爲一個隨機值。

      2)for iter to 1 to MAX:

    2-1) for i =1 to m:

      a) 將DNN輸入a1a1設置爲xixi

      b) for ll=2 to L,進行前向傳播算法計算ai,l=σ(zi,l)=σ(Wlai,l−1+bl)ai,l=σ(zi,l)=σ(Wlai,l−1+bl)

      c) 經過損失函數計算輸出層的δi,Lδi,L

      d) for ll= L to 2, 進行反向傳播算法計算δi,l=(Wl+1)Tδi,l+1⊙σ′(zi,l)δi,l=(Wl+1)Tδi,l+1⊙σ′(zi,l)

    2-2) for ll = 2 to L,更新第ll層的Wl,blWl,bl:

Wl=Wl−α∑i=1mδi,l(ai,l−1)TWl=Wl−α∑i=1mδi,l(ai,l−1)T

bl=bl−α∑i=1mδi,lbl=bl−α∑i=1mδi,l

    2-3) 若是全部W,bW,b的變化值都小於中止迭代閾值ϵϵ,則跳出迭代循環到步驟3。

    3) 輸出各隱藏層與輸出層的線性關係係數矩陣WW和偏倚向量bb。

4. DNN反向傳播算法小結

    有了DNN反向傳播算法,咱們就能夠很方便的用DNN的模型去解決第一節裏面提到了各類監督學習的分類迴歸問題。固然DNN的參數衆多,矩陣運算量也很大,直接使用會有各類各樣的問題。有哪些問題以及如未嘗試解決這些問題並優化DNN模型與算法,咱們在下一篇講。

 

參考資料:

1) Neural Networks and Deep Learning by By Michael Nielsen

2) Deep Learning, book by Ian Goodfellow, Yoshua Bengio, and Aaron Courville

3) UFLDL Tutorial