使用 🤗 Transformers 進行時間序列 Transformer 機率預測

TL;DR

Hugging Face 推出了 Time Series Transformer,一個原始的編碼器‑解碼器 Transformer,能夠學習單變量序列的全局機率預測,並在 Tourism Monthly 資料集上超越傳統基線。


為何使用全局機率模型?

在許多相關序列上訓練單一模型(全局模型)使網路能捕捉共享的模式與潛在表示,與傳統「局部」方法逐一為每條序列擬合不同。機率預測——預測完整的分佈而非單點估計——提供了不確定性量化,這對後續決策至關重要。

架構概覽

Time Series Transformer 在編碼器‑解碼器配置中重新使用標準 Transformer(Vaswani 等,2017)。

  • Encoder 消耗固定大小的過去觀測上下文窗口。
  • Decoder 以因果遮罩自回歸方式生成未來值,類似於文字生成。
  • Distribution head(預設:Student‑t)為每個預測步驟輸出機率分佈的參數。

主要優勢:

  • 透過類似 attention_mask 的機制處理缺失值。
  • 透過窗口式訓練支援任意的上下文與預測長度。
  • 利用與 NLP 模型相同的 API,支援推論時使用 generate()

模型設定細節

from transformers import TimeSeriesTransformerConfig, TimeSeriesTransformerForPrediction

config = TimeSeriesTransformerConfig(
    prediction_length=24,               # forecast horizon (months)
    context_length=48,                  # encoder window (2× horizon)
    lags_sequence=[1,2,3,4,5,6,7,11,12,13,23,24,25,35,36,37],
    num_time_features=2,                # month‑of‑year + age feature
    num_static_categorical_features=1, # series ID
    cardinality=[366],                  # 366 regions in the dataset
    embedding_dimension=[2],
    encoder_layers=4,
    decoder_layers=4,
    d_model=32,
)

model = TimeSeriesTransformerForPrediction(config)
  • 模型學習 Student‑t 分佈(model.config.distribution_output == "student_t")。
  • 靜態類別嵌入編碼每條序列的身份,使單一模型能服務全部 366 條序列。

資料管線(GluonTS + 🤗 Datasets)

  1. 載入 Monash tourism_monthly 資料集(訓練/驗證/測試分割,366 條序列)。
  2. start 時間戳轉換為 pandas.Period,以便輕鬆產生時間特徵。
  3. 定義 GluonTS 轉換鏈,其:
    • 移除未使用的靜態/動態欄位。
    • 將欄位轉換為 NumPy 陣列。
    • 為缺失值加入觀測遮罩。
    • 產生時間特徵(month_of_year)與年齡特徵。
    • 堆疊時間特徵並重新命名欄位以符合 Transformer API。
  4. 建立 InstanceSplitter,為編碼器抽樣大小為 context_length + max(lags) 的窗口,為解碼器抽樣 prediction_length。它支援三種模式:train(隨機窗口)、validation(最後窗口)以及 test(僅最後上下文)。
  5. 建構 DataLoaders,將轉換後的實例批次化為張量(past_valuespast_time_featuresfuture_time_features 等)。

訓練迴圈(Accelerate)

from accelerate import Accelerator
from torch.optim import AdamW

accelerator = Accelerator()
model.to(accelerator.device)
optimizer = AdamW(model.parameters(), lr=6e-4, betas=(0.9, 0.95), weight_decay=1e-1)
model, optimizer, train_loader = accelerator.prepare(model, optimizer, train_loader)

model.train()
for epoch in range(40):
    for batch in train_loader:
        optimizer.zero_grad()
        outputs = model(**batch)
        accelerator.backward(outputs.loss)
        optimizer.step()
  • 解碼器會自動平移 future_values 以計算似然損失。
  • 未執行超參數搜尋;40 個 epoch 已足以取得優異結果。

使用自回歸生成進行推論

model.eval()
forecasts = []
for batch in test_loader:
    out = model.generate(**batch)
    forecasts.append(out.sequences.cpu().numpy())
forecasts = np.vstack(forecasts)   # shape: (366, 100, 24)
  • generate() 從學習到的分佈抽樣,為每條序列產生 100 條 Monte‑Carlo 軌跡。
  • 取樣本的中位數作為點預測評估。

評估指標

使用 evaluate 套件:

  • MASE(Mean Absolute Scaled Error)= 1.256(在 366 條序列上的平均)。
  • sMAPE(Symmetric Mean Absolute Percentage Error)= 0.161。 這些數值在相同基準上優於各種傳統與深度基線。

基準比較

模型 MASE
SES 3.306
Theta 1.649
TBATS 1.751
ETS 1.526
(DHR‑)ARIMA 1.589
PR 1.678
CatBoost 1.699
FFNN 1.582
DeepAR 1.409
N‑BEATS 1.574
WaveNet 1.482
Transformer (this work) 1.256

Transformer 在未進行任何資料集特定調整的情況下取得最低的 MASE,顯示全局注意力機制能有效捕捉季節性與趨勢模式。

實務要點

  • 全局機率預測 可透過少量程式碼使用 🤗 Transformers 套件實作。
  • 與語言模型相同的 API(generateforwardloss)適用於時間序列資料,降低實務門檻。
  • 缺失資料處理透過注意力遮罩原生支援,免除填補需求。
  • 二次方注意力成本限制上下文長度;未來工作可採用高效注意力變體。

社群未來方向

  • 多變量擴充 – 支援對角獨立與全協方差分佈頭。
  • 時間序列分類 – 為異常偵測等任務加入分類頭。
  • 預訓練檢查點 – 探索在異質時間序列語料庫上大規模預訓練,類似於 NLP/視覺。
  • 可選日期時間輸入 – 調整管線以適用缺乏明確時間戳的資料集(例如神經科學錄製)。
  • 高效注意力 – 整合稀疏或線性複雜度注意力以擴大可行的上下文窗口。

此發佈證明,原始 Transformer 結合適當的機率頭與資料管線,即可在單變量預測上具競爭力。鼓勵研究人員與工程師嘗試 Hugging Face Hub 上的其他資料集,調整頻率特定參數,並為套件貢獻更多模型。

Sources