導言
動機:為了高效的設(shè)計和調(diào)試神經(jīng)網(wǎng)絡(luò),理解反向傳播的機理是很重要的。
問題描述:有了函數(shù)f(x)我們對于計算f在x點的梯度很感興趣。
在神經(jīng)網(wǎng)絡(luò)中,f相應(yīng)于損失函數(shù)和輸入x將組成訓練集和神經(jīng)網(wǎng)絡(luò)權(quán)重,比如損失將是SVM損失函數(shù)而輸入既是訓練數(shù)據(jù)也是權(quán)重,既是我們可以很快的使用后向傳播計算出梯度,實際上我們通常也僅僅計算每一個參數(shù)的梯度,所以我們可以使用它來實現(xiàn)一個參數(shù)的更新,然而正如我們在課程中后面會看到的x仍然是有用的,比如為了可視化神經(jīng)網(wǎng)絡(luò)在做什么。
計算
首先看最簡單的例子:
反向傳播是一個精美的本地進程。電路圖中的每個門都會獲得一些輸入,可以立即計算兩件事情:1.其輸出值和2.其輸入的本地梯度相對于其輸出值。注意,門可以完全獨立完成,而不知道它們嵌入的全電路的任何細節(jié)。但是,一旦正向通過結(jié)束,在反向傳播期間,門將最終了解其輸出值的梯度在整個電路的最終輸出。連鎖規(guī)則說,門應(yīng)該采用該梯度,并將其乘以其通常為其所有輸入計算的每個梯度。
所以,后向傳播其實是門之間的互相交流,通過梯度信號來交流,是增加還是減少,增加減少多大程度,來是的最后的輸出結(jié)果更高。
模塊度
上面介紹的門是相對來說任意的,任何可微的函數(shù)都可以作為一個門,并且可以把多個門集合到一個里面或者分解一個函數(shù)到多個門中。

可以用下圖來表示:

分階段反向傳播。如上面的代碼所示,在實踐中,將前進路徑分解為容易反向推進的階段總是有幫助的。例如,我們創(chuàng)建了一個中間變量點,它保存了w和x之間的點積的輸出。在反向通過期間,我們?nèi)缓笠来斡嬎悖ǚ聪蝽樞颍┍4孢@些變量的梯度的相應(yīng)變量(例如,ddot,最后dw,dx)。
本節(jié)的要點是,反向傳播如何執(zhí)行的細節(jié)以及我們認為是門的前向功能的哪些部分是方便的問題。它有助于了解表達式的哪些部分具有容易的本地漸變,使得它們可以用最少的代碼和努力鏈接在一起。
案例 分階段計算
下面看以下的案例:

x = 3 # example values
y = -4
# forward pass
sigy = 1.0 / (1 + math.exp(-y)) # sigmoid in numerator #(1)
num = x + sigy # numerator #(2)
sigx = 1.0 / (1 + math.exp(-x)) # sigmoid in denominator #(3)
xpy = x + y #(4)
xpysqr = xpy**2 #(5)
den = sigx + xpysqr # denominator #(6)
invden = 1.0 / den #(7)
f = num * invden # done! #(8)
有幾點需要注意:首先應(yīng)該將計算過的變量放入緩存,為了后巷傳遞變量應(yīng)該把一些變量存儲,在實際中你想要結(jié)構(gòu)化這些變量,所以他們在后向傳播中能夠可用。另外,前向的表達式中用到x和y多次,所以當我們使用后向傳播的時候應(yīng)該慎重使用+=而不是=,以在這些變量上積累梯度,而不是直接替換掉,這個符合多變量鏈式規(guī)則。
后向傳播流的模式
在這幅圖中,add gate 會將梯度平等的傳遞給輸入節(jié)點,無論前向的節(jié)點傳遞了什么值。
而max gate 規(guī)定了梯度傳遞的路線,他只會傳遞給特定的一個路線。
multiply gate 會交換傳入的梯度。

向量梯度
當兩個向量相乘的時候,如何找到梯度是比較難的。
# forward pass
W = np.random.randn(5, 10)
X = np.random.randn(10, 3)
D = W.dot(X)
# now suppose we had the gradient on D from above in the circuit
dD = np.random.randn(*D.shape) # same shape as D
dW = dD.dot(X.T) #.T gives the transpose of the matrix
dX = W.T.dot(dD)
使用維度分析!請注意,您不需要記住dW和dX的表達式,因為它們?nèi)菀赘鶕?jù)維度重新導出。例如,我們知道權(quán)重dW上的梯度在計算之后必須與W的大小相同,并且必須依賴于X和dD的矩陣乘法(如同時X,W都是單個數(shù)字的情況)而不是矩陣)。總是有一種實現(xiàn)這一點的方法,以便維度得到解決。例如,X大小為[10×3],dD大小為[5×3],所以如果我們想要dW和W具有[5×10]的形狀,那么實現(xiàn)這一點的唯一方法是使用dD.dot XT),如上所示。
使用小的,明確的例子。有些人可能會發(fā)現(xiàn)很難得出一些向量化表達式的漸變更新。我們的建議是明確地寫出一個最小的矢量化示例,導出紙上的漸變,然后將模式推廣到其有效的向量化形式。