我試圖通過這篇文章http://colah.github.io/posts/2015-08-Understanding-LSTMs/加強對LSTMs的理解,並使用Keras實現了LSTM。同時也關注了為Keras教程編寫的http://machinelearningmastery.com/time-series-prediction-lstm-recurrent-neural-networks-python-keras/博客。我主要困惑的是,
-
將數據係列(data series)重新組織(reshape)到
[samples, time steps, features]
中, -
有狀態的LSTMs
讓我們把注意力集中在以上兩個問題上,參考下麵的代碼:
# reshape into X=t and Y=t+1
look_back = 3
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back)
# reshape input to be [samples, time steps, features]
trainX = numpy.reshape(trainX, (trainX.shape[0], look_back, 1))
testX = numpy.reshape(testX, (testX.shape[0], look_back, 1))
########################
# The IMPORTANT BIT
##########################
# create and fit the LSTM network
batch_size = 1
model = Sequential()
model.add(LSTM(4, batch_input_shape=(batch_size, look_back, 1), stateful=True))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
for i in range(100):
model.fit(trainX, trainY, nb_epoch=1, batch_size=batch_size, verbose=2, shuffle=False)
model.reset_states()
注意:create_dataset采用長度為N的序列,並返回一個N-look_back
數組,其中每個元素都是look_back
長度序列。
什麽是時間步驟和特征?
可以看出TrainX是Time_steps的三維數組,特征分別是最後兩個維(在這個特定的代碼中是3和1)。關於下麵的圖片,這是否意味著我們正在考慮many to one
情形,其中粉紅色框的數量是3?或者它是否意味著鏈長是3(即隻考慮3個綠色框)。
當我們考慮多元係列時,特征參數是否變得相關?例如同時建模兩個金融股?
有狀態的LSTM
有狀態的LSTM是否意味著我們在批次間保存單元內存值?如果是這樣的話,batch_size
就是一個,而且訓練運行之間的 memory 是重置的,所以說這是有狀態的。我猜這是與訓練數據不做洗牌(shuffle)有關,但是不太確定。
有什麽想法嗎?圖片參考:http://karpathy.github.io/2015/05/21/rnn-effectiveness/
編輯1:
下麵的API調用是否與展開圖相對應?特別注意第二張圖(batch_size
是任意選擇的):
編輯2:
對於那些已經完成Udacity的深度學習課程,仍然對time_step參數感到困惑的人,請看下麵的討論:https://discussions.udacity.com/t/rnn-lstm-use-implementation/163169
更新:
原來model.add(TimeDistributed(Dense(vocab_len)))
是我正在尋找的。這裏是一個例子:https://github.com/sachinruk/ShakespeareBot
UPDATE2:
我在這裏總結了我對LSTM的大部分理解:https://www.youtube.com/watch?v=ywinX5wgdEU
最佳解決辦法
Time-step表示:X.shape(描述數據形狀)中的Time-steps==3
表示有三個粉紅色的框。由於在Keras每一步都需要輸入,所以綠色框的數量通常應該等於紅色框的數量。除非你破解這個結構。
多對多與多對一:在keras中,在初始化LSTM
或GRU
或SimpleRNN
時有一個return_sequences
參數。當return_sequences
為False
時(默認),則如圖所示為多對一。它的返回形狀是(batch_size, hidden_unit_length)
,它代表最後一個狀態。當return_sequences
是True
時,則是多對多。它的形狀是(batch_size, time_step, hidden_unit_length)
特征參數是否變得相關:特征參數意味著“您的紅色框有多大”或每個步驟的輸入維度是什麽。如果您想預測8種市場信息,那麽您可以使用feature==8
生成您的數據。
有狀態:您可以查看the source code。當初始化狀態時,如果stateful==True
,那麽上次訓練的狀態將被用作初始狀態,否則會產生一個新的狀態。我還完全理解stateful
,但是,我不同意batch_size
隻能在stateful==True
時為1。
目前,您使用收集的數據生成數據。假設您的股票信息即將到來,而不是等待一整天收集整個序列,你需要在線產生輸入數據,同時訓練/預測。如果您有400個股票共享一個網絡,那麽您可以設置batch_size==400
。