動圖詳解LSTM和GRU

2021-02-19 半杯茶的小酒杯

問題:短期記憶

反向傳播(Back Propagation)是一種與最優化方法(比如梯度下降方法)結合、用來訓練人工神經網絡的常見方法。該方法對網絡中所有權重計算損失函數的梯度,然後將梯度反饋給最優化方法,用來更新網絡權重以最小化損失函數。

在神經網絡中一個典型的問題就是梯度消失(Gradient Vanishing)的問題,其原因在於是隨著神經網絡層數的加深,梯度逐漸減小甚至接近0,當梯度變的非常小的時候,就不能為學習提供足夠的信息。

Recurrent Neural Networks(遞歸神經網絡,RNN)也存在梯度消失的問題,當輸入的序列足夠長時,RNN前期的層通常通常由於梯度消失而停止學習,從而導致RNN只擁有短期記憶。也就是說如果輸入的序列的足夠長,RNN在處理序列後面的信息時,可能已經將序列前面的信息丟失或者遺忘了,RNN很難完整的傳遞完整的長序列信息。

視頻來源Youtube: https://www.youtube.com/watch?v=8HyCNIVRbSU

短期記憶的解決方案-LSTM和GRU


LSTM和GRU的短期記憶的解決方案,它通過門控(Gates)機制調節信息的流向。Gates可以學習到序列數據中哪些信息是重要的,需要保留;哪些信息是不重要的,可以丟棄,從而解決長序列的信息傳遞問題。RNN回顧

為了更好的理解LSTM和GRU是如何實現的,先回顧下Recurrent Neural Network是如何工作的。

以機器翻譯為例,RNN先將句子和詞語轉換為機器可識別的詞向量(Word Vector),然後把詞向量one by one的交給RNN進行處理。

Processing sequence one by one

RNN處理信息過程中,Hidden State作為神經網絡的記憶數據,保留了神經網絡已經看到的歷史信息。通過將前一單元的Hidden State傳遞給後一個RNN單元,從而實現對歷史信息的記憶。

Passing hidden state to next time step

RNN計算Hidden State的過程如下:它將當前RNN單元的輸入和前一個RNN單元輸出的Hidden State組合起來,經過一個Tanh激活函數,生成當前單元的Hidden State。

RNN Cell

Tanh激活函數將輸入值壓縮至-1和1之間。

Tanh squishes values to be between -1 and 1

如果不採用Tanh激活函數,數據流經多層神經網絡後,個別維度會出現急劇膨脹,甚至變成一個天文數字。下圖是神經網絡每層都對輸入數據做了一個x3的操作的效果。

vector transformations without tanh

Tanh函數確保網絡的輸出值在-1與1之間,下圖是同樣的輸入數據流經激活函數為Tanh的多層神經網絡的效果。

vector transformations with tanhLSTM

LSTM與RNN有相似的數據流控制機制,差別在於LSTM Cell內部的運作邏輯。

LSTM Cell and It’s Operations

LSTM的核心概念是Cell States和各種Gates。Cell State在整個序列的處理過程中都攜帶相關的信息,即使較早時刻的信息也可以很好的保留,從而降低了短期記憶問題的影響。

Gates都是不同神經網絡,它們可以決定哪些信息需要保留在Cell States中,哪些信息需要遺忘。

Sigmoid

Gates中使用了Sigmoid激活函數,Sigmoid激活函數與Tanh激活函數類似,只不過它不是將所有輸入數據壓縮到(-1, 1)之間,而是將輸入數據壓縮到(0, 1)之間。Sigmoid激活函數對於Gates數據更新或者遺忘數據非常有用,因為任意數值乘以0都等於0,從而使得這些數據被遺忘或則消失;任意數值乘以1都等於原數值,從而使得這些信息保留下來。所以最終Gates通過訓練可以哪些數據是重要的,需要保留;哪些數據是不重要的,需要遺忘。

Sigmoid squishes values to be between 0 and 1

下面在深入看看各種Gates都做了什麼。

Forget Gate

Forget Gate決定哪些信息需要丟棄,哪些信息需要保留。它合併前一個Hidden State和當前的Input信息,然後輸入Sigmoid激活函數,輸出(0,1)之間的數值。輸出值接近0的信息需要被遺忘,輸出值接近1的信息需要被保留。

