正確理解LSTM在keras API中的stateful參數

理解LSTM中的return_sequence和return_state看這裏。解釋的很詳細:

理解LSTM在keras API中參數return_sequences和return_state

推薦英語原文Stateful LSTM in Keras

文中使用三個問題來解釋了這個參數:

  1. 給定了一個長序列(eg 時間序列),然後把它分爲一些更小的子序列來構造輸入矩陣X,LSTM是否能在序列之間找到依賴的關係?

    除非我們指定使用有狀態的LSTM,否則LSTM無法找到序列之間的依賴關係。

    但大多數問題都可以通過無狀態LSTM來解決,所以確保你真的需要有狀態模式,再將stateful設爲True

    在無狀態模式下,長期記憶並不意味着LSTM將記住先前批次的內容,這裏的批次指的是batch

  2. 爲什麼我們在Keras中區分無狀態LSTM和有狀態LSTM?

    LSTM具有cell,因此根據定義是有狀態的(這個指的是隱藏層的狀態)。

    Fabien Chollet給出了有狀態的定義:
    stateful:Boolean(默認爲False)。 如果爲True,則批次中索引i處的每個樣本的最後狀態將用作後續批次中索引i的樣本的初始狀態。

    換句話說,無論何時訓練或測試LSTM,首先必須構建形狀爲(nb_samples,時間步長,input_dim)的輸入矩陣X,其中batch批量大小除以nb_samples

    例如,如果nb_samples = 1024batch_size = 64,則表示您的模型將接收64個樣本的塊,計算每個輸出(無論每個樣本的時間步數是多少)的平均梯度並傳播它以更新參數向量 。

    默認情況下,Keras在X中對樣本進行shuffles(置換),並且XiX_iXi+1X_{i+1}之間的依賴關係丟失。也就是爲什麼當我們使用有狀態的LSTM時,在對模型fit時,shufflesFalse,確保順序不被打亂。

    假設我們沒有對其進行shuffles操作。如果模型是無狀態的,則在每個序列處重置單元狀態。 使用有狀態模型,所有狀態都將傳播到下一批。 這意味着位於索引iXiX_i的樣本的狀態將用於計算下一批中的樣本Xi+bsX_{i + bs},其中bs是批量大小(無混洗)。

  3. 爲什麼Keras在有狀態模式下需要批量大小?

    當模型是無狀態時,Keras爲大小爲output_dim(LSTM中的cell數)的狀態分配一個數組。 在每個序列處理中,重置該狀態數組。

    在有狀態模型中,Keras必須在批次中傳播每個樣本的先前狀態。 參考上面的解釋,批#1中的索引i處的樣品(Xi+bs)(X_{i + bs})將知道批#0(Xi)(X_i)中樣品i的狀態。 在這種情況下,存儲狀態的數值結構形狀爲(batch_size,output_dim)

    這就是必須在創建LSTM時指定批量大小的原因。 如果不這樣做,Keras可能會引發錯誤提醒:如果RNN是有狀態的,則必須提供完整的input_shape(包括批量大小)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章