動態視覺化:一步步拆解LSTM和GRU
作者:Michael Nguyen
編譯:Bot
編者按:關於LSTM,之前我們已經出過不少文章,其中最經典的一篇是chrisolah的《一文詳解LSTM網路》,文中使用的視覺化圖片被大量博文引用,現在已經隨處可見。但正如短視訊取代純文字閱讀是時代的趨勢,在科普文章中,用視覺化取代文字,用動態圖取代靜態圖,這也是如今使知識更易於被讀者吸收的常規操作。
今天,論智給大家帶來的是AI語音助理領域的機器學習工程師Michael Nguyen撰寫的一篇LSTM和GRU的動態圖解:對於新手,它更直觀易懂;對於老手,這些新圖絕對值得收藏。

在這篇文章中,我們將從LSTM和GRU背後的知識開始,逐步拆解它們的內部工作機制。如果你想深入瞭解這兩個網路的原理,那麼這篇文章就是為你準備的。
問題:短期記憶
如果說RNN有什麼缺點,那就是它只能傳遞短期記憶。當輸入序列夠長時,RNN是很難把較早的資訊傳遞到較後步驟的,這意味著如果我們準備了一段長文字進行預測,RNN很可能會從一開始就遺漏重要資訊。
出現這個問題的原因是在反向傳播期間,RNN的梯度可能會消失。我們都知道,網路權重更新依賴梯度計算,RNN的梯度會隨著時間的推移逐漸減小,當序列足夠長時,梯度值會變得非常小,這時權重無法更新,網路自然會停止學習。

根據上圖公式:新權重=權重-學習率×梯度。已知學習率是個超引數,當梯度非常小時,權重和新權重幾乎相等,這個層就停止學習了。由於這些層都不再學習,RNN就會忘記在較長序列中看到的內容,只能傳遞短期記憶。
解決方案:LSTM和GRU
LSTM和GRU都是為了解決短期記憶這個問題而建立的。它們都包含一種名為“控制門”的內部機制,可以調節資訊流:

這些門能判斷序列中的哪些資料是重要的,哪些可以不要,因此,它就可以沿著長序列傳遞相關資訊以進行預測。截至目前,基於RNN的幾乎所有實際應用都是通過這兩個網路實現的,無論是語音識別、語音合成,還是文字生成,甚至是為視訊生成字幕。
在下文中,我們會詳細介紹它們背後的具體思路。
人類的記憶
讓我們先從一個思維實驗開始。雙11快到了,假設你想買幾袋麥片當早餐,現在正在瀏覽商品評論。評論區的留言很多,你的閱讀目的是判斷評論者是好評還是差評:

以上圖評論為例,當你一目十行地讀過去時,你不太會關注“this”“give”“all”“should”這些詞,相反地,大腦會下意識被“amazing”“perfectly balanced breakfast”這些重點詞彙吸引。糾結了一晚上,最後你下單了。第二天,你朋友問起你為什麼要買這個牌子的麥片,這時你可能連上面這些重點詞都忘光了,但你會記得評論者最重要的觀點:“will definitely be buying again”(肯定會再光顧)。

就像上圖展示的,那些不重要的詞彷彿一讀完就被我們從腦海中清除了。而這基本就是LSTM和GRU的作用,它們可以學會只保留相關資訊進行預測,並忘卻不相關的資料。
RNN綜述
為了理解LSTM和GRU是怎麼做到這一點的,我們先回顧一下它們的原型RNN。下圖是RNN的工作原理,輸入一個詞後,這個詞會被轉換成機器可讀的向量;同理,輸入一段文字後,RNN要做的就是按照順序逐個處理向量序列。

我們都知道,RNN擁有“記憶”能力。處理向量時,它會把先前的隱藏狀態傳遞給序列的下一步,這個隱藏狀態就充當神經網路記憶,它包含網路以前見過的先前資料的資訊。

那麼這個隱藏狀態是怎麼計算的?讓我們看看RNN的第一個cell。如下圖所示,首先,它會把輸入x和上一步的隱藏狀態組合成一個向量,使這個的向量包含當前輸入和先前輸入的資訊;其次,向量經tanh啟用,輸出新的隱藏狀態。

Tanh啟用
啟用函式Tanh的作用是調節流經網路的值,它能把值始終約束在-1到1之間。

當向量流經神經網路時,由於各種數學運算,它會經歷許多次變換。假設每流經一個cell,我們就把值乘以3,如下圖所示,這個值很快就會變成天文數字,導致其它值看起來微不足道。

而使用了Tanh函式後,如下圖所示,神經網路能確保值保持在-1和1之間,從而調節輸出。

以上就是一個最基礎的RNN,它的內部構造很簡單,但具備從先前資訊推斷之後將要發生的事的能力。也正是因為簡單,它所需的計算資源比LSTM和GRU這兩個變體少得多。
LSTM
從整體上看,LSTM具有和RNN類似的流程:一邊向前傳遞,一邊處理傳遞資訊的資料。它的不同之處在於cell內的操作:它們允許LSTM保留或忘記資訊。