Forget gate operationsInput Gate

Input Gate首先將前一個Hidden State和當前Input合併起來,送入Sigmoid函數,輸出(0,1)之間的值,0表示信息不重要,1表示信息重要。

Hidden State和Input的輸入同時也被送入Tanh函數,輸出(-1, 1)之間的數值。

Sigmoid的輸出和Tanh的輸出相乘,決定哪些Tanh的輸出信息需要保留,哪些輸出信息需要丟棄。

Input gate operations

Cell State

前一個Cell State的輸出,首先與Forget Gate的輸出相乘,選擇性的遺忘不重要的信息,再與Input Gate的輸出相加,從而實現將當前的Input信息添加到Cell State中,輸出新的Cell State。

Calculating cell stateOutput Gate

Output Gate用於輸出Hidden State。Output Gate首先將前一個Hidden State和當前Input送入Sigmoid函數,然後與新的Cell State通過Tanh函數的輸出相乘,決定Hidden State要將哪些信息攜帶到下一個Time Step。

output gate operations

概括來說,就是Forget Gate決定哪些歷史信息要保留;Input Gate決定哪些新的信息要添加進來;Output Gate決定下一個Hidden State要攜帶哪些歷史信息。

Code Demo

通過Python偽代碼輔助更好的理解整個LSTM的運行過程。

GRU

GRU與LSTM非常相似,但它去除了Cell State,使用Hidden State來傳遞信息。GRU只有兩個Gates: Reset Gate和Update Gate。

GRU cell and it’s gates

上圖不夠直接明白,再來一張臺灣大學李宏毅教學視頻中的講解。

其中

如上圖所示,r是Reset Gate,z為Update Gate。

通過重置門(Reset Gate)處理前一個Cell的輸出:

再將

最後進行記憶更新的步驟:

Update Gate z的範圍為0~1,它的值越接近1,代表記憶數據越多;它的值越接近0,則代表遺忘的越多。

相比LSTM,GRU的Tensor Operation更少,因而訓練速度更快,並且效果與LSTM不相上下。

參考材料

1.https://towardsdatascience.com/illustrated-guide-to-lstms-and-gru-s-a-step-by-step-explanation-44e9eb85bf21

2.https://zhuanlan.zhihu.com/p/32481747

註:本文所有圖片均來自參考材料。

