Keras之stateful LSTM全面解析+實例測試

Keras中的stateful LSTM可以說是所有學(xué)習(xí)者的夢魘丐枉,令人混淆的機(jī)制,說明不到位的文檔掘托,中文資料的匱乏瘦锹。
通過此文,旨在幫助有困惑的人理解statefulness這一狀態(tài)闪盔。

警告: 永遠(yuǎn)不要在不熟悉stateful LSTM的情況下使用它

參考目錄:

官方文檔簡介

stateful: Boolean (default False). If True, the last state for each sample at index i in a batch will be used as initial state for the sample of index i in the following batch.

使 RNN 具有狀態(tài)意味著每批樣品的狀態(tài)將被重新用作下一批樣品的初始狀態(tài)弯院。

注意,此處的狀態(tài)表示的是原論文公式里的c泪掀,h听绳,即LSTM特有的一些記憶參數(shù),并非w權(quán)重异赫。

當(dāng)使用有狀態(tài) RNN 時椅挣,假定:

  • 所有的批次都有相同數(shù)量的樣本
  • 如果 x1x2 是連續(xù)批次的樣本,則x2[i]x1[i] 的后續(xù)序列祝辣,對于每個 i贴妻。

要在 RNN 中使用狀態(tài)切油,你需要:

  • 通過將 batch_size 參數(shù)傳遞給模型的第一層來顯式指定你正在使用的批大小蝙斜。例如,對于 10 個時間步長的 32 樣本的 batch澎胡,每個時間步長具有 16 個特征孕荠,batch_size = 32娩鹉。
  • 在 RNN 層中設(shè)置 stateful = True
  • 在調(diào)用 fit() 時指定 shuffle = False稚伍。

重置累積狀態(tài):

  • 使用 model.reset_states()來重置模型中所有層的狀態(tài)
  • 使用layer.reset_states()來重置指定有狀態(tài) RNN 層的狀態(tài)

疑問解答:

  • 將一個很長的序列(例如時間序列)分成小序列來構(gòu)建我的輸入矩陣弯予。那LSTM網(wǎng)絡(luò)會發(fā)現(xiàn)我這些小序列之間的關(guān)聯(lián)依賴嗎?
    不會个曙,除非你使用 stateful LSTM 锈嫩。大多數(shù)問題使用stateless LSTM即可解決,所以如果你想使用stateful LSTM垦搬,請確保自己是真的需要它呼寸。在stateless時,長期記憶網(wǎng)絡(luò)并不意味著你的LSTM將記住之前batch的內(nèi)容猴贰。

  • 在Keras中stateless LSTM中的stateless指的是?
    注意对雪,此文所說的stateful是指的在Keras中特有的,是batch之間的記憶cell狀態(tài)傳遞米绕。而非說的是LSTM論文模型中表示那些記憶門瑟捣,遺忘門,c栅干,h等等在同一sequence中不同timesteps時間步之間的狀態(tài)傳遞迈套。
    假定我們的輸入X是一個三維矩陣,shape = (nb_samples, timesteps, input_dim)碱鳞,每一個row代表一個sample交汤,每個sample都是一個sequence小序列。X[i]表示輸入矩陣中第isample劫笙。步長啥的我們先不用管芙扎。
    當(dāng)我們在默認(rèn)狀態(tài)stateless下,Keras會在訓(xùn)練每個sequence小序列(=sample)開始時填大,將LSTM網(wǎng)絡(luò)中的記憶狀態(tài)參數(shù)reset初始化(指的是c戒洼,h而并非權(quán)重w),即調(diào)用model.reset_states()允华。

  • 為啥stateless LSTM每次訓(xùn)練都要初始化記憶參數(shù)?
    因為Keras在訓(xùn)練時會默認(rèn)地shuffle samples圈浇,所以導(dǎo)致sequence之間的依賴性消失,samplesample之間就沒有時序關(guān)系靴寂,順序被打亂磷蜀,這時記憶參數(shù)在batch、小序列之間進(jìn)行傳遞就沒意義了百炬,所以Keras要把記憶參數(shù)初始化褐隆。

  • 那stateful LSTM到底怎么傳遞記憶參數(shù)?
    首先要明確一點剖踊,LSTM作為有記憶的網(wǎng)絡(luò)庶弃,它的有記憶指的是在一個sequence中衫贬,記憶在不同的timesteps中傳播。舉個例子歇攻,就是你有一篇文章X固惯,分解,然后把每個句子作為一個sample訓(xùn)練對象(sequence)缴守,X[i]就代表一句話葬毫,而一句話里的每個word各自代表一個timestep時間步,LSTM的有記憶即指的是在一句話里屡穗,X[i][0]第一個單詞(時間步)的信息可以被記憶供常,傳遞到第5個單詞(時間步)X[i][5]中。
    而我們突然覺得鸡捐,這還遠(yuǎn)遠(yuǎn)不夠栈暇,因為句子和句子之間沒有任何的記憶啊,假設(shè)文章一共1000句話箍镜,我們想預(yù)測出第1001句是什么源祈,不想丟棄前1000句里的一些時序性特征(stateless時這1000句訓(xùn)練時會被打亂,時序性特征丟失)色迂。那么,stateful LSTM就可以做到歇僧。
    stateful = True 時诈悍,我們要在fit中手動使得shuffle = False侥钳。隨后,在X[i](表示輸入矩陣中第isample)這個小序列訓(xùn)練完之后苦酱,Keras會將將訓(xùn)練完的記憶參數(shù)傳遞給X[i+bs](表示第i+bs個sample),作為其初始的記憶參數(shù)疫萤。bs = batch_size敢伸。這樣一來,我們的記憶參數(shù)就能順利地在samplesample之間傳遞,X[i+n*bs]也能知道X[i]的信息饶辙。

