目錄
鏈式法則
邏輯回歸的正、反向傳播
邏輯回歸的正、反向傳播案例
全連接神經網絡的正、反向傳播
全連接神經網絡的正、反向傳播案例
參考資料
鏈式法則 |
類型一:
類型二:
類型三:
邏輯回歸的正、反向傳播 |
邏輯回歸可以看做最簡單的神經網絡,他只有一個神經元,損失函數選擇的是對數損失,他的正向傳播過程如下圖所示:
邏輯回歸可以看做最簡單的神經網絡,他只有一個神經元,損失函數選擇的是對數損失,他的正向傳播過程如下圖所示:
接下來反向計算損失函數對每個變量的導數。如果你想直接求L對w1的導數是會產生很多重復計算的,回憶下鏈式求導法則就知道了。因此我們從右向左求導數,這樣可以避免重復計算,也就是梯度反向傳播的過程,如下圖所示:
然后就可以更新w和b,更新模型了,即
非常簡單吧,下面我們通過一個案例演示,看一下如何梯度反向傳播(BP算法)是如何降低訓練誤差的。
邏輯回歸的正、反向傳播案例 |
假設最開始初始化,本輪訓練樣本為[(2,3),0],損失函數選用的對數損失,如下圖所示:
可以看出在當前模型參數下,正向傳播后,損失為2.859
接下來,使用BP算法更新模型參數,如下圖所示:
如果再進行正向傳播計算損失的話,可以發現,損失從2.859降低到1.682:
全連接神經網絡的正、反向傳播 |
上面舉了一個單神經元使用對數損失做分類的例子,這里為了描述全面,闡述一下多神經元做分類的情況,下圖是全連接神經網絡正向傳播的過程:
接下來反向計算損失函數對每個變量的導數。也就是梯度反向傳播的過程,如下圖所示:
然后就可以更新w和b,更新模型了,即
全連接神經網絡的正、反向傳播案例 |
假設最開始初始化所有w都等於0.5,所有的b都等於1,本輪訓練樣本為[(2,3),0],損失函數選用的對數損失,如下圖所示:
可以看出在當前模型參數下,正向傳播后,損失為2.017
接下來,使用BP算法更新模型參數,如下圖所示:
如果再進行正向傳播計算損失的話,可以發現,損失從2.017降低到1.83:
對應代碼:

import numpy as np def sigmod(x): return 1/(1+np.exp(-(x))) w1_1 = np.array([0.5,0.5]) w1_2 = np.array([0.5,0.5]) w2_1 = np.array([0.5,0.5]) w2_2 = np.array([0.5,0.5]) w3_1 = np.array([0.5,0.5]) b1_1 = 1 b1_2 = 1 b2_1 = 1 b2_2 = 1 b3_1 = 1 x = np.array([2,3]) y = 0 for i in range(200): a1_1 = sigmod(sum(x*w1_1)+b1_1) a1_2 = sigmod(sum(x*w1_2)+b1_2) a1 = np.array([a1_1,a1_2]) a2_1 = sigmod(sum(a1*w2_1)+b2_1) a2_2 = sigmod(sum(a1*w2_2)+b2_2) a2 = np.array([a2_1,a2_2]) a3 = sigmod(sum(a2 * w3_1)+b3_1) loss = -y * np.log(a3) - (1 - y) * np.log(1 - a3) print(loss) dz3 = a3 - y dw3_1 = dz3 * a2 dz2 = dz3 * w3_1 * a2 * (1-a2) dw2_1 = dz2[0] * a1 dw2_2 = dz2[1] * a1 da1 = dz2[0] *w2_1 + dz2[1]*w2_2 dz1 = da1 * a1 *(1-a1) dw1_1 = dz1 * x dw1_2 = dz1 * x step = 0.1 w1_1 -= step*dw1_1 w1_2 -= step*dw1_2 w2_1 -= step*dw2_1 w2_2 -= step*dw2_2 w3_1 -= step*dw3_1 b1_1 -= step*dz1[0] b1_2 -= step*dz1[1] b2_1 -= step*dz2[0] b2_2 -= step*dz2[1] b3_1 -= step*dz3
參考資料 |
吳恩達機器學習