深度學習四從迴圈神經網路入手學習LSTM及GRU

JYRoy發表於2020-10-24

迴圈神經網路

簡介

迴圈神經網路(Recurrent Neural Networks, RNN) 是一類用於處理序列資料的神經網路。之前的說的卷積神經網路是專門用於處理網格化資料(例如一個影像)的神經網路,而迴圈神經網路專門用於處理序列資料(例如\(x^{(1)},x^{(2)},···,x^{(T)},\))的神經網路。

應用場景

一些要求處理序列輸入的任務,例如:

  • 語音識別(speech recognition)
  • 時間序列預測(time series prediction)
  • 機器翻譯(machine translation)
  • 手寫識別(handwriting recognition)

RNN產生的原因

通常我們人類思考,不會從是每一秒都要從一件事的開始進行思考。就像你正在讀這篇文章,你所理解的每一個詞都是從之前的基礎上來的。你永遠不會把之前的詞丟掉從新開始思考。也就是說思考都是持續性的。

而我們之前討論的傳統的神經網路是做不到讓思考持續性的,這是它們的一個主要的問題。而RNN的出現,就是為了解決這一個問題。也就是讓思考具有持續性!

符號

在正式討論之前,我們先明確一些符號和概念:

  • \(x^{(t)}\) :是在時刻 t 包含的向量,即時刻 t 的輸入
  • \(\tau\):序列長度
  • 時間步:time step,這不是現實中的時間,而是序列資料的每一次的輸入。時間步索引表示序列中的位置。

簡單RNN結構

Simple Recurrent Network(SRN) 是 Elman 在 1990 年提出的,所以又叫ELem Network,基本結構如下:

可以看出,和傳統的神經網路結構相比,RNN最大的不同在於它的隱藏層節點(H1,H2,H3)和記憶單元(S1,S2,S3)(“context” layer)之間存在直接連線(虛線)。

也就是:

  • 說每一次隱藏節點輸出的時候,出了傳遞啟用後的資訊到下一層,還會被複制到記憶單元中。
  • 隱藏層節點除了和輸入節點(I1,I2,I3)之間存在連線以外,還和 context layer 之間存在直接連線(實線)。即隱藏層同時接收來自輸入層和 context layer 的輸入
  • context layer 無限期的保留狀態資訊。每次網路接收一個輸入都會用 context layer 來記住產生輸出所需要的資訊。

從上述資訊中可以看出,迴圈神經網路名字中迴圈的由來,即網路本身是一個迴圈的序列結構。

我們可以用這樣的圖來簡潔的表示 SRN。其中 \(A\) 表示一個神經網路結構塊。\(x_t\) 表示輸如,\(h_t\) 表示輸出。在這個圖中神經網路的基本結構被壓縮了,從 \(x_t\)\(A\) 的一條線實際上是上面的從輸入節點到輸出節點的全部連線。同樣的 \(A\)\(h_t\) 也是一樣。而且下圖中忽略掉了 context layer 的存在。

如果我們再進一步思考,會發現上面的圖和普通的神經網路好像又沒有什麼區別。因為我們可以把上面的圖展平成一個等價的前饋結構,從而更好的觀察神經網路的結構。這相當於一個共享權重的網路結構。

這種鏈狀的性質表明迴圈神經網路與序列和列表密切相關。RNN 也正是用於處理此類資料的神經網路的自然結構。

RNN中的反向傳播

在迴圈神經網路中應用反向傳播被稱為 通過時間反向傳播 backpropagation through time(BPTT),如下圖所示:

我們可以反向傳播一個 time step, 也可以反向傳播固定數目的 time steps,也可以直接反向傳播到序列的最開始。

之後應該還需單獨寫一篇文章來分析BPTT,現在還不太會推導實現。

其他的RNN結構

  • 有的時候,我們會在輸入層和輸出層之間新增直接的連線,又叫 shortcut。如下圖所示:

  • Jordan Networks:在輸出層新增一個返回到隱藏層的連線。

長期依賴的問題

RNN的優勢之一就是它可以把之前的資訊和當前的資訊相互關聯。例如,使用視訊中先前的幀可以幫助理解當前的幀。如果RNN可以永遠做到這一點那是最好的,但是在實際應用中,RNN好像不能永遠保留所有的先前資訊。

有時候,我們只需要利用很少的先前資訊就可以執行當前的任務。例如,我們考慮一個基於之前的單詞預測之後的單詞的語言模型。如果我們想預測 “the clouds are in the sky“ 這句話中的最後一個單詞,我們不需要知道特別多的資訊就能知道最後一個單詞是天空。在這種情況下,當相關的資訊和需要預測的地方差距很小的時候,RNN 可以迅速的學習並利用之前的資訊。過程如下圖所示:

然而,有的時候我們需要更多的先前資訊。例如,我們還是考慮一個基於之前的單詞預測之後的單詞的語言模型。我們想預測下面這句話的最後一個單詞。“I grew up in France… I speak fluent French.” 相鄰的單詞可以告訴我們可能要填入一個語言的名稱,但是我們不知道要填入哪一個語言。我們需要繼續向先前的資訊中尋找,直到找到 France。 這之前的差距可能會非常的巨大。在這種情況下,RNN 就不能夠學習到什麼有用的東西了。過程如下圖所示:

