以通俗易懂的方式介紹LSTM&GRU(動圖)

本文內(nèi)容主要翻譯自:Illustrated Guide to LSTM’s and GRU’s: A step by step explanation

本文首先從直覺上了解一下LSTM和GRU;然后再介紹LSTM和GRU的內(nèi)部機(jī)制。

短期記憶問題

RNN網(wǎng)絡(luò)會受到短期記憶問題的影響。如果一個輸入序列足夠長,那么RNN很難將早期的信息傳送到之后的時間步上。如果你正在嘗試處理一段文字來進(jìn)行預(yù)測,RNN可能會丟失掉起始部分的重要信息。

在反向傳播過程中,RNN網(wǎng)絡(luò)會遇到梯度消失問題。反向傳播過程中計算的梯度用于對權(quán)重參數(shù)進(jìn)行更新。梯度消失問題是指梯度隨著時間的推移而逐漸減小[或者說由于鏈?zhǔn)降姆▌t,梯度值從后往前越來越小],如果梯度值變得非常小,那么權(quán)重參數(shù)就不再更新。

所在RNN網(wǎng)絡(luò)中,獲得小梯度的網(wǎng)絡(luò)層將終止學(xué)習(xí)過程,通常這些網(wǎng)絡(luò)層為模型的前幾層。因?yàn)檫@些網(wǎng)絡(luò)層停止學(xué)習(xí),RNN可能會忘記在長序列中看到的信息,因此具有短期記憶。

解決方法:LSTM & GRU

LSTM和GRU的提出是為了解決傳統(tǒng)RNN遇到的短期記憶問題,它們內(nèi)部具有稱為“門”的機(jī)制,可以調(diào)節(jié)信息的流動。

這些“門”可以通過學(xué)習(xí)知道輸入數(shù)據(jù)序列中那部分是重要的需要保留,那部分可以丟棄。通過這樣的“門”,相關(guān)信息可以沿序列的長鏈傳遞下去從而進(jìn)行預(yù)測。幾乎所有基于遞歸神經(jīng)網(wǎng)絡(luò)的技術(shù)成果都是通過這兩個網(wǎng)絡(luò)實(shí)現(xiàn)的。LSTM和GRU可以用于語音識別、語音合成以及文本生成,甚至可以用它們來為視頻生成字幕。

下面,我們通過圖示對這兩種網(wǎng)絡(luò)進(jìn)行介紹,在介紹過程中會避免大量的數(shù)學(xué)計算;通過圖示,我們能對這兩種網(wǎng)絡(luò)的內(nèi)部機(jī)制有清晰的了解。

本質(zhì)

我們先開始做一個小實(shí)驗(yàn)。假設(shè)你想要在網(wǎng)上買一份麥片,首先你會閱讀購買用戶的商品評價進(jìn)而決定是否購買。

當(dāng)你閱讀上述評論時,大腦會下意識地只記住那些關(guān)鍵詞,如“amazing","perfectly balanced breakfast",對”this“,”gave“,”all“,”should“等詞并不會太過關(guān)注。如果你朋友第二天問題評論的內(nèi)容,你可能不會一字不差地記住評論內(nèi)容,可能只記得關(guān)鍵信息,像”will definitely be buying again“.而不記得其他詞匯。

這基本上就像是LSTM和GRU所做的事情,它們可以學(xué)習(xí)只保留相關(guān)信息來進(jìn)行預(yù)測,并忘記不相關(guān)的數(shù)據(jù)信息。在這個例子中,你記得的詞匯信息可以幫助你判斷這個商品是否值得購買。

RNN回顧

為了了解LSTM和GRU的實(shí)現(xiàn)原理,我們先回顧一下RNN。RNN的工作原理:首先將單詞轉(zhuǎn)換成機(jī)器能理解的向量形式,然后將向量依次送到網(wǎng)絡(luò)中進(jìn)行處理。

在處理過程中,RNN網(wǎng)絡(luò)將前一個時間步的隱藏狀態(tài)傳送到當(dāng)前時間步。RNN的隱藏狀態(tài)的作用類似于神經(jīng)網(wǎng)絡(luò)的"記憶",保存著它處理過的從起始到當(dāng)前位置的所有數(shù)據(jù)信息。

讓我們聚焦到RNN的單個單元來看一下隱藏狀態(tài)是如何計算的。首先,將輸入數(shù)據(jù)和前一個隱藏狀態(tài)聚合,形成一個向量。這個向量擁有當(dāng)前輸入和以前所有的輸入信息。這個聚合向量通過一個tanh激活函數(shù),其輸出結(jié)果即為新的隱藏狀態(tài),或者說網(wǎng)絡(luò)的“記憶”。

