作為深度學習最強框架的TensorFlow如何進行時序預測!

摘要: 2017年深度學習框架關注度排名tensorflow以絕對的優勢佔領榜首,本文通過一個小例子介紹了TensorFlow在時序預測上的應用。

TensorFlow 是一個採用數據流圖(data flow graphs),用於數值計算的開源軟體庫。節點(Nodes)在圖中表示數學操作,圖中的線(edges)則表示在節點間相互聯繫的多維數據數組,即張量(tensor)。它靈活的架構讓你可以在多種平台上展開計算,例如台式計算機中的一個或多個CPU(或GPU),伺服器,移動設備等等。TensorFlow 最初由Google大腦小組(隸屬於Google機器智能研究機構)的研究員和工程師們開發出來,用於機器學習和深度神經網路方面的研究,但這個系統的通用性使其也可廣泛用於其他計算領域。

時間序列分析在計量經濟學和財務分析中具有重要意義,但也可以應用於了解趨勢做決策和對行為模式的變化做出反應的領域。其中例如,作為主要石油和天然氣供應商的MapR融合數據平台客戶將感測器放在井上,將數據發送到MapR Streams,然後將其用於趨勢監測井的狀況,如體積和溫度。在金融方面,時間序列分析用於股票價格,資產和商品的價格的預測。計量經濟學家長期利用「差分自回歸移動平均模型」(ARIMA)模型進行單變數預測。

ARIMA模型已經使用了幾十年,並且很好理解。然而,隨著機器學習的興起,以及最近的深度學習,其他模式正在被探索和利用。

深度學習(DL)是基於一組演算法的機器學習的分支,它通過使用由多個非線性變換組成的人造神經網路(ANN)架構來嘗試對數據進行高級抽象然後建模。更為流行的DL神經網路之一是循環神經網路(RNN)。RNN是依賴於其輸入的順序性質的一類神經網路。這樣的輸入可以是文本,語音,時間序列,以及序列中的元素的出現取決於在它之前出現的元素。例如,一句話中的下一個字,如果有人寫「雜貨」最有可能是「商店」而不是「學校」。在這種情況下,給定這個序列,RNN可能預測是商店而不是學校。

人工神經網路

實際上,事實證明,雖然神經網路有時是令人畏懼的結構,但使它們工作的機制出奇地簡單:隨機梯度下降。對於我們網路中的每個參數(如權重或偏差),我們所要做的就是計算相對於損耗的參數的導數,並在相反方向微調一點。

ANNs使用稱為反向傳播(有想了解BP演算法的可以參考BP演算法雙向傳,鏈式求導最纏綿)的方法來調整和優化結果。反向傳播是一個兩步過程,其中輸入通過正向傳播饋送到神經網路中,並且在通過激活函數變換之前與(最初隨機的)權重和偏差相乘。你的神經網路的深度將取決於你的輸入應該經過多少變換。一旦正向傳播完成,反向傳播步驟通過計算產生誤差的權重的偏導數來調整誤差。一旦調整權重,模型將重複正向和反向傳播步驟的過程,以最小化誤差率直到收斂。下圖中你看到這是一個只有一個隱藏層的ANN,所以反向傳播不需要執行多個梯度下降計算。

循環神經網路

循環神經網路(RNN)被稱為循環是因為它們對輸入序列中的所有元素執行相同的計算。由於RNN的廣泛應用,RNN正在變得非常受歡迎。它們可以分析時間序列數據,如股票價格,並提供預測。在自動駕駛系統中,他們可以預測汽車軌跡並幫助避免事故。他們可以將句子,文檔或音頻樣本作為輸入,它們也可以應用於自然語言處理(NLP)系統,如自動翻譯,語音對文本或情感分析。

上圖是RNN架構的示例,並且我們看到xt是時間步長t的輸入。例如,x1可能是時間段1中的股票的第一個價格。st是在時間步長tn處的隱藏狀態,並且使用激活函數基於先前的隱藏狀態和當前步驟的輸入來計算。St-1通常被初始化為零。ot是步驟t的輸出。例如,如果我們想預測序列中的下一個值,那麼它將是我們時間序列中概率的向量。

RNN隱藏層的成長是依賴於先前輸入的隱藏狀態或記憶,捕獲到目前為止所看到的內容。任何時間點的隱藏狀態的值都是前一時間步驟中的隱藏狀態值和當前時間的輸入值進行函數計算的結果。RNN具有與ANN不同的結構,並且通過時間(BPTT)使用反向傳播來計算每次迭代之後的梯度下降。

一個小例子:

此示例使用3個節點的小型MapR群集完成。此示例將使用以下內容:

  • Python 3.5
  • TensorFlow 1.0.1
  • Red Hat 6.9

