下篇 | 使用 Transformers 進行概率時間序列預測

在《使用 ?? Transformers 進行概率時間序列預測》的第一部分里,我們?yōu)榇蠹医榻B了傳統(tǒng)時間序列預測和基于 Transformers 的方法,也一步步準備好了訓練所需的數(shù)據(jù)集并定義了環(huán)境、模型、轉換和?InstanceSplitter
。本篇內容將包含從數(shù)據(jù)加載器,到前向傳播、訓練、推理和展望未來發(fā)展等精彩內容。
創(chuàng)建 PyTorch 數(shù)據(jù)加載器
有了數(shù)據(jù),下一步需要創(chuàng)建 PyTorch DataLoaders。它允許我們批量處理成對的 (輸入, 輸出) 數(shù)據(jù),即 (past_values
?,?future_values
)。
讓我們檢查第一批:
可以看出,我們沒有將?input_ids
?和?attention_mask
?提供給編碼器 (訓練 NLP 模型時也是這種情況),而是提供?past_values
,以及?past_observed_mask
、past_time_features
、static_categorical_features
?和?static_real_features
?幾項數(shù)據(jù)。
解碼器的輸入包括?future_values
、future_observed_mask
?和?future_time_features
。future_values
?可以看作等同于 NLP 訓練中的?decoder_input_ids
。
我們可以參考 Time Series Transformer 文檔 以獲得對它們中每一個的詳細解釋。
前向傳播
讓我們對剛剛創(chuàng)建的批次執(zhí)行一次前向傳播:
目前,該模型返回了損失值。這是由于解碼器會自動將?future_values
?向右移動一個位置以獲得標簽。這允許計算預測結果和標簽值之間的誤差。
另請注意,解碼器使用 Causal Mask 來避免預測未來,因為它需要預測的值在?future_values
?張量中。
訓練模型
是時候訓練模型了!我們將使用標準的 PyTorch 訓練循環(huán)。
這里我們用到了 ?? Accelerate 庫,它會自動將模型、優(yōu)化器和數(shù)據(jù)加載器放置在適當?shù)?span id="s0sssss00s" class="Apple-converted-space">?device
?上。
?? Accelerate 文檔地址:
https://hf.co/docs/accelerate/index
推理
在推理時,建議使用?generate()
?方法進行自回歸生成,類似于 NLP 模型。
預測的過程會從測試實例采樣器中獲得數(shù)據(jù)。采樣器會將數(shù)據(jù)集的每個時間序列的最后?context_length
?那么長時間的數(shù)據(jù)采樣出來,然后輸入模型。請注意,這里需要把提前已知的?future_time_features
?傳遞給解碼器。
該模型將從預測分布中自回歸采樣一定數(shù)量的值,并將它們傳回解碼器最終得到預測輸出:
該模型輸出一個表示結構的張量 (batch_size
,?number of samples
,?prediction length
)。
下面的輸出說明: 對于大小為 64 的批次中的每個示例,我們將獲得接下來 24 個月內的 100 個可能的值:
我們將垂直堆疊它們,以獲得測試數(shù)據(jù)集中所有時間序列的預測:
我們可以根據(jù)測試集中存在的樣本值,根據(jù)真實情況評估生成的預測。這里我們使用數(shù)據(jù)集中的每個時間序列的 MASE 和 sMAPE 指標 (metrics) 來評估:
MASE 文檔地址:
https://hf.co/spaces/evaluate-metric/masesMAPE 文檔地址:
https://hf.co/spaces/evaluate-metric/smape
我們還可以單獨繪制數(shù)據(jù)集中每個時間序列的結果指標,并觀察到其中少數(shù)時間序列對最終測試指標的影響很大:
為了根據(jù)基本事實測試數(shù)據(jù)繪制任何時間序列的預測,我們定義了以下輔助繪圖函數(shù):
例如:
plot(334)