相關焦點

  • 從動圖中理解 RNN,LSTM 和 GRU
    Animated RNN, LSTM and GRU作者 | Raimi Karim譯者 | 汪鵬(重慶郵電大學)、Overfitting本文編輯:王立魚英文原文:https://towardsdatascience.com/animated-rnn-lstm-and-gru-ef124d06cf45
  • 常見的時序模型:RNN/LSTM/GRU
    Klaus Greff LSTM & Colah’s Blog先忽略下圖中的藍線部分,是LSTM的一種變體。Hochreiter LSTM 1997LSTM正式的更新過程如下:colah's blog & gru paper直接由更新門控制時序信息流傳遞,比如更新門等於0,其實就是線性自循環Cell。當前輸入X的信息直接由重置門篩選關聯的hidden層特徵。
  • LSTM和GRU的解析從未如此通俗易懂(動圖)
    ▌作為解決方案的 LSTM 和 GRULSTM 和 GRU 是解決短時記憶問題的解決方案,它們具有稱為「門」的內部機制,可以調節信息流。AI項目體驗地址 https://loveai.techLSTM 和 GRU 可以在語音識別、語音合成和文本生成中找到,你甚至可以用它們為視頻生成字幕。對 LSTM 和 GRU 擅長處理長序列的原因,到這篇文章結束時你應該會有充分了解。 下面我將通過直觀解釋和插圖進行闡述,並避免儘可能多的數學運算。
  • LSTM和GRU的解析從未如此清晰(動圖+視頻)
    博文中,他先介紹了 LSTM 和 GRU 的本質, 然後解釋了讓 LSTM 和 GRU 有良好表現的內部機制。 當然,如果你還想了解這兩種網絡背後發生了什麼,那麼這篇文章就是為你準備的。視頻詳解LSTM 和 GRU 可以在語音識別、語音合成和文本生成中找到,你甚至可以用它們為視頻生成字幕。對 LSTM 和 GRU 擅長處理長序列的原因,到這篇文章結束時你應該會有充分了解。 下面我將通過直觀解釋和插圖進行闡述,並避免儘可能多的數學運算。
  • 序列模型簡介:RNN, 雙向RNN, LSTM, GRU,有圖有真相
    圖4 循環神經網絡要理解時間步t+1的上下文,我們可能需要知道時間步驟0和1的表示。圖6 遺忘門我們從當前時間步驟中獲取輸入和從上一個時間步驟中獲得的表示,並將它們連接起來。圖9 門控循環單元門控循環單元使用更新門和復位門。更新門決定應該讓過去的多少信息通過,復位門決定應該丟棄過去的多少信息。
  • 超生動圖解LSTM和GRU:拯救循環神經網絡的記憶障礙就靠它們了!
    LSTM和GRU經常用在語音識別、語音合成和文本生成等領域,還可用來為視頻生成字幕。當你看完這篇文章時,我相信你會對LSTM和GRU在處理長序列的突出能力有充分了解。下面我將通過直觀解釋和插圖來進行介紹,並儘可能繞開數學運算。直觀認識我們從一個思考實驗開始。當你在網絡上購買生活用品時,一般會先閱讀商品評論來判斷商品好壞,以確定是否要購買這個商品。
  • RNN系列教程之四 | 利用LSTM或GRU緩解梯度消失問題
    你基本上可將LSTB(和GRU)單元視為黑匣子,只要你給定當前輸入和前一時刻的隱藏狀態,便可計算出下一隱藏狀態。如下圖:g是基於當前輸入和先前隱藏狀態計算出的「候選」隱藏狀態。它與傳統RNN中的方程式完全相同,此處僅將參數U和W重命名為U^g和W^g。在傳統RNN中,我們指定g的值為新隱藏狀態,並輸出給下一個狀態,而在LSTM中,我們將通過輸入門來挑選g的一部分值,再輸出給下一個狀態。c_t是內部的記憶單元。
  • 超生動圖解 LSTM 和 GPU,一文讀懂循環神經網絡!
    先將先前隱藏狀態的信息和當前輸入的信息輸入到Sigmoid函數,在0和1之間調整輸出值來決定更新哪些信息,0表示不重要,1表示重要。你也可將隱藏狀態和當前輸入傳輸給Tanh函數,並在-1和1之間壓縮數值以調節網絡,然後把Tanh輸出和Sigmoid輸出相乘,Sigmoid輸出將決定在Tanh輸出中哪些信息是重要的且需要進行保留。
  • 超生動圖解LSTM和GPU,一文讀懂循環神經網絡!
    LSTM和GRU經常用在語音識別、語音合成和文本生成等領域,還可用來為視頻生成字幕。當你看完這篇文章時,我相信你會對LSTM和GRU在處理長序列的突出能力有充分了解。下面我將通過直觀解釋和插圖來進行介紹,並儘可能繞開數學運算。直觀認識我們從一個思考實驗開始。當你在網絡上購買生活用品時,一般會先閱讀商品評論來判斷商品好壞,以確定是否要購買這個商品。
  • 【重溫序列模型】再回首DeepLearning遇見了LSTM和GRU
    下面再來個RNN的圖回顧一下(會發現和之前的圖又是不一樣, 好多種畫法, 但是萬變不離其宗, 原理不會變,哈哈):上一篇文章已經詳細分析了這種網絡的工作原理和計算方面的細節, 這裡就不再過多贅述, 這裡看一點新的東西, 就是序列依賴的問題, 上一篇文章中只是提到了循環網絡一個很重要的作用就是能夠捕捉序列之間的依賴關係, 而原理就是RNN在前向傳播的時候時間步之間有隱藏狀態信息的傳遞, 這樣反向傳播修改參數的時候
  • 手寫GRU-[TensorFlow]
    當前時刻標籤的標註是會基於上一時刻的標註結果,其實個人感覺就是循環神經網絡的機制可以完成,然而循環神經網絡輸出為隱藏單元的狀態,直接將這種狀態作為標籤應該是不夠準確的,所以大多論文中會在最後一層網絡中添加一層MLP什麼的,對隱藏單元序列進行解碼輸出所謂標籤,然而作為TensorFlow菜雞,一直就用人家封裝好的函數如下:with tf.variable_scope('GRU-cell'): gru_cell_fw
  • 一步一步動畫圖解LSTM和GRU,沒有數學,包你看的明白!
    不過,其實只要幫你梳理一下,理解起來還是很清楚的,其實就是一個信息流動的過程,這次帶給大家的分享更是通過動圖的方式,讓大家一次看個明白。大家好,歡迎來到長短期記憶(LSTM)和門控循環單元(GRU)的圖解指南。我是Michael,我是AI語音助手空間的機器學習工程師。
  • PyTorch:Bi-LSTM的文本生成
    我們可以在圖中清楚地看到這個過程。在本例中,窗口的大小為4,這意味著它將包含4個字符。目標是作者在窗口圖像右邊的第一個字符到目前為止,我們已經看到了如何以一種簡單的方式生成字符序列。現在我們需要將每個字符轉換為其各自的數字格式,為此,我們將使用預處理階段生成的字典。這個過程可以在下圖可視化。
  • 用Bi-GRU語義解析,實現中文人物關係分析 | 附完整代碼
    而實體識別和關係抽取是構建知識圖譜等上層自然語言處理應用的基礎。關係抽取可以簡單理解為一個分類問題:給定兩個實體和兩個實體共同出現的句子文本,判別兩個實體之間的關係。使用CNN或者雙向RNN加Attention的深度學習方法被認為是現在關係抽取state of art的解決方案。已有的文獻和代碼,大都是針對英文語料,使用詞向量作為輸入進行訓練。
  • 循環神經網絡 RNN、LSTM、GRU
    RNN 2.1 RNN 結構 RNN 是比較早期的循環神經網絡,結構相對簡單,通常的結構如下圖所示。 在 RNN 中每一時刻都共用同一個神經元,將神經元展開之後如下圖所示。
  • Tensorflow教程-雙向的LSTM文本分類
    ,這裡有個注意的地方,2 * num_hidden代表的是向前和向後的LSTM輸出一共有兩個輸出。# 定義LSTM# 向前的LSTMlstm_fw_cell = rnn.BasicLSTMCell(num_hidden, forget_bias=1.0)lstm_fw_cell = tf.contrib.rnn.DropoutWrapper(lstm_fw_cell, output_keep_prob=0.5)# 向後的LSTMlstm_bw_cell = rnn.BasicLSTMCell
  • 自己動手做聊天機器人 三十三-兩套代碼詳解LSTM-RNN——有記憶的神經網絡
    在這裡先說一下這個加法器的思路:二進位的加法是一個一個二進位位相加,同時會記錄一個滿二進一的進位,那麼訓練時,隨機找個c=a+b就是一個樣本,輸入a、b輸出c就是整個lstm的預測過程,我們要訓練的就是由a、b的二進位向c轉換的各種轉換矩陣和權重等
  • 「乾貨」深入淺出LSTM及其Python代碼實現
    如下圖所示:圖中標示了LSTM中各個門的構成情況和相互之間的關係,其中:遺忘門由一個$sigmod$神經網絡層和一個按位乘操作構成;記憶門由輸入門(input gate)與tanh神經網絡層和一個按位乘操作構成;輸出門(output gate)與 $tanh$ 函數(注意:這裡不是 $tanh$ 神經網絡層)以及按位乘操作共同作用將細胞狀態和輸入信號傳遞到輸出端。
  • LSTM模型結構的可視化
    我也是苦苦冥思很久,看了很多資料和網友分享的LSTM結構圖形才明白其中的玄機。1、傳統的BP網絡和CNN網絡2、LSTM網絡3、LSTM的輸入結構4、pytorch中的LSTM4.1 pytorch中定義的LSTM模型4.2 餵給LSTM的數據格式4.3 LSTM的output格式5、LSTM和其他網絡組合BP網絡和CNN網絡沒有時間維,和傳統的機器學習算法理解起來相差無幾,CNN