なぜ Transformer を時系列に使うのか
時系列予測の主役は長らく ARIMA / SARIMA のような線形状態空間モデルと LSTM でしたが、2017 年の “Attention Is All You Need” 以降、自然言語処理から波及した Transformer が時系列領域でも急速に存在感を増しています。本記事は ML時系列ハブ の自然な深掘りとして、Attention の数学・Positional Encoding・PyTorch 最小実装・Informer/Autoformer/PatchTST まで一気通貫で扱います。
LSTM や カルマンフィルタ系の状態空間モデル は、内部状態 \(h_t\) を時刻順に逐次更新する 逐次計算 が本質です。これは長距離依存(数百ステップ離れた相関)を扱うほど勾配が薄まり、かつ GPU 並列化が効きません。Transformer は以下の 3 点で根本的に異なります:
- Self-Attention で全時刻ペアを一括計算 — 任意の時刻 \(i, j\) の相関を \(O(1)\) ステップで参照
- 完全並列 — 系列長 \(T\) の依存連鎖がなく、\(T\) 個のトークンを同時に処理
- 長距離依存に強い — 経路長が距離に依らず一定(LSTM は \(O(T)\) )
代償は計算量で、Self-Attention は系列長に対して \(O(T^2 d)\) (\(d\) は埋め込み次元)。これが Informer / Autoformer のような疎化バリアントが生まれた理由です。本記事では、まず基礎の Attention 機構と Positional Encoding を数式で押さえ、その後 PyTorch で最小実装し、最後に時系列専用 Transformer の系譜と ARIMA / LSTM との実務比較を行います。
Attention 機構の数学
Query / Key / Value
Self-Attention は入力系列 \(X \in \mathbb{R}^{T \times d_{\text{model}}}\) を 3 つの線形射影で Query / Key / Value に変換します:
\[ Q = X W_Q, \quad K = X W_K, \quad V = X W_V \tag{1} \]ここで \(W_Q, W_K \in \mathbb{R}^{d_{\text{model}} \times d_k}\) 、\(W_V \in \mathbb{R}^{d_{\text{model}} \times d_v}\) は学習可能な重み。直感的には Query が「今、何を探しているか」、Key が「自分は何を表しているか」、Value が「実際に運ぶ情報」を担います。
スケール付き内積 Attention
各 Query \(q_i\) と全 Key \(k_j\) の内積で類似度を計り、\(\sqrt{d_k}\) でスケールしてから Softmax で重み化、Value を加重平均します:
\[ \text{Attention}(Q, K, V) = \mathrm{softmax}\!\left(\frac{Q K^\top}{\sqrt{d_k}}\right) V \tag{2} \]\(\sqrt{d_k}\) で割る理由は、\(d_k\) が大きいと内積の分散が膨らみ Softmax が極端な one-hot に潰れて勾配が消えるため。これは モンテカルロ最適化 で議論する確率的勾配の分散制御と同じ思想です。
Multi-Head Attention
ヘッド数 \(h\) に分けて並列に Attention を計算し、結果を連結します:
\[ \mathrm{MHA}(X) = [\mathrm{head}_1; \ldots; \mathrm{head}_h] W_O, \quad \mathrm{head}_i = \mathrm{Attention}(XW_Q^{(i)}, XW_K^{(i)}, XW_V^{(i)}) \tag{3} \]ヘッドごとに異なる「視点」(例:短期相関を捉えるヘッド、季節性を捉えるヘッド)を学習でき、アンサンブル学習 と似た多様性の恩恵を受けます。
Positional Encoding:順序情報の注入
Self-Attention は順序を持たない集合演算なので、そのままだと時刻 \(t\) の情報を区別できません。これを補うのが Positional Encoding (PE) です。
sin / cos 固定 PE(オリジナル Transformer)
位置 \(\text{pos}\) 、次元 \(i\) について:
\[ \begin{aligned} \mathrm{PE}_{(\text{pos}, 2i)} &= \sin\!\left(\frac{\text{pos}}{10000^{2i/d_{\text{model}}}}\right) \\ \mathrm{PE}_{(\text{pos}, 2i+1)} &= \cos\!\left(\frac{\text{pos}}{10000^{2i/d_{\text{model}}}}\right) \end{aligned} \tag{4} \]各次元が異なる波長の正弦波になっており、波長は \(2\pi\) から \(10000 \cdot 2\pi\) までの幾何級数。任意のオフセット \(k\) に対して \(\mathrm{PE}_{\text{pos}+k}\) を \(\mathrm{PE}_{\text{pos}}\) の線形変換で書けるため、相対位置の表現 が自然に学習可能です。フーリエ的な観点は 時間周波数解析ハブ や 離散DSP基礎 と接続します。
学習可能 PE と相対位置 PE
- 学習可能 PE:
nn.Embedding(max_len, d_model)で位置ごとにベクトルを学習。BERT / GPT 系の主流。固定 PE より柔軟だが長系列に外挿しにくい - 相対位置 PE(T5, Transformer-XL):Query/Key 間の相対距離 \(i - j\) にバイアスを加える。時系列のように「絶対時刻よりラグが重要」な場面で有利
- RoPE(Rotary PE):複素回転を埋め込みに掛ける。LLaMA / PatchTST 系で採用
時系列では 季節周期に合わせた sin/cos PE や 時間特徴量(曜日・月・祝日)を別チャネルで連結 する設計が安定します。これは STL 分解 + GBDT 残差 の発想に近い特徴量設計です。
時系列固有の工夫
Causal Mask / Look-ahead Mask
時系列予測では「未来の情報を見てはいけない」制約があります。Decoder(または autoregressive Encoder)で Self-Attention を計算する際、上三角行列をマスクして Softmax の前に \(-\infty\) を代入します:
\[ \mathrm{Mask}_{ij} = \begin{cases} 0 & \text{if } j \le i \\ -\infty & \text{if } j > i \end{cases} \tag{5} \]これが Causal mask(look-ahead mask)。一括並列計算しつつ自己回帰の因果性を守る仕組みで、PyTorch では torch.nn.Transformer.generate_square_subsequent_mask(T) で 1 行生成できます。
Encoder-Decoder 構造
- Encoder のみ:BERT 型。系列分類・回帰ヘッドを乗せて LSTM 分類 の代替。時系列異常検知 で再構成型に使うと有力
- Decoder のみ:GPT 型。自己回帰的に次トークンを生成。長期予測で誤差蓄積に注意
- Encoder-Decoder:過去の入力系列を Encoder で圧縮、Decoder で未来を生成。Seq2Seq 予測の王道
Informer / Autoformer / PatchTST 簡介
オリジナル Transformer の \(O(T^2)\) ボトルネックを時系列向けに改良したのが以下:
| モデル | 主アイディア | 計算量 | 強み |
|---|---|---|---|
| Informer | ProbSparse Attention(重要 Query のみ計算)+ 蒸留 | \(O(T \log T)\) | 長系列予測(数千ステップ先) |
| Autoformer | Series Decomposition(STL 風トレンド/季節分離)+ Auto-Correlation Attention | \(O(T \log T)\) | 強い季節性データ |
| FEDformer | 周波数領域での疎 Attention(FFT/Wavelet 系の発想) | \(O(T)\) | 周期成分支配の系列 |
| PatchTST | 系列をパッチ化(Vision Transformer 風)+ Channel-Independent | \(O((T/P)^2)\) | 多変量時系列、最近の SOTA 常連 |
| TimesNet | 1D → 2D 変換(周期で折り畳む)+ Inception Block | \(O(T \log T)\) | 多周期・多周波数の同時モデル |
「まず PatchTST、長系列なら Informer、強い季節性なら Autoformer」がざっくりした使い分け。詳細は ML時系列ハブ の Foundation Model 節で扱う Lag-Llama / Chronos / TimesFM へと続きます。
PyTorch 最小実装
torch.nn.TransformerEncoder を使い、ラグ窓 → 次ステップ予測の最小モデルを 60 行で構築します。データ準備は LSTM と同じく合成時系列(トレンド + 季節 + ノイズ)を用います。
import math
import numpy as np
import torch
import torch.nn as nn
from torch.utils.data import DataLoader, TensorDataset
# (1) 合成時系列:トレンド + 季節 + ノイズ
rng = np.random.default_rng(0)
T = 2000
t = np.arange(T)
y = 0.01 * t + 2.0 * np.sin(2 * np.pi * t / 50) + rng.normal(0, 0.3, T)
y = (y - y.mean()) / y.std() # 標準化
# (2) ラグ窓に切る
L, H = 64, 1 # 過去 64 ステップで 1 ステップ先を予測
X = np.stack([y[i - L : i] for i in range(L, T)])
Y = y[L:]
split = int(len(X) * 0.8)
ds_tr = TensorDataset(torch.tensor(X[:split], dtype=torch.float32).unsqueeze(-1),
torch.tensor(Y[:split], dtype=torch.float32))
ds_va = TensorDataset(torch.tensor(X[split:], dtype=torch.float32).unsqueeze(-1),
torch.tensor(Y[split:], dtype=torch.float32))
dl_tr = DataLoader(ds_tr, batch_size=64, shuffle=True)
dl_va = DataLoader(ds_va, batch_size=64)
# (3) Positional Encoding(sin/cos)
class PositionalEncoding(nn.Module):
def __init__(self, d_model, max_len=5000):
super().__init__()
pe = torch.zeros(max_len, d_model)
pos = torch.arange(0, max_len, dtype=torch.float32).unsqueeze(1)
div = torch.exp(torch.arange(0, d_model, 2).float() * -(math.log(10000.0) / d_model))
pe[:, 0::2] = torch.sin(pos * div)
pe[:, 1::2] = torch.cos(pos * div)
self.register_buffer("pe", pe.unsqueeze(0))
def forward(self, x): # x: (B, T, d_model)
return x + self.pe[:, : x.size(1)]
# (4) Encoder-only Transformer 予測器
class TSTransformer(nn.Module):
def __init__(self, d_in=1, d_model=64, nhead=4, num_layers=2, dim_ff=128, dropout=0.1):
super().__init__()
self.proj = nn.Linear(d_in, d_model)
self.pe = PositionalEncoding(d_model)
layer = nn.TransformerEncoderLayer(d_model, nhead, dim_ff, dropout, batch_first=True)
self.encoder = nn.TransformerEncoder(layer, num_layers)
self.head = nn.Linear(d_model, 1)
def forward(self, x): # x: (B, T, 1)
h = self.pe(self.proj(x))
h = self.encoder(h) # (B, T, d_model)
return self.head(h[:, -1, :]).squeeze(-1) # 最後の時刻だけ取り出して回帰
device = "cuda" if torch.cuda.is_available() else "cpu"
model = TSTransformer().to(device)
opt = torch.optim.Adam(model.parameters(), lr=1e-3)
loss_fn = nn.MSELoss()
# (5) 学習ループ
for epoch in range(20):
model.train()
for xb, yb in dl_tr:
xb, yb = xb.to(device), yb.to(device)
opt.zero_grad()
loss = loss_fn(model(xb), yb)
loss.backward()
opt.step()
model.eval()
with torch.no_grad():
mse = np.mean([loss_fn(model(xb.to(device)), yb.to(device)).item() for xb, yb in dl_va])
print(f"epoch {epoch:02d} val MSE {mse:.4f}")
ポイント:
batch_first=Trueを指定すると(B, T, d_model)の自然な形で扱える(デフォルトは(T, B, d_model))- Encoder のみで最後の時刻
h[:, -1, :]を回帰ヘッドに通す「分類トークン風」の設計。Decoder を足せば Seq2Seq に拡張可能 - Causal mask は
nn.Transformer.generate_square_subsequent_mask(L).to(device)をself.encoder(h, mask=mask)に渡す - 多変量入力は
d_inを増やすだけ。PatchTST 風にしたいならL=64を 8 パッチ × 8 ステップにリシェイプ
性能比較は ML時系列ハブの Python 統合評価フレームワーク に組み込んで LSTM / GBDT / ARIMA と並べると効果的です。
LSTM / ARIMA / Transformer 比較表
| 観点 | ARIMA / SARIMA | LSTM | Transformer |
|---|---|---|---|
| モデル種別 | 線形・状態空間 | 非線形・逐次 RNN | 非線形・全結合 Attention |
| 計算複雑度 | \(O(T)\) | \(O(T H^2)\) 逐次 | \(O(T^2 d)\) 並列 |
| 長距離依存 | 弱い(次数で制限) | 中(ゲート機構) | 強い(経路長 \(O(1)\) ) |
| データ要件 | \(\sim 10^2\) 〜 | \(\sim 10^4\) 〜 | \(\sim 10^4\) 〜(事前学習で軽減) |
| 解釈性 | 高(係数 = ラグ寄与) | 低 | 中(Attention 重み) |
| 季節性 | SARIMA で明示 | 暗黙学習 | PE と Autoformer で明示 |
| GPU 並列 | 不要 | 効きにくい | 圧倒的に効く |
| 推奨初手 | 短系列・解釈重視 | 中規模・中期予測 | 長系列・多変量・大データ |
実務では 「ARIMA → GBDT + ラグ特徴量 → LSTM → Transformer」 の順で複雑度を上げ、検証 MSE の改善幅が学習コストに見合うかを毎ステップ確認するのが堅実です。小データなら ガウス過程回帰 で予測区間を出すほうが妥当な場面も多くあります。
過学習・データ量・正則化のコツ
Transformer は表現力が高い反面、データ量に対する飢餓が大きく、素朴に組むと容易に過学習します。
- データ量の目安:単変量 1 系列なら最低 \(10^4\) ステップ、多変量なら系列数 × ステップ数で \(10^5\) オーダーが欲しい。足りなければ PatchTST のチャネル独立化や事前学習済みモデル(Chronos / TimesFM)の Fine-tuning を検討
- Dropout:Attention・FFN 双方に
dropout=0.1〜0.3。Multi-Head の数を増やすほどヘッドあたりのデータが減るので過学習しやすい - Layer Normalization の位置:Pre-LN(残差前に LN)の方が学習が安定。
nn.TransformerEncoderLayer(norm_first=True) - Warmup + Cosine スケジューラ:lr を \(0 \to 1 \times 10^{-3}\) に 1000 ステップで温め、その後 cosine 減衰。Adam 系(特に AdamW)と相性が良い
- ラベル平滑化 / Huber loss:外れ値に強くする
- 早期終了:検証損失が 5〜10 エポック改善しなければ停止。アンサンブル学習 の early stopping と同じ設計
- ハイパパラ探索:
d_model / nhead / num_layers / lookback / lrは ベイズ最適化 で 30〜50 試行回すと実用域に届く - 入力標準化:時系列は平均・分散が時間で動く(非定常)ので、ラグ窓ごとに標準化する Reversible Instance Normalization (RevIN) が PatchTST で標準
入力特徴量側では、生の値だけでなく 自己相関 のピーク位置をラグ選択に使い、STL / EMD / VMD でトレンド・季節成分を分離してチャネルとして連結すると安定します。
応用と限界
応用領域
- 長期予測:エネルギー需要・気象・トラフィック。Informer / Autoformer / PatchTST が主戦場
- 異常検知:再構成誤差ベース。時系列異常検知 の LSTM-AE を Transformer-AE に置換すると長距離パターン崩壊も検出可
- 分類・診断:心電・振動・通信信号。STFT/CWT スペクトログラムを ViT 風に入力するハイブリッドが強い
- マルチモーダル時系列:テキスト + センサ + 画像。LLM の埋め込みを Transformer 時系列に注入する研究が急増
- Foundation Model:Chronos / TimesFM / Lag-Llama / MOIRAI。ゼロショットで予測できる事前学習済みモデルが 2024 年以降爆発的に登場。詳細は DSP × ML 学習ロードマップ を参照
限界と注意点
- 小データでは負ける:1000 サンプル未満なら ARIMA / GBDT / ガウス過程 のほうが安定
- 計算コスト:\(O(T^2)\) メモリ。\(T = 10^4\) で 16GB GPU を食い潰す。FlashAttention / 疎 Attention で緩和
- 解釈性の幻想:Attention 重みは「説明」ではなく「相関」。SHAP や Integrated Gradients を併用し、Random Forest の Permutation Importance のような厳密性は期待しない
- 非定常への弱さ:分布シフトに弱い。RevIN・ドメイン適応・オンライン更新(カルマンフィルタ的逐次推定 との融合)が研究領域
- 離散信号処理との接続:サンプリング・エイリアス・窓関数の理解は依然必須。離散DSP基礎 を踏まえた前処理が品質を左右する
おわりに
Transformer は時系列予測の デフォルト選択肢のひとつ になりつつあり、長距離依存・並列性・多変量への自然な対応で LSTM を多くの場面で凌駕します。一方で「データ量・計算資源・解釈性」のトレードオフは依然として存在し、ARIMA / GBDT / LSTM / ガウス過程 と適材適所で使い分けるのが実務最適です。
次に深掘りする方向としては、(a) PatchTST / TimesNet の実装と評価、(b) Foundation Model の Fine-tuning、(c) 物理モデルとのハイブリッド(カルマン + Transformer)、(d) 不確実性定量化(ベイズ最適化 や ガウス過程 との接合)が挙げられます。
関連記事
- 機械学習による時系列予測・分類・異常検知ハブ — 本記事の親ハブ
- LSTM による時系列予測 — Transformer の比較対象、ゲート機構と Seq2Seq
- ARIMA・SARIMA による時系列予測 — 線形ベースライン
- ガウス過程回帰 — 小データで予測区間が必要なとき
- アンサンブル学習(RF / GBDT / XGBoost) — 表形式時系列の万能解
- ベイズ最適化 — Transformer のハイパパラ探索
- モンテカルロ最適化(SGD・NN 学習の基礎) — 確率的勾配の理論
- 自己相関とラグ選択 — lookback 長の決定に
- 離散DSP基礎ハブ — サンプリング・離散時間信号の基礎
- 時間周波数解析ハブ(FFT / STFT / Wavelet) — Attention の周波数的解釈
- EMD・VMD・SSA によるモード分解 — Autoformer の Series Decomposition と接続
- 時系列異常検知 — Transformer-AE への自然な発展
- DSP × ML 学習ロードマップ — Foundation Model へのメタ動線
- RTS スムーザ — オフライン平滑化と Encoder-Decoder の対比