1. 程式人生 > >深度神經網路之反向傳播演算法

深度神經網路之反向傳播演算法

1.DNN反向傳播演算法簡介

回顧我們前面學到的監督問題,通常會遇到這種情況,假如有mm個訓練樣本,分別為{(x1,y1),(x2,y2),(x3,y3),...,(xm,ym)}\{(x_1,y_1),(x_2,y_2),(x_3,y_3),...,(x_m,y_m) \},其中xx為輸入變數,特徵維度為n_in,y為輸出向量,特徵維度為n_out。現在我們利用這m個訓練樣本來訓練模型,當有測試樣本(xtest,?)(x_{test},?)時,需要我們能夠預測出ytesty_{test}

向量的輸出。

現在對應到我們的DNN模型之中,即輸入層有n_in個神經元,輸出層有n_out個神經元,再加上一些含有若干個神經元的隱含層。此時我們需要找到所有隱含層和輸出層所對應的線性係數矩陣W、偏倚向量b,希望通過DNN對所有的訓練樣本計算後,計算結果能夠等於或很接近樣本輸出,當有新的測試樣本資料時,能夠有效預測樣本輸出。但怎樣找到合適的線形係數矩陣W和偏倚變數b呢?

回顧我們前面學習的機器學習之Logistic迴歸機器學習之SVM支援向量機等機器學習演算法,很容易聯想到,我們可以用一個合適的損失函式來度量訓練樣本的輸出損失。然後對損失函式優化,求損失函式最小化的極值,此時對應的線性係數矩陣W,偏倚變數b便是我們希望得到的結果。深度神經網路中,損失函式優化極值求解的過程,通常是利用梯度下降法迭代完成的。當然也可以利用其他的迭代方法,比如牛頓法或擬牛頓法。梯度下降演算法以前在

機器學習之線形迴歸中有過詳細介紹,有興趣可以回顧一下。

對DNN損失函式用梯度下降法進行迭代優化求極小值的過程,便是我們的反向傳播演算法(Back Propagation,BP)

2.DNN反向傳播演算法數學推導

進行DNN反向傳播演算法之前,我們需要選擇一個損失函式,來度量計算樣本的輸出和真實樣本之間的損失。但訓練時的計算樣本輸出怎麼得到呢?

初始時,我們會隨機選擇一系列W,b,然後利用神經網路之前向傳播演算法中介紹到的al=σ(zl)=σ(Wlal1+bl)a^l=\sigma(z^l)=\sigma(W^la^{l-1}+b^l),計算輸出層所對應的a

La^L,此時的aLa^L便是DNN計算樣本的輸出。為專注DNN反向傳播演算法的推導,我們選擇較為簡單的損失函式,為此我們使用最常見的均方差來度量損失。

即對於每個樣本,我們期望能夠最小化下式,其中aLa^Lyy為特徵維度的n_out的向量,S2||S||_2為S的L2範數。
J(W,b,x,y)=12aLy22 J(W,b,x,y)=\frac{1}{2}||a^L-y||_{2}^{2}
通過損失函式,我們能夠用梯度下降法來迭代求解每一層的W,b。首先計算的是輸出層,其中輸出層的W,b滿足下式
aL=σ(zL)=σ(WLaL1+bL) a^L=\sigma(z^L)=\sigma(W^La^{L-1}+b^L)

J(W,b,x,y)=12aLy22=12σ(WLaL1+bL)y22 J(W,b,x,y)=\frac{1}{2}||a^L-y||_{2}^{2}=\frac{1}{2}||\sigma(W^La^{L-1}+b^L)-y||_2^2

然後對WL,bLW^L,b^L分別求偏導,其中符號\odot表示Hadamard積,對於兩個維度的向量A(a1,a2,a3,...,an)TA(a_1,a_2,a_3,...,a_n)^TB(b1,b2,b3,...,bn)TB(b_1,b_2,b_3,...,b_n)^T,那麼AB=(a1b1,a2b2,a3b3,...,anbn)TA\odot B=(a_1b_1,a_2b_2,a_3b_3,...,a_nb_n)^T。之所以使用Hadamard積,是因為我們不瞭解啟用函式的形式,所以用Hadamard積來乘啟用函式的導數。另外補充矩陣求導的知識點,其中ABB=AT\frac{\partial AB}{\partial B}=A^T
J(W,b,x,y)WL=J(W,b,x,y)zLzLWL=(aLy)σ(zL)(aL1)T \frac{\partial J(W,b,x,y)}{\partial W^L}=\frac{\partial J(W,b,x,y)}{\partial z^L}\frac{\partial z^L}{\partial W^L}=(a^L-y)\odot {\sigma}' (z^L)(a^{L-1})^T

J(W,b,x,y)bL=J(W,b,x,y)zLzL)bL=(aLy)σ(zL) \frac{\partial J(W,b,x,y)}{\partial b^L}=\frac{\partial J(W,b,x,y)}{\partial z^L}\frac{\partial z^L)}{\partial b^L}=(a^L-y)\odot {\sigma}' (z^L)

注意到在求解輸出層W,b的時候,有公共部分J(W,b,x,y)zL\frac{\partial J(W,b,x,y)}{\partial z^L},因此我們可以把公共部分先算出來,記為
δL=J(W,b,x,y)zL=(aLy)σ(zL) \delta^L=\frac{\partial J(W,b,x,y)}{\partial z^L}=(a^L-y)\odot {\sigma}' (z^L)