🤗 Transformers を用いた時系列トランスフォーマーの確率的予測
TL;DR
Hugging Face は Time Series Transformer を導入しました。これは、単変量系列に対してグローバルな確率的予測を学習するバニラのエンコーダ‑デコーダトランスフォーマーで、Tourism Monthly データセットにおいて従来のベースラインを上回ります。
なぜグローバル確率的モデルなのか?
多くの関連する系列に対して単一のモデルを訓練する(グローバル モデル)ことで、ネットワークは共有パターンや潜在表現を捉えることができます。これは、各系列を個別にフィットさせる従来の「ローカル」手法とは異なります。確率的予測—点推定ではなく完全な分布を予測すること—は、下流の意思決定に不可欠な不確実性の定量化を提供します。
アーキテクチャ概要
The Time Series Transformer は、エンコーダ‑デコーダ構成で標準的な Transformer(Vaswani et al., 2017)を再利用します。
- Encoder は過去観測の固定サイズコンテキストウィンドウを消費します。
- Decoder は因果マスキングを用いて自己回帰的に将来の値を生成し、テキスト生成に類似しています。
- Distribution head(デフォルト: Student‑t)は、各予測ステップの確率分布のパラメータを出力します。
Key benefits
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)
- Monash の
tourism_monthlyデータセットをロードします(train/validation/test に分割、366 系列)。 startタイムスタンプをpandas.Periodに変換し、時系列特徴量の生成を容易にします。- GluonTS の変換チェーンを定義し、
- 未使用の静的/動的フィールドを削除します。
- フィールドを NumPy 配列に変換します。
- 欠損値用の observed‑mask を追加します。
- 時系列特徴量(
month_of_year)とエイジ特徴量を生成します。 - 時間的特徴量をスタックし、Transformer API に合わせてフィールド名を変更します。
InstanceSplitterを作成し、エンコーダ用にcontext_length + max(lags)、デコーダ用にprediction_lengthのウィンドウをサンプリングします。3 つのモードをサポートします:train(ランダムウィンドウ)、validation(最後のウィンドウ)、test(最後のコンテキストのみ)。- 変換されたインスタンスをテンソル(
past_values、past_time_features、future_time_featuresなど)にバッチ化する DataLoaders を構築します。
トレーニングループ(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 エポックで十分な結果が得られました。
自己回帰生成による推論
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 本のモンテカルロ軌跡を生成します。- サンプルの中央値を点予測の評価に使用します。
評価指標
Using the evaluate library:
- 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(
generate、forward、loss)が時系列データにも適用でき、実務者のハードルを下げます。 - 欠損データの処理は attention mask によってネイティブに行われ、補完の必要がなくなります。
- 二次的な注意コストがコンテキスト長を制限するため、将来的には効率的な注意機構の導入が検討されます。
コミュニティへの次のステップ
- 多変量拡張 – 対角独立および全共分散分布ヘッドをサポートします。
- 時系列分類 – 異常検知などのタスク向けに分類ヘッドを追加します。
- 事前学習チェックポイント – NLP/ビジョンに類似した、異種時系列コーパスでの大規模事前学習を検討します。
- 任意の日時入力 – 明示的なタイムスタンプがないデータセット(例:神経科学の記録)にパイプラインを適応させます。
- 効率的な注意 – スパースまたは線形計算量の注意機構を統合し、実用的なコンテキストウィンドウを拡大します。
このリリースは、適切な確率ヘッドとデータパイプラインを組み合わせたバニラTransformerが、単変量予測において競争力があることを示しています。研究者やエンジニアは、Hugging Face Hub の他のデータセットで実験し、周波数固有のパラメータを調整し、ライブラリに追加モデルを貢献することが奨励されています。
Sources
関連
- Dispatch
- Dispatch
- Dispatch
- Dispatch
- Dispatch