在前面幾節(jié)課的代碼演示中,我們都是先通過模型的正向傳播(forward propagation)對輸入計算模型輸出,利用損失函數(shù)得出預測值和真實值的損失值,然后使用反向傳播算法(back-propagation)快速計算目標函數(shù)關(guān)于各個參數(shù)的梯度,最后使用隨機梯度下降算法(Stochastic Gradient Descent,SGD)基于前面得到的梯度值計算loss函數(shù)局部最小值,從而求解權(quán)重并更新網(wǎng)絡(luò)參數(shù)。
模型訓練關(guān)鍵步驟
基于反向傳播算法(back-propagation)的 動求梯度極 簡化了深度學習模型訓練算法的實現(xiàn)。
這 節(jié)我們將使 數(shù)學和計算圖(computational graph)兩個 式來描述正向傳播和反向傳播。具體地,我們將以帶 L2 范數(shù)正則化的單隱藏層感知機為樣例模型解釋正向傳播和反向傳播。
1.正向傳播
正向傳播是指對神經(jīng) 絡(luò)沿著從輸 層到輸出層的順序,依次計算并存儲模型的中間變量(包括輸出)。為簡單起 ,假設(shè)輸 是 個特征為 x Rd 的樣本,且不考慮偏差項,那么中間變量
網(wǎng)絡(luò)計算的中間變量
其中W(1) Rh d 是隱藏層的權(quán)重參數(shù)。把中間變量z Rh 輸 按元素操作的激活函數(shù)? 后,
我們將得到向量 度為h 的隱藏層變量
h = ?(z).
隱藏變量h 也是 個中間變量。假設(shè)輸出層參數(shù)只有權(quán)重W(2) Rq h,我們可以得到向量 度
為q 的輸出層變量
o = W(2)h.
假設(shè)損失函數(shù)為?,且樣本標簽為y,我們可以計算出單個數(shù)據(jù)樣本的損失項
L = ?(o, y)
根據(jù)L2 范數(shù)正則化的定義,給定超參數(shù)λ,正則化項即
正則化懲罰項
其中矩陣的Frobenius 范數(shù)等價于將矩陣變平為向量后計算L2 范數(shù)。最終,模型在給定的數(shù)據(jù)
樣本上帶正則化的損失為
J = L + s.
我們將J 稱為有關(guān)給定數(shù)據(jù)樣本的 標函數(shù),并在以下的討論中簡稱 標函數(shù)。
2.正向傳播的計算圖
通常繪制計算圖來可視化運算符和變量在計算中的依賴關(guān)系,一般來說,計算圖中左下角是輸入,右上角是輸出。其中方框代表變量,圓圈代表運算符,箭頭表示從輸入到輸出之間的依賴關(guān)系。
正向傳播的計算圖
3.反向傳播
反向傳播指的是計算神經(jīng)網(wǎng)絡(luò)參數(shù)梯度的方法??偟膩碚f,反向傳播依據(jù)微積分中的鏈式法則,沿著從輸出層到輸入層的順序,依次計算并存儲目標函數(shù)有關(guān)神經(jīng)網(wǎng)絡(luò)各層的中間變量以及參數(shù)的梯度。對輸入或輸出X , Y , Z 為任意形狀張量的函數(shù)Y = f ( X ) 和Z = g ( Y ) ,通過鏈式法則,有:
鏈式法則求導
其中prod運算將根據(jù)兩個輸入的形狀,在必要的操作(如轉(zhuǎn)置和互換輸入位置)后對兩個輸入做乘法。
例中的模型,它的參數(shù)是W(1) 和W(2) ,因此反向傳播的目標是計算目標函數(shù)對參數(shù)的導數(shù) J/ W(1)和 J/ W(2)。
應(yīng)用鏈式法則則依次計算各中間變量和參數(shù)的梯度,其計算次序與前向傳播中相應(yīng)中間變量的計算次序恰恰相反。
首先,分別計算目標函數(shù)J = L + s 有關(guān)損失項L和正則項s 的梯度:
其次,依據(jù)鏈式法則計算目標函數(shù)有關(guān)輸出層變量的梯度 J/ o Rq:
接下來,計算正則項有關(guān)兩個參數(shù)的梯度:
現(xiàn)在,我們可計算最靠近輸出層的模型參數(shù)的梯度 J/ W(2) Rq h。依據(jù)鏈式法則,得到:
沿著輸出層向隱藏層繼續(xù)反向傳播,隱藏層變量的梯度 J/ h Rh 計算如下:
由于激活函數(shù)?是按元素運算的,中間變量z 的梯度 J/ z Rh的計算需要使用按元素乘法符 :
最終,可以得到最靠近輸入層的模型參數(shù)的梯度 J/ W(1) Rh d。依據(jù)鏈式法則,得到:
4.正向傳播和反向傳播的訓練關(guān)系
在訓練深度學習模型時,正向傳播和反向傳播之間相互依賴。
一方面,正向傳播的計算可能依賴于模型參數(shù)的當前值。而這些模型參數(shù)是在反向傳播的梯度計算后通過優(yōu)化算法迭代的。
例如,計算正則化項
依賴模型參數(shù)W(1) 和 W(2) 的當前值。而這些當前值是優(yōu)化算法最近 次根據(jù)反向傳播算出梯度后迭代得到的。
另一方面,反向傳播的梯度計算可能依賴于各變量的當前值。而這些變量的當前值是通過正向傳播計算得到的。舉例來說,參數(shù)梯度 J/ W(2) = ( J/ o)hT + λW(2) 的計算需要依賴隱藏層變量的當前值 h。這個當前值是通過從輸 層到輸出層的正向傳播計算并存儲得到的。
因此,在模型參數(shù)初始化完成后,我們交替地進 正向傳播和反向傳播,并根據(jù)反向傳播計算的梯度迭代模型參數(shù)。既然我們在反向傳播中使 了正向傳播中計算得到的中間變量來避免重復計算,那么這個重 也導致正向傳播結(jié)束后不能 即釋放中間變量內(nèi)存。這也是訓練要 預測占 更多內(nèi)存的 個重要原因。另外需要指出的是,這些中間變量的個數(shù)跟 絡(luò)層數(shù)線性相關(guān),每個變量的 小跟批量 小和輸 個數(shù)也是線性相關(guān)的,它們是導致較深的神經(jīng) 絡(luò)使 較 批量訓練時更容易超內(nèi)存的主要原因。
總結(jié)
正向傳播沿著從輸 層到輸出層的順序,依次計算并存儲神經(jīng) 絡(luò)的中間變量。
反向傳播沿著從輸出層到輸 層的順序,依次計算并存儲神經(jīng) 絡(luò)中間變量和參數(shù)的梯度。
所謂反向傳播,傳播的是損失,也就是根據(jù)最后的損失,計算網(wǎng)絡(luò)中每一個節(jié)點的梯度,這里利用了鏈式法則,使得梯度的計算并不是很復雜。
在訓練深度學習模型時,正向傳播和反向傳播相互依賴。