用圖片可以更好地展示,如下圖弃揽,藍(lán)色箭頭就代表了記憶參數(shù)的傳遞矿微,如果stateful = False涌矢,則沒有這些藍(lán)色箭頭。

stateful_lstm.jpg

  • stateful LSTM中為何一定要提供batch_size參數(shù)娜庇?
    我們可以發(fā)現(xiàn),記憶參數(shù)(state)是在每個batch對應(yīng)的位置跳躍著傳播的励负,所以batch_size參數(shù)至關(guān)重要继榆,在stateful lstm層中必須提供略吨。

  • 那stateful時考阱,對權(quán)重參數(shù)w有影響嗎羔砾?
    我們上面所說的一切記憶參數(shù)都是LSTM模型的特有記憶c姜凄,h參數(shù),和權(quán)重參數(shù)w沒有任何關(guān)系董虱。無論是stateful還是stateless愤诱,都是在模型接受一個batch后淫半,計算每個sequence的輸出,然后平均它們的梯度昏滴,反向傳播更新所有的各種參數(shù)谣殊。

總結(jié)

如果你還是不理解牺弄,沒關(guān)系势告,簡單的說:

  • stateful LSTM:能讓模型學(xué)習(xí)到你輸入的samples之間的時序特征培慌,適合一些長序列的預(yù)測,哪個sample在前盒音,那個sample在后對模型是有影響的祥诽。
  • stateless LSTM:輸入samples后瓮恭,默認(rèn)就會shuffle屯蹦,可以說是每個sample獨(dú)立登澜,之間無前后關(guān)系,適合輸入一些沒有關(guān)系的樣本购撼。

如果你還是不理解迂求,沒關(guān)系……舉個例子:

  • stateful LSTM:我想根據(jù)一篇1000句的文章預(yù)測第1001句,每一句是一個sample毫玖。我會選用stateful涩盾,因為這文章里的1000句是有前后關(guān)聯(lián)的,是有時序的特征的砸西,我不想丟棄這個特征芹枷。利用這個時序性能讓第一句的特征傳遞到我們預(yù)測的第1001句鸳慈。(batch_size = 10時)

  • stateless LSTM:我想訓(xùn)練LSTM自動寫詩句走芋,我想訓(xùn)練1000首詩翁逞,每一首是一個sample溉仑,我會選用stateless LSTM浊竟,因為這1000首詩是獨(dú)立的振定,不存在關(guān)聯(lián),哪怕打亂它們的順序棚赔,對于模型訓(xùn)練來說也沒區(qū)別丧肴。

實戰(zhàn)

如果感興趣芋浮,可以看看官方的example——lstm_stateful.py纸巷,個人不推薦眶痰,用例繁瑣存哲,還沒畫圖七婴,講的不清楚修肠。

本實戰(zhàn)代碼地址:GitHub

