1. 程式人生 > >[譯]使用遞迴神經網路(LSTMs)對時序資料進行預測

[譯]使用遞迴神經網路(LSTMs)對時序資料進行預測

使用長短時記憶網路(LSTMs)來預測未來貨幣匯率變化

Statsbot 團隊已經發表了一篇關於使用時間序列分析進行異常檢測的文章。今天,我們將討論使用長短時記憶模型(LSTMs)進行時間序列的預測。我們請資料科學家 Neelabh Pant 向大家來講述他使用迴圈神經網路預測匯率變化的經驗。

作為一個生活在美國的印度人,我和我的家人之間會有源源不斷的資金流相互流轉。如果美元在市場上走強,那麼印度盧比(INR)就會下跌,因此,一個印度人將要用更多的盧比來購買一美元。如果美元走弱,你就會花更少的盧比去購買同樣的一美元。

如果你能預測出明天的一美元是什麼價格,那麼它就能指導你的決策,這對於最小化風險和最大化回報是非常重要的。通過觀察神經網路的優勢,特別是迴圈神經網路,我想到了預測美元和印度盧比的匯率。

預測匯率的方法有很多,例如:

  • 購買力平價(PPP),它將通貨膨脹考慮在內並計算通脹的差異。
  • 相對經濟實力方法,它考慮了各國經濟增長,以此對匯率的走勢進行預測。
  • 計量經濟模式 是另一種常用的匯率預測技術,可以根據預測者認為重要的因素或屬性進行定製。這樣的因素或屬性可能是不同國家之間存在的利率差異、GDP 的增長率和收入增長率等特徵。
  • 時間序列模型 則是純粹取決於過去的變化行為和價格模式來預測未來的匯率對應價格。

在本文中,我們將告訴你如何使用機器學習進行時間序列分析來預測未來的匯率變化。

序列問題

讓我們從順序問題開始。涉及序列的最簡單的機器學習問題是一對一問題。

一對一

在這種情況下,模型的輸入資料或輸入張量只有一個,同時模型根據給定的輸入生成一個對應的預測。線性迴歸、分類和使用卷積網路進行的影象分類都屬於這一範疇。將其進行拓展,可以允許模型使用輸入和輸出的舊值。

這就是一對多問題了。一對多問題開始時就和一對一問題一樣,模型有一個輸入,同時生成一個輸出。然而,模型的輸出現在作為新的輸入反饋給模型。模型現在可以生成一個新的輸出,我們可以這樣無限地繼續迴圈下去。現在你可以看到為什麼這些被稱為迴圈神經網路了。

一對多

使用遞迴神經網路處理序列問題,因為它們都可以連線形成一個有向的迴圈。換句話說,通過使用它們自己的輸出作為下一個步驟的輸入,它們可以保持從一個迭代到下一個迭代的狀態。使用程式設計的術語來說,這就像是在執行一個固定的程式,其中帶有特定輸入和一些內部變數。如果我們在時間軸上將其展開,最簡單的遞迴神經網路可以看作是一個完全連線的神經網路。

在時間軸上展開的 RNN

在這種單變數情況下,只涉及到兩個權重。權重 u 乘以當前的輸入 xt,而另一個權重 w 乘以前一次的輸出 yt-1 。這個公式類似於指數加權移動平均方法(EWMA),它將過去的輸出值與當前的輸入值結合起來。

可以通過簡單堆疊神經網路單元來建立一個深層的迴圈神經網路。一個簡單的迴圈神經網路只對短期記憶有效。如果我們有長期記憶的需求,就會發現它對此有根本上的不足。

長短時神經網路

正如我們已經討論過的,一個簡單的迴圈網路存在一個根本問題,即不能捕獲序列中的長時依賴關係。我們構建的 RNNs 在分析文字和回答問題時,涉及到跟蹤長序列的單詞,所以這將會是一個問題。

在 90 年代後期,LSTM 是由 Sepp Hochreiter 和 Jurgen Schmidhuber 提出的,用來替代 RNNs、隱馬爾科夫模型以及其它眾多應用中的序列學習方法,相比於它們 LSTM 對時間間隔長度不敏感。

LSTM 網路結構

該模型是一個操作單元,其中包括幾個基本操作。LSTM 有一個內部狀態變數,它從一個單元傳遞到另外一個單元,並由 操作門 來修改。

  1. 遺忘門

使用一個 sigmoid 層來接收前一個時間節點 t-1 的輸出和當前時間節點 t 的輸入,將其合併成為一個張量(tensor),然後在其後應用一個線性變換。經過 sigmoid 啟用函式後,遺忘門的輸出為 0 到 1 之間的數值。這個數值將會與內部狀態相乘,這也就是為什麼它會被稱為遺忘門的原因。如果 ft=0,則完全忘記之前的內部狀態,如果 ft=1 ,則會沒有任何改變地通過。

  1. 輸入門

輸入門接受先前的輸出和新輸入,並將其傳遞到另一個 sigmoid 層。輸入門返回的也是 0 到 1 之間的值。然後輸入門返回的值與候選層的輸出相乘。

這一層對輸入和先前層的輸出進行混合,然後應用雙曲切線啟用,返回一個候選向量新增到內部狀態上。

內部狀態更新規則如下:

之前的狀態乘以遺忘門輸出,然後新增到輸出門允許的新的候選項中。

  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 EremenkoJose PortillaDan Van Boxel(即著名的 Dan Does Data)等等。他們中的大多數人都可以在不同的部落格站點上找到,他們的部落格中有很多不同的主題,比如 RNN、卷積神經網路和 LSTM,甚至最新的神經圖靈機技術。

保持更新各種人工智慧會議的新聞。順便說一下,如果你感興趣的話,Kirill Eremenko 將會在今年的 11 月份來到聖地亞哥和他的團隊一起做關於機器學習、神經網路和資料科學的演講。

結論

LSTM 模型足夠強大,可以學習到最重要的過去行為,並理解這些過去的行為是否是進行未來預測的重要特徵。在許多應用程式中,LSTM 的使用率都很高。一些應用比如語音識別、音樂合成和手寫識別,甚至是在我目前的人口流動和旅遊預測等的研究中。

在我看來,LSTM 就像是一個擁有自己記憶的模型,在做決定時可以表現得像一個聰明的人。

再次感謝,並祝在機器學習的學習過程中得到快樂!

如果發現譯文存在錯誤或其他需要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可獲得相應獎勵積分。文章開頭的 本文永久連結 即為本文在 GitHub 上的 MarkDown 連結。


掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智慧等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