“長(zhǎng)期依賴”問(wèn)題
RNN最主要的問(wèn)題就是“長(zhǎng)期依賴”問(wèn)題,也就是 RNN 很容易接受和處理最近的上下文信息,比如:
“天氣預(yù)報(bào)說(shuō)明天早上要下大雨,出門(mén)一定要記得帶_____。”
像這樣的短期信息,由于相關(guān)信息“下大雨”和要填的詞之間的距離比較短, RNN 就可以很容易地學(xué)會(huì)利用過(guò)去的信息,預(yù)測(cè)出來(lái)_____里面應(yīng)該填“雨傘”。
可是當(dāng)有些時(shí)候當(dāng)相關(guān)的信息距離需要預(yù)測(cè)的位置_____比較遠(yuǎn)時(shí),比如:
“我出生在中國(guó),但是后來(lái)隨父母移民到了美國(guó),我......(省略200個(gè)字),因此我能講一口流利的____?!?/strong>
現(xiàn)在再用 RNN 來(lái)預(yù)測(cè)____里面的詞時(shí)就存在一定困難,依靠最近的信息很難預(yù)測(cè)出下一個(gè)詞是什么,我們可能知道大致是一門(mén)語(yǔ)言,因?yàn)樗蕾嚨牟皇嵌唐谛畔⒍情L(zhǎng)期信息。
從模型結(jié)構(gòu)上看,RNN 完全能夠處理這樣的“長(zhǎng)期依賴”問(wèn)題,因?yàn)?RNN 每個(gè)神經(jīng)元都接受了上一個(gè)神經(jīng)元的信息,理論上講,即使信息距離這個(gè)神經(jīng)元很遠(yuǎn)很遠(yuǎn)也能夠傳遞下來(lái),這樣理解確實(shí)沒(méi)錯(cuò),理論上講人們可以通過(guò)仔細(xì)挑選 RNN 的參數(shù),來(lái)解決這種問(wèn)題,但在實(shí)踐中,我們發(fā)現(xiàn)即使這樣 RNN 似乎也不能處理好這些問(wèn)題,因?yàn)殡S著信息的傳遞總會(huì)有一些信息慢慢地被忽略掉。怎么處理,應(yīng)該很容易想到,既然信息沿著神經(jīng)元一個(gè)一個(gè)往下傳容易出現(xiàn)信息丟失的情況,那可不可以找一個(gè)處理單元,專(zhuān)門(mén)用來(lái)保存過(guò)去的信息,有用的時(shí)候就直接把它取出來(lái),不用的時(shí)候就丟棄,需要修改的時(shí)候就修改,答案是當(dāng)然可以,而且 LSTM 就是這么干的。
長(zhǎng)短時(shí)記憶網(wǎng)絡(luò) LSTM(Long Short Term Memory Network, LSTM)。LSTM 是一種特殊的循環(huán)神經(jīng)網(wǎng)絡(luò),具有能夠處理長(zhǎng)期信息的能力,解決'長(zhǎng)期依賴'的問(wèn)題,比如在文本處理中能夠利用很寬范圍的上下文信息來(lái)判斷下一個(gè)詞的概率。LSTM 在各種各樣的問(wèn)題中都取得了極好的效果,現(xiàn)在正在被更廣泛地使用。
LSTM能記住很長(zhǎng)時(shí)間的信息,實(shí)際上是 LSTM 的默認(rèn)行為,而不是需要努力學(xué)習(xí)的東西。換句話說(shuō),這能力是與生俱來(lái)的,前面我們就已經(jīng)說(shuō)了 LSTM 直接把過(guò)去的信息單獨(dú)找了一個(gè)處理單元給存儲(chǔ)起來(lái)了,只要決定是保留、去除還是更新即可,根本不需要學(xué)習(xí)。
既然LSTM 是 RNN 的變種,那么它同樣是由神經(jīng)網(wǎng)絡(luò)的重復(fù)復(fù)塊組成的鏈?zhǔn)浇Y(jié)構(gòu)。對(duì)于標(biāo)準(zhǔn)的RNN,這種重復(fù)模塊有一個(gè)非常簡(jiǎn)單的結(jié)構(gòu),比如一個(gè)單一的tanh(雙曲正切)層。
標(biāo)準(zhǔn)RNN結(jié)構(gòu)
標(biāo)準(zhǔn)RNN結(jié)構(gòu)
看著下面這個(gè)圖比上面那個(gè)圖高大上一點(diǎn),其實(shí)表達(dá)的是同一個(gè)意思,只不過(guò)多了一些細(xì)節(jié),把隱含層的激活函數(shù)加上了而已。LSTM 和這個(gè)很像,只不過(guò)在重復(fù)模塊里多了幾個(gè)處理單元而已,也就是把我們最初說(shuō)得保留過(guò)去信息的那個(gè)功能加上罷了。
看上去比較復(fù)雜,其實(shí)理解起來(lái)很簡(jiǎn)單,都看到這里了大家沉住氣,馬上你就能掌握傳說(shuō)中的 LSTM 了 ,懂了就可以嘗試用 LSTM 去挑戰(zhàn)一下傳統(tǒng)的時(shí)間序列模型 ARIMA 這些了,也可以建立一個(gè)模型來(lái)預(yù)測(cè)股票走勢(shì)之類(lèi)的,廢話不多說(shuō),且聽(tīng)作者對(duì) LSTM 網(wǎng)絡(luò)結(jié)構(gòu)娓娓道來(lái)。
LSTM網(wǎng)絡(luò)結(jié)構(gòu)
從圖中我們很容易看出 RNN 和 LSTM 的區(qū)別,RNN 重復(fù)模塊中只包括 1 個(gè)處理單元,也就是 1 個(gè) tanh 層。LSTM也是這樣的鏈?zhǔn)浇Y(jié)構(gòu),但重復(fù)模塊卻具有和一般RNN不同的結(jié)構(gòu),具有 4 個(gè)交互層,用一種特殊的方式進(jìn)行交互。
在講具體怎么交互之前我們先看一下圖中的每個(gè)符號(hào)的意思。每個(gè)箭頭有一個(gè)完整的向量,表示信息流動(dòng),從一個(gè)輸出節(jié)點(diǎn)到另外的輸入節(jié)點(diǎn)。粉紅圓圈代逐點(diǎn)操作,比如向量相加或者相乘。而神經(jīng)網(wǎng)絡(luò)層是黃色的框,框里面具體的操作稍后詳細(xì)展開(kāi)。箭頭的合并表示串聯(lián),即把信息合并到一起,而線分叉表示將其內(nèi)容復(fù)制一份分別到其他地方。
LSTM中的符號(hào)
LSTM 的核心理念我們?cè)谏厦嬉埠?jiǎn)單提到過(guò),就是找一個(gè)能夠單獨(dú)存儲(chǔ)長(zhǎng)時(shí)間信息的單元狀態(tài),這個(gè)單元狀態(tài)就是圖中頂部穿過(guò)所有重復(fù)模塊的水平箭頭。
長(zhǎng)時(shí)間信息按一個(gè)方向傳遞
單元狀態(tài),也就是最上面那根線,就像一個(gè)傳送帶,它通過(guò)整個(gè)鏈往下運(yùn)行,只有一些小的線性相互作用。信息會(huì)很容易地沿著箭頭方向流動(dòng)。
正如前面所說(shuō),LSTM 完全可以刪除或添加單元狀態(tài)的的信息,被稱為門(mén)限( gates)的結(jié)構(gòu)將會(huì)控制信息。門(mén)限可以有選擇地讓信息通過(guò),它由 Sigmoid 神經(jīng)絡(luò)層和點(diǎn)乘操作組成。
門(mén)限
Sigmoid (σ)層輸出 0 和 1 之間的向量,描述每個(gè)組件能通過(guò)多少信息。0 值表示“不讓任何東西通過(guò)”,而 1 值的意思是“讓所有的信息都通過(guò)”。
一個(gè)LSTM有 3 種這樣的門(mén)限,也就是大家在圖中看到的 3 個(gè) Sigmoid 層,來(lái)保護(hù)和控制單元的狀態(tài)。
第一步:遺忘門(mén)限
第一步,決定從單元狀態(tài)(最上面那根線)中扔掉哪些信息。一個(gè)叫“遺忘門(mén)限”的 Sigmoid 層負(fù)責(zé)做出這些決定。在單元狀態(tài) C_t-1 上,上一時(shí)刻傳遞來(lái)的信息 h_t-1 和這一時(shí)刻的信息 x_t合并后經(jīng)過(guò) Sigmoid 函數(shù)輸出0 和 1 之間的一個(gè)向量。同樣,1 代表“完全保留信息”,0代表 “完全丟掉信息”。
在實(shí)際的語(yǔ)言模型中,當(dāng)我們?cè)囍谝郧暗男畔㈩A(yù)測(cè)下一個(gè)詞語(yǔ)時(shí)。在這樣的問(wèn)題中,單元狀態(tài)可能包括性別的話題,這樣模型就能正確使用代詞,比如他者她。當(dāng)我們看到一個(gè)新的話題,想要忘記舊話題中有關(guān)性別的內(nèi)容時(shí),就可以使用“遺忘門(mén)限”。
遺忘門(mén)限
第二步:輸入新信息
第二步,我們要決定在單元狀態(tài)中儲(chǔ)存哪些新的信息。這一步分為兩個(gè)部分組成,首先,一個(gè)被稱為“輸入門(mén)限”的 Sigmoid 層決定哪些值會(huì)更新。接著,一個(gè)tanh 層創(chuàng)建新的候選值向量 ~C_t,~C_t 表示這個(gè)重復(fù)模塊所產(chǎn)生的信息,它是一個(gè)可添加的狀態(tài),之后會(huì)決定要不要加到單元狀態(tài) C_t-1 中。
輸入門(mén)限
第三步:更新單元狀態(tài)
第三步,結(jié)合第一步和第二步創(chuàng)建一個(gè)更新的單元狀態(tài)。比如,在語(yǔ)言模型的例子中,我們想添加有興趣愛(ài)好的新話題,以取代有關(guān)性別的話題時(shí),就需要使用“遺忘門(mén)限”來(lái)去除舊的信息,'輸入門(mén)限'用來(lái)添加新的信息,更新最上面的單元狀態(tài)從 C_t-1 到 C_t,即舊狀態(tài)乘以 f_t 表示丟棄我們之前決定忘記的東西,然后,加上新?tīng)顟B(tài)乘以 i_t 表示加上新的信息。
更新單元狀態(tài)
第四步:重復(fù)模塊的輸出
最后,前面只講了單元狀態(tài)的更新部分,別忘了還有一件重要的事,那就是決定要輸出什么。先看一下輸出由那些信息決定,前一個(gè)重復(fù)模塊的輸出 h_t-1,本重復(fù)模塊的輸入 x_t,以及更新后的單元狀態(tài) C_t。
首先,前一個(gè)重復(fù)模塊的輸出 h_t-1 和 本重復(fù)模塊的輸入 x_t 合并后輸入到 Sigmoid 函數(shù)中,得到 0 和 1 之間的一個(gè)向量,用來(lái)決定我們要輸出哪些單元狀態(tài)。
然后,我們把單元狀態(tài)通過(guò) tanh 函數(shù) (tanh 函數(shù)的作用:將輸出值規(guī)一化于-1到1之間)和 Sigmoid 門(mén)限的輸出相乘,以便只輸出我們決定輸出的部分。
比如在語(yǔ)言模型的例子中,當(dāng)話題由性別主題轉(zhuǎn)移到興趣愛(ài)好主題時(shí),我們可以根據(jù)前面的性別信息確定他是男生還是女生,一旦性別確定下來(lái)后,我們就選擇忘記這個(gè)信息,去記住新的主題信息——“興趣愛(ài)好”,這樣的處理對(duì)于后面的預(yù)測(cè)就會(huì)很有用,比如前面是男生的話,興趣就很有可能是“打籃球”,如果前面是女生的話,興趣就很有可能是“打羽毛球”,這樣模型就可以記住長(zhǎng)期的信息,并將其用在之后的預(yù)測(cè)中。
重復(fù)模塊的輸出
LSTM 概述大致就是這么多內(nèi)容,這里講得是標(biāo)準(zhǔn)的 LSTM,當(dāng)然 LSTM 還有很多變體,這里就不詳細(xì)展開(kāi)了,如果大家有什么問(wèn)題,歡迎大家留言討論。
以下是參考文獻(xiàn)以及圖片來(lái)源,在此致謝。
Reference
colah’ blog 《Understanding LSTM Networks》
聯(lián)系客服