動手學深度學習15-深度學習-正向傳播、反向傳播和計算圖


前幾節里面我們使用了小批量隨機梯度下降的優化算法來訓練模型。在實現中,我們只提供了模型的正向傳播的(forward propagation)計算,即對於輸入計算模型輸出,然后通過autograd模塊來調用系統自動生成的bachward函數來計算梯度。本節將使用數學和計算圖(computational graph)兩個方式來描述正向傳播和反向傳播。具體來說,我們將以帶L2范數正則化的含單隱藏層感知機為樣例模型解釋正向和反向傳播。

正向傳播

正向傳播是指神經網絡沿着輸入層到輸出層的順序,依次計算並存儲模型的中間變量(包括輸出)。為簡單起見,假設輸入是一個特征為\(x∈R^{d}的樣本,且不考慮偏置項,那么中間變量 z = \boldsymbol{W}^{(1)}x\),其中,\(\boldsymbol{W}^{(1)} ∈ R^{hxd}是隱藏層的權重參數。把其中變量z∈R^{h}輸入按照元素運算的激活函數\phi\)\(將得到向量長度為h的隱藏層變量h = \phi(z)\)

隱藏層變量h也是一個中間變量。假設輸出層測呢概述只有權重\(\boldsymbol{W}^{(2)} ∈R^{qxh}\),可以得到向量長度為q的輸出層變量

\[\omicron = \boldsymbol{W}^{(2)} h \]

假設損失函數 \(l,且樣本標簽為y,可以計算出單個樣本的損失項L =l(\omicron,y)\),根據L2范數正則化的定義,給定超參數\(\lambda\),正則化項即

\[s = \frac{\lambda}{2}(\|\boldsymbol{W}^{(1)}\|_{F}^{2}+\|\boldsymbol{W}^{(2)}\|_{F}^{2}) \]

其中,矩陣的forbenius范數等價於將矩陣變平為向量后計算L2范數。最終,模型在給定的數據樣本帶上正則化的損失為
\(J = L+s 我們將J\)稱為有關給定數據樣本的目標函數,並在以下的討論中簡稱為目標函數。

反向傳播

反向傳播是指計算神經網絡參數梯度的方法。
總的來說,反向傳播依據微積分中的鏈式法則,沿着從輸出層到輸入層的順序,一次計算並存儲在有關神經網絡各層的中間變量以及參數的梯度。對輸入或者輸出為X,Y和Z為任意形狀的張量的函數Y = f(X) 和Z = g(Y) 通過鏈式法則,我們有

\[\frac { \partial Z } { \partial X } = \operatorname { prod } \left( \frac { \partial Z } { \partial Y } , \frac { \partial Y } { \partial X } \right) \]

其中,pord運算符將根據兩個輸入的形狀,在必要的操作(如轉置和互換輸入位置)后對兩個輸入做乘法)以本節的樣例模型為例:
它的參數為\(\boldsymbol{W}^{(1)}和\boldsymbol{W}^{(2)},因此反向傳播的目標計算\frac{\partial J}{\partial W^{(1)}} 和\frac{\partial J}{\partial W^{(2)}}\)。我們將應用鏈式法則依次計算各中間變量和參數的梯度,其計算次序與前向傳播中相應的變量的計算次序正好相反。

首先,分別計算目標函數

\[J = L+s有關損失項L和正則項s的梯度\frac{\partial J}{\partial L}=1 ,\frac{\partial J}{\partial s}=1 \]

其次,依據鏈式法則計算目標函數有關輸出層變量的梯度\(\frac{\partial J}{\partial \omicron} ∈ R^{q}\)

\[\frac{\partial J}{\partial \omicron} = prod(\frac{\partial J}{\partial L},\frac{\partial L}{\partial \omicron}) = \frac{\partial J}{\partial \omicron} \]

接下來,我們可以計算正則項有關的兩個參數的梯度:
\(\frac{\partial s}{\partial W^{(1)}} = \lambda \boldsymbol{W}^{(1)}\),\(\frac{\partial s}{\partial W^{(2)}} = \lambda \boldsymbol{W}^{(2)}\)

現在我們可以計算靠近輸出層的模型參數的梯度\(\frac{\partial J}{\partial W^{(2)}}∈ R^{qxh}\),根據鏈式法則,得到
$\frac{\partial J}{\partial W^{(2)}} = prod(\frac{\partial J}{\partial \omicron},\frac{\partial \omicron}{\partial {W}^{(2)}}) + prod(\frac{\partial J}{\partial s},\frac{\partial s}{\partial {W}^{(2)}})=\frac{\partial J}{\partial \omicron}h^{T}+1* \lambda{W}^{(2)} $

沿着輸出層想隱藏層繼續反向傳播,隱藏層變量的梯度\(\frac{\partial J}{\partial h}∈R^{h}\)可以這樣計算
\(\frac{\partial J}{\partial h}=prod(\frac{\partial J}{\partial \omicron},\frac{\partial \omicron}{\partial h})\) =\({W^{(2)}}^{T}\frac{\partial J}{\partial \omicron}\)

由於激活函數\(\phi是按照元素計算的,中間變量z的梯度,\frac{\partial J}{\partial z}) ∈R^{h}的計算也需要使用按照元素乘法符⊙\)

\[\frac{\partial J}{\partial z} = prod(\frac{\partial J}{\partial h},\frac{\partial h}{\partial z})=\frac{\partial J}{\partial h}⊙ \phi^{'}(z) \]

最終,我們得到最靠近輸入層的模型參數的梯度為\(\frac{\partial J}{\partial W^{(1)}}∈R^{hxd}\),根據鏈式法則,得到

\[\frac{\partial J}{\partial W^{(1)}} = prod(\frac{\partial J}{\partial z},\frac{\partial z}{\partial {W}^{(1)}}) + prod(\frac{\partial J}{\partial s},\frac{\partial s}{\partial {W}^{(1)}})= \frac{\partial J}{\partial z}{x}^{T}+\lambda {W}^{(1)} \]

訓練深度學習模型

  • 正向傳播和反向傳播相互依賴

  • 一方面,正向傳播的梯度計算可能依賴於各變量的當前值,而這些變量的當前值都是通過反向傳播的梯度計算之后通過優化算法迭代的。比如加入正則化的目標函數的當前值是根據反向傳播算出梯度迭代后得到的

  • 另一方面,反向傳播的梯度計算可能依賴於各變量的當前值,而這些變量的當前值都是正向傳播計算得到的 。計算參數梯度的需要某系變量的當前值,而這些當前值是通過正向傳播計算並存儲得到。

  • 在模型參數初始化完成后,我們交替的進行正向和反向傳播,並根據反向傳播的梯度迭代模型參數。在訓練過程中,正向傳播和反向傳播的中的各個中間變量和梯度計算值都需要占用內存,而在預測過程中,沒有反向傳播計算梯度的過程,因此預測過程中內存的占用較小。

  • 訓練過程中的質檢變量的個數大體上跟網絡層數線性相關,每個變量的大小跟批量大小和輸入個數也是線性相關的,它們是導致較深的神經網絡使用較大批量訓練是更容易超內存的主要原因。

小結

  • 正向傳播沿着輸入層到輸出層的順序,依次計算並存儲神經網絡的中間變量。
  • 反向傳播沿着輸出層到輸入層的順序,依次計算並存儲神經網絡中間變量和參數的梯度。
  • 在訓練深度學習模型時,正向傳播和反向傳播相互依賴,而在預測過程中,不存在反向傳播過程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM