在深度神經網絡(DNN)模型與前向傳播算法中,我們對DNN的模型和前向傳播算法做了總結,這裡我們更進一步,對DNN的反向傳播算法(Back Propagation,BP)做一個總結。
在了解DNN的反向傳播算法前,我們先要知道DNN反向傳播算法要解決的問題,也就是說,什麼時候我們需要這個反向傳播算法?
回到我們監督學習的一般問題,假設我們有m個訓練樣本:{(x1,y1),(x2,y2),...,(xm,ym)},其中x為輸入向量,特徵維度為n_in,而y為輸出向量,特徵維度為n_out。我們需要利用這m個樣本訓練出一個模型,當有一個新的測試樣本(xtest,?)來到時, 我們可以預測ytest向量的輸出。
如果我們採用DNN的模型,即我們使輸入層有n_in個神經元,而輸出層有n_out個神經元。再加上一些含有若干神經元的隱藏層。此時我們需要找到合適的所有隱藏層和輸出層對應的線性係數矩陣W,偏倚向量b,讓所有的訓練樣本輸入計算出的輸出儘可能的等於或很接近樣本輸出。怎麼找到合適的參數呢?
如果大家對傳統的機器學習的算法優化過程熟悉的話,這裡就很容易聯想到我們可以用一個合適的損失函數來度量訓練樣本的輸出損失,接著對這個損失函數進行優化求最小化的極值,對應的一系列線性係數矩陣W,偏倚向量b即為我們的最終結果。
在DNN中,損失函數優化極值求解的過程最常見的一般是通過梯度下降法來一步步迭代完成的,當然也可以是其他的迭代方法比如牛頓法與擬牛頓法。對DNN的損失函數用梯度下降法進行迭代優化求極小值的過程即為我們的反向傳播算法。
在進行DNN反向傳播算法前,我們需要選擇一個損失函數,來度量訓練樣本計算出的輸出和真實的訓練樣本輸出之間的損失。DNN可選擇的損失函數有不少,為了專注算法,這裡我們使用最常見的均方差來度量損失。即對於每個樣本,我們期望最小化下式:
其中,aL和y為特徵維度為n_out的向量,而||S||2為S的L2範數。現在我們開始用梯度下降法迭代求解每一層的W,b。首先是輸出層第L層。注意到輸出層的W,b滿足下式:
現在我們把輸出層的梯度算出來了,那麼如何計算上一層L−1層的梯度,上上層L−2層的梯度呢?這裡我們需要一步步的遞推,注意到對於第l層的未激活輸出zl,它的梯度可以表示為:
如果我們可以依次計算出第l層的δl,則該層的Wl,bl很容易計算?為什麼呢?注意到根據前向傳播算法,我們有:
由於梯度下降法有批量(Batch),小批量(mini-Batch),隨機三個變種,為了簡化描述,這裡我們以最基本的批量梯度下降法為例來描述反向傳播算法。實際上在業界使用最多的是mini-Batch的梯度下降法。不過區別僅僅在於迭代時訓練樣本的選擇而已。
輸入: 總層數L,各隱藏層與輸出層的神經元個數,激活函數,損失函數,迭代步長α,最大迭代次數MAX與停止迭代閾值ϵ
輸出:各隱藏層與輸出層的線性關係係數矩陣W和偏倚向量
1 ) 初始化各隱藏層與輸出層的線性關係係數矩陣W和偏倚向量b的值為一個隨機值。
2)for iter to 1 to MAX:
2-1) for i =1 to m:
a) 將DNN輸入a1設置為xi
b) for l=2 to L,進行前向傳播算法計算
c) 通過損失函數計算輸出層的δi,L
d) for l= L to 2, 進行反向傳播算法計算
2-2) for l = 2 to L,更新第l層的Wl,bl:
2-3) 如果所有W,b的變化值都小於停止迭代閾值ϵ,則跳出迭代循環到步驟3。
3)輸出各隱藏層與輸出層的線性關係係數矩陣W和偏倚向量b。
有了DNN反向傳播算法,我們就可以很方便的用DNN的模型去解決各種監督學習的分類回歸問題。當然DNN的參數眾多,矩陣運算量也很大,直接使用會有各種各樣的問題。有哪些問題以及如何嘗試解決這些問題並優化DNN模型與算法,我們在以後涉及。
本文內容採編自極智能,版權歸原作者所有,灃雲平臺不擁有其著作權,亦不承擔相應法律責任。如果本文涉及版權問題,請聯繫工作人員刪除,感謝。