上面的問題就是我們要討論的長期依賴(long-term dependency)問題。也就是說RNN是具備長期依賴問題的!

門控網路

門控網路(Gated Network)是學習 LSTM 之前必須明白的一個基本網路結構。因為門控的理念是 LSTM 的核心。

如下圖所示,這是一個簡單的二階門控網路 Second Order(or Gated)Network:從圖中可以看出,門控的意思就是通過一個類似於開關的結構控制輸入和相應的權重來配對。如果我們有26個字母要來識別的話,就會有26套權重。

這個門控網路主要是被設計來處理語言識別的,例如,一次掃描一個字元序列,然後將序列分類為接受或拒絕。:

這樣的問題可以轉換為一個有限狀態機來理解,如下所示,右下角就是對應的有限狀態自動機,左邊是一個二維圖 表示。叉表示初始狀態,如果輸入為 1 ,將會向右上角走,如果為 0,會往左下角走。如果最終停在了斜線的右側就表示為 Accept,如果停在了左側就表示為 Reject。

下面我們再來看一個更加複雜的語言識別任務,如下圖所示,如果連續出現 3 個及以上數量的 0 就 Reject:

這個任務的有限狀態自動機和圖可以表示為下面的形式

如果語言識別的任務再複雜一些呢?

我們下面來看一下 Chomsky Hierarchy ,這涉及到了更加複雜集中語言識別任務,根據前面的字母預測下一個字母是什麼:

例如,我們要識別這樣的一個字串,abaabbabaaabbbaaaabbbbabaabbaaaaabbbbb...

對於這樣的一個任務,第一個 b 的位置其實是很難預計的,但是如果已經給出了 b 那麼後續的 b 和後續的第一個 a 是可以被預測出來的。下面的 Elem Network 就可以實現這個預測:

這個網路很難用有限狀態自動機表示,但是我們可以用啟用空間中兩個固定的點(fix point)來表示,一個是吸引點,一個是排斥點,這是一個震盪的解法,也就是每一個輸入都是圍繞著一個 fix point 來回震盪,虛線就是我們的分割線,如下圖所示:

然而這個神經網路再訓練的時候,有時候會有非單調的情況,這種情況下就不會再圍著 fix point 震盪了,而是隨著輸入一直趨向於一個 fix point,如下圖所示:

如果我們利用旋轉來計算的話,如果輸入是 a 就向內圈旋轉,如果輸入是 b 就向外圈旋轉,下方的直線是輸出線:

如果我們要處理的任務是根據 \(a^nb^nc^n\) 來預測,那麼 solution 就可以表示為下圖所示的情況,最終預測的輸出線從一條線變成了一個面,下圖中沒有畫出來,大家知道這件事就可以了:

在這個圖中,a b c 是向不同的方向計數來實現預測的,會產生幾個星形的形狀。

如果是部分單調的話,就會變成下面的樣子:

LSTM

簡介

長短期記憶網路(Long Short Term Memory networks,LSTM)是一種特殊的 RNN,主要用於處理長期的依賴。是由 Horchreiter 和 Schmidhuber 發明的。

LSTM 產生的原因

LSTM 被設計出來主要是為了解決長期依賴(long-term dependency)問題。也就是長時間的記住某些東西。

SRN 可以學習到中等範圍的東西,但是在學習長期依賴方面有困難。

LSTM 和 GRU(後面會提到)在學習長期依賴方面要優於SRN。

LSTM的結構

在看 LSTM 的結構之前,我們再來討論一下 RNN 的結構。

所有的迴圈神經網路都由重複的鏈式神經網路結構構成的。在標準的 RNN 中重複的神經網路通常會採用一個十分簡單的結構,例如一個單獨的 tanh 層。如下圖所示:

在明確了上面的傳統的 RNN 的結構圖之後呢,我們來仔細研究一下 LSTM 的結構圖。

LSTM 同樣有類似鏈式結構,但是它的重複的神經網路結構的部分,不再是一個簡單的 tanh 層,而是一個十分複雜的結構。具體來講有四層神經網路和三個門控構成!如下圖所示:

我們可以對上面的結構進行如下的一個基本劃分,明確一下接收了哪些輸入,後面再具體將每一處的細節,可以先暫時不管右邊的公式:

下面我們將一步步的學習 LSTM 的結構,在學習之前我們先明確一下相關的符號:

  • 黃色方框:一個神經網路層
  • 粉色圓圈:一個點態操作
  • 一條線:攜帶一個完整的向量從一個節點的輸出到另一個節點的輸入
  • 合併的線:連線
  • 分叉的線:把一個內容賦值到兩個不同的位置

LSTM 的核心

LSTM 的核心關鍵是細胞狀態(cell state),表示細胞狀態的這條線水平的穿過圖的頂部。細胞的狀態類似於輸送帶,細胞的狀態在整個鏈上執行,只有一些小的線性操作作用其上,資訊很容易保持不變的流過整個鏈。

