淺談遞歸神經網路 (RNN) 與長短期記憶模型 (LSTM)

TengYuan Chang
9 min readFeb 16, 2019

當我們在理解一件事情的時候,通常不會每次都從頭開始學習,而是透過既有的知識與記憶來理解當下遇到的問題;對於語言的理解也是一樣,我們在閱讀一篇文章的時候,通常不是逐字逐句分開了解,而是有辦法從過往知識或是文章的上下文來理解文意。在機器學習模型的發展中,引入這種遞歸 (recurrent) 的概念,是遞歸神經網路與其他神經網路模型 (如 CNN) 相比,較為創新的地方。長短期記憶模型則是改善了遞歸神經網路在長期記憶上的一些不足,因為其強大的辨識能力,現在已大量運用在自然語言理解 (例如語音轉文字,翻譯,產生手寫文字),圖像與影像辨識等應用。

這篇文章試著整理三篇深入淺出討論遞歸神經網路的文章,從一個生活化的例子開始:

從預測晚餐要吃什麼的例子來解釋遞歸神經網路

我還記得在高中的時候曾經住過學校宿舍,宿舍每天晚上都會供應晚餐,住沒幾天後,我就希望我可以知道明天晚上的晚餐是什麼,因為我可以根據是不是我喜歡吃的東西,來決定要不要回宿舍吃晚餐。我們有沒有可能設計一個模型來預測明天宿舍會供應什麼晚餐?

當我住了一個月後,我就發現每天的晚餐其實非常的規律,就是每週從星期一到星期五不斷地循環。如果昨天吃披薩,今天就是壽司;如果昨天吃壽司,今天就會是鬆餅,非常連貫。

每天晚餐出現的循環。圖片來源

如果我昨天不在宿舍吃飯,那我是不是就沒辦法推測今天晚上會吃什麼?可以的,因為我可以利用更早之前的資料,預測昨天晚上是吃什麼。所以,我們不只能利用昨天晚上吃什麼來預測今天的晚餐,我們還能利用昨天預測的結果,來做進一步的預測。

可以根據昨天的結果,或是預測的結果,來做預測。圖片來源

我們把「披薩、壽司、鬆餅」改為用向量的方式來表示。比如說我們可以將「今天晚餐會吃什麼?」的預測改為用數學向量的方式來表示。如果我們預測今天晚上會吃壽司,則將壽司記為 1,披薩和鬆餅都寫成 0 (如下圖),這種表示方式,稱為 one-hot 編碼。

將預測結果改用向量表示,雖然 fu 變少了,但是實用。圖片來源

如果我們將所有輸入與輸出都變為用向量表示,也就是幾串的數字。所以我們可以歸納出三組向量:昨天的預測、昨天的結果、以及今天的預測,以及每個輸入與輸出之間的關聯:

將昨天的預測、昨天的結果、以及今天的預測,用向量表示後的示意圖。圖片來源

另外,我們也希望將今天預測的結果回收,用來預測明天會吃什麼,下圖中的虛線,表示了今天的預測結果如何在明天被重新利用,成為明天的「昨日預測」,然後明天就可以用來預測明天晚上會吃什麼:

將今天預測的結果回收,變為明天的「昨日」預測。圖片來源

所以,我們可以將資料不斷往前延伸,即使我一兩個禮拜都不在宿舍吃晚餐,透過觀察更早的規律,我還是可以準確地預測今天晚上要吃什麼,延伸過後的神經網路如下圖所示:

延伸過後的神經網路。圖片來源

但,現實世界中不會每間事情都這麼的有規律,即使是學校宿舍,像我的高中那樣每週晚餐固定循環,把人當豬在餵的,應該也不多。單純的遞迴神經網路,在長期記憶上表現的並不好,因此有了長短期記憶模型 (Long Short Term Memory networks,LSTM) 的出現。

圖解長短期記憶模型 (LSTM)

從預測晚餐的例子,我們可以將遞迴神經網路想像成相似的單元,不斷地將過往資訊往下傳遞,所以我們可以用過往的資料來預測或瞭解現在的現象。這樣的鏈結可以透過下圖來表示:

X 代表輸入的資料,h 為輸出,昨天預測的結果可作爲今天預測的資料,形成一條長鏈。圖片來源

