LSTM介紹
機器學習當中最常利用多層感知器(Multi-Layer Perceptron, MLP)來訓練模型,如下圖所示
而利用MLP的方式並非能處理所有問題,因為他沒辦法處理時序性的問題,例如:當輸入為[1, 2, 3]
希望輸出4
,而當輸入[3, 2, 1]
時希望輸出0
,對於MLP來說,[1, 2, 3]
和 [3, 2, 1]
是相同的,因此無法得到預期的結果。
因此有了遞歸神經網絡(Recurrent Neural Network, RNN)的出現設計如下圖所示。
主要概念是將前面輸入得到的權重(Weight)加入下一層,這樣就可以完成時序性的概念。
而長短期記憶(Long Short-Term Memory, LSTM)是RNN的一種,而其不相同之處在於有了更多的控制單元input gate
、output gate
、forget gate
示意圖如下。
瞭解更多:李弘毅 — ML Lecture 21–1: Recurrent Neural Network (Part I)
Stock Prediction為例
SPY dataset: Yahoo SPDR S&P 500 ETF (SPY)
目標:利用過去的資料預測未來幾天的Adj Close
。
資料建置
匯入套件
將pandas
、numpy
、keras
、matplotlib
匯入
讀取資料
Augment Features
除了基本資料提供的Features(Open, High, Low, Close, Adj Close, Volume)以外,還可自己增加Features,例如星期幾、幾月、幾號等等。
Normalization
將所有資料做正規化,而由於Date
是字串非數字,因此先將它drop
掉
Build Training Data
輸入X_train: 利用前30天的Open, High, Low, Close, Adj Close, Volume, month, year, date, day
作為Features,shape為(30, 10)
輸出Y_train: 利用未來5天的Adj Close
作為Features,shape為(5,1)
我們須將資料做位移的展開作為Training Data,如圖(1)所示。
資料亂序
將資料打散,而非照日期排序
Training data & Validation data
將Training Data取一部份當作Validation Data
因此最後將輸出合併為
模型建置
比較many to one
以及many to many
一對一模型
由於是一對一模型,因此return_sequences
也可設為False
,但Y_train
以及Y_val
的維度需改為二維(5710,1)
以及(634,1)
。
將過去的天數pastDay
設為1,預測的天數futureDay
也設為1
由下圖可見變數的使用量
最後val_loss: 2.2902e-05
停在第164個Epoch
多對一模型
LSTM參數return_sequences=False
,未設定時default也為False,而且不可使用TimeDistribution
需要設定的有pastDay=30
、future=1
,且注意Y_train
的維度需為二維
由下圖可見變數的使用量
最後val_loss: 3.9465e-05
停在第113個Epoch
一對多模型
因為是一對多模型Timesteps
只有1,因此return_sequences=False
才可執行
將pastDay
設為1, futureDay
設為5
由下圖可見變數的使用量
最後val_loss: 5.6081e-05
停在第163個Epoch
多對多模型 (輸入與輸出相同長度)
將return_sequences
設為True
,再用TimeDistributed(Dense(1))
將輸出調整為(5,1)
將pastDay
以及futureDay
設為相同長度5
由下圖可見變數的使用量
最後val_loss: 9.3788e-05
停在第169個Epoch
多對多模型(輸入與輸出不同長度)
參考下一篇文:利用Keras建構LSTM模型,以Stock Prediction 為例2(Sequence to Sequence)
Reference
[1] 李弘毅 — 機器學習 RNN
[2] Keras關於LSTM的units參數,還是不理解?
[3] Many to one and many to many LSTM examples in Keras
[4] Yahoo — SPDR S&P 500 ETF (SPY)
[5] Wiki — 長短期記憶