網(wǎng)站建設(shè)中的需求報告功能企業(yè)策劃書
前向傳播與反向傳播
- 前向傳播與反向傳播的作用
- 前向傳播及公式
- 前向傳播范例
- 反向傳播及公式
- 反向傳播范例
- 小結(jié)
- 前向傳播計算圖
前向傳播與反向傳播的作用
在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時,前向傳播和反向傳播相互依賴。
對于前向傳播,我們沿著依賴的方向遍歷計算圖并計算其路徑上的所有變量。
然后將這些用于反向傳播,其中計算順序與計算圖的相反,用于計算w、b的梯度(即神經(jīng)網(wǎng)絡(luò)中的參數(shù))。隨后使用梯度下降算法來更新參數(shù)。
因此,在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時,在初始化模型參數(shù)后, 我們交替使用前向傳播和反向傳播,利用反向傳播給出的梯度來更新模型參數(shù)。
注意:
- 反向傳播重復(fù)利用前向傳播中存儲的中間值,以避免重復(fù)計算。 帶來的影響之一是我們需要保留中間值,直到反向傳播完成。 這也是訓(xùn)練比單純的預(yù)測需要更多的內(nèi)存(顯存)的原因之一。
- 這些中間值的大小與網(wǎng)絡(luò)層的數(shù)量和批量的大小大致成正比。 因此,使用更大的批量來訓(xùn)練更深層次的網(wǎng)絡(luò)更容易導(dǎo)致內(nèi)存不足(out of memory)錯誤。
前向傳播及公式
前向傳播(forward propagation或forward pass) 指的是:按順序(從輸入層到輸出層)計算和存儲神經(jīng)網(wǎng)絡(luò)中每層的結(jié)果。
假設(shè)輸入樣本是 x∈Rd\mathbf{x}\in \mathbb{R}^dx∈Rd, 并且我們的隱藏層不包括偏置項。 這里的中間變量是:
z=W(1)x,\mathbf{z}= \mathbf{W}^{(1)} \mathbf{x},z=W(1)x,
其中W(1)∈Rh×d\mathbf{W}^{(1)} \in \mathbb{R}^{h \times d}W(1)∈Rh×d是隱藏層的權(quán)重參數(shù)。 將中間變量z∈Rh\mathbf{z}\in \mathbb{R}^hz∈Rh通過激活函數(shù)?\phi?后, 我們得到長度為hhh的隱藏激活向量:
h=?(z).\mathbf{h}= \phi (\mathbf{z}).h=?(z).
隱藏變量h\mathbf{h}h也是一個中間變量。 假設(shè)輸出層的參數(shù)只有權(quán)重W(2)∈Rq×h\mathbf{W}^{(2)} \in \mathbb{R}^{q \times h}W(2)∈Rq×h, 我們可以得到輸出層變量,它是一個長度為qqq的向量:
o=W(2)h.\mathbf{o}= \mathbf{W}^{(2)} \mathbf{h}.o=W(2)h.
假設(shè)損失函數(shù)為lll,樣本標(biāo)簽為yyy,我們可以計算單個數(shù)據(jù)樣本的損失項
L=l(o,y).L = l(\mathbf{o}, y).L=l(o,y).
根據(jù)L2L_2L2?正則化的定義,給定超參數(shù)λ\lambdaλ,正則化項為
s=λ2(∥W(1)∥F2+∥W(2)∥F2),s = \frac{\lambda}{2} \left(\|\mathbf{W}^{(1)}\|_F^2 + \|\mathbf{W}^{(2)}\|_F^2\right),s=2λ?(∥W(1)∥F2?+∥W(2)∥F2?),
其中矩陣的Frobenius范數(shù)是將矩陣展平為向量后應(yīng)用的L2L_2L2?范數(shù)。 最后,模型在給定數(shù)據(jù)樣本上的正則化損失為:
J=L+s.J = L + s.J=L+s.
前向傳播范例
反向傳播及公式
反向傳播(backward propagation或backpropagation)指的是計算神經(jīng)網(wǎng)絡(luò)參數(shù)梯度的方法。也稱“BP算法”
簡言之,該方法根據(jù)微積分中的鏈?zhǔn)揭?guī)則,按相反的順序從輸出層到輸入層遍歷網(wǎng)絡(luò)。
該算法存儲了計算某些參數(shù)梯度時所需的任何中間變量(偏導(dǎo)數(shù))。
假設(shè)我們有函數(shù)Y=f(X)\mathsf{Y}=f(\mathsf{X})Y=f(X)和Z=g(Y)\mathsf{Z}=g(\mathsf{Y})Z=g(Y), 其中輸入和輸出X,Y,Z\mathsf{X}, \mathsf{Y}, \mathsf{Z}X,Y,Z是任意形狀的張量。 利用鏈?zhǔn)椒▌t,我們可以計算Z\mathsf{Z}Z關(guān)于X\mathsf{X}X的導(dǎo)數(shù)
?Z?X=prod(?Z?Y,?Y?X).\frac{\partial \mathsf{Z}}{\partial \mathsf{X}} = \text{prod}\left(\frac{\partial \mathsf{Z}}{\partial \mathsf{Y}}, \frac{\partial \mathsf{Y}}{\partial \mathsf{X}}\right).?X?Z?=prod(?Y?Z?,?X?Y?).
反向傳播的目的是計算梯度?J/?W(1)\partial J/\partial \mathbf{W}^{(1)}?J/?W(1)和?J/?W(2)\partial J/\partial \mathbf{W}^{(2)}?J/?W(2). 為此,我們應(yīng)用鏈?zhǔn)椒▌t,依次計算每個中間變量和參數(shù)的梯度。 計算的順序與前向傳播中執(zhí)行的順序相反,因為我們需要從計算圖的結(jié)果開始,并朝著參數(shù)的方向努力。
- 計算目標(biāo)函數(shù)J=L+sJ=L+sJ=L+s相對于損失項LLL和正則項sss的梯度
?J?L=1and?J?s=1.\frac{\partial J}{\partial L} = 1 \; \text{and} \; \frac{\partial J}{\partial s} = 1.?L?J?=1and?s?J?=1. - 根據(jù)鏈?zhǔn)椒▌t計算目標(biāo)函數(shù)關(guān)于輸出層變量o\mathbf{o}o的梯度:
?J?o=prod(?J?L,?L?o)=?L?o∈Rq.\frac{\partial J}{\partial \mathbf{o}} = \text{prod}\left(\frac{\partial J}{\partial L}, \frac{\partial L}{\partial \mathbf{o}}\right) = \frac{\partial L}{\partial \mathbf{o}} \in \mathbb{R}^q.?o?J?=prod(?L?J?,?o?L?)=?o?L?∈Rq. - 計算正則化項相對于兩個參數(shù)的梯度:
?s?W(1)=λW(1)and?s?W(2)=λW(2).\frac{\partial s}{\partial \mathbf{W}^{(1)}} = \lambda \mathbf{W}^{(1)} \; \text{and} \; \frac{\partial s}{\partial \mathbf{W}^{(2)}} = \lambda \mathbf{W}^{(2)}.?W(1)?s?=λW(1)and?W(2)?s?=λW(2). - 計算最接近輸出層的模型參數(shù)的梯度 ?J/?W(2)∈Rq×h\partial J/\partial \mathbf{W}^{(2)} \in \mathbb{R}^{q \times h}?J/?W(2)∈Rq×h。 使用鏈?zhǔn)椒▌t得出:
?J?W(2)=prod(?J?o,?o?W(2))+prod(?J?s,?s?W(2))=?J?oh?+λW(2).\frac{\partial J}{\partial \mathbf{W}^{(2)}}= \text{prod}\left(\frac{\partial J}{\partial \mathbf{o}}, \frac{\partial \mathbf{o}}{\partial \mathbf{W}^{(2)}}\right) + \text{prod}\left(\frac{\partial J}{\partial s}, \frac{\partial s}{\partial \mathbf{W}^{(2)}}\right)= \frac{\partial J}{\partial \mathbf{o}} \mathbf{h}^\top + \lambda \mathbf{W}^{(2)}.?W(2)?J?=prod(?o?J?,?W(2)?o?)+prod(?s?J?,?W(2)?s?)=?o?J?h?+λW(2). - 為了獲得關(guān)于W(1)\mathbf{W}^{(1)}W(1)的梯度,我們需要繼續(xù)沿著輸出層到隱藏層反向傳播。 關(guān)于隱藏層輸出的梯度?J/?h∈Rh\partial J/\partial \mathbf{h} \in \mathbb{R}^h?J/?h∈Rh由下式給出:
?J?h=prod(?J?o,?o?h)=W(2)??J?o.\frac{\partial J}{\partial \mathbf{h}} = \text{prod}\left(\frac{\partial J}{\partial \mathbf{o}}, \frac{\partial \mathbf{o}}{\partial \mathbf{h}}\right) = {\mathbf{W}^{(2)}}^\top \frac{\partial J}{\partial \mathbf{o}}.?h?J?=prod(?o?J?,?h?o?)=W(2)??o?J?. - 由于激活函數(shù)?\phi?是按元素計算的, 計算中間變量z\mathbf{z}z的梯度?J/?z∈Rh\partial J/\partial \mathbf{z} \in \mathbb{R}^h?J/?z∈Rh需要使用按元素乘法運算符,我們用⊙\odot⊙表示:
?J?z=prod(?J?h,?h?z)=?J?h⊙?′(z).\frac{\partial J}{\partial \mathbf{z}} = \text{prod}\left(\frac{\partial J}{\partial \mathbf{h}}, \frac{\partial \mathbf{h}}{\partial \mathbf{z}}\right) = \frac{\partial J}{\partial \mathbf{h}} \odot \phi'\left(\mathbf{z}\right).?z?J?=prod(?h?J?,?z?h?)=?h?J?⊙?′(z). - 最后,我們可以得到最接近輸入層的模型參數(shù)的梯度 ?J/?W(1)∈Rh×d\partial J/\partial \mathbf{W}^{(1)} \in \mathbb{R}^{h \times d}?J/?W(1)∈Rh×d。 根據(jù)鏈?zhǔn)椒▌t,我們得到:
?J?W(1)=prod(?J?z,?z?W(1))+prod(?J?s,?s?W(1))=?J?zx?+λW(1).\frac{\partial J}{\partial \mathbf{W}^{(1)}} = \text{prod}\left(\frac{\partial J}{\partial \mathbf{z}}, \frac{\partial \mathbf{z}}{\partial \mathbf{W}^{(1)}}\right) + \text{prod}\left(\frac{\partial J}{\partial s}, \frac{\partial s}{\partial \mathbf{W}^{(1)}}\right) = \frac{\partial J}{\partial \mathbf{z}} \mathbf{x}^\top + \lambda \mathbf{W}^{(1)}.?W(1)?J?=prod(?z?J?,?W(1)?z?)+prod(?s?J?,?W(1)?s?)=?z?J?x?+λW(1).
反向傳播范例
假設(shè)輸入x = 1.5,模型初始參數(shù)w=0.8,b=0.2。學(xué)習(xí)率為0.1,則過程如下圖:
當(dāng)有兩層的時候:
小結(jié)
- 前向傳播在神經(jīng)網(wǎng)絡(luò)定義的計算圖中按順序計算和存儲中間變量,它的順序是從輸入層到輸出層。
- 反向傳播按相反的順序(從輸出層到輸入層)計算和存儲神經(jīng)網(wǎng)絡(luò)的中間變量和參數(shù)的梯度。
- 在訓(xùn)練深度學(xué)習(xí)模型時,前向傳播和反向傳播是相互依賴的。
- 訓(xùn)練比預(yù)測需要更多的內(nèi)存。
前向傳播計算圖
其中正方形表示變量,圓圈表示操作符。 左下角表示輸入,右上角表示輸出。 注意顯示數(shù)據(jù)流的箭頭方向主要是向右和向上的。