門控是一種選擇性地讓資訊通過的方式。具體的門控概念和相應的任務例項已經在上面講過了。LSTM 中它們由一個 Sigmoid 神經網路層和一個點乘運算組成。Sigmoid 層輸出 0 到 1 之間的數字,描述每個元件有多少應該被允許通過。一個 LSTM 有三個這樣的門,以保護和控制單元的狀態。

具體分析LSTM的結構

  1. 第一步:LSTM 中的第一步就是要決定我們從之前的資訊中丟棄哪些資訊。這個是 forget gate 的工作。如下圖所示:

丟棄資訊通過一個 Sigmoid 層實現,又叫 forget gate layer。接收了上一層的輸出 \(h_{t-1}\) 以及當前 time step 的輸入 \(x_t\) 。通過 Sigmoid 層之後輸出一個介於 0 和 1 之間的數字 \(f_t\)。如果 \(f_t = 1\) 表示完全的保留這些資訊;如果 \(f_t = 0\) 表示完全的遺忘這些資訊;如果 \(0<f_t<1\) 表示只忘記一部分資訊。

  1. 第二步:LSTM中的第二步就是決定我們要保留哪些新資訊,即儲存哪些資訊到 cell state 中。這個是 input gate 的工作。如下圖所示:

從圖中可以看出,這一步由兩個神經網路層來實現。第一個是一個 Sigmoid 層,又稱為 input gate layer,決定的是我們將會更新哪資訊。第二個是一個 tanh 層,會建立一個新的候選資料 \({\widetilde{C}_{t}}\) ,它將會被新增到當前資訊中。在下一步的時候,我們會將二者結合來創新對新資訊的更新。

  1. 第三步:我們要將傳入的舊cell state \({\widetilde{C}_{t-1}}\) ,更新為新的cell state \({\widetilde{C}_{t}}\) 。如下圖所示:

我們先用第一步產生的 \(f_t\) 乘以 \({\widetilde{C}_{t-1}}\) ,也就是忘記我們打算忘記的資訊(這就是一個門控過程)。然後和 \(i_t *{\widetilde{C}_{t}}\) 相加。這就是我們根據想要更新多少資訊而選出的新的資訊。

  1. 第四步:決定我們要輸出什麼資訊,這個是 output gate 的工作。如下圖所示:

首先我們利用一個 Sigmoid 層決定我們要輸出哪些資訊。然後我們把第三步的新的資訊放入一個 tanh 層中(把值置為 -1 到 1 之間),然後二者相乘。最終就能得到我們想輸出的值。

由此整個 LSTM 的資料流向和基本操作已經學習完畢。但是我們還有個地方需要注意!

如果你有仔細看基本結構劃分的黑白圖,會發現裡面多了幾個框,也就是 U 和 W 的框。這個其實就是我們的神經網路的權重。需要注意的一點是,這裡的三組 U 和 W 是各不相同!也就是第一組實際上應該是 \(U_f\)\(W_f\) ;第二組實際上應該是 \(U_i\)\(W_i\) ;第三組實際上應該是 \(U_o\)\(W_o\)。之前討論過的公式,最終應該為下圖右邊表示的公式:

GRU

簡介

門控迴圈單元(Gated Recurrent Unit, GRU), 是 LSTM 的一個比較經典的變種。在上面的傳統LSTM中有三個門控單元,但是在GRU中只有兩個門控單元,分別為更新門和重置門,結構變的更加的簡單了。所以和LSTM相比,它更容易計算。如下圖所示:

  • 重置門:reset gate,\(z_t\),控制需要從前的忘記多少資訊和從當前的資訊裡保留多少資訊。
  • 更新門:update gate,\(r_t\),控制需要保留多少之前的資訊,這個和 LSTM 中的相同。

其實如果你已經理解了LSTM的公式,那麼可以從右側的公式中很容易就能看出兩個門控的作用。

  • 如果當前的任務是處理具有長期依賴的資訊,那麼更新門會起到比較大的作用。
  • 如果是處理短期依賴的資訊,那麼重置門會起到比較大的作用。
  • 如果 \(r_t\) 為 1,\(z_t\) 為 0,GRU 就變成了傳統的RNN

LSTM 和 GRU 對比

  • GRU 引數更少,計算更容易,更容易收斂。但是 LSTM 更適用於處理資料集很大的任務。因為它的表達能力更強
  • GRU 只有兩個門,而LSTM有三個門。GRU 沒有 output gate,而是直接把得到的 \(h_t\),即隱藏單元的輸出傳給下一個 time step。而 LSTM 利用一個 output gate 將 \(h_t\) 再進行一次處理之後再輸出。

常見面試問題

  • 什麼是 RNN
  • RNN 為什麼好
  • RNN 容易梯度消失,怎麼解決?
  • LSTM 和 RNN 的區別
  • LSTM 每個門的公式
  • LSTM 和 GRU 的原理
  • 畫出 GRU 的結構
  • 推導 LSTM 正向傳播和反向傳播的過程

參考資料

相關文章