Tanh激活函數(shù)

tanh激活函數(shù)用于幫助調(diào)節(jié)流經(jīng)網(wǎng)絡(luò)的值。tanh網(wǎng)絡(luò)將輸出結(jié)果的取值范圍限制到(-1, 1).

當(dāng)向量流過神經(jīng)網(wǎng)絡(luò)時,由于各種數(shù)學(xué)運(yùn)算,它會經(jīng)歷許多變換。我們假設(shè)變化過程為:一個值連續(xù)乘以3.通過下面的gif,你可以看到某些值如何爆炸并成為天文數(shù)字,從而導(dǎo)致其他值顯得微不足道。

不經(jīng)tanh的向量變換

tanh激活函數(shù)能夠?qū)?shù)據(jù)的輸出范圍壓縮到-1到1之間,從而達(dá)到調(diào)整神經(jīng)網(wǎng)絡(luò)輸出結(jié)果的目的。你可以通過下圖看到相同的輸入數(shù)據(jù)經(jīng)過tanh激活函數(shù)后的數(shù)據(jù)變化過程。

經(jīng)過tanh的向量變換

這就是RNN的計算過程。RNN的內(nèi)部計算很少,在恰當(dāng)?shù)那榫诚鹿ぷ餍Ч浅:茫?strong>如處理短文本序列)。RNN使用的計算資源比它的變體LSTM和GRU都少。

LSTM

LSTM和RNN具有類似的數(shù)據(jù)控制流,它在前向傳播時處理流經(jīng)單元的數(shù)據(jù)。兩者的不同之處在于LSTM的內(nèi)部數(shù)據(jù)操作不同。

這些操作可以保證LSTM對信息的保留和丟棄。下面我們逐步介紹LSTM單元的內(nèi)部操作。

核心概念

LSTM的核心概念在于細(xì)胞狀態(tài)以及各種門。細(xì)胞狀態(tài)充當(dāng)信息傳輸公路,它將相關(guān)信息沿著序列鏈進(jìn)行傳遞,你可以將它看做是網(wǎng)絡(luò)模型的“記憶”。理論上,細(xì)胞狀態(tài)可以在整個序列處理過程中攜帶相關(guān)信息。因此,盡管是早期的信息也能被攜帶到之后的時間步的細(xì)胞中,進(jìn)而能減緩短期記憶的問題。隨著細(xì)胞狀態(tài)的變化,信息通過“門”機(jī)制添加或刪除到細(xì)胞狀態(tài)中?!伴T”是一種神經(jīng)網(wǎng)絡(luò),可以決定哪部分信息添加到細(xì)胞狀態(tài)中。這些“門”可以通過學(xué)習(xí)知道在訓(xùn)練過程中哪些信息需要保留哪些信息需要忘記。

Sigmoid

“門”結(jié)構(gòu)中包含sigmoid激活函數(shù)。Sigmoid激活函數(shù)和tanh激活函數(shù)類似:tanh激活函數(shù)將數(shù)據(jù)的輸出范圍限制到(-1, 1), sigmoid則將范圍限制到(0,1)。這有助于更新和忘記信息,因?yàn)槿魏螖?shù)字乘以0得0,進(jìn)而實(shí)現(xiàn)信息的“忘記”;任何數(shù)字乘以1得原數(shù)字,進(jìn)而實(shí)現(xiàn)信息的“保留”。神經(jīng)網(wǎng)絡(luò)可以學(xué)習(xí)指導(dǎo)哪部分?jǐn)?shù)據(jù)不重要可以忘記,哪些數(shù)據(jù)重要需要保留。

Sigmoid將輸出限制到0~1

下面我們看看LSTM中各種門結(jié)構(gòu)。LSTM包括三種用于控制信息流動的門結(jié)構(gòu),分別是:遺忘門、輸入門和輸出門。

遺忘門

忘記門用于決定信息的保留或丟失。前一個神經(jīng)元的隱藏狀態(tài)和當(dāng)前輸入傳遞到sigmoid函數(shù)中。輸出結(jié)果在0至1之間。越接近0表示信息需要被丟棄(忘記),越接近1表示信息需要保留。

遺忘門

輸入門

輸入門用于更新細(xì)胞狀態(tài)。首先,我們將前一個神經(jīng)元的隱藏狀態(tài)和當(dāng)前輸入傳送帶sigmoid函數(shù)中。sigmoid將輸出調(diào)整到0~1之間,0表示信息不重要,1表示信息重要。此外,將隱藏狀態(tài)和當(dāng)前輸入傳送到tanh函數(shù)中得到一個候選狀態(tài)。然后,將候選狀態(tài)和sigmoid計算結(jié)果進(jìn)行相乘。sigmoid計算結(jié)果用于決定tanh的輸出結(jié)果哪部分是重要的需要保存。