但實際上,RNN 在長期記憶的表現並不如預期。有點像是宿舍剛放完 10 天的年假,年假回來後的傳統是晚餐會加菜,這時候預測就會失準,因為 RNN 沒辦法記得一年前資料的規律性。而 LSTMs 就是設計用來改善 RNN 在長期記憶的不足。RNN 雖然構成一個龐大的神經網路,但如果我們將標準的 RNN 內部的單元放大來,裡面是個相當單純的架構,通常只有一層,包含一個稱為激勵函數的方程式,這個方程式有幾種選擇,這邊用雙曲函數 tanh 表示:

標準的 RNN 架構,包含一個 tanh 函數的神經層。圖片來源

LSTMs 也是由不斷重複的單元彼此相連所構成,但內部的單元設計比較複雜,有四層 (黃色長方形),彼此之間會交互作用,如下圖示:

LSTMs 的內部單元由四層不同函數組成,彼此間會相互影響。圖片來源

在討論那四層的單元如何互相影響之前,先介紹 LSTMs 最為核心的一個概念:透過閘門來做調控。下圖由左至右的水平線用來表示單元狀態 (cell state),可以將它想像成是一個貫穿所有單元的一條道路,將資訊從一個單元帶到下一個單元 ,比如說昨天吃壽司,前天吃披薩的「記憶」。但這個記憶是可以透過粉紅色的閘門 (gate) 做調控的。

橫貫所有單元,帶著「記憶」的 Cell state。圖片來源
黃色的部分用來表示「閘門」,可用邏輯函數來表示。圖片來源

所以第一步是,決定哪些資訊要忘掉,透過這個黃色的邏輯函數我們可以決定從上一層的輸出帶進來的資訊,以及這一層新增加的資訊,有多少比例要被忘掉,不被帶進下一層。如果套回宿舍晚餐的例子,可能是上週一晚上因為宿舍有人在批踢踢賭輸,請吃雞排加珍奶當晚餐,這算是突發事件,可以選擇忘掉,不要帶進下一層。

下一步是將新帶進來的資料紀錄到主要的單元狀態中。這邊又分成兩步驟:決定什麼要被記錄下來,以及更新我們的主要單元。

一樣地,透過下圖的邏輯函數來決定有多少新的資訊要被記錄下來,然後 tanh 激勵函數算出一個向量,決定有多少資訊 Ct 要用來更新主要單元。

這個第二步驟用來解釋主要單元被更新,從數學公式可以看出,這邊也考慮了上一個遺忘步驟的結果 ft

最後,我們決定有多少資訊要被輸出。從上一步驟的結果 Ct,再透過邏輯函數以及 tanh 的調控,來決定主要單元上要被輸出,用作明天預測的資料是什麼。

以上,就是標準的 LSTMs 在單元中每一步驟做的事情。透過這樣看似簡單的幾個步驟,已經在許多應用上都大幅改善 RNN 的效果。

RNN 與 LSTM 的強大效果以及應用方向

遞歸神經網路強大的地方在於它允許輸入與輸出的資料不只是單一組向量,而是多組向量組成的序列。當只能一組固定大小的向量輸入,且只允許一組向量輸出時時,可以處理分類問題。但一組輸入多組輸出時,就可以處理將圖片自動標上文字的問題。多組輸入一組輸出則可以處理文本的情感理解,比如說從一段文章中知道是正面或反面的結果。而當可以處理多組輸入,多組輸出時,就可以處理自動翻譯,或是影片分類的問題。

Andrej Karpathy 這篇文章中也演示了機器如何透過不同的迭代次數,逐步理解然後產出一段文字。一開始,模型可以辨識單字之間的空間關係,比如說英文單字中間要空格,但還無法理解標點符號後通常要有一個空白。然後很快地,模型開始可以理解文字,從比較短的字開始,然後延伸到比較長的單字,這時候還無法理解字詞和字詞之間意義的關係,所以產出的文章難以理解。但在超過 2000 次的迭代後,已經可以產出像下面這樣的文章:

"Why do what that day," replied Natasha, and wishing to himself the fact theprincess, Princess Mary was easier, fed in had oftened him.Pierre aking his soul came to the packs and drove up his father-in-law women.

在下面介紹的這篇論文中,作者則比較傳統的 RNN,長短期記憶模型 (LSTM),以及改良後的 Gated Recurrent Unit (GRU) 這三個不同的 RNN 模型的效能:

參考資料

1/ How Recurrent Neural Networks and Long Short-Term Memory Work by Brandon Rohrer

2/ Understanding LSTM Networks by Chris Olah

3/ The Unreasonable Effectiveness of Recurrent Neural Networks by Andrej Karpathy

--

--