1. 程式人生 > >Pytorch實現LSTM時間序列預測

Pytorch實現LSTM時間序列預測

摘要:本文主要基於Pytorch深度學習框架,實現LSTM神經網路模型,用於時間序列的預測。

開發環境說明:

Python 35

Pytorch 0.2

CPU/GPU均可

01

LSTM簡介

        人類在進行學習時,往往不總是零開始,學習物理你會有數學基礎、學習英語你會有中文基礎等等。於是對於機器而言,神經網路的學習亦可不再從零開始,於是出現了Transfer Learning,就是把一個領域已訓練好的網路用於初始化另一個領域的任務,例如會下棋的神經網路可以用於打德州撲克。我們這講的是另一種不從零開始學習的神經網路——迴圈神經網路(Recurrent Neural Network, RNN),它的每一次迭代都是基於上一次的學習結果,不斷迴圈以得到對於整體序列的學習,區別於傳統的MLP神經網路,這種神經網路模型存在環型結構,具體下所示:

       上圖是RNN的基本單元,通過不斷迴圈迭代展開模型如下所示,圖中ht是神經網路的在t時刻的輸出,xt是t時刻的輸入資料。這種迴圈結構對時間序列資料能夠很好地建模,例如語音識別、語言建模、機器翻譯等領域。

        但是普通的RNN對於長期依賴問題效果比較差,當序列本身比較長時,由於神經網路模型的訓練是採用backward進行,在梯度鏈式法則中容易出現梯度消失和梯度爆炸的問題,需要進一步改進RNN的模型結構。

        針對Simple RNN存在的問題,LSTM網路模型被提出,LSTM的核心是修改了增添了Cell State,即加入了LSTM CELL,通過輸入門、輸出門、遺忘門把上一時刻的hidden state和cell state傳給下一個狀態。如下所示:

遺忘門:ft = sigma(Wf*[ht-1, xt] + bf)

輸入門:it = sigma(Wi*[ht-1, xt] + bi)

cell state initial: C't = tanh(Wc*[ht-1, xt] +bc)

cell state: Ct = ft*Ct-1+ itC't

輸出門:ot = sigma(Wo*[ht-1, xt] + bo)

模型輸出:ht = ot*tanh(Ct)

        LSTM有很多種變型結構,實際工程化過程中用的比較多的是peephole,就是計算每個門的時候增添了cell state的資訊,有興趣的童鞋可以專研專研。

        上一部分簡單地介紹了LSTM的模型結構,下邊將具體介紹使用LSTM模型進行時間序列預測的具體過程。

02


資料準備

        對於時間序列,本文選取正弦波序列,事先產生一定數量的序列資料,然後擷取前部分作為訓練資料訓練LSTM模型,後部分作為真實值與模型預測結果進行比較。正弦波的產生過程如下:

SeriesGen(N)方法用於產生長度為N的正弦波數值序列;

trainDataGen(seq,k)用於產生訓練或測試資料,返回資料結構為輸入輸出資料。seq為序列資料,k為LSTM模型迴圈的長度,使用1~k的資料預測2~k+1的資料。

03


模型構建

        Pytorch的nn模組提供了LSTM方法,具體介面使用說明可以參見Pytorch的介面使用說明書。此處呼叫nn.LSTM構建LSTM神經網路,模型另增加了線性變化的全連線層Linear(),但並未加入啟用函式。由於是單個數值的預測,這裡input_size和output_size都為1.

04


訓練和測試

(1)模型定義、損失函式定義

(2)訓練與測試

(3)結果展示

比較模型預測序列結果與真實值之間的差距