首先反向傳播是利用鏈式法則遞迴計算表示式的梯度的方法。從簡單表示式入手可以為複雜表示式打好符號和規則基礎。先考慮乙個簡單的二元乘法函式
這些導數的意義在於函式變數在某個點周圍的極小區域內變化,而導數就是變數變化導致的函式在該方向的變化率。
現在考慮更複雜的包含多個函式的復合函式,比如
鏈式法則指出將這些梯度表示式鏈結起來的正確方式是相乘,比如
# 設定輸入值
x = -2; y = 5; z = -4
# 進行前向傳播
q = x + y # q becomes 3
f = q * z # f becomes -12
# 進行反向傳播:
# 首先回傳到 f = q * z
**** = q # df/dz = q, 所以關於z的梯度是3
dfdq = z # df/dq = z, 所以關於q的梯度是-4
# 現在回傳到q = x + y
dfdx = 1.0 * dfdq # dq/dx = 1. 這裡的乘法是因為鏈式法則
dfdy = 1.0 * dfdq # dq/dy = 1
最後得到變數的梯度[dfdx, dfdy, ****],它們告訴我們函式f對於變數[x, y, z]的敏感程度。這是乙個最簡單的反向傳播。一般會使用乙個更簡潔的表達符號,這樣就不用寫df了。這就是說,用dq來代替dfdq,且總是假設梯度是關於最終輸出的。
這次計算可以被視覺化為如下計算線路影象:
上圖的真實值計算線路展示了計算的視覺化過程。前向傳播從輸入計算到輸出(綠色),反向傳播從尾部開始,根據鏈式法則遞迴地向前計算梯度(顯示為紅色),一直到網路的輸入端。可以認為,梯度是從計算鏈路中回流。
下面通過例子來對這一過程進行理解。加法門收到了輸入[-2, 5],計算輸出是3。既然這個門是加法操作,那麼對於兩個輸入的區域性梯度都是+1。網路的其餘部分計算出最終值為-12。在反向傳播時將遞迴地使用鏈式法則,算到加法門(是乘法門的輸入)的時候,知道加法門的輸出的梯度是-4。如果網路如果想要輸出值更高,那麼可以認為它會想要加法門的輸出更小一點(因為負號),而且還有乙個4的倍數。繼續遞迴並對梯度使用鏈式法則,加法門拿到梯度,然後把這個梯度分別乘到每個輸入值的區域性梯度(就是讓-4乘以x和y的區域性梯度,x和y的區域性梯度都是1,所以最終都是-4)。可以看到得到了想要的效果:如果x,y減小(它們的梯度為負),那麼加法門的輸出值減小,這會讓乘法門的輸出值增大。
任何可微分的函式都可以看做門。可以將多個門組合成乙個門,也可以根據需要將乙個函式分拆成多個門。使用sigmoid啟用函式的2維神經元的例子。輸入是[x0, x1],可學習的權重是[w0, w1, w2]。一會兒會看見,這個神經元對輸入資料做點積運算,然後其啟用資料被sigmoid函式擠壓到0到1之間。在實際的應用中將這些操作裝進乙個單獨的門單元中將會非常有用。該神經元反向傳播的**實現如下:
w = [2,-3,-3] # 假設一些隨機資料和權重
x = [-1, -2]
# 前向傳播
dot = w[0]*x[0] + w[1]*x[1] + w[2]
f = 1.0 / (1 + math.exp(-dot)) # sigmoid函式
# 對神經元反向傳播
ddot = (1 - f) * f # 點積變數的梯度, 使用sigmoid函式求導
dx = [w[0] * ddot, w[1] * ddot] # 回傳到x
dw = [x[0] * ddot, x[1] * ddot, 1.0 * ddot] # 回傳到w
# 完成!得到輸入的梯度
cs231n 筆記02 反向傳播與2 NN示例
反向傳播鏈式計算梯度。sigmoid函式將實數壓縮到 0,1 tanh函式將實數壓縮到 1,1 relu函式 優點 梯度下降收斂巨大加速。缺點 如果學習率設定得太快,可能會發現網路中40 神經元不被啟用。改進 leaky relu。x 0時,y接近0。maxout是relu與leaky relu的一...
cs231n筆記總結
cs231n的課程以及作業都完成的差不多了,後續的課程更多的涉及到卷積神經網路的各個子方向了,比如語義分割 目標檢測 定位 視覺化 遷移學習 模型壓縮等等。assignment3有涉及到這些中的一部分,但需要深入了解的話還是得看 了。所以在看 前把之前已學的知識,筆記和作業 一起做個整理。部落格裡主...
CS231n理解筆記
linear classification notes 該方法的組成 乙個是評分函式 原始影象資料到類別分值的對映 乙個是損失函式 用來量化 分類標籤的得分和真實標籤之間的一致性。影象分類的任務是從已有的固定分類標籤中選擇乙個並分配一張影象,我們介紹了knn分類器,該分類器的基本思想是通過將測試影象...