如果你使用Anaconda,你需要保證你能夠安裝TensorFlow 1.0.1版本在你本地的機器上。此代碼將不能在TensorFlow <1.0版本上使用。如果TensorFlow版本相同,則可以在本地機器上運行並傳輸到集群。其他需要考慮的深度學習庫是MXNet,Caffe2,Torch和Theano。Keras是另一個為TensorFlow或Theano提供python包的深度學習庫。

MapR提供了用戶喜好的集成Jupyter Notebook(或Zeppelin)的功能。我們將在這裡顯示的是數據管道的尾端。在分散式環境中運行RNN時間序列模型的真正價值是你可以構建的數據流水線,將聚合的系列數據推送到可以饋送到TensorFlow計算圖中的格式。

如果我正在聚合來自多個設備(IDS,syslogs等)的網路流,並且我想預測未來的網路流量模式行為,我可以使用MapR Streams建立一個實時數據管道,將這些數據聚合成一個隊列,進入我的TensorFlow模型。對於這個例子,我在集群上只使用一個節點,但是我可以在其他兩個節點上安裝TensorFlow,並且可以有三個TF模型運行不同的超參數。

對於這個例子,我生成了一些虛擬數據。

我們在我們的數據中有209個觀察結果。我want確保我對每個批次輸入都有相同的觀察次數。

我們看到的是我們的訓練數據集由10個批次組成,包含20個觀測值。每個觀察值是單個值的序列。

現在我們有了我們的數據,我們來創建一個將執行計算的TensorFlow圖。

這裡有很多事情需要處理。例如我們正在指定我們用來預測的周期數。我們指定我們的變數佔位符。我們初始化一種使用的RNN單元格(大小100)和我們想要的激活函數的類型。ReLU代表「整流線性單元」,是默認的激活功能,但如果需要,可以更改為Sigmoid,Hyberbolic Tangent(Tanh)等。

我們希望我們的輸出與我們的輸入格式相同,我們可以使用損失函數來比較我們的結果。在這種情況下,我們使用均方誤差(MSE),因為這是一個回歸問題,我們的目標是最小化實際和預測之間的差異。如果我們處理分類結果,我們可能會使用交叉熵。現在我們定義了這個損失函數,可以定義TensorFlow中的訓練操作,這將優化我們的輸入和輸出網路。要執行優化,我們將使用Adam優化器。Adam優化器是一個很好的通用優化器,可以通過反向傳播實現漸變下降。

現在是時候在我們的訓練數據上實施這個模型了。

我們將指定我們的批次訓練序列循環的迭代/紀元的數量。接著,我們創建我們的圖形對象(tf.Session()),並初始化我們的數據,以便在我們遍歷曆元時被饋送到模型中。縮寫輸出顯示每100個紀元後的MSE。隨著我們的模型提供數據向前和反向傳播運行,它調整應用於輸入的權重並運行另一個訓練時期,我們的MSE得到了持續改善(減少)。最後,一旦模型完成,它將接受參數並將其應用於測試數據中,以Y的預測輸出。

我們來看看我們的預測跟實際相差多少。對於我們的測試數據,我們集中在整個209個周期的最後20個時期。

看來這還有一些改進的空間。這可以通過改變隱藏的神經元的數量或增加迭代的數量來完成。優化我們的模式是一個試錯的過程,但我們有一個好的開始。這是隨機數據,所以我們期待著很好的結果,但是也許將這個模型應用到實時系列中會給ARIMA模型帶來一些競爭壓力。

數據科學家因為RNN(和深度學習)的出現,有了更多可用的選項以此來解決更多有趣的問題。許多數據科學家面臨的一個問題是,一旦我們進行了優化,我們如何自動化我們的分析運行?擁有像MapR這樣的平台允許這種能力,因為你可以在大型數據環境中構建,訓練,測試和優化你的模型。在這個例子中,我們只使用了10個訓練批次。如果我的數據允許我利用數百批次,而不僅僅是20個時期,我想我一定能改進這種模式。一旦我做到了,我可以把它打包成一個自動化腳本,在一個單獨的節點,一個GPU節點,一個Docker容器中運行。這就是在融合數據平台上進行數據科學和深度學習的力量。

希望上述的文章能夠幫到你理解TensorFlow。

文章原標題《Applying Deep Learning to Time Series Forecasting with TensorFlow》,

作者:Justin Brandenburg 譯者:袁虎

文章中文版來源:阿里云云棲社區 ,請查看看深度學習框架排名第一的TensorFlow如何進行時序預測!-博客-雲棲社區-阿里雲

文章為簡譯,更為詳細的內容,請查看原文

推薦閱讀:

深入淺出Tensorflow(四):卷積神經網路
利用TensorFlow搞定知乎驗證碼之《讓你找中文倒轉漢字》
深入淺出Tensorflow(五):循環神經網路簡介
cs20si:tensorflow for research 學習筆記2

TAG:TensorFlow | 深度学习DeepLearning |