細(xì)胞狀態(tài)

至此,我們有了充足的信息可以用來更新細(xì)胞狀態(tài)。首先,細(xì)胞狀態(tài)和忘記向量逐元素相乘,如果和一個接近0的值進(jìn)行相乘,則有可能丟棄細(xì)胞狀態(tài)中元素的值;然后將這個值與輸入門的輸出結(jié)果進(jìn)行逐元素相加,將神經(jīng)網(wǎng)絡(luò)發(fā)現(xiàn)的相關(guān)信息添加到細(xì)胞狀態(tài)中。這樣,我們就完成了細(xì)胞狀態(tài)的更新。

輸出門

輸出門可以用于確定下一個隱藏狀態(tài)的值。隱藏狀態(tài)包含先前的輸入信息,同時也可以用于做預(yù)測。首先,我們將前一個神經(jīng)元的隱藏狀態(tài)和當(dāng)前輸入傳送到sigmoid函數(shù)中;然后我們將更新后的細(xì)胞狀態(tài)送到tanh激活函數(shù)中;最后將tanh函數(shù)的輸出與sigmoid函數(shù)的輸出進(jìn)行相乘,進(jìn)而確定隱藏狀態(tài)攜帶的信息,這個計算結(jié)果就是新的隱藏狀態(tài)值。最后,將新的細(xì)胞狀態(tài)和隱藏狀態(tài)傳送到下一個時間步的神經(jīng)元中。

讓我們來回顧一下,忘記門決定先前時間步的信息哪些信息的相關(guān)的需要保留。輸入門決定當(dāng)前時間步開始需要添加的相關(guān)信息。輸出門決定下一個隱藏狀態(tài)應(yīng)該是什么。

運(yùn)算偽代碼

Code Demo
  1. 將前一個的隱藏狀態(tài)和當(dāng)前輸入進(jìn)行拼接得到一個新的輸入,我們稱之為combine

  2. 將combine傳送到忘記門中,這一步用于移除不相關(guān)的信息

  3. 將combine傳送到候選層中創(chuàng)建一個候選狀態(tài)。候選狀態(tài)保存著可能添加到細(xì)胞狀態(tài)的信息

  4. 將combine傳送到輸入門中,這一步用于確定候選狀態(tài)中哪些信息需要添加到新的候選狀態(tài)中

  5. 使用忘記門、候選狀態(tài)和輸入門的計算結(jié)果,結(jié)合先前的細(xì)胞狀態(tài)和候選狀態(tài)計算新的細(xì)胞狀態(tài)

  6. 計算當(dāng)前細(xì)胞的輸出

  7. 將輸出門和輸出相乘得到新的隱藏狀態(tài)

LSTM計算公式

LSTM網(wǎng)絡(luò)的控制流就是幾個張量計算以及一個for循環(huán)。你可以使用隱藏狀態(tài)做預(yù)測。通過這些機(jī)制,LSTM在序列處理過程中可以決定哪部分信息需要忘記,哪些數(shù)據(jù)需要遺忘。

GRU

了解了LSTM的工作原理,我們來簡單介紹一個GRU。GRU是RNN的一個新變體,工作原理和LSTM很相似。GRU沒有細(xì)胞狀態(tài),只有一個隱藏狀態(tài)用于傳送信息。它只有兩個門結(jié)構(gòu):重置門和更新門。

GRU

更新門

更新門和LSTM中的遺忘門和輸入門功能類似。它可以決定哪部分信息需要遺忘哪些信息需要被添加。

重置門

重置門用于決定先前的信息哪些部分需要遺忘。

GRU內(nèi)部的張量計算更少,因此GRU的訓(xùn)練速度比LSTM更快。但是很難確定兩者之間孰優(yōu)孰劣。研究者和算法工程師通常會都嘗試一下,然后決定到底是用哪一個。

GRU計算公式

總結(jié)

RNN 用于處理序列數(shù)據(jù)來進(jìn)行預(yù)測,但容易受到短期記憶的制約。LSTM 和 GRU 采用門結(jié)構(gòu)來克服短期記憶的影響。門結(jié)構(gòu)是一種神經(jīng)網(wǎng)絡(luò),可以調(diào)節(jié)流經(jīng)序列鏈的信息流。LSTM和GRU可以用于語音識別,語音合成,自然語言理解等任務(wù)中。

一起學(xué)習(xí)呀
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容