選自TowardsDataScience
作者:Michael Nguyen
機器之心編譯
參與:高璇、思源
大家好,歡迎來到 LSTM 和 GRU 的圖解指南。在本文中,Michael 將從 LSTM 和 GRU 的背後的原理開始,然後解釋令 LSTM 和 GRU 具有優秀性能的內部機制。如果你想了解這兩個網絡背後發生了什麼,這篇文章就是為你準備的。
如果喜歡,你還可以觀看這篇文章的視頻版。
問題重點——短期記憶
循環神經網絡(RNN)很大程度上會受到短期記憶的影響,如果序列足夠長,它們將很難將信息從早期時間步傳遞到靠後的時間步。因此,如果你試圖處理一段文字來做預測,RNN 可能從一開始就遺漏掉重要的信息。
在反向傳播過程中,循環神經網絡也存在梯度消失等問題。一般而言,梯度是用來更新神經網絡權值的,梯度消失問題是梯度會隨著時間的推移逐漸縮小接近零。如果梯度值變得非常小,它就不能為學習提供足夠的信息。
梯度更新規則
所以在 RNN 中,通常是前期的層會因為梯度消失和停止學習。因此,RNN 會忘記它在更長的序列中看到的東西,從而只擁有短期記憶。
解決方案——LSTM 和 GRU
創建 LSTM 和 GRU 可以作為短期記憶的解決方案,它們有一種稱為「門」的內部機制,可以調節信息流。
這些門可以判斷數據在一個序列中該保留或棄用,因此它可以將相關信息傳遞到較長序列鏈中進行預測。幾乎所有基於循環神經網絡的最新成果都是通過這兩個網絡實現的。LSTM 和 GRU 可以應用在語音識別、語音合成和文本生成中。你甚至可以用它們來生成視頻的字幕。
現在你應該理解 LSTM 和 GRU 擅長處理長序列的原因了。我將用直觀的解釋和插圖來解答這個問題,我儘量避免使用數學。
直觀解釋
好,讓我們從一個思維實驗開始。假設你通過在網上看評論來決定是否買 Life 牌麥片。因為我們先看評論,然後判斷其他人認為它是好還是壞。
當你閱讀評論時,你的大腦潛意識裡只會記住重要的關鍵詞。你會側重一些諸如「驚人的」和「完美均衡早餐」之類的詞。你不會在意「這個」、「給予」、「所有」、「應該」等等。如果朋友第二天問你評論說了什麼,你可能不會逐字逐句地記住。但你可能還記得一些重點,比如「肯定會再買」,其他的詞會從記憶中消失。
這就是 LSTM 或 GRU 的作用,它可以學會只保留相關的信息以進行預測。在這種情況下,你記得的評論會讓你做出好的判斷。
回顧循環神經網絡
為了理解 LSTM 或 GRU 是如何做到這一點的,讓我們回顧一下循環神經網絡。RNN 是這樣工作的:第一個單詞被轉換成機器可讀的向量。然後,RNN 逐個處理向量序列。
逐個處理序列
在處理過程中,它將之前的隱狀態傳遞給序列的下一個步驟。隱狀態作為神經網絡的記憶,保存著網絡先前觀察到的數據信息。
傳遞隱藏狀態到下一時間步
觀察 RNN 的一個單元格,看看如何計算隱狀態。首先,輸入和之前的藏狀態組合成一個向量。這個向量現在有當前輸入和先前輸入的信息。向量通過 tanh 激活,輸出是新的隱狀態,或神經網絡的記憶。
RNN 單元
雙曲正切(tanh)激活函數
tanh 激活函數用於調節在神經網絡中傳遞的值,它會將輸入值壓縮到-1 到 1 之間。
Tanh 將輸入壓縮到介於-1 到 1 之間
當向量通過神經網絡時,由於各種數學運算,它會經歷許多變換。假設一個值連續乘以 3,結果會爆炸增長成天文數字,從而導致其他值的變化變得微不足道。
缺少 tanh 的向量變換
tanh 函數確保值保持在-1 到 1 之間,從而控制神經網絡的輸出。下圖可以看到數值是如何藉助 tanh 函數在不同的時間步之中保持穩定。
tanh 函數下的向量變化
這就是 RNN。它的內部操作很少,但在適當的環境下(比如短序列)會有很好的性能。RNN 使用的計算資源比它的改進版 LSTM 和 GRU 要少得多。
LSTM
LSTM 具有與循環神經網絡相似的控制流,它在前向傳播時處理傳遞信息的數據,兩者區別在於單元內的處理過程不同。
LSTM 單元及內部運算
這些內部操作用於允許 LSTM 保存或丟棄信息,現在看這些操作可能會有點難,所以我們一步步來看。
核心概念
LSTM 的核心概念是單元狀態,及單元中各種各樣的門。單元狀態好比傳輸的高速公路,在序列鏈中傳遞相關信息。你可以把它看作是網絡的「記憶」。從理論上講,單元狀態可以在整個序列處理過程中攜帶相關信息。因此,即使是前期時間步的信息也可以幫助後續時間步的處理,因此單元狀態有效減少了短期記憶的影響。隨著單元狀態在不同時間步的傳遞,我們可以通過門控機制添加或刪除單元狀態中的信息。這些門是不同的神經網絡,用來決定能夠進入單元狀態的信息。在訓練過程中,門可以學習到哪些信息是需要保存或遺忘的。
sigmoid 函數
門控機制主要由 sigmoid 激活函數構成,sigmoid 激活函數類似於 tanh 激活函數,它會將數值控制在 0 到 1 之間,而不是-1 到 1。這有助於更新或丟棄數據,因為任何數乘以 0 都是 0,這將導致數值消失或被「遺忘」。任何數字乘以 1 都是其本身,因此這個值不變或者「保存」。網絡可以知道哪些數據不重要,可以被遺忘,或者哪些數據需要保存。
Sigmoid 會將數值控制在 0 到 1 之間
讓我們再深入探討一下各種門的作用,我們有三個不同的門來調節 LSTM 單元中的信息流,即遺忘門、輸入門和輸出門。
遺忘門
首先是遺忘門(forget gate),這個門決定了哪些信息應該被丟棄或保存。在遺忘門中,來自先前隱狀態的信息和來自當前輸入的信息傳遞到 sigmoid 函數,並將值壓縮到 0 和 1 之間。越接近 0 意味著丟棄,越接近 1 意味著保留。
遺忘門操作
輸入門
為了更新單元狀態,LSTM 需要輸入門(input gate)。首先,我們將前面的隱狀態和當前輸入傳遞給一個 sigmoid 函數,它通過將值轉換為 0 到 1 來決定將更新哪些值。0 表示不重要,1 表示重要。還可以將隱狀態和當前輸入傳遞給 tanh 函數,使值變為-1 到 1 之間的值,以幫助調節神經網絡。然後將 tanh 輸出與 sigmoid 輸出相乘,sigmoid 輸出將決定保留 tanh 輸出的重要信息。
輸入門操作
單元狀態
現在應該有足夠的信息來計算單元狀態。首先,單元狀態逐點乘以遺忘向量,如果它與接近 0 的值相乘,就有可能在單元狀態中得到低值。然後,從輸入門讀取上一步輸出,並逐點相加,將單元狀態更新為神經網絡認為相關的新值,這就得到了新的單元狀態。
計算單元狀態
輸出門
最後是輸出門(output gate),輸出門決定下一個隱藏狀態。記住,隱藏狀態包含先前輸入的信息。隱藏狀態也用於預測。首先,我們將前面的隱狀態和當前輸入傳遞給一個 sigmoid 函數。然後我們將新修改的單元狀態傳遞給 tanh 函數。我們將 tanh 輸出與 sigmoid 輸出相乘,以確定隱狀態應該包含的信息。新的單元狀態和新的隱藏狀態隨後被轉移到下一步中。
輸出門操作
需要了解的是,遺忘門決定了哪些內容與前面的步驟相關。輸入門決定從當前步驟中添加哪些相關信息。輸出門決定下一個隱狀態應該是什麼。
代碼演示
對於那些需要通過代碼更好地理解模型的人來說,這裡有一個 Python 偽代碼示例:
Python 偽代碼
首先,將前面的隱狀態和當前輸入拼接起來,即為 combine。
將 combine 的值送至遺忘層,並刪除不相關的數據。
使用 combine 創建候選層,候選項保存要添加到單元狀態的可能值。
將 combine 的值送至輸入層,這一層決定應該添加到新的單元狀態的候選數據。
在計算遺忘層、候選層和輸入層後,利用這些向量和前面的單元格狀態計算新單元格狀態。
然後計算輸出。
輸出和新單元狀態之間的對應元素乘積將得到新的隱藏狀態。
GRU
我們已經知道 LSTM 是如何工作的,讓我們簡單看看 GRU。GRU 是新一代的循環神經網絡,它與 LSTM 非常相似。GRU 擺脫了單元狀態,直接用隱藏狀態傳遞信息,它只有重置門和更新門這兩個門控機制。
GRU 單元和它的門
更新門的作用類似於 LSTM 的遺忘門和輸入門。它同時決定丟棄什麼舊信息,添加什麼新信息。而重置門是一個用來決定要忘記多少過去信息的門。
GRU 的張量運算很少,因此與 LSTM 相比,它的訓練速度要快一些。目前還不清楚哪一個更好,研究人員和工程師通常都根據自己實際情況選擇二者之一。
結論
綜上所述,RNN 對於處理用於預測的序列數據很有幫助,但其存在短期記憶問題。創建 LSTM 和 GRU 的目的是利用「門」的機制來降低短期記憶。LSTM 和 GRU 廣泛應用在語音識別、語音合成、自然語言理解等最先進的深度學習應用中。
原文連結:https://towardsdatascience.com/illustrated-guide-to-lstms-and-gru-s-a-step-by-step-explanation-44e9eb85bf21
本文為機器之心編譯,轉載請聯繫本公眾號獲得授權。
✄---
加入機器之心(全職記者 / 實習生):hr@jiqizhixin.com
投稿或尋求報導:content@jiqizhixin.com
廣告 & 商務合作:bd@jiqizhixin.com