具體代碼里面可以自己看户盯,我就不多說細(xì)節(jié)了嵌施,這里主要來展示下結(jié)果。

  • 目標(biāo):
    很簡單先舷,就是用LSTM去預(yù)測一個cos曲線艰管。

  • 訓(xùn)練集:
    訓(xùn)練集如下圖:

    訓(xùn)練集

  • 生產(chǎn)訓(xùn)練集數(shù)據(jù):
    類似滑動窗口,假設(shè)我們有1000組數(shù)據(jù)蒋川,若滑動窗口大小為20牲芋,則第i組數(shù)據(jù)trainX = Y[i:i+20], trainY = Y[i+20] ,一共980組訓(xùn)練數(shù)據(jù)。

  • 普通多層神經(jīng)網(wǎng)絡(luò)預(yù)測結(jié)果:

    NN

  • stateless LSTM預(yù)測結(jié)果:

    stateless LSTM

  • 單層Stateful LSTM預(yù)測結(jié)果:

    單層Stateful LSTM

  • 雙層stacked Stateful LSTM預(yù)測結(jié)果:

    雙層stacked Stateful LSTM

  • 注意:訓(xùn)練存在不穩(wěn)定性捺球,若預(yù)測結(jié)果偏差過大缸浦,請重新訓(xùn)練氮兵。另外弥姻,不要迷信GPU薪缆,LSTM用CPU訓(xùn)練效率可能更高。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末峡谊,一起剝皮案震驚了整個濱河市正什,隨后出現(xiàn)的幾起案子主经,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翘骂,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)仙蚜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了秘症?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵瞬痘,是天一觀的道長拆撼。 經(jīng)常有香客問我蚜印,道長忆绰,這世上最難降的妖魔是什么伐债? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任飒货,我火速辦了婚禮塘辅,結(jié)果婚禮上晃虫,老公的妹妹穿的比我還像新娘哲银。我一直安慰自己做院,他們只是感情好郁竟,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪视哑。 梳的紋絲不亂的頭發(fā)上绣否,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機(jī)與錄音挡毅,去河邊找鬼蒜撮。 笑死,一個胖子當(dāng)著我的面吹牛慷嗜,可吹牛的內(nèi)容都是我干的淀弹。 我是一名探鬼主播丹壕,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼薇溃!你這毒婦竟也來了菌赖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤沐序,失蹤者是張志新(化名)和其女友劉穎琉用,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體策幼,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡邑时,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了特姐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晶丘。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖唐含,靈堂內(nèi)的尸體忽然破棺而出浅浮,到底是詐尸還是另有隱情,我是刑警寧澤捷枯,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布滚秩,位于F島的核電站,受9級特大地震影響淮捆,放射性物質(zhì)發(fā)生泄漏郁油。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一攀痊、第九天 我趴在偏房一處隱蔽的房頂上張望桐腌。 院中可真熱鬧,春花似錦蚕苇、人聲如沸哩掺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盒件,卻和暖如春蹬碧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背炒刁。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工恩沽, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人翔始。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓罗心,卻偏偏與公主長得像里伯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子渤闷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 文章作者:Tyan博客:noahsnail.com | CSDN | 簡書 翻譯論文匯總:https://gith...
    SnailTyan閱讀 9,896評論 0 8
  • 語言的正則化LSTM用于情感分類 Linguistically Regularized LSTM for Sent...
    __子不語__閱讀 1,932評論 0 2
  • 這個夏天疾瓮,開啟尋找多年不見同學(xué)和朋友的按鈕。通過同學(xué)尋找飒箭,通過網(wǎng)絡(luò)尋找狼电,一一如愿了。聚會停不下來的節(jié)奏弦蹂,記得以前看...
    迎新閱讀 501評論 5 5
  • 十八歲的夏天 你走在熱鬧的街 喜歡的人從身邊過 你說就要忘記他的臉 曾經(jīng)喜歡過的他 是在操場上彈著吉他 曾經(jīng)喜歡過...
    慕白_V閱讀 432評論 2 3
  • 安然心里一暖凸椿,原本慌亂的心緒恢復(fù)了平靜削祈。看著蘇晉的眼睛粲然一笑脑漫,我也想你了岩瘦。安然笑的很美,美的刺痛了剛剛想要開門進(jìn)...
    夏小棠的白小夏閱讀 269評論 0 2