我們如何與其他模型進行比較?Monash Time Series Repository 有一個測試集 MASE 指標的比較表。我們可以將自己的結果添加到其中作比較:
請注意,我們的模型擊敗了所有已知的其他模型 (另請參見相應 論文 中的表 2) ,并且我們沒有做任何超參數(shù)優(yōu)化。我們僅僅花了 40 個完整訓練調參周期來訓練 Transformer。
上文對于此數(shù)據(jù)集的預測方法論文:
https://openreview.net/pdf?id=wEc1mgAjU-
當然,我們應該謙虛。從歷史發(fā)展的角度來看,現(xiàn)在認為神經網絡解決時間序列預測問題是正途,就好比當年的論文得出了 “你需要的就是 XGBoost” 的結論。我們只是很好奇,想看看神經網絡能帶我們走多遠,以及 Transformer 是否會在這個領域發(fā)揮作用。這個特定的數(shù)據(jù)集似乎表明它絕對值得探索。
得出“你需要的就是 XGBoost”結論的論文地址:
https://www.sciencedirect.com/science/article/pii/S0169207021001679
下一步
我們鼓勵讀者嘗試我們的 Jupyter Notebook 和來自 Hugging Face Hub 的其他時間序列數(shù)據(jù)集,并替換適當?shù)念l率和預測長度參數(shù)。對于您的數(shù)據(jù)集,需要將它們轉換為 GluonTS 的慣用格式,在他們的 文檔 里有非常清晰的說明。我們還準備了一個示例 Notebook,向您展示如何將數(shù)據(jù)集轉換為 ?? Hugging Face 數(shù)據(jù)集格式。
Time Series Transformers Notebook:
https://colab.research.google.com/github/huggingface/notebooks/blob/main/examples/time-series-transformers.ipynbHub 中的 Monash Time Series 數(shù)據(jù)集:
https://hf.co/datasets/monash_tsfGluonTS 闡述數(shù)據(jù)集格式的文檔:
https://ts.gluon.ai/stable/tutorials/forecasting/extended_tutorial.html演示數(shù)據(jù)集格式轉換的 Notebook:
https://github.com/huggingface/notebooks/blob/main/examples/time_series_datasets.ipynb
正如時間序列研究人員所知,人們對“將基于 Transformer 的模型應用于時間序列”問題很感興趣。傳統(tǒng) vanilla Transformer 只是眾多基于注意力 (Attention) 的模型之一,因此需要向庫中補充更多模型。
目前沒有什么能妨礙我們繼續(xù)探索對多變量時間序列 (multivariate time series) 進行建模,但是為此需要使用多變量分布頭 (multivariate distribution head) 來實例化模型。目前已經支持了對角獨立分布 (diagonal independent distributions),后續(xù)會增加其他多元分布支持。請繼續(xù)關注未來的博客文章以及其中的教程。
路線圖上的另一件事是時間序列分類。這需要將帶有分類頭的時間序列模型添加到庫中,例如用于異常檢測這類任務。
當前的模型會假設日期時間和時間序列值都存在,但在現(xiàn)實中這可能不能完全滿足。例如 WOODS 給出的神經科學數(shù)據(jù)集。因此,我們還需要對當前模型進行泛化,使某些輸入在整個流水線中可選。
WOODS 主頁:
https://woods-benchmarks.github.io/
最后,NLP/CV 領域從大型預訓練模型 中獲益匪淺,但據(jù)我們所知,時間序列領域并非如此。基于 Transformer 的模型似乎是這一研究方向的必然之選,我們迫不及待地想看看研究人員和從業(yè)者會發(fā)現(xiàn)哪些突破!
大型預訓練模型論文地址:
https://arxiv.org/abs/1810.04805
英文原文: Probabilistic Time Series Forecasting with ?? Transformers:?https://huggingface.co/blog/time-series-transformers
譯者、排版: zhongdongy (阿東)