核心概念
LSTM的核心概念是cell的狀態和各種控制門。其中前者是一個包含多個值的向量,它就像神經網路中的“高速公路”,穿行在序列鏈中一直傳遞相關資訊——我們也可以把它看作是神經網路的“記憶”。從理論上來說,cell狀態可以在序列的整個處理過程中攜帶相關資訊,它擺脫了RNN短期記憶的問題,即便是較早期的資訊,也能被用於較後期的時間步。
而當cell狀態在被不斷傳遞時,每個cell都有3個不同的門,它們是不同的神經網路,主要負責把需要的資訊保留到cell中,並移除無用資訊。
Sigmoid
每個門都包含sigmoid啟用,它和Tanh的主要區別是取值範圍在0到1之間,而不是-1到1。這個特點有助於在cell中更新、去除資料,因為任何數字乘以0都是0(遺忘),任何數字乘以1都等於它本身(保留)。由於值域是0到1,神經網路也能計算、比較哪些資料更重要,哪些更不重要。

遺忘門
首先,我們來看3個門中的遺忘門。這個門決定應該丟棄哪些資訊。當來自先前隱藏狀態的資訊和來自當前輸入的資訊進入cell時,它們經sigmoid函式啟用,向量的各個值介於0-1之間。越接近0意味著越容易被忘記,越接近1則越容易被保留。

輸入門
輸入門是我們要看的第二個門,它是更新cell狀態的重要步驟。如下圖所示,首先,我們把先前隱藏狀態和當前輸入傳遞給sigmoid函式,由它計算出哪些值更重要(接近1),哪些值不重要(接近0)。其次,同一時間,我們也把原隱藏狀態和當前輸入傳遞給tanh函式,由它把向量的值推到-1和1之間,防止神經網路數值過大。最後,我們再把tanh的輸出與sigmoid的輸出相乘,由後者決定對於保持tanh的輸出,原隱藏狀態和當前輸入中的哪些資訊是重要的,哪些是不重要的。

cell狀態
到現在為止,我們就可以更新cell狀態了。首先,將先前隱藏狀態和遺忘門輸出的向量進行點乘,這時因為越不重要的值越接近0,原隱藏狀態中越不重要的資訊也會接近0,更容易被丟棄。之後,利用這個新的輸出,我們再把它和輸入門的輸出點乘,把當前輸入中的新資訊放進cell狀態中,最後的輸出就是更新後的cell狀態。

輸出門
最後是輸出門,它決定了下一個隱藏狀態應該是什麼。細心的讀者可能已經發現了,隱藏狀態和cell狀態不同,它包含有關先前輸入的資訊,神經網路的預測結果也正是基於它。如下圖所示,首先,我們將先前隱藏狀態和當前輸入傳遞給sigmoid函式,其次,我們再更新後的cell狀態傳遞給tanh函式。最後,將這兩個啟用函式的輸出相乘,得到可以轉移到下一時間步的新隱藏狀態。

總而言之,遺忘門決定的是和先前步驟有關的重要資訊,輸入門決定的是要從當前步驟中新增哪些重要資訊,而輸出門決定的是下一個隱藏狀態是什麼。
程式碼演示
對於更喜歡讀程式碼的讀者,下面是一個Python虛擬碼示例:

- 首先,把先前隱藏狀態
prev_ht
和當前輸入input
合併成combine
- 其次,把
combine
輸入遺忘層,決定哪些不相關資料需要被剔除 - 第三,用
combine
建立候選層,其中包含能被新增進cell狀態的可能值 - 第四,把
combine
輸入輸入層,決定把候選層中哪些資訊新增進cell狀態 - 第五,更新當前cell狀態
- 第六,把
combine
輸入輸出層,計算輸出 - 最後,把輸出和當前cell狀態進行點乘,得到更新後的隱藏狀態
如上所述,LSTM網路的控制流程不過是幾個張量操作和一個for迴圈而已。
GRU
現在我們已經知道LSTM背後的工作原理了,接下來就簡單看一下GRU。GRU是新一代的RNN,它和LSTM很像,區別是它擺脫了cell狀態,直接用隱藏狀態傳遞資訊。GRU只有兩個門:重置門和更新門。

更新門
更新門的作用類似LSTM的遺忘門和輸入門,它決定要丟棄的資訊和要新新增的資訊。
重置門
重置門的作用是決定要丟棄多少先前資訊。
相比LSTM,GRU的張量操作更少,所以速度也更快。但它們之間並沒有明確的孰優孰劣,只有適不適合。
小結
以上就是LSTM和GRU的動態圖解。總而言之,它們都是為了解決RNN短期記憶的問題而建立的,現在已經被用於各種最先進的深度學習應用,如語音識別、語音合成和自然語言理解等。感謝你的閱讀!