吳恩達深度學習筆記(deeplearning.ai)之循環神經網絡(RNN)(三)


1. 導讀

本節內容介紹普通RNN的弊端,從而引入各種變體RNN,主要講述GRU與LSTM的工作原理。
事先聲明,本人采用ng在課堂上所使用的符號系統,與某些學術文獻上的命名有所不同,不過核心思想都是相同的。

2. 普通RNN的弊端

  • 在NLP中,句子內部以及句子之間可能存在很長的依賴關系(long-term dependecies),最前邊的單詞對句子后面的單詞產生影響。但是普通RNN不擅長捕獲這種長期依賴關系。因為RNN相當於很深的權重共享的神經網絡,因此在反向傳播的過程中存在很嚴重的梯度消失現象,損失函數得到的輸出誤差很難影響到前面層的計算。
  • 對於深度神經網絡,不光存在梯度消失,也存在梯度爆炸的現象,以至於網絡參數崩潰(當參數梯度指數級增長時,你會看到很多參數值為NaN,這意味着網絡發生了數值溢出)。普通RNN也是如此,但是相比於梯度消失,梯度爆炸比較容易解決,可以采用梯度修剪(gradient clipping)的處理方法。

梯度修剪,指當梯度向量大於某個閾值時,re-scale梯度向量,保證它不會數值爆炸。

3. GRU

3.1 簡化GRU(便於理解)

與普通RNN相比,GRU添加了門控單元,改變了RNN的隱藏層,使得其能更好捕獲長距離依賴關系,並且有效解決了梯度消失問題。下面對GRU進行詳細的介紹:

  • 在GRU中,人們引入了新的概念,memory cell,用符號\(c\)來表示,其提供了記憶能力。比如在英文句子中,網絡能夠記住前文的主語是單數還是復數,因此當網絡看到之后的動詞,仍然可以聯想到前文的主語 。
  • 在GRU中,\(t\)時刻有\(c^{<t>}=a^{<t>}\)\(a^{<t>}\)是t時刻的激活值。盡管這兩個值相同,我們仍然用兩個不同的符號來表示,因為其分別是記憶細胞的值與輸出的激活值,在LSTM中二者並不相同。 在每個時間戳,我們將用一個候選值\(\tilde{c}^{<t>}\)重寫記憶細胞,每一時刻都對其進行更新。
  • 在每個時間戳\(t\)中,需要用上一時刻的記憶細胞\(c^{<t-1>}\),以及當前時刻的候選值\(\tilde{c}^{<t>}\),來更新當前時刻的記憶細胞\(c^{<t>}\)
  • GRU最重要的思想是讓我們擁有了一個叫做\(\gamma_u\)(下標\(u\)代表更新門 )的門,該值位於0到1之間,該門用來決定,在每個時刻該如何更新記憶細胞的值。

以下是簡化GRU的計算公式:

\[\tilde{c}^{<t>}=tanh(W_c[c^{<t-1>},x^{<t>}]+b_c) \]

\[\gamma_u = \sigma (W_u[c^{<t-1>},x^{<t>}]+b_u) \]

\[c^{<t>}=\gamma_u * \tilde{c}^{<t>} + (1-\gamma_u) * c^{<t-1>} \]

\[a^{<t>} = c^{<t>} \]

GRU實現細節:

  • \(c^{<t>}\)\(\tilde{c}^{<t>}\)\(\gamma_u\)是具有相同維度的向量,因此在更新\(c^{<t>}\)時,\(\gamma_u * \tilde{c}^{<t>}\)中的\(*\)代表向量間的點乘操作。

3.2 Full GRU (完整版本)

通過上文的介紹,相信你已經對GRU有了簡單的理解,出於入門的考慮,上述GRU並不完整,這里將介紹其余下的部分。
以下是完整GRU的計算公式:

\[\tilde{c}^{<t>}=tanh(W_c[\gamma_r * c^{<t-1>},x^{<t>}]+b_c) \]

\[\gamma_u = \sigma (W_u[c^{<t-1>},x^{<t>}]+b_u) \]

\[\gamma_r = \sigma (W_r[c^{<t-1>},x^{<t>}]+b_r) \]

\[c^{<t>}=\gamma_u * \tilde{c}^{<t>} + (1-\gamma_u) * c^{<t-1>} \]

\[a^{<t>} = c^{<t>} \]

這里引入了另一個門\(\gamma_r\)——the relevance gate。

ng在課上講,可以認為r代表相關性,\(\gamma_r\)門告訴你計算出的\(\tilde{c}^{<t>}\)\(c^{<t-1>}\)有多大的相關性。

我對GRU中“門”這一概念的理解如下:

  • 無論是\(\gamma_u\),還是\(\gamma_r\),其本質都是一個線性函數通過激活函數(sigmoid)得到的激活值,而該線性函數是以\(x^{<t>}\)\(c^{<t-1>}\)作為輸入。
  • 也就是說,每個門的向量值是由\(x^{<t>}\)\(c^{<t-1>}\)這兩個值以及線性函數的權重、偏置計算得到的。
  • 反向傳播通過梯度下降改變線性函數的參數來改變門的向量值。

4. LSTM

LSTM存在很多變體,這里介紹經典LSTM。

4.1 經典LSTM

LSTM的計算公式如下所示(\(a^{<t>}\)指時刻t的隱狀態):

\[\tilde{c}^{<t>}=tanh(W_c[a^{<t-1>},x^{<t>}]+b_c) \]

\[\gamma_u = \sigma (W_u[a^{<t-1>},x^{<t>}]+b_u) \]

\[\gamma_f = \sigma (W_f[a^{<t-1>},x^{<t>}]+b_f) \]

\[\gamma_o = \sigma (W_o[a^{<t-1>},x^{<t>}]+b_o) \]

\[c^{<t>}=\gamma_u * \tilde{c}^{<t>} + \gamma_f * c^{<t-1>} \]

\[a^{<t>} = \gamma_o * tanh(c^{<t>}) \]

LSTM與GRU的區別:

  • LSTM中有三個門,分別是更新門\(\gamma_u\),遺忘門\(\gamma_f\),輸出門\(\gamma_o\)
  • LSTM中使用遺忘門\(\gamm_f\),來代替GRU中的系數\((1-\gamma_u)\),這樣是的模型更加完備,但是也引入更多的學習參數。
  • LSTM的三個門,實際上是線性函數的激活值(sigmoid),而線性函數的輸入是\(a^{t-1}\)\(x^{<t>}\)

有些論文提到了peephole connection這一概念,其目的是為了LSTM在計算門值的時候能夠獲得上一時刻\(c^{<t-1>}\)的信息,即將線性函數的輸入擴增為\(a^{t-1}\)\(x^{<t>}\)\(c^{<t-1>}\)

\(c^{<t-1>}\)\(\gamma_u\)\(\gamma_f\)\(\gamma_o\)是維度相同的向量。\(c^{<t-1>}\)的每個維度,與三個門的每個維度一一對應,\(c^{<t-1>}\)中每個維度的數值只會影響到三個門中對應維度的數值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM