Python中利用LSTM模型進行時間序列預測分析

原文鏈接:https://blog.csdn.net/u010159842/article/details/56016137

時間序列模型

時間序列預測分析就是利用過去一段時間內某事件時間的特徵來預測未來一段時間內該事件的特徵。這是一類相對比較複雜的預測建模問題,和迴歸分析模型的預測不同,時間序列模型是依賴於事件發生的先後順序的,同樣大小的值改變順序後輸入模型產生的結果是不同的。
舉個栗子:根據過去兩年某股票的每天的股價數據推測之後一週的股價變化;根據過去2年某店鋪每週想消費人數預測下週來店消費的人數等等

RNN 和 LSTM 模型

時間序列模型最常用最強大的的工具就是遞歸神經網絡(recurrent neural network, RNN)。相比與普通神經網絡的各計算結果之間相互獨立的特點,RNN的每一次隱含層的計算結果都與當前輸入以及上一次的隱含層結果相關。通過這種方法,RNN的計算結果便具備了記憶之前幾次結果的特點。

典型的RNN網路結構如下:

右側爲計算時便於理解記憶而產開的結構。簡單說,x爲輸入層,o爲輸出層,s爲隱含層,而t指第幾次的計算;V,W,U爲權重,其中計算第t次的隱含層狀態時爲St = f(U*Xt + W*St-1),實現當前輸入結果與之前的計算掛鉤的目的。對RNN想要更深入的瞭解可以戳這裏

RNN的侷限:
由於RNN模型如果需要實現長期記憶的話需要將當前的隱含態的計算與前n次的計算掛鉤,即St = f(U*Xt + W1*St-1 + W2*St-2 + ... + Wn*St-n),那樣的話計算量會呈指數式增長,導致模型訓練的時間大幅增加,因此RNN模型一般直接用來進行長期記憶計算。

LSTM模型
LSTM(Long Short-Term Memory)模型是一種RNN的變型,最早由Juergen Schmidhuber提出的。經典的LSTM模型結構如下:

LSTM的特點就是在RNN結構以外添加了各層的閥門節點。閥門有3類:遺忘閥門(forget gate),輸入閥門(input gate)和輸出閥門(output gate)。這些閥門可以打開或關閉,用於將判斷模型網絡的記憶態(之前網絡的狀態)在該層輸出的結果是否達到閾值從而加入到當前該層的計算中。如圖中所示,閥門節點利用sigmoid函數將網絡的記憶態作爲輸入計算;如果輸出結果達到閾值則將該閥門輸出與當前層的的計算結果相乘作爲下一層的輸入(PS:這裏的相乘是在指矩陣中的逐元素相乘);如果沒有達到閾值則將該輸出結果遺忘掉。每一層包括閥門節點的權重都會在每一次模型反向傳播訓練過程中更新。更具體的LSTM的判斷計算過程如下圖所示:

LSTM模型的記憶功能就是由這些閥門節點實現的。當閥門打開的時候,前面模型的訓練結果就會關聯到當前的模型計算,而當閥門關閉的時候之前的計算結果就不再影響當前的計算。因此,通過調節閥門的開關我們就可以實現早期序列對最終結果的影響。而當你不不希望之前結果對之後產生影響,比如自然語言處理中的開始分析新段落或新章節,那麼把閥門關掉即可。(對LSTM想要更具體的瞭解可以戳這裏
下圖具體演示了閥門是如何工作的:通過閥門控制使序列第1的輸入的變量影響到了序列第4,6的的變量計算結果。

黑色實心圓代表對該節點的計算結果輸出到下一層或下一次計算;空心圓則表示該節點的計算結果沒有輸入到網絡或者沒有從上一次收到信號。

Python中實現LSTM模型搭建

Python中有不少包可以直接調用來構建LSTM模型,比如pybrain, kears, tensorflow, cikit-neuralnetwork等(更多戳這裏)。這裏我們選用keras。(PS:如果操作系統用的linux或者mac,強推Tensorflow!!!)

因爲LSTM神經網絡模型的訓練可以通過調整很多參數來優化,例如activation函數,LSTM層數,輸入輸出的變量維度等,調節過程相當複雜。這裏只舉一個最簡單的應用例子來描述LSTM的搭建過程。

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