在實際處理時序數據的時候思考了這麼一個問題(知乎上也有人問):爲何要用RNN,不能把時間序列的數據都做爲特徵值輸入全鏈接神經網絡(DNN)嗎?網絡
我看到知乎上有個回答不錯:機器學習
若是固定了就是前四天輸入,預測第五天,普通的全鏈接徹底能夠解決這個問題,無非是擬合一個四元的高階函數罷了。可是大多數的時序問題,輸入是變長的,並且很是長。有時輸出也要求是變長一個序列。網絡的形狀都是固定的,故而普通的全鏈接沒法解決輸入輸出的變長問題。函數
上面的回答我是承認的,在定長window做爲輸入下,確實能夠用DNN或者其餘機器學習模型,只不過收斂速度會慢些。學習
下面咱們回到RNN如何處理時序數據。舉例來講,咱們作故障預測(注意這裏是預測),已經知道了故障發生點,如何使用時序數據進行故障預測。設計
首先咱們不可能固定肯定的window做爲輸入,由於不知道應該取1分鐘,仍是3分鐘,仍是5分鐘。。。所以咱們可能須要先截取一個相對較長的時間,好比5分鐘的數據做爲輸入,也就是說故障發生點的前五分鐘數據拿出來進行label,而且分紅不一樣長度:code
至關於不一樣長度的時間序列打標爲故障,同時取正常數據也是相同數據量的長度數據打標爲正常。塞到RNN訓練。get
斷定的時候,每個instance的時間序列須要截成上述6種序列輸入到model進行斷定。即從當前時刻,向前推30秒判斷;向前推1分鐘判斷。。。可是若是30秒斷定會有故障,那麼1分鐘也應該斷定會有故障,餘此類推,這麼來看,就沒有必要把時間序列截成6段。這就是該方法最大的問題。io
上述方法問題的根源在於標註不對,即不肯定到底應該是多長的時間序列應該標註爲故障。好比有的故障對應了前面30秒,有的故障對應了前面50秒,有的對應了前面80秒等等。最理想的方案是咱們人工標註數據集,好比咱們得到了2千個故障,那麼人工標註每一個故障發生前多久的時間序列爲故障序列。這樣的序列可能每一個長度都不同,假設有兩千種長度,而後統一塞到RNN模型作訓練。神經網絡
斷定的時候,須要根據長度種類,從當前時刻拿出對應的長度來斷定,那麼須要拿出多少種長度呢?須要拿出2000種長度嗎?答案是不須要的。這就是RNN的強大之處,只要給定一個instance的歷史序列(能夠類比一篇文章),那麼在任何一個位置,給定一個片斷,RNN是可以記住(反應)以前序列信息的。好比abcde->1
,那麼給定de
,RNN輸出爲1
,不須要給定所有序列,由於de已經帶了abc的信息。可是若是有另外一條序列,xyzde->0
,那麼給定de
,RNN有50%機率給1
或0
,由於de能夠表示爲abcde,也能夠是xyzde。所以,輸入仍是越多越好。model
那麼上面的故障預測問題到底怎麼設計比較合適呢?這就和咱們的目標相關。目標是給定當前時刻,向前推一段時間的序列(也能夠是幾段序列),即當前時刻,給定n個window,斷定接下來m個時間後/內(或者給定時間段)會發生故障。
按照上面的目標,咱們能夠先定義預測window,即接下來多久會發生故障,好比1分鐘之內。那麼標註數據須要是在故障發生點1分鐘前的序列。若是訓練數據是多條變長的序列,那麼在作inference的時候會變得很困難,由於不知道要取多久的序列好。所以最好咱們作成定長的序列,包括訓練和推斷。例如,咱們的目標是預測1分鐘以內會發生故障,經過人工觀察到2千條序列,在故障以前的異常序列有10分鐘到3分鐘不等。那麼咱們要嘗試不一樣的序列窗口,例如嘗試3分鐘,4分鐘,5分鐘,一直到15分鐘,看哪一個效果好用哪一個。
具體過程以下:好比嘗試5分鐘的序列,對於故障1:
序列1:[11:55:01, 11:59:01]->1
序列2:[11:55:02, 11:59:02]->1
序列3:[11:55:03, 11:59:03]->1
序列4:[11:55:04, 11:59:04]->1
序列5:[11:55:05, 11:59:05]->1
序列6:[11:55:06, 11:59:06]->1
序列7:[11:55:07, 11:59:07]->1
序列8:[11:55:08, 11:59:08]->1
序列9:[11:55:09, 11:59:09]->1
......
序列59:[11:55:59, 11:59:59]->1
對於故障2,故障3也作相似的標註,至關於一個故障有60比data,2000個故障有12萬筆data,進行訓練獲得model。
inference時的時間窗口也是取5分鐘,即當前時刻要預測接下來(1分鐘以內)是否會發生異常,須要從當前時刻向前取5分鐘的序列,輸入到model獲得結果。
上面的過程是嘗試序列窗口爲5分鐘的,咱們要嘗試多種序列窗口,而且必定要覆蓋誇異常區間的。好比人工標註了2000個故障,發現1000個故障前的異常數據序列有3分鐘,另一千個故障前面的異常序列有5分鐘,那麼序列窗口必定要嘗試6分鐘,7分鐘等,即跨5分鐘的序列。