如果您完成了第 9.5 節(jié)中的練習,您會發(fā)現(xiàn)梯度裁剪對于防止偶爾出現(xiàn)的大量梯度破壞訓練穩(wěn)定性至關重要。我們暗示爆炸梯度源于長序列的反向傳播。在介紹大量現(xiàn)代 RNN 架構之前,讓我們仔細看看反向傳播在數(shù)學細節(jié)中是如何在序列模型中工作的。希望這個討論能使梯度消失和爆炸的概念更加精確。如果你還記得我們在 5.3 節(jié)介紹 MLP 時通過計算圖進行前向和反向傳播的討論,那么 RNN 中的前向傳播應該相對簡單。在 RNN 中應用反向傳播稱為 時間反向傳播 ( Werbos, 1990 ). 此過程要求我們一次擴展(或展開)RNN 的計算圖。展開的 RNN 本質上是一個前饋神經(jīng)網(wǎng)絡,具有相同的參數(shù)在整個展開的網(wǎng)絡中重復出現(xiàn)的特殊屬性,出現(xiàn)在每個時間步長。然后,就像在任何前饋神經(jīng)網(wǎng)絡中一樣,我們可以應用鏈式法則,通過展開的網(wǎng)絡反向傳播梯度。每個參數(shù)的梯度必須在參數(shù)出現(xiàn)在展開網(wǎng)絡中的所有位置上求和。從我們關于卷積神經(jīng)網(wǎng)絡的章節(jié)中應該熟悉處理這種權重綁定。
出現(xiàn)并發(fā)癥是因為序列可能相當長。處理由超過一千個標記組成的文本序列并不罕見。請注意,從計算(太多內(nèi)存)和優(yōu)化(數(shù)值不穩(wěn)定)的角度來看,這都會帶來問題。第一步的輸入在到達輸出之前要經(jīng)過 1000 多個矩陣乘積,還需要另外 1000 個矩陣乘積來計算梯度。我們現(xiàn)在分析可能出現(xiàn)的問題以及如何在實踐中解決它。
9.7.1. RNN 中的梯度分析
我們從 RNN 工作原理的簡化模型開始。該模型忽略了有關隱藏狀態(tài)細節(jié)及其更新方式的細節(jié)。這里的數(shù)學符號沒有明確區(qū)分標量、向量和矩陣。我們只是想培養(yǎng)一些直覺。在這個簡化模型中,我們表示ht作為隱藏狀態(tài), xt作為輸入,和ot作為時間步的輸出t. 回憶一下我們在第 9.4.2 節(jié)中的討論,輸入和隱藏狀態(tài)可以在乘以隱藏層中的一個權重變量之前連接起來。因此,我們使用 wh和wo分別表示隱藏層和輸出層的權重。因此,每個時間步的隱藏狀態(tài)和輸出是
在哪里f和g分別是隱藏層和輸出層的變換。因此,我們有一個價值鏈 {…,(xt?1,ht?1,ot?1),(xt,ht,ot),…} 通過循環(huán)計算相互依賴。前向傳播相當簡單。我們所需要的只是遍歷(xt,ht,ot)一次三倍一個時間步長。輸出之間的差異ot和想要的目標 yt然后通過所有的目標函數(shù)進行評估 T時間步長為
對于反向傳播,事情有點棘手,尤其是當我們計算關于參數(shù)的梯度時wh目標函數(shù)的L. 具體來說,根據(jù)鏈式法則,
評論