原文鏈接
TensorFlow 是一個(gè)采用數(shù)據(jù)流圖(data flow graphs),用于數(shù)值計(jì)算的開源軟件庫(kù)喻频。節(jié)點(diǎn)(Nodes)在圖中表示數(shù)學(xué)操作,圖中的線(edges)則表示在節(jié)點(diǎn)間相互聯(lián)系的多維數(shù)據(jù)數(shù)組锻煌,即張量(tensor)姻蚓。它靈活的架構(gòu)讓你可以在多種平臺(tái)上展開計(jì)算,例如臺(tái)式計(jì)算機(jī)中的一個(gè)或多個(gè)CPU(或GPU)捂龄,服務(wù)器加叁,移動(dòng)設(shè)備等等。TensorFlow 最初由Google大腦小組(隸屬于Google機(jī)器智能研究機(jī)構(gòu))的研究員和工程師們開發(fā)出來刀脏,用于機(jī)器學(xué)習(xí)和深度神經(jīng)網(wǎng)絡(luò)方面的研究超凳,但這個(gè)系統(tǒng)的通用性使其也可廣泛用于其他計(jì)算領(lǐng)域耀态。
時(shí)間序列分析在計(jì)量經(jīng)濟(jì)學(xué)和財(cái)務(wù)分析中具有重要意義首装,但也可以應(yīng)用于了解趨勢(shì)做決策和對(duì)行為模式的變化做出反應(yīng)的領(lǐng)域。其中例如仙逻,作為主要石油和天然氣供應(yīng)商的MapR融合數(shù)據(jù)平臺(tái)客戶將傳感器放在井上,將數(shù)據(jù)發(fā)送到MapR Streams檬贰,然后將其用于趨勢(shì)監(jiān)測(cè)井的狀況,如體積和溫度桥言。在金融方面葵礼,時(shí)間序列分析用于股票價(jià)格,資產(chǎn)和商品的價(jià)格的預(yù)測(cè)鸳粉。計(jì)量經(jīng)濟(jì)學(xué)家長(zhǎng)期利用“差分自回歸移動(dòng)平均模型”(ARIMA)模型進(jìn)行單變量預(yù)測(cè)届谈。
ARIMA模型已經(jīng)使用了幾十年,并且很好理解疼约。然而程剥,隨著機(jī)器學(xué)習(xí)的興起,以及最近的深度學(xué)習(xí)织鲸,其他模式正在被探索和利用搂擦。
深度學(xué)習(xí)(DL)是基于一組算法的機(jī)器學(xué)習(xí)的分支,它通過使用由多個(gè)非線性變換組成的人造神經(jīng)網(wǎng)絡(luò)(ANN)架構(gòu)來嘗試對(duì)數(shù)據(jù)進(jìn)行高級(jí)抽象然后建模瀑踢。更為流行的DL神經(jīng)網(wǎng)絡(luò)之一是循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)橱夭。RNN是依賴于其輸入的順序性質(zhì)的一類神經(jīng)網(wǎng)絡(luò)。這樣的輸入可以是文本棘劣,語音,時(shí)間序列首昔,以及序列中的元素的出現(xiàn)取決于在它之前出現(xiàn)的元素。例如拘荡,一句話中的下一個(gè)字撬陵,如果有人寫“雜貨”最有可能是“商店”而不是“學(xué)校”蟋定。在這種情況下草添,給定這個(gè)序列,RNN可能預(yù)測(cè)是商店而不是學(xué)校抄淑。
人工神經(jīng)網(wǎng)絡(luò)
實(shí)際上驰后,事實(shí)證明,雖然神經(jīng)網(wǎng)絡(luò)有時(shí)是令人畏懼的結(jié)構(gòu)郑原,但使它們工作的機(jī)制出奇地簡(jiǎn)單:隨機(jī)梯度下降夜涕。對(duì)于我們網(wǎng)絡(luò)中的每個(gè)參數(shù)(如權(quán)重或偏差),我們所要做的就是計(jì)算相對(duì)于損耗的參數(shù)的導(dǎo)數(shù)酸役,并在相反方向微調(diào)一點(diǎn)驾胆。
ANNs使用稱為反向傳播(有想了解BP算法的可以參考BP算法雙向傳,鏈?zhǔn)角髮?dǎo)最纏綿)的方法來調(diào)整和優(yōu)化結(jié)果暑塑。反向傳播是一個(gè)兩步過程锅必,其中輸入通過正向傳播饋送到神經(jīng)網(wǎng)絡(luò)中,并且在通過激活函數(shù)變換之前與(最初隨機(jī)的)權(quán)重和偏差相乘驹愚。你的神經(jīng)網(wǎng)絡(luò)的深度將取決于你的輸入應(yīng)該經(jīng)過多少變換劣纲。一旦正向傳播完成,反向傳播步驟通過計(jì)算產(chǎn)生誤差的權(quán)重的偏導(dǎo)數(shù)來調(diào)整誤差劫瞳。一旦調(diào)整權(quán)重绷柒,模型將重復(fù)正向和反向傳播步驟的過程,以最小化誤差率直到收斂伺绽。下圖中你看到這是一個(gè)只有一個(gè)隱藏層的ANN嗜湃,所以反向傳播不需要執(zhí)行多個(gè)梯度下降計(jì)算。
循環(huán)神經(jīng)網(wǎng)絡(luò)
循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)被稱為循環(huán)是因?yàn)樗鼈儗?duì)輸入序列中的所有元素執(zhí)行相同的計(jì)算杖挣。由于RNN的廣泛應(yīng)用刚陡,RNN正在變得非常受歡迎橘荠。它們可以分析時(shí)間序列數(shù)據(jù),如股票價(jià)格哥童,并提供預(yù)測(cè)贮懈。在自動(dòng)駕駛系統(tǒng)中,他們可以預(yù)測(cè)汽車軌跡并幫助避免事故各聘。他們可以將句子抡医,文檔或音頻樣本作為輸入早敬,它們也可以應(yīng)用于自然語言處理(NLP)系統(tǒng)大脉,如自動(dòng)翻譯,語音對(duì)文本或情感分析琐驴。
上圖是RNN架構(gòu)的示例秤标,并且我們看到xt是時(shí)間步長(zhǎng)t的輸入。例如牢酵,x1可能是時(shí)間段1中的股票的第一個(gè)價(jià)格怖现。st是在時(shí)間步長(zhǎng)tn處的隱藏狀態(tài),并且使用激活函數(shù)基于先前的隱藏狀態(tài)和當(dāng)前步驟的輸入來計(jì)算潘拨。St-1通常被初始化為零饶号。ot是步驟t的輸出。例如琅束,如果我們想預(yù)測(cè)序列中的下一個(gè)值算谈,那么它將是我們時(shí)間序列中概率的向量然眼。
RNN隱藏層的成長(zhǎng)是依賴于先前輸入的隱藏狀態(tài)或記憶,捕獲到目前為止所看到的內(nèi)容高每。任何時(shí)間點(diǎn)的隱藏狀態(tài)的值都是前一時(shí)間步驟中的隱藏狀態(tài)值和當(dāng)前時(shí)間的輸入值進(jìn)行函數(shù)計(jì)算的結(jié)果鲸匿。RNN具有與ANN不同的結(jié)構(gòu),并且通過時(shí)間(BPTT)使用反向傳播來計(jì)算每次迭代之后的梯度下降运授。
一個(gè)小例子:
此示例使用3個(gè)節(jié)點(diǎn)的小型MapR群集完成。此示例將使用以下內(nèi)容:
Python 3.5
TensorFlow 1.0.1
Red Hat 6.9
如果你使用Anaconda撕氧,你需要保證你能夠安裝TensorFlow 1.0.1版本在你本地的機(jī)器上喇完。此代碼將不能在TensorFlow <1.0版本上使用剥啤。如果TensorFlow版本相同,則可以在本地機(jī)器上運(yùn)行并傳輸?shù)郊嚎陶铩F渌枰紤]的深度學(xué)習(xí)庫(kù)是MXNet牺丙,Caffe2,Torch和Theano粟判。Keras是另一個(gè)為TensorFlow或Theano提供python包的深度學(xué)習(xí)庫(kù)峦剔。
MapR提供了用戶喜好的集成Jupyter Notebook(或Zeppelin)的功能。我們將在這里顯示的是數(shù)據(jù)管道的尾端呻澜。在分布式環(huán)境中運(yùn)行RNN時(shí)間序列模型的真正價(jià)值是你可以構(gòu)建的數(shù)據(jù)流水線惨险,將聚合的系列數(shù)據(jù)推送到可以饋送到TensorFlow計(jì)算圖中的格式辫愉。
如果我正在聚合來自多個(gè)設(shè)備(IDS,syslogs等)的網(wǎng)絡(luò)流一屋,并且我想預(yù)測(cè)未來的網(wǎng)絡(luò)流量模式行為冀墨,我可以使用MapR Streams建立一個(gè)實(shí)時(shí)數(shù)據(jù)管道,將這些數(shù)據(jù)聚合成一個(gè)隊(duì)列蔚出,進(jìn)入我的TensorFlow模型。對(duì)于這個(gè)例子稀余,我在集群上只使用一個(gè)節(jié)點(diǎn)趋翻,但是我可以在其他兩個(gè)節(jié)點(diǎn)上安裝TensorFlow,并且可以有三個(gè)TF模型運(yùn)行不同的超參數(shù)师骗。
對(duì)于這個(gè)例子讨惩,我生成了一些虛擬數(shù)據(jù)。
我們?cè)谖覀兊臄?shù)據(jù)中有209個(gè)觀察結(jié)果黍少。我want確保我對(duì)每個(gè)批次輸入都有相同的觀察次數(shù)处面。
我們看到的是我們的訓(xùn)練數(shù)據(jù)集由10個(gè)批次組成鸳君,包含20個(gè)觀測(cè)值。每個(gè)觀察值是單個(gè)值的序列或颊。
現(xiàn)在我們有了我們的數(shù)據(jù)囱挑,我們來創(chuàng)建一個(gè)將執(zhí)行計(jì)算的TensorFlow圖。
這里有很多事情需要處理游添。例如我們正在指定我們用來預(yù)測(cè)的周期數(shù)通熄。我們指定我們的變量占位符。我們初始化一種使用的RNN單元格(大小100)和我們想要的激活函數(shù)的類型廊酣。ReLU代表“整流線性單元”赏枚,是默認(rèn)的激活功能晓猛,但如果需要戒职,可以更改為Sigmoid透乾,Hyberbolic Tangent(Tanh)等。
我們希望我們的輸出與我們的輸入格式相同蚓曼,我們可以使用損失函數(shù)來比較我們的結(jié)果钦扭。在這種情況下床绪,我們使用均方誤差(MSE)癞己,因?yàn)檫@是一個(gè)回歸問題,我們的目標(biāo)是最小化實(shí)際和預(yù)測(cè)之間的差異痹雅。如果我們處理分類結(jié)果绩社,我們可能會(huì)使用交叉熵。現(xiàn)在我們定義了這個(gè)損失函數(shù)贮尉,可以定義TensorFlow中的訓(xùn)練操作朴沿,這將優(yōu)化我們的輸入和輸出網(wǎng)絡(luò)。要執(zhí)行優(yōu)化魏铅,我們將使用Adam優(yōu)化器坚芜。Adam優(yōu)化器是一個(gè)很好的通用優(yōu)化器货岭,可以通過反向傳播實(shí)現(xiàn)漸變下降疾渴。
現(xiàn)在是時(shí)候在我們的訓(xùn)練數(shù)據(jù)上實(shí)施這個(gè)模型了屯仗。
我們將指定我們的批次訓(xùn)練序列循環(huán)的迭代/紀(jì)元的數(shù)量。接著桩撮,我們創(chuàng)建我們的圖形對(duì)象(tf.Session())峰弹,并初始化我們的數(shù)據(jù)鞠呈,以便在我們遍歷歷元時(shí)被饋送到模型中『当縮寫輸出顯示每100個(gè)紀(jì)元后的MSE窘茁。隨著我們的模型提供數(shù)據(jù)向前和反向傳播運(yùn)行山林,它調(diào)整應(yīng)用于輸入的權(quán)重并運(yùn)行另一個(gè)訓(xùn)練時(shí)期,我們的MSE得到了持續(xù)改善(減少)桑孩。最后砂蔽,一旦模型完成,它將接受參數(shù)并將其應(yīng)用于測(cè)試數(shù)據(jù)中镣隶,以Y的預(yù)測(cè)輸出安岂。
我們來看看我們的預(yù)測(cè)跟實(shí)際相差多少帆吻。對(duì)于我們的測(cè)試數(shù)據(jù),我們集中在整個(gè)209個(gè)周期的最后20個(gè)時(shí)期次员。
看來這還有一些改進(jìn)的空間。這可以通過改變隱藏的神經(jīng)元的數(shù)量或增加迭代的數(shù)量來完成市殷。優(yōu)化我們的模式是一個(gè)試錯(cuò)的過程刹衫,但我們有一個(gè)好的開始带迟。這是隨機(jī)數(shù)據(jù),所以我們期待著很好的結(jié)果嗅绰,但是也許將這個(gè)模型應(yīng)用到實(shí)時(shí)系列中會(huì)給ARIMA模型帶來一些競(jìng)爭(zhēng)壓力婶肩。
數(shù)據(jù)科學(xué)家因?yàn)镽NN(和深度學(xué)習(xí))的出現(xiàn),有了更多可用的選項(xiàng)以此來解決更多有趣的問題。許多數(shù)據(jù)科學(xué)家面臨的一個(gè)問題是险毁,一旦我們進(jìn)行了優(yōu)化们童,我們?nèi)绾巫詣?dòng)化我們的分析運(yùn)行?擁有像MapR這樣的平臺(tái)允許這種能力跷跪,因?yàn)槟憧梢栽诖笮蛿?shù)據(jù)環(huán)境中構(gòu)建吵瞻,訓(xùn)練甘磨,測(cè)試和優(yōu)化你的模型。在這個(gè)例子中卿泽,我們只使用了10個(gè)訓(xùn)練批次滋觉。如果我的數(shù)據(jù)允許我利用數(shù)百批次齐邦,而不僅僅是20個(gè)時(shí)期侄旬,我想我一定能改進(jìn)這種模式煌妈。一旦我做到了,我可以把它打包成一個(gè)自動(dòng)化腳本汰蜘,在一個(gè)單獨(dú)的節(jié)點(diǎn)族操,一個(gè)GPU節(jié)點(diǎn)比被,一個(gè)Docker容器中運(yùn)行。這就是在融合數(shù)據(jù)平臺(tái)上進(jìn)行數(shù)據(jù)科學(xué)和深度學(xué)習(xí)的力量枷莉。
希望上述的文章能夠幫到你理解TensorFlow尺迂。
更多閱讀:
閱讀博客“TensorFlow on MapR教程:一個(gè)完美的地方開始”
閱讀博客“深度學(xué)習(xí):我的選項(xiàng)是什么笤妙?“
閱讀博客“通過SparkR和H2O的MapR融合數(shù)據(jù)平臺(tái)上的可擴(kuò)展機(jī)器學(xué)習(xí)”
希望上述的介紹能夠幫助到你!
本文由北郵@愛可可-愛生活老師推薦噪裕,阿里云云棲社區(qū)組織翻譯蹲盘。
文章原標(biāo)題《Applying Deep Learning to Time Series Forecasting with TensorFlow》,
作者:Justin Brandenburg?譯者:袁虎?審閱:董昭男
文章為簡(jiǎn)譯膳音,更為詳細(xì)的內(nèi)容召衔,請(qǐng)查看原文