時間序列預測的新老baseline——deepar和temporal fusion transformer(待續)
- 2021 年 6 月 22 日
- AI
DEEPAR部分
deepar這篇論文的亮點不僅在於提出了新的模型結構,許多關於時序預測的見解也很具有啟發性,下面是對論文的閱讀筆記和思考:
1、
在現實世界的預測問題中,試圖共同學習多個時間序列時經常遇到的一個挑戰是,時間序列的數量級差異很大,而且數量級的分布具有很強的傾斜性。這個問題如圖1所示,圖中顯示了亞馬遜銷售的數百萬件商品的銷售速度(即平均每周銷售一件商品)的分布情況。分布在幾個數量級上,近似冪律。

據我們所知,這一發現是新的(儘管可能並不令人驚訝),並且對試圖從這些數據集學習全局模型的預測方法具有基本意義。由於該分布的無標度特性,很難將數據集劃分為具有一定速度帶的時間序列子組,並為它們學習單獨的模型,因為每個速度子組都會有相似的偏態。此外,基於分組的正則化方案,比如Chapados[4]提出的方案,可能會失敗,因為每個分組的速度將有很大的不同。最後,這種偏態分布使得使用某些常用的標準化技術,如輸入標準化或批標準化[14],效果較差。
這裡說的是最常見的多序列預測問題,web traffic,rossman store forecasting等比賽以及電商的商品銷量預測的都是典型的多序列預測問題,不同商品的base level(時序數據四分量之一)差異很大,整體也呈現冪律分布,常規標準化處理無效,因為常規的標準化基於全局的統計特徵無法改變不同商品之間的相對大小關係,使得不同商品的base level差異仍舊很大,冷門商品的銷量和熱門商品的銷量相差成千上萬倍,這導致輸入數據的量綱差異極大(一般基本是做分組標準化),即不同的商品自己內部做標準化,從而使得不同商品的序列數據具有可比性。
2、模型說明部分
為了便於說明,這裡我們以電商銷量預測的問題為例:
問題定義:

其中:

表示已知的,從時刻1~時刻t0 -1的商品的銷量數據

表示從時刻1到時刻T的所有的協變數,這裡需要說明,我們假設[1, t0− 1]為已知銷量的時間區間,[t0, T]為我們需要預測的時間區間,而Xi,1:T是橫跨了[1, t0− 1]和[t0, T]兩個時間區間的,這意味著X 必然是 靜態特徵(例如商品的大類,商品所在的省,城市或商品的歷史銷量的統計值)或者是可以推斷的動態特徵,time varying known features,例如月份,年份,隨著時間變化,但是他們未來的值是可以直接推算出來的,而銷量這種數據屬於不可推斷的動態特徵(同時也是標籤),即time varying unknown features。

模型結構圖如上,在理解上圖之前,需要了解兩個背景知識:
1、時間序列預測中的自回歸模型:時間序列預測中進行自回歸式的預測本質上是把多步預測轉化為多個遞歸式的單步預測,一個典型的例子就是基於RNN的seq2seq結構。seq2seq的結構有兩種形式:

簡單的seq2seq的結構是無法使用預測的數據的特徵,僅僅是將t時刻的隱層輸出作為decoder部分的共同輸入。

實際上上圖的seq2seq結構才算是在做真正意義上的自回歸,t+1時刻的預測結果被用於幫助預測t+2時刻的結果,t+2時刻的預測結果被用於幫助預測t+3時刻的結果。
當然,在這個過程中,外生變數是可以放進來的,假設我們的encoder部分的輸入的序列數據是[5,4,3,2,1,0]對應t-5到t,外生變數是[a5,b5,c5]....[a0,b0,c0],則encoder部分的輸入數據的形式就是[5,a5,b5,c5].....[0,a0,b0,c0],decoder部分的初始輸入是t時刻的特徵即[0,a0,b0,c0],我們在decoder的t時刻部分產生了t+1時刻的預測 t+1_pred,然後我們將t+1_pred和t+1時刻的可推斷特徵(例如城市,省份,店鋪,品類,月份,星期等)合併得到了[t+1_pred,a-1,b-1,c-1],作為t+2時刻的輸入特徵幫助預測t+2,依次類推。
由於這種遞歸式的訓練很容易產生誤差累積的問題,即如果t+1的預測誤差大,則後續的decoder都是在錯誤的預測結果上繼續訓練的,所以更常見的訓練方式是使用teacher forcing:

decoder的時候直接使用真實的值幫助模型訓練。
而常規的LSTM是直接做的向量輸出:

seq2seq式的encoder-decoder結構相對於LSTM這樣單一的encoder的結構有兩個好處:
1、』seq2seq可以支援不定長的輸入和輸出,而單一的encoder結構只能支援不定長輸入無法支援不定長的輸出,因為單一的encoder結構最終是通過一個固定的dense層完成預測任務的,dense層的size是固定不變的;
2、seq2seq的訓練過程可以使用到未來的特徵,當然這些特徵必須是可以推斷的(前面描述過過了),這可能可以幫助模型更好的學習。
deepar的模型結構介於常規的RNN和基於RNN的seq2seq之間,這在原文中提到了:

即deepar中,encoder和decoder使用的是同一個RNN模型,這個RNN模型就是常規意義上的RNN模型,可以是單層的LSTM或多層的LSTM。
那麼deepar的模型是怎麼訓練的?和使用teacher forcing的seq2seq一樣,deepar的訓練和預測過程是不一樣的,基於teacher forcing訓練策略的seq2seq訓練的時候用到了真實的標籤,但是預測的時候我們是沒有真實標籤可用的,因此這類seq2seq預測的行為退化為了普通的recursive seq2seq:

在程式碼實現上也比較麻煩,我們需要手動寫decoder部分的循環(不知道有沒有什麼方便的開源可以實現這個功能,沒有找過)

deepar的訓練過程如上,其實去掉中間的

部分,deepar看起來就是一個LSTM,為了方便描述,中間部分暫時先不考慮,看一下deepar的輸入和輸出是什麼
輸入部分:Xi(t-1),即t-1時刻的外生變數,即可推斷的特徵,比如前面說過的城市,省份,店鋪,品類,月份,星期等,Zi(t-2),即t-2時刻的標籤,比如商品的銷量(也就是我們想要預測的目標),通過一個RNN cell得到 t-1時刻的表徵,然後接一個dense(1)的層得到Zi(t-2),依次類推。其中t-1,t和t+1都是我們需要預測的標籤,和teacher forcing seq2seq一樣,訓練的過程中,待預測的標籤被放進來用於模型訓練了。
然後在預測階段:

和recursive seq2seq一樣,進行迭代預測,這種預測方式可以預測無限長的序列,只不過當預測的序列變長之後精度往往很差,這也是時序預測問題的一個挑戰,長時序的預測如何保證精度的問題,和本文無關,不廢話。
2、

當然deepar沒這麼簡單,deepar的設計本身不是針對點預測,而是針對概率預測的。
這又涉及到頻率派和貝葉斯學派之爭,我們還需要了解一下貝葉斯機器學習和深度學習的一些背景知識,即如何用模型來完成對概率分布的預測。

