- 原文地址:A Guide For Time Series Prediction Using Recurrent Neural Networks (LSTMs)
- 原文做者:Neelabh Pant
- 譯文出自:掘金翻譯計劃
- 本文永久連接:github.com/xitu/gold-m…
- 譯者:haiyang-tju
- 校對者:TrWestdoor, yzrds
Statsbot 團隊已經發表了一篇關於使用時間序列分析進行異常檢測的文章。今天,咱們將討論使用長短時記憶模型(LSTMs)進行時間序列的預測。咱們請數據科學家 Neelabh Pant 向你們來說述他使用循環神經網絡預測匯率變化的經驗。前端
做爲一個生活在美國的印度人,我和個人家人之間會有源源不斷的資金流相互流轉。若是美圓在市場上走強,那麼印度盧比(INR)就會下跌,所以,一個印度人將要用更多的盧比來購買一美圓。若是美圓走弱,你就會花更少的盧比去購買一樣的一美圓。python
若是你能預測出明天的一美圓是什麼價格,那麼它就能指導你的決策,這對於最小化風險和最大化回報是很是重要的。經過觀察神經網絡的優點,特別是循環神經網絡,我想到了預測美圓和印度盧比的匯率。android
預測匯率的方法有不少,例如:ios
在本文中,咱們將告訴你如何使用機器學習進行時間序列分析來預測將來的匯率變化。git
讓咱們從順序問題開始。涉及序列的最簡單的機器學習問題是一對一問題。github
一對一算法
在這種狀況下,模型的輸入數據或輸入張量只有一個,同時模型根據給定的輸入生成一個對應的預測。線性迴歸、分類和使用卷積網絡進行的圖像分類都屬於這一範疇。將其進行拓展,能夠容許模型使用輸入和輸出的舊值。編程
這就是一對多問題了。一對多問題開始時就和一對一問題同樣,模型有一個輸入,同時生成一個輸出。然而,模型的輸出如今做爲新的輸入反饋給模型。模型如今能夠生成一個新的輸出,咱們能夠這樣無限地繼續循環下去。如今你能夠看到爲何這些被稱爲循環神經網絡了。後端
一對多網絡
使用遞歸神經網絡處理序列問題,由於它們均可以鏈接造成一個有向的循環。換句話說,經過使用它們本身的輸出做爲下一個步驟的輸入,它們能夠保持從一個迭代到下一個迭代的狀態。使用編程的術語來講,這就像是在運行一個固定的程序,其中帶有特定輸入和一些內部變量。若是咱們在時間軸上將其展開,最簡單的遞歸神經網絡能夠看做是一個徹底鏈接的神經網絡。
在時間軸上展開的 RNN
在這種單變量狀況下,只涉及到兩個權重。權重 u 乘以當前的輸入 xt,而另外一個權重 w 乘之前一次的輸出 yt-1 。這個公式相似於指數加權移動平均方法(EWMA),它將過去的輸出值與當前的輸入值結合起來。
能夠經過簡單堆疊神經網絡單元來創建一個深層的循環神經網絡。一個簡單的循環神經網絡只對短時間記憶有效。若是咱們有長期記憶的需求,就會發現它對此有根本上的不足。
正如咱們已經討論過的,一個簡單的循環網絡存在一個根本問題,即不能捕獲序列中的長時依賴關係。咱們構建的 RNNs 在分析文本和回答問題時,涉及到跟蹤長序列的單詞,因此這將會是一個問題。
在 90 年代後期,LSTM 是由 Sepp Hochreiter 和 Jurgen Schmidhuber 提出的,用來替代 RNNs、隱馬爾科夫模型以及其它衆多應用中的序列學習方法,相比於它們 LSTM 對時間間隔長度不敏感。
LSTM 網絡結構
該模型是一個操做單元,其中包括幾個基本操做。LSTM 有一個內部狀態變量,它從一個單元傳遞到另一個單元,並由 操做門 來修改。
使用一個 sigmoid 層來接收前一個時間節點 t-1 的輸出和當前時間節點 t 的輸入,將其合併成爲一個張量(tensor),而後在其後應用一個線性變換。通過 sigmoid 激活函數後,遺忘門的輸出爲 0 到 1 之間的數值。這個數值將會與內部狀態相乘,這也就是爲何它會被稱爲遺忘門的緣由。若是 ft=0,則徹底忘記以前的內部狀態,若是 ft=1 ,則會沒有任何改變地經過。
輸入門接受先前的輸出和新輸入,並將其傳遞到另外一個 sigmoid 層。輸入門返回的也是 0 到 1 之間的值。而後輸入門返回的值與候選層的輸出相乘。
這一層對輸入和先前層的輸出進行混合,而後應用雙曲切線激活,返回一個候選向量添加到內部狀態上。
內部狀態更新規則以下:
以前的狀態乘以遺忘門輸出,而後添加到輸出門容許的新的候選項中。
輸出門控制着有多少內部狀態被傳遞給輸出,它的工做方式相似於其它的門結構。
上面描述的這三個門結構具備獨立的權值和誤差,所以網絡須要學習有多少過去的輸出須要保留,有多少當前的輸入須要保留,以及有多少的內部狀態須要被傳送到輸出。
在遞歸神經網絡中,須要輸入的不只僅是當前網絡的輸入數據,還有該網絡的前一個時刻的狀態數據。例如,若是我說「嘿!我在開車的時候發生了一件瘋狂的事情」,而後你的大腦某個部分就開始轉動開關,說「哦,這是 Neelabh 告訴個人一個故事,故事的主角是 Neelabh,路上發生了一些事情。」如今,你就會保留一部分我剛纔告訴你的句子的信息。當你聽我講其它句子的時候,爲了理解整個故事,你必須保留一些以前句子信息中的記憶。
另一個例子是使用循環神經網絡進行視頻處理。在當前幀中發生的事情很大程度上取決於上一幀的內容。在一段時間內,一個循環神經網絡應該學習到保留什麼、從過去的數據中保留多少、以及對當前狀態保留多少的策略,這使得它比簡單的前饋神經網絡更增強大。
我對循環神經網絡的優點印象是很深入的,決定使用它來預測美圓和印度盧比的匯率。本項目使用的數據集是 1980 年 1 月 2 日至 2017 年 8 月 10 日的匯率數據。稍後,我會提供一個連接來下載這個數據集並進行實驗。
表 1 數據集示例
數據集顯示了 1 美圓的盧比價值。從 1980 年 1 月 2 日到 2017 年 8 月 10 日,咱們總共有 13730 項記錄。
USD 對 INR
從整個階段看,1 美圓的盧比價格一直是在上漲的。咱們能夠看到,美國經濟在 2007 到 2008 年間大幅下滑,這在很大程度上是由那段時期的大衰退形成的。2000 年代末至 2010 年代初,全球市場廣泛經歷了經濟衰退。
這段時期對世界上的發達經濟體來講並非很好,特別是北美和歐洲(包括俄羅斯),它們已經陷入了嚴重的經濟衰退。許多較新的發達經濟體受到的影響要小得多,特別是中國和印度,這兩個國家的經濟在這段時期大幅增加。
如今,要訓練模型,咱們就須要將數據劃分爲測試集和訓練集。處理時間序列時,以一個特定的日期將其劃分爲訓練集和測試集是很是重要的。因此,咱們不但願看到的是測試數據出如今訓練數據以前。
在咱們的實驗中,咱們將定義一個日期,好比 2010 年 1 月 1 日,做爲咱們分開的日期。訓練數據是 1980 年 1 月 2 日至 2009 年 12 月 31 日之間的數據,大約有 11000 個訓練數據點。
測試數據集在 2010 年 1 月 1 日到 2017 年 8 月 10 日之間,大約 2700 個數據點。
測試-訓練數據劃分
接下來要作的是對數據集進行規範化。只須要調整和變換訓練數據,而後變換測試數據便可。這樣作的緣由是,假定咱們是不知道測試數據的規模的。
對數據進行規範化或變換是指應用一個新的介於 0 和 1 之間的縮放變量。
全鏈接模型是一個簡單的神經網絡模型,它被構建爲一個單輸入單輸出的迴歸模型。基本上是取前一天的價格來預測次日的價格。
咱們使用均方差做爲損失函數,使用隨機梯度降低做爲優化器,在訓練足夠多的時期(epochs)後,將會找到一個較好的局部最優值。下面是全鏈接層的概要。
全鏈接層概要
在將該模型訓練到 200 個時期後或者不管出現哪一個 early_callbacks(即知足條件的提早終止回調)以後,該模型經過訓練學習到數據的模式和行爲。因爲咱們將數據分爲訓練集和測試集,咱們如今能夠預測測試數據對應的數值了,並將其與真實值進行比較。
真實值(藍色)對 預測值(橙色)
正如你所看到的,這個模型的表現並很差。它本質上就是重複前面的數據,只有一個輕微的變化。全鏈接模型不能從單個先前值來預測將來的數據。如今讓咱們來嘗試使用一個循環神經網絡,看看它作得如何。
咱們使用的循環網絡模型是一個單層的順序模型。在咱們輸入維度形狀爲 (1,1) 的層中使用了 6 個 LSTM 節點,即該網絡的輸入只有一個。
LSTM 模型概要
最後一層是密集層(即全鏈接層),損失函數採用的是均方差,優化器使用隨機梯度降低算法。咱們使用 early_stopping 回調對這個模型進行了200次的訓練。模型的概要如上圖所示。
LSTM 預測
這個模型已經學到了重現數據在年度內的總體形狀,並且不像前面使用簡單的前饋神經網絡那樣有延遲。可是它仍然低估了一些觀察值,因此該模型確定還有改進的空間。
該模型能夠作不少的改變來使它變得更好。通常能夠直接經過修改優化器來更改模型訓練配置。另一個重要的修改是使用了滑動時間窗口的方法,它是來自於流數據管理系統領域的方法。
這種方法來自於這樣一種觀點,即只有最近的數據纔是重要的。你可使用一年的模型數據,並試着對下一年的第一天作出預測。滑動時間窗口方法在獲取數據集中的重要模式方面很是有用,這些模式高度依賴於過去的大量觀察。
你能夠嘗試根據我的喜愛對該模型進行修改,並查看模型對這些修改的反應。
我在 github 帳戶的倉庫中 deep learning in python 提供了該數據集。請隨意下載並使用它。
我我的關注了一些喜歡的數據科學家,好比 Kirill Eremenko、Jose Portilla 和 Dan Van Boxel(即著名的 Dan Does Data)等等。他們中的大多數人均可以在不一樣的博客站點上找到,他們的博客中有不少不一樣的主題,好比 RNN、卷積神經網絡和 LSTM,甚至最新的神經圖靈機技術。
保持更新各類人工智能會議的新聞。順便說一下,若是你感興趣的話,Kirill Eremenko 將會在今年的 11 月份來到聖地亞哥和他的團隊一塊兒作關於機器學習、神經網絡和數據科學的演講。
LSTM 模型足夠強大,能夠學習到最重要的過去行爲,並理解這些過去的行爲是不是進行將來預測的重要特徵。在許多應用程序中,LSTM 的使用率都很高。一些應用好比語音識別、音樂合成和手寫識別,甚至是在我目前的人口流動和旅遊預測等的研究中。
在我看來,LSTM 就像是一個擁有本身記憶的模型,在作決定時能夠表現得像一個聰明的人。
再次感謝,並祝在機器學習的學習過程當中獲得快樂!
若是發現譯文存在錯誤或其餘須要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可得到相應獎勵積分。文章開頭的 本文永久連接 即爲本文在 GitHub 上的 MarkDown 連接。
掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、後端、區塊鏈、產品、設計、人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。