1. 誤差反向傳播算法(Back Propagation):
①將訓練集數據輸入到神經網絡的輸入層,經過隱藏層,最后達到輸出層並輸出結果,這就是前向傳播過程。
②由於神經網絡的輸出結果與實際結果有誤差,則計算估計值與實際值之間的誤差,並將該誤差從輸出層向隱藏層反向傳播,直至傳播到輸入層;
③在反向傳播的過程中,根據誤差調整各種參數的值(相連神經元的權重),使得總損失函數減小。
④迭代上述三個步驟(即對數據進行反復訓練),直到滿足停止准則。
2. 前向傳播和反向傳播的區別:
①前向傳播 forward propagation:從前往后,根據輸入和參數計算輸出值和損失值,並將當地梯度(local gradient),即每個結點的輸出值對該節點的輸入值的偏導數,保留
在內存中以供反向傳播計算梯度時使用,注意:前一個結點的輸出是后一個結點的輸入
②反向傳播 back propagation:從后往前,利用鏈式求導法則,計算損失函數值對各參數 / 輸入值 / 中間值的偏導數 / 梯度,梯度下降法需要使用反向傳播來計算梯度。
△在利用梯度下降法對權重矩陣等參數進行更新時,需要利用反向傳播去計算損失函數對權重參數的偏導數
3. 反向傳播的過程:
△正向傳播時,在計算流程圖中,每一個結點計算並保存該節點的輸出值對輸入值的偏導數 / 導數,即局部梯度(local gradient)
①將輸出值和標簽代入損失函數,計算出損失值。損失值作為第一個數值參與計算,記為S,開始計算導數 / 偏導,S對S求導=1,所以從后面開始第一個為1
②每遇到一個節點,根據鏈式求導法則,將已經計算過的上游梯度(從后面過來已經計算過的梯度)乘於局部梯度,即可得到損失函數值對該參數的梯度。從整體上看,是遇到
結點一直累乘下去。
梯度與局部梯度的關系:
③有幾類需要特別注意的計算:
(1)結點的運算為 * 時:局部梯度=另一個元素(二元)/ 其他元素的乘積(多元)
(2)結點運算為 + 時:局部梯度為1(因為只對自己求導)
(3)結點運算為 max 時:max的數(最大的數)的梯度為其本身,其他數的梯度為0(因為只選擇了最大的數,其他的數對於結果並沒有影響)
④當向量作為輸入時,如何計算梯度:當變量是向量時,梯度的形狀與向量的形狀相同(綠色的是輸入值、輸出值,紅色的是梯度)
最后一個結點的函數是L2,導數是2q_i * x_j,又x_j =1,所以經過L2后,梯度變為2;然后向量【0.22,0.26】乘以上游梯度2,得【0.44,0.52】;又到上一個頂點 * ,注意:
這里的x的局部梯度不是W,W的局部梯度也不是x,因為W和x是向量,不是數值,不可以直接這么計算。這里設q = W * x,得矩陣,如圖所示。在對計算結果(矩陣)的各元
素求偏導,即可得到當地梯度。上游梯度 * 當地梯度就可以啦!
鏈式求導:
4. 例子:
5. forward、backward代碼: