ある電力会社のエンジニアが、来週の電力需要を予測するモデルを構築しなければならないとします。過去の電力消費データは十分にありますが、気温、曜日、祝日、産業活動など、需要に影響を与える要因は膨大で、ARIMAのような古典的手法では捉えきれない複雑なパターンが潜んでいます。一方で、別の会社が構築した交通量予測モデルや、気象予報で使われている時系列モデルには、「長期依存性の捉え方」や「周期性の抽出方法」など、電力需要予測にも通じる共通の知識が含まれているはずです。もし、膨大な種類の時系列データで事前学習された汎用モデルがあり、それを電力需要データにゼロショットで適用できたらどうでしょうか。
これがまさに時系列基盤モデル(Time Series Foundation Models)の発想です。自然言語処理における GPT や BERT、画像認識における ViT や CLIP のように、大規模データで事前学習した汎用モデルを、個別のドメインにゼロショットまたは少量のファインチューニングで適用する — このパラダイムが、いま時系列分析の世界にも広がりつつあります。

発想は上の図の通りです。電力・気象・株価・交通量・センサなど多様なドメインの時系列で1つのモデルを大規模に事前学習し、「時系列の普遍的なパターン」を獲得します。学習後は、未知のドメインにゼロショット(または少量のファインチューニング)で適用できます。NLPのGPTや画像のCLIPと同じ発想を時系列に持ち込むものです。
時系列基盤モデルを理解すると、以下のような応用に直接つながります。
- エネルギー・電力需要予測: 過去の電力消費パターンから将来需要を予測し、発電計画や再生可能エネルギーの統合を最適化します。ドメイン固有の学習なしに、事前学習済みモデルでゼロショット予測が可能になります
- 金融市場のリスク管理: 株価・為替・コモディティの複雑な時系列パターンから、異常検知やボラティリティ予測を行います。多様な市場で学習した基盤モデルは、新興市場のデータが少ない場面でも威力を発揮します
- 産業機器・インフラ監視: 設備の多変量センサデータ(温度、電力、振動など)は典型的な多変量時系列であり、異常検知や残寿命予測に基盤モデルの適用が始まっています
- 医療・バイタルサイン監視: 心電図、脳波、血圧などの生体信号をリアルタイムで解析し、異常の早期発見に活用します
本記事の内容
- 時系列基盤モデルとは何か — 事前学習と汎化の考え方
- なぜ時系列に基盤モデルが必要なのか — NLP・画像との違い
- Informer・Autoformer・FEDformerの長系列Transformer
- PatchTSTのパッチ化とチャネル独立性 — 重要なブレイクスルー
- iTransformerの「変数=トークン」という逆転の発想
- TimesFM(Google)・Chronos(Amazon)・Lag-Llama・Moiraiの大規模事前学習モデル
- パッチ化・チャネル設計・事前学習戦略の設計思想
- TRACEとの接続 — 基盤モデルの検索拡張
- Pythonによるゼロショット予測の実装
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。


時系列基盤モデルとは何か
基盤モデルのパラダイム
自然言語処理の世界で起きた革命を振り返りましょう。GPTやBERTが登場する以前、NLPタスクごとに専用のモデルを一から訓練するのが常識でした。感情分析には感情分析モデル、機械翻訳には翻訳モデル、要約には要約モデル — それぞれが別々のアーキテクチャとデータで訓練されていました。ところが、大規模なテキストコーパスで事前学習した基盤モデルが登場すると、状況は一変しました。1つのモデルが「言語の構造」を汎用的に理解し、少量のファインチューニングで多様なタスクに適応できるようになったのです。
時系列基盤モデルは、このパラダイムを時系列データに持ち込もうとするものです。電力需要、気温変化、株価変動、センサデータ、交通量 — あらゆるドメインの時系列データで事前学習し、「時系列データの普遍的なパターン」を獲得したモデルを目指します。
数学的に表現すると、時系列基盤モデルは次のようなフレームワークで考えることができます。時系列データ $\bm{x}_{1:T} = (x_1, x_2, \dots, x_T)$ が与えられたとき、事前学習済みエンコーダ $f_\theta$ が時系列を潜在表現 $\bm{z}$ にマッピングします。
$$ \bm{z} = f_\theta(\bm{x}_{1:T}) $$
この潜在表現 $\bm{z}$ は、ドメインによらず時系列の本質的な構造(トレンド、周期性、自己相関、非定常性など)を捉えています。下流タスク(予測、分類、異常検知など)には、タスク固有の軽量なヘッドを付けるか、ゼロショットでそのまま利用します。
「時系列の事前学習」の意味
NLPの基盤モデルが「次の単語を予測する」という普遍的なタスクで事前学習されるように、時系列基盤モデルも普遍的な学習目標を必要とします。しかし、ここに時系列固有の難しさがあります。テキストは離散的なトークン列であり、語彙辞書という共通の記号体系が存在します。一方、時系列データは連続値であり、ドメインによってスケール、サンプリング周波数、チャネル数がまったく異なります。
この違いにもかかわらず、時系列データには驚くほど多くの共通構造があります。トレンドの存在、季節性周期、自己相関の減衰、レジームチェンジ — これらのパターンは電力需要でも株価でも気温でも観測されます。時系列基盤モデルの根底にあるのは、「これらの共通構造を大量の多様なデータから抽出すれば、未知のドメインにも適用できる汎用的な表現が得られる」という仮説です。
では、なぜ従来のTransformerをそのまま適用するだけでは不十分なのでしょうか。次節で、時系列データに固有の課題を見ていきます。
なぜ時系列に基盤モデルが必要なのか — NLP・画像との本質的な違い
時系列データにTransformerを適用する試みは2019年頃から始まりましたが、NLPや画像認識のTransformerをそのまま持ち込むだけでは、いくつかの根本的な問題にぶつかります。
系列長の壁
Self-Attentionの計算量は系列長 $L$ に対して $O(L^2)$ です。NLPでは文の長さがせいぜい数百〜数千トークンですが、時系列データは1時間に3,600点(1Hz)、1日に86,400点というスケールになり得ます。電力需要の1年分データを1時間刻みで扱うだけでも $L = 8,760$ であり、これに対するフルAttentionの計算は現実的ではありません。
連続値とドメイン間の異質性
テキストは語彙辞書の中のトークンIDに変換できますが、時系列は連続値です。気温は $-40$ ℃から $+50$ ℃、株価は数円から数万円、加速度は $\pm 20$ g — ドメインごとにスケールが全く異なります。さらに、同じ「上昇トレンド」でも、気温の0.1℃/時間と株価の5%/日では数値の意味が全く違います。基盤モデルは、この異質性を超えて共通のパターンを学ぶ必要があります。
チャネル構造の複雑さ
画像のRGBチャネルは常に3つで、各チャネルの意味(赤・緑・青)は画像間で共通です。しかし、時系列データのチャネル数はデータセットごとに異なり、各チャネルの意味も異なります。気象データは(気温、湿度、気圧、風速)の4チャネルかもしれませんし、工場の設備モニタリングは100を超えるセンサチャネルを持つかもしれません。基盤モデルは、任意のチャネル数と構成に対応する柔軟性が求められます。
非定常性
テキストや画像のデータ分布は(大域的には)時間によって大きく変化しませんが、時系列データは本質的に非定常です。電力需要の統計的性質は季節、曜日、年によって変化し、株価のボラティリティはレジームによって劇的に変わります。事前学習で獲得した表現が、非定常なデータにも適応できるかどうかは重要な課題です。

上の図が、NLPや画像のTransformerをそのまま持ち込めない4つの理由です。①系列長に対してAttentionが $O(L^2)$ で爆発する、②連続値でスケールがドメイン毎に全く違う、③チャネル数も意味も可変、④分布が時間とともに変わる非定常性。これらに対処する工夫が、以降の各手法の出発点になります。
これらの課題に対して、研究コミュニティは2020年以降、数多くのアーキテクチャを提案してきました。まずは、長系列時系列に対するTransformerの効率化から歴史を辿りましょう。
Informer — ProbSparse Attentionによる長系列予測の突破口
背景と動機
2021年にAAAIで発表されたInformer(Zhou et al., 2021)は、長系列時系列予測(Long Sequence Time-series Forecasting, LSTF)に対する最初の本格的なTransformerベースのアプローチです。従来のRNNベースの手法(LSTMやGRU)は、系列が長くなると勾配消失によって長期依存性を捉えることが困難でした。Transformerは理論上、系列長に関係なく任意の2点間の依存関係を捉えられますが、$O(L^2)$ の計算量が壁になっていました。
Informerの核心的な洞察は、「Self-Attentionにおいて、実際に支配的な役割を果たすのは少数のQuery-Keyペアだけである」ということです。多くのQueryは、Keyに対してほぼ一様な分布のAttentionスコアを持ち、有用な情報をほとんど抽出していません。この疎な構造を活用すれば、計算量を劇的に削減できます。
ProbSparse Attention
Informerは、各Queryの「重要度」をKL divergenceで測定し、一様分布からの乖離が大きいQueryだけをアクティブに処理するProbSparse Attentionを提案しました。
通常のSelf-Attentionでは、Query $\bm{Q} \in \mathbb{R}^{L \times d}$、Key $\bm{K} \in \mathbb{R}^{L \times d}$、Value $\bm{V} \in \mathbb{R}^{L \times d}$ に対して次のように計算します。
$$ \text{Attention}(\bm{Q}, \bm{K}, \bm{V}) = \text{softmax}\left(\frac{\bm{Q}\bm{K}^\top}{\sqrt{d}}\right)\bm{V} $$
この計算量は $O(L^2 d)$ です。ProbSparse Attentionでは、まず各Queryの「疎性スコア」$M(q_i, \bm{K})$ を定義します。
$$ M(q_i, \bm{K}) = \max_j \left(\frac{q_i k_j^\top}{\sqrt{d}}\right) – \frac{1}{L}\sum_{j=1}^{L}\frac{q_i k_j^\top}{\sqrt{d}} $$
この式は、$i$ 番目のQueryのAttentionスコアの最大値と平均値の差を計算しています。直感的には、特定のKeyに強く注目しているQueryほどスコアが高くなります。逆に、すべてのKeyにほぼ均等にAttentionを割り振っているQueryはスコアが低く、一様分布に近いため情報をほとんど抽出していません。
上位 $u = c \cdot L \ln L$ 個のQueryだけを選びフルAttentionを計算し、残りのQueryには平均値を割り当てることで、計算量を $O(L \ln L)$ に削減します。

図のように、通常のAttention(左)は全Query×全Keyを計算しますが、実際に特定のKeyへ強く注目している「重要なQuery」はごく一部です。ProbSparse Attention(右)はその少数のQueryだけをフル計算し、残りは平均で済ませることで $O(L\ln L)$ に削減します。
蒸留(Distilling)操作
Informerはもうひとつ重要な工夫として、エンコーダ内に蒸留操作を導入しています。各Attentionレイヤの出力に対して1D畳み込みとMaxPoolingを適用し、系列長を半分に縮小します。
$$ \bm{X}_{l+1} = \text{MaxPool}\left(\text{ELU}\left(\text{Conv1d}(\bm{X}_l^{\text{Attn}})\right)\right) $$
$L$ 層のスタックで系列長は $L \to L/2 \to L/4 \to \dots$ と幾何的に減少するため、エンコーダ全体の計算量もさらに改善されます。この蒸留操作は、冗長な情報を段階的に削ぎ落とし、支配的な特徴のみを残すことで、メモリ使用量の削減にも貢献します。
Informerは長系列予測における Transformer の実用性を示した先駆的な研究ですが、アーキテクチャがやや複雑で、後続の研究では「そもそも時系列の構造をもっと直接的に活用できるのではないか」という問いが生まれました。次に紹介するAutoformerは、時系列データの周期構造を直接モデルに組み込んだアプローチです。
Autoformer と FEDformer — 周期性と周波数構造の活用
Autoformer: 自己相関機構
Autoformer(Wu et al., NeurIPS 2021)は、時系列データに本来備わっている周期性をAttention機構に直接組み込むことで、Informerとは異なるアプローチで長系列予測に取り組みました。
時系列データの多くは周期性を持っています。電力需要は24時間周期、気温は年周期、交通量は1週間周期を示します。Autoformerは、この周期性を自己相関(Auto-Correlation) という操作でAttentionの代わりに利用します。
通常のSelf-Attentionが「各時点が他のどの時点に注目すべきか」を点ごとに計算するのに対し、Auto-CorrelationはWiener-Khinchinの定理を利用して、系列全体の周期的類似性を効率的に計算します。
$$ \mathcal{R}_{XX}(\tau) = \mathcal{F}^{-1}\left(\mathcal{F}(\bm{X}) \cdot \overline{\mathcal{F}(\bm{X})}\right) $$
ここで $\mathcal{F}$ はフーリエ変換、$\overline{\cdot}$ は複素共役を表します。この自己相関関数 $\mathcal{R}_{XX}(\tau)$ から上位 $k$ 個のラグ $\tau_1, \tau_2, \dots, \tau_k$ を選び、それらのラグに対応する周期でサブ系列を集約します。FFTを用いることで計算量は $O(L \log L)$ に抑えられます。
もうひとつの重要な設計がシリーズ分解ブロックです。各Attentionレイヤの前後で、時系列をトレンド成分 $\bm{X}_t$ と季節成分 $\bm{X}_s$ に分解します。
$$ \bm{X}_t = \text{AvgPool}(\text{Padding}(\bm{X})), \quad \bm{X}_s = \bm{X} – \bm{X}_t $$
移動平均でトレンドを抽出し、残差を季節成分とするシンプルな方法ですが、これをTransformerの各ブロックに挿入することで、モデルが段階的にトレンドと季節性を分離・洗練していきます。

図のように、時系列を移動平均で「トレンド成分」と「季節成分」に分解し、各ブロックで段階的に洗練します。さらに自己相関をFFTで計算することで、点ごとのAttentionではなく系列全体の周期的類似性を $O(L\log L)$ で捉えます。

FEDformer: 周波数領域での強化
FEDformer(Zhou et al., ICML 2022)は、Autoformerの周期性活用をさらに推し進め、周波数領域で直接Attentionを計算するというアイデアを導入しました。
時系列データの重要な情報の多くは、少数の周波数成分に集中しています。FEDformerは、フーリエ変換またはウェーブレット変換で時系列を周波数領域に変換し、少数の周波数成分だけでAttentionを計算します。
$$ \bm{Q}_f = \mathcal{F}(\bm{Q}), \quad \bm{K}_f = \mathcal{F}(\bm{K}) $$
周波数領域でランダムに $s$ 個の周波数成分を選択してAttentionを計算し、逆フーリエ変換で時間領域に戻します。
$$ \bm{A}_f = \bm{Q}_f \odot \overline{\bm{K}_f}, \quad \text{Output} = \mathcal{F}^{-1}(\bm{A}_f \odot \bm{V}_f) $$
計算量は $O(L)$ の線形になります。ただし、ランダムな周波数選択によって一部の情報が失われる可能性があり、後続のPatchTSTは「Attentionを効率化する」方向ではなく、「入力をパッチ化して系列長を短くする」という全く異なるアプローチで問題を解決しました。
ここまでInformer、Autoformer、FEDformerという3つの「効率的なAttention」のアプローチを見てきました。いずれも $O(L^2)$ の壁を打破する工夫ですが、2023年に発表されたPatchTSTは、問題のフレーミングそのものを変えることで、シンプルかつ強力なブレイクスルーを達成しました。
PatchTST — パッチ化とチャネル独立性がもたらしたブレイクスルー
「パッチ」という発想
PatchTST(Nie et al., ICLR 2023)は、時系列基盤モデルの歴史における最も重要なブレイクスルーの一つです。その核心的なアイデアは、驚くほどシンプルです。
画像認識の世界で、Vision Transformer(ViT)は画像を16×16ピクセルのパッチに分割し、各パッチを1つのトークンとしてTransformerに入力しました。224×224の画像は196個のトークンに変換され、フルAttentionが計算可能になります。PatchTSTは、この「パッチ化」のアイデアを時系列データに適用しました。
長さ $L$ の時系列を、パッチ長 $P$、ストライド $S$ で分割すると、$N = \lfloor (L – P) / S \rfloor + 1$ 個のパッチが得られます。
$$ \bm{p}_i = (x_{(i-1)S+1}, x_{(i-1)S+2}, \dots, x_{(i-1)S+P}) \in \mathbb{R}^P, \quad i = 1, 2, \dots, N $$
例えば、$L = 512$ の時系列を $P = 16$、$S = 8$ で分割すると、$N = 63$ 個のパッチになります。各パッチは線形射影で $d$ 次元の埋め込みに変換されます。
$$ \bm{e}_i = \bm{W}_p \bm{p}_i + \bm{b}_p \in \mathbb{R}^d $$
ここで $\bm{W}_p \in \mathbb{R}^{d \times P}$ が射影行列です。Attentionの計算量は $O(N^2 d)$ となり、元の $O(L^2 d)$ に比べて $(L/N)^2 \approx (S)^2$ 倍程度の削減が見込めます。$L = 512$、$N = 63$ の場合、計算量は約66分の1になります。
パッチ化が有効な理由は、単なる計算量削減にとどまりません。時系列データの各個別点(例えば $x_{42}$)は、それ単体ではほとんど意味を持ちません。しかし、16個の連続する点をまとめたパッチは、「上昇トレンド」「周期的変動の1周期」「急激なスパイク」といった局所パターンを内包しています。つまり、パッチ化は意味的に豊かなトークンを生成するのです。これはViTで画像パッチが個別ピクセルより豊かな視覚情報を持つのとまったく同じ理屈です。
チャネル独立性(Channel Independence)
PatchTSTのもう一つの重要な設計決定がチャネル独立(Channel-Independent, CI)処理です。多変量時系列 $\bm{X} \in \mathbb{R}^{C \times L}$($C$ チャネル、長さ $L$)が与えられたとき、PatchTSTは各チャネルを独立にパッチ化し、同じTransformerに通します。
$$ \bm{z}_c = f_\theta(\text{Patch}(\bm{X}_c)), \quad c = 1, 2, \dots, C $$
全チャネルが同じパラメータ $\theta$ を共有するため、チャネル数が変わってもモデル構造を変更する必要がありません。これは基盤モデルとしての汎用性にとって極めて重要です。
直感的に不思議に感じるかもしれません。チャネル間の相関を無視して良いのでしょうか。例えば気温と湿度には強い相関がありますが、チャネル独立処理ではこの相関を明示的にモデル化しません。
しかし、実験結果はチャネル独立処理が多くの場合でチャネル混合(Channel-Dependent, CD)処理を上回ることを示しています。これには2つの理由が考えられます。第一に、チャネル数が多い場合、チャネル間Attentionのトークン数が爆発的に増加し、学習が不安定になります。第二に、チャネル独立処理はデータ拡張としても機能します。$C$ チャネルの時系列は、$C$ 個の独立した訓練サンプルとして扱われるため、実効的な学習データ量が $C$ 倍になるのです。
PatchTSTの事前学習
PatchTSTは、Masked AutoencoderのアイデアをPatch化された時系列に適用した自己教師あり事前学習も提案しています。

パッチ列 $(\bm{p}_1, \bm{p}_2, \dots, \bm{p}_N)$ の一部をランダムにマスクし、残りの可視パッチからマスクされたパッチを復元するように学習します。損失関数はMSEです。
$$ \mathcal{L}_{\text{mask}} = \frac{1}{|\mathcal{M}|} \sum_{i \in \mathcal{M}} \|\bm{p}_i – \hat{\bm{p}}_i\|^2 $$
ここで $\mathcal{M}$ はマスクされたパッチのインデックス集合、$\hat{\bm{p}}_i$ はモデルの予測です。マスク率は40%程度が最適とされています(画像のMAEの75%より低い理由は、時系列パッチの情報密度が画像パッチより高いためです)。
PatchTSTの成功は、時系列のTransformerにおけるパッチ化の重要性を確立しました。以降、ほぼ全ての時系列基盤モデルがパッチ化を採用することになります。では、パッチ化の次に生まれた革新的な発想を見てみましょう。
iTransformer — 変数=トークンという逆転の発想
2024年にICLRで発表されたiTransformer(Liu et al., 2024)は、Transformerの入力設計に対する根本的な再考を提案しました。
通常の時系列Transformer(PatchTSTを含む)では、時間方向のトークン列を処理します。各トークンは「ある時点(またはパッチ)における値」を表し、Self-Attentionは時間方向の依存関係を捉えます。しかしiTransformerは、変数(チャネル)をトークンとして扱い、Self-Attentionでチャネル間の依存関係を捉えるという逆転のアプローチをとりました。
多変量時系列 $\bm{X} \in \mathbb{R}^{C \times L}$ に対して、各変数 $\bm{X}_c \in \mathbb{R}^L$($c = 1, \dots, C$)を1つのトークンとみなします。各変数の全時間ステップをまとめて線形射影で $d$ 次元に埋め込みます。
$$ \bm{h}_c = \bm{W}_e \bm{X}_c + \bm{b}_e \in \mathbb{R}^d, \quad c = 1, 2, \dots, C $$
ここで $\bm{W}_e \in \mathbb{R}^{d \times L}$ は線形射影です。トークン列 $(\bm{h}_1, \bm{h}_2, \dots, \bm{h}_C)$ に対してSelf-Attentionを適用し、チャネル間の相互作用を学習します。
$$ \text{Attention}(\bm{Q}_c, \bm{K}_c, \bm{V}_c) = \text{softmax}\left(\frac{\bm{Q}_c \bm{K}_c^\top}{\sqrt{d}}\right)\bm{V}_c $$
Attentionの計算量は $O(C^2 d)$ であり、系列長 $L$ に依存しません。変数数 $C$ は通常 $L$ よりはるかに小さいため、計算効率が大幅に改善されます。一方、時間方向のパターン抽出はFeed-Forward Networkが担います。各トークン(変数)に対してMLPが適用されることで、トレンドや周期性といった時間的特徴が獲得されます。
iTransformerの設計は、「Self-Attentionは何を関連づけるべきか」という問いに対する興味深い回答です。PatchTSTが「時間方向のパッチ間の関係」を重視したのに対し、iTransformerは「変数間の関係」を重視します。どちらが優れているかはデータセットの性質に依存し、変数間の相互作用が強い場合(例えば多変数の気象データ)にはiTransformerが有利で、長い時間依存性が重要な場合(例えば単変量の電力需要)にはPatchTSTが有利な傾向があります。

図の対比が分かりやすいでしょう。従来(左)は時間方向のパッチをトークンにしてAttentionで時間依存を捉えます。iTransformer(右)は逆に変数(チャネル)をトークンにし、Attentionで変数間の依存を捉え、時間方向はFFNが担います。計算量は $O(C^2)$ で系列長 $L$ に依存しません。
ここまで紹介した手法(Informer、Autoformer、FEDformer、PatchTST、iTransformer)は、主に「アーキテクチャの革新」に焦点を当てたものでした。しかし、2024年に入ると、研究の焦点は「大規模データでの事前学習」に移り、NLPのGPTやLLaMAに匹敵する、真の意味での「時系列基盤モデル」が登場します。
TimesFM — Googleの大規模事前学習デコーダモデル
設計思想
TimesFM(Time Series Foundation Model, Das et al., 2024)は、Google Researchが発表した時系列基盤モデルです。200Mパラメータのデコーダ専用Transformer(decoder-only)を、1000億時点以上の多様な時系列データで事前学習しました。
TimesFMの設計思想は、LLMの成功に直接触発されています。GPTが「次のトークンを予測する」という単純な目的関数で言語の深い構造を学んだように、TimesFMは「次のパッチを予測する」というタスクで時系列の汎用的なパターンを学びます。
具体的には、入力時系列をパッチに分割し、因果マスクを用いたデコーダTransformerで次のパッチを自己回帰的に予測します。
$$ p(\bm{p}_{i+1} | \bm{p}_1, \bm{p}_2, \dots, \bm{p}_i) = f_\theta(\bm{p}_1, \bm{p}_2, \dots, \bm{p}_i) $$
LLMとの重要な違いは、出力が離散トークンではなく連続値のパッチである点です。出力層は線形射影であり、損失関数はMSEです。
出力パッチ長の柔軟性
TimesFMの重要な工夫として、出力パッチ長の柔軟性があります。推論時に、1ステップ先から任意のホライズンまでの予測を、出力パッチ長を変えることで対応します。学習時には複数の出力パッチ長でランダムに学習することで、推論時の柔軟性を確保しています。
事前学習データ
TimesFMの事前学習データは以下の3つのソースから構成されています。
- Google Trends: 検索キーワードのトレンドデータ(多様なドメインの周期性・トレンドを含む)
- Wiki Pageviews: Wikipediaの記事閲覧数(イベント駆動のスパイクパターン)
- 合成データ: ARIMA、指数平滑化、ガウス過程などの統計モデルから生成した合成時系列
合成データの組み入れは特に注目に値します。統計モデルのパラメータをランダムに変えることで、トレンド、季節性、ノイズレベルの多様な組み合わせを生成でき、実データだけでは不足するパターンのカバレッジを補完します。
TimesFMはゼロショットで多くのベンチマークデータセットにおいて、教師あり学習モデル(当該データセットで直接訓練されたモデル)と同等以上の性能を達成しました。これは、時系列基盤モデルの実用性を示す強力な証拠です。
次に紹介するChronosは、TimesFMとは異なる戦略 — 連続値のトークン化 — で事前学習に取り組みます。
Chronos — 連続値のトークン化とT5ベースの基盤モデル
時系列の「言語化」
Chronos(Ansari et al., 2024)は、Amazon Scienceが発表した時系列基盤モデルで、時系列基盤モデルの設計に対するまったく異なるアプローチを採用しています。TimesFMが連続値のまま処理するのに対し、Chronosは連続値を離散トークンに変換し、既存のLLMアーキテクチャ(T5)をそのまま活用するという大胆な戦略をとりました。
その核心はスケーリングと量子化(Scaling and Quantization)です。まず、時系列をゼロ平均・単位分散に正規化します。
$$ \tilde{x}_t = \frac{x_t – \mu}{\sigma + \epsilon} $$
ここで $\mu$ と $\sigma$ はコンテキストウィンドウ内の平均と標準偏差、$\epsilon$ は数値安定性のための小さな定数です。
次に、正規化された値をビン(bin)に量子化します。$B$ 個のビンの境界を定義し、各値を最も近いビンのインデックスにマッピングします。
$$ \text{token}_t = \text{Quantize}(\tilde{x}_t) \in \{1, 2, \dots, B\} $$
Chronosはデフォルトで $B = 4096$ ビンを使用し、ビンの境界は正規分布の分位点に基づいて設定されます。量子化は情報の損失を伴いますが、ビン数を十分に大きくすれば、実用上の精度低下は無視できるレベルに抑えられます。
T5アーキテクチャの活用
量子化によって時系列が離散トークン列に変換されたら、あとは通常のシーケンスモデリングです。ChronosはT5(Encoder-Decoderアーキテクチャ)を採用し、入力トークン列からのクロスアテンションを用いて出力トークン列を自己回帰的に生成します。
出力はカテゴリカル分布として予測されます。
$$ p(y_{t+1} = b | \bm{x}_{1:t}) = \text{softmax}(\bm{W}_o \bm{h}_t + \bm{b}_o)_b $$
$B$ クラスの分類問題として予測を行い、損失関数はクロスエントロピーです。
$$ \mathcal{L} = -\sum_{t=1}^{T} \log p(y_t = b_t^* | \bm{x}_{1:t-1}) $$
ここで $b_t^*$ は正解のビンインデックスです。
確率的予測
Chronosの大きな利点は、自然に確率的予測が得られることです。各ステップでカテゴリカル分布が出力されるため、そこからサンプリングを繰り返すことで、予測の不確実性を表す予測分布が得られます。20回サンプリングすれば、予測値の分位点(50%点、90%区間など)を計算できます。
$$ \hat{x}_{t+1}^{(s)} = \text{Dequantize}\left(\text{Sample}\left(p(\cdot | \bm{x}_{1:t})\right)\right), \quad s = 1, \dots, S $$
Chronosは20Mから710Mまで複数のモデルサイズで提供されており、小さなモデルでも驚くほど良い性能を発揮します。NLPのスケーリング則が時系列でも成立することの証拠として注目されています。
Chronosのトークン化アプローチは、既存のLLMの学習インフラをそのまま活用できるという実用的な利点も持っています。では、LLMのアーキテクチャ自体に着想を得た別のモデルも見てみましょう。
Lag-Llama・Timer・Moirai — 2024年の最前線
Lag-Llama: LLMからの確率的予測
Lag-Llama(Rasul et al., 2024)は、LLaMAアーキテクチャを時系列の確率的予測に適用したモデルです。名前の通り、ラグ特徴量(lag features)を入力トークンの構成に組み込んでいる点が特徴です。
通常のLLMが前のトークン列をコンテキストとするのに対し、Lag-Llamaは各時点 $t$ で、過去のラグ値 $x_{t-1}, x_{t-7}, x_{t-14}, x_{t-30}, x_{t-365}$ などを特徴ベクトルとして構成します。これにより、日次・週次・月次・年次の周期性を明示的にモデルに提供します。
出力は分布パラメータの予測です。例えばStudentのt分布を仮定する場合、各時点で自由度 $\nu_t$、位置パラメータ $\mu_t$、スケールパラメータ $\sigma_t$ を予測します。
$$ x_t \sim \text{Student-t}(\nu_t, \mu_t, \sigma_t), \quad (\nu_t, \mu_t, \sigma_t) = g_\theta(\bm{h}_t) $$
損失関数は負の対数尤度です。
$$ \mathcal{L} = -\sum_{t=1}^{T} \log p(x_t | \nu_t, \mu_t, \sigma_t) $$
Timer: 単一系列シーケンスモデリング
Timer(Liu et al., 2024)は、GPTスタイルの「次トークン予測」を時系列に直接適用するアプローチです。TimesFMと類似していますが、特に単一系列(Single-Series)のモデリングに焦点を当て、各時系列を1つの「文章」のように扱います。
Timerの重要な貢献は、異なるデータセットの時系列を連結して1つの長い系列として学習するS4(Single Series Sequence to Sequence)フレームワークです。異なるデータセット間にはスペシャルトークンを挿入して境界を示します。
Moirai: 任意チャネル数への対応
Moirai(Woo et al., 2024)は、Salesforce AIが発表した時系列基盤モデルで、Any-Variate Attentionという機構によって、任意のチャネル数の多変量時系列を処理できます。
従来の多変量モデルの多くは、学習時と推論時でチャネル数が固定されている必要がありました。Moiraiは、各チャネルのパッチを独立にトークン化した後、チャネル間の関係をAttentionで学習するハイブリッドなアプローチをとります。
$$ \bm{H} = \text{Attention}(\bm{Q}_{1:C}, \bm{K}_{1:C}, \bm{V}_{1:C}) $$
各チャネルのトークンにチャネルIDの埋め込みを付与することで、Attentionが「どのチャネルの情報か」を識別できるようにしています。これにより、学習時に見たことのないチャネル構成に対しても、ゼロショットで適応可能です。
Moiraiはまた、出力分布として混合分布を採用しています。Studentのt分布、正規分布、負の二項分布などの混合により、データの特性に応じた柔軟な確率的予測を実現します。
2024年のこれらのモデルを俯瞰すると、時系列基盤モデルの設計空間には「パッチ化」「チャネル処理」「事前学習戦略」という3つの軸が見えてきます。次節以降で、これらの設計軸を体系的に整理します。
パッチ化 — 時系列基盤モデルの共通基盤
ここまで紹介したモデルの多く(PatchTST、TimesFM、Chronos、Timer、Moirai)がパッチ化を採用しています。パッチ化がこれほど広く受け入れられた理由を、3つの観点から整理しましょう。
1. 意味的な情報密度の向上
個々の時点の値 $x_t$ には意味がほとんどありませんが、16個の連続点を束ねたパッチ $\bm{p}_i = (x_{t}, x_{t+1}, \dots, x_{t+15})$ には「上昇トレンド」「局所的な振動」「急激なスパイク」といった局所パターンが含まれています。これはNLPにおける文字とサブワードの関係に似ています。個々の文字(a, b, c)は意味を持ちにくいですが、サブワード(un-, -tion, pre-)には意味的な情報が含まれます。パッチ化は、時系列におけるサブワード分割の役割を果たしているのです。
2. 計算量の大幅削減
長さ $L$ の系列をパッチ長 $P$、ストライド $S$ で分割すると、トークン数は $N \approx L/S$ に減少します。Attentionの計算量は $O(N^2)$ なので、$S = P$ の場合に $(L/P)^2$ 倍の削減になります。$L = 1024$、$P = 16$ なら、$64^2 = 4096$ トークンから $64^2 = 4096$ …ではなく、元の $1024^2 \approx 10^6$ が $64^2 = 4096$ に削減されるので、約250倍の計算量削減です。
3. 局所的な時間構造の保存
パッチの中の点はローカルなコンテキストを共有しています。通常のTransformerでは $x_t$ と $x_{t+1}$ の近接性は位置エンコーディングでしか伝わりませんが、同じパッチ内の点は物理的にひとつのトークンに含まれるため、局所的な時間構造が自然に保存されます。
パッチサイズの選択はハイパーパラメータですが、実践的には $P = 16$ または $P = 32$、ストライドは $S = P$(非重複)または $S = P/2$(50%重複)がよく使われます。パッチが大きすぎると細かいパターンが1つのトークンに埋もれ、小さすぎるとトークン数の削減効果が薄れます。
パッチ化の設計が固まったところで、次にもう1つの重要な設計軸であるチャネル処理について、より深く議論しましょう。
チャネル独立 vs チャネル混合 — 設計思想の対立
多変量時系列を扱う際、チャネル間の関係をどのように処理するかは、最も議論が活発な設計選択の1つです。
チャネル独立(Channel-Independent, CI)
PatchTSTが採用したアプローチです。各チャネルを別々の単変量時系列として扱い、同じモデルに独立に通します。
利点: – チャネル数に依存しない — 学習時と推論時でチャネル数が異なっても良い – データ拡張効果 — $C$ チャネルで学習データが実効 $C$ 倍 – 過学習の抑制 — チャネル間の疑似相関を学習しない – 基盤モデルの汎用性 — 任意のチャネル構成に適用可能
欠点: – チャネル間の相互作用(例: 気温と湿度の負の相関)を捉えられない – チャネル数が少ない場合のデータ拡張効果が限定的
チャネル混合(Channel-Dependent, CD)
iTransformerやMoiraiが採用したアプローチです。全チャネルの情報を統合してAttentionで処理します。
利点: – チャネル間の相関・因果関係を明示的にモデル化 – 例: ある変数の将来値が別の変数の過去値に依存する場合
欠点: – チャネル数が固定される — 新しいチャネル構成への適応が困難 – チャネル数が多い場合の計算量増大 – 訓練データに含まれないチャネル間関係への汎化が困難
ハイブリッドアプローチ
最近の研究では、両方の利点を組み合わせるアプローチが模索されています。MoiraiのAny-Variate Attentionや、TRACEのChannel Identity Token(CIT)は、チャネル独立的な処理を基本としつつ、Attentionでチャネル間の情報を選択的に統合するハイブリッド設計です。

実践的なガイドラインとしては、以下のようにまとめられます。
- チャネル数が変わりうる場面: CI を選択(基盤モデル的な用途)
- 固定チャネルで相関が重要: CD を選択(ドメイン固有モデル)
- 両方の利点が必要: ハイブリッド設計(CIT付きCI等)

図に3方式をまとめました。チャネル独立(左)は各chを共有モデルに別々に通すため汎用的でデータ拡張効果もありますが相関は捉えません。チャネル混合(中央)は全chをまとめてAttentionで相関を捉えますがチャネル数が固定されます。ハイブリッド(右)は独立処理を基本に、CIT等で選択的にch間情報を統合する折衷案です。
チャネル処理の設計を理解した上で、次はモデルを「汎用的」にするための学習戦略 — 事前学習の方法について見ていきましょう。
事前学習戦略 — 時系列の汎用表現をどう獲得するか
時系列基盤モデルの事前学習には、大きく3つの戦略があります。NLPや画像の基盤モデルで確立された戦略を時系列に適応させたものですが、それぞれに時系列固有の工夫が加えられています。
1. マスク再構成(Masked Reconstruction)
BERTやMAEの成功に触発されたアプローチで、PatchTSTやTRACEが採用しています。入力パッチの一部をマスクし、残りのパッチからマスクされた部分を復元するように学習します。
$$ \mathcal{L}_{\text{mask}} = \frac{1}{|\mathcal{M}|} \sum_{i \in \mathcal{M}} \|\bm{p}_i – \hat{\bm{p}}_i\|^2 $$
時系列におけるマスク再構成の重要なポイントは、マスク率の選択です。画像のMAEでは75%が最適でしたが、時系列では40〜50%程度が良いとされています。これは、時系列パッチが画像パッチより情報密度が高い(画像は空間的冗長性が高い)ためです。マスク率が高すぎると、復元が困難になりすぎて学習が不安定になります。
2. 次パッチ予測(Next-Patch Prediction)
GPTの「次トークン予測」に対応するアプローチで、TimesFM、Timer、Lag-Llamaが採用しています。因果マスクを用いたデコーダTransformerで、過去のパッチ列から次のパッチを予測します。
$$ \mathcal{L}_{\text{next}} = \sum_{i=1}^{N-1} \ell\left(\bm{p}_{i+1}, f_\theta(\bm{p}_1, \dots, \bm{p}_i)\right) $$
ここで $\ell$ は損失関数(MSEまたはクロスエントロピー)です。このアプローチは、時系列の「因果的」な構造 — 未来は過去にのみ依存する — を自然に反映しています。
マスク再構成が双方向のコンテキスト(過去と未来の両方)を利用するのに対し、次パッチ予測は過去のみのコンテキストを使用します。予測タスクでは未来の情報は使えないため、次パッチ予測で学習したモデルは推論時の条件により近い状態で学習していることになります。
3. 対照学習(Contrastive Learning)
同じ時系列の異なるビュー(データ拡張)を正例ペア、異なる時系列を負例として、表現空間での距離を学習します。

$$ \mathcal{L}_{\text{contrast}} = -\log \frac{\exp(\text{sim}(\bm{z}_i, \bm{z}_i^+)/\tau)}{\sum_{j=1}^{N} \exp(\text{sim}(\bm{z}_i, \bm{z}_j)/\tau)} $$
時系列のデータ拡張には、ジッタリング(ノイズ付加)、スケーリング、タイムワーピング(時間軸の伸縮)、クロッピング(部分切り出し)などが使われます。対照学習は、予測タスクだけでなく分類や異常検知にも有効な汎用的表現を獲得できる利点があります。
事前学習戦略の比較
| 戦略 | 代表モデル | コンテキスト | 出力 | 主な用途 |
|---|---|---|---|---|
| マスク再構成 | PatchTST, TRACE | 双方向 | 連続値パッチ | 表現学習 → ファインチューニング |
| 次パッチ予測 | TimesFM, Timer | 因果的(過去のみ) | 連続値パッチ | ゼロショット予測 |
| トークン化 + 次トークン予測 | Chronos | 因果的 | 離散トークン | ゼロショット確率的予測 |
| 分布パラメータ予測 | Lag-Llama | 因果的 | 分布パラメータ | 確率的予測 |
| 対照学習 | TS2Vec, CoST | 双方向 | 表現ベクトル | 分類、異常検知 |
これらの戦略は排他的ではなく、組み合わせることも可能です。例えばTRACEは、MAEによる事前学習の後に対照学習でマルチモーダルアライメントを行う2段階学習を採用しています。

図の3戦略が主流です。①マスク再構成(双方向・PatchTST/TRACE)は隠したパッチを前後の文脈から復元、②次パッチ予測(因果的・TimesFM/Timer)は過去から未来を自己回帰的に予測、③対照学習(双方向・TS2Vec)は同じ系列の別ビューを近づけ異なる系列を遠ざけます。予測には因果的、表現学習には双方向が向きます。
事前学習戦略を理解したところで、これらのモデルがどのように評価されているのか、ベンチマークと実験結果を見てみましょう。
評価とベンチマーク
時系列基盤モデルの性能を評価するために、いくつかの標準的なベンチマークデータセットが使われています。
主要なベンチマークデータセット
- ETTh1, ETTh2, ETTm1, ETTm2: 電力変圧器の油温データ(Informer論文で導入)。h = hourly, m = 15分刻み
- Weather: 21変数の気象データ(1年分、10分刻み)
- Electricity: 321世帯の電力消費量(1時間刻み)
- Traffic: 862地点の交通量(1時間刻み)
- ILI: インフルエンザ様疾患の週次報告データ
評価指標
予測精度の評価には主にMSE(Mean Squared Error)とMAE(Mean Absolute Error)が使われます。
$$ \text{MSE} = \frac{1}{H} \sum_{t=T+1}^{T+H} (x_t – \hat{x}_t)^2, \quad \text{MAE} = \frac{1}{H} \sum_{t=T+1}^{T+H} |x_t – \hat{x}_t| $$
ここで $H$ は予測ホライズン(予測先のステップ数)です。確率的予測の場合は、CRPS(Continuous Ranked Probability Score)やWQL(Weighted Quantile Loss)も使われます。
ゼロショット性能の意義
時系列基盤モデルの最も印象的な成果は、ゼロショット性能です。TimesFMやChronosは、ターゲットデータセットで一切学習することなく、事前学習だけで当該データセットの教師あり学習モデルと同等の予測精度を達成しました。これは、NLPにおけるGPT-3のゼロショット性能が衝撃を与えたのと同様の意義を持ちます。
ただし、ゼロショット性能にはデータセットによるばらつきがあります。事前学習データに類似したパターンを持つデータセットでは高い性能を示しますが、非常に特殊なドメイン(例: 地震波形、遺伝子発現など)では性能が低下する傾向があります。少量のファインチューニングでこのギャップを埋められるかどうかは、実用上の重要な論点です。
定量的な評価に加えて、基盤モデルの価値を引き出す新しいアプローチとして、検索拡張(Retrieval-Augmented)の考え方が注目されています。
TRACEとの接続 — 基盤モデルの検索拡張
NLPの世界では、LLMの知識をリアルタイムに補完するRAG(Retrieval-Augmented Generation)が大きな成功を収めています。同様に、時系列基盤モデルの予測を「過去の類似パターン」で補強する発想が生まれています。
TRACE(Chen et al., NeurIPS 2025)は、時系列とテキストの共通埋め込み空間を構築し、テキストクエリで時系列データを検索できるフレームワークです。TRACEが提供する検索能力は、時系列基盤モデルと組み合わせることで、以下のような恩恵をもたらします。
コンテキスト情報の付与: 基盤モデルに入力する時系列に、TRACEで検索した「類似パターンの過去事例」をコンテキストとして追加することで、予測精度を向上させることができます。例えば、電力需要の予測時に「過去の猛暑日の需要パターン」を検索して追加すれば、極端な気象条件下でのロバスト性が高まります。
セマンティックな類似度検索: 従来の時系列類似度検索(DTW等)は数値パターンの形状的な類似性に基づいていますが、TRACEは「意味的な」類似性に基づく検索を可能にします。「急激な需要増加を伴うイベント」というテキストクエリで、形状は異なるが意味的に類似したパターンを検索できます。
ドメイン知識の統合: 時系列データそのものには含まれないドメイン知識(気象条件、祝日情報、経済指標など)をテキストとして検索に組み込めます。
この「基盤モデル + 検索拡張」の組み合わせは、時系列分析の次のフロンティアとして注目されており、NLPにおけるRAGの成功パターンが時系列にも適用できるかどうかは活発な研究テーマです。
それでは、ここまでの理論を実感するために、実際に時系列基盤モデルをPythonで使ってゼロショット予測を試してみましょう。
Pythonでの実装 — Chronosによるゼロショット予測
環境準備
Amazon Chronosはオープンソースで公開されており、Hugging Face経由で簡単に利用できます。以下のコードで、事前学習済みモデルを使ったゼロショット予測を実行します。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as _fm
for _c in ['Hiragino Sans','Yu Gothic','Noto Sans CJK JP','IPAexGothic','Meiryo']:
if any(_c==_f.name for _f in _fm.fontManager.ttflist):
plt.rcParams['font.family']=_c; break
plt.rcParams['axes.unicode_minus']=False
import torch
# --- 1. 合成データ生成(トレンド + 季節性 + ノイズ) ---
np.random.seed(42)
T = 512 # コンテキスト長
H = 64 # 予測ホライズン
t = np.arange(T + H)
trend = 0.02 * t
seasonal = 3.0 * np.sin(2 * np.pi * t / 52) # 週次周期(52週=1年)
noise = np.random.normal(0, 0.5, T + H)
y = trend + seasonal + noise
context = y[:T]
ground_truth = y[T:T + H]
# --- 2. コンテキスト → パッチ化の可視化 ---
patch_len = 16
stride = 16
n_patches = (T - patch_len) // stride + 1
patches = np.array([context[i * stride:i * stride + patch_len] for i in range(n_patches)])
fig, axes = plt.subplots(2, 1, figsize=(12, 8))
# 上段: 元の時系列
axes[0].plot(range(T), context, color='#00bcd4', linewidth=0.8, label='コンテキスト')
axes[0].plot(range(T, T + H), ground_truth, color='#ff9800', linewidth=0.8, label='グラウンドトゥルース')
axes[0].axvline(x=T, color='white', linestyle='--', alpha=0.5)
axes[0].set_title('元の時系列', fontsize=14, color='white')
axes[0].legend()
axes[0].set_facecolor('#1a1a2e')
# 下段: パッチに分割
for i in range(min(n_patches, 32)):
color = plt.cm.viridis(i / 32)
axes[1].plot(range(i * stride, i * stride + patch_len), patches[i], color=color, linewidth=1.5)
axes[1].set_title(f'パッチ化後({n_patches}パッチ, P={patch_len}, S={stride})', fontsize=14, color='white')
axes[1].set_facecolor('#1a1a2e')
for ax in axes:
ax.tick_params(colors='white')
ax.spines['bottom'].set_color('white')
ax.spines['left'].set_color('white')
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
fig.patch.set_facecolor('#0f0f23')
plt.tight_layout()
plt.savefig('patching_visualization.png', dpi=150, bbox_inches='tight', facecolor='#0f0f23')
plt.show()
print(f"元の系列長: {T} → パッチ数: {n_patches}")
print(f"Attention計算量の比: {T**2} → {n_patches**2} (約{T**2 / n_patches**2:.0f}倍削減)")

上段のグラフは元の時系列で、シアン色のコンテキスト部分(512点)とオレンジ色のグラウンドトゥルース(64点)を示しています。下段はパッチ化後の可視化で、512点の系列が32個のパッチに分割されていることが確認できます。各パッチは16点の局所パターンを内包しており、色のグラデーションで時間的な順序が表現されています。計算量は $512^2 = 262,144$ から $32^2 = 1,024$ へと約256倍削減されており、パッチ化の効果が定量的に実感できます。
Chronosによるゼロショット予測
次に、事前学習済みChronosモデルを使ってゼロショット予測を行います。
# Chronosのインストール: pip install chronos-forecasting
from chronos import ChronosPipeline
# --- 事前学習済みモデルのロード ---
pipeline = ChronosPipeline.from_pretrained(
"amazon/chronos-t5-small", # 20Mパラメータ
device_map="cpu",
torch_dtype=torch.float32,
)
# --- コンテキストをtensorに変換 ---
context_tensor = torch.tensor(context, dtype=torch.float32)
# --- ゼロショット予測(20サンプル) ---
forecast = pipeline.predict(
context=context_tensor,
prediction_length=H,
num_samples=20,
)
# forecast.shape: (20, H)
# --- 予測統計量の計算 ---
median_forecast = np.median(forecast.numpy(), axis=0)
lower_90 = np.percentile(forecast.numpy(), 5, axis=0)
upper_90 = np.percentile(forecast.numpy(), 95, axis=0)
lower_50 = np.percentile(forecast.numpy(), 25, axis=0)
upper_50 = np.percentile(forecast.numpy(), 75, axis=0)
# --- 可視化 ---
fig, ax = plt.subplots(figsize=(14, 6))
# コンテキスト(末尾100点のみ表示)
show_start = T - 100
ax.plot(range(show_start, T), context[show_start:], color='#00bcd4', linewidth=1.5, label='コンテキスト')
# グラウンドトゥルース
ax.plot(range(T, T + H), ground_truth, color='white', linewidth=2, label='グラウンドトゥルース', linestyle='--')
# 予測中央値
forecast_x = range(T, T + H)
ax.plot(forecast_x, median_forecast, color='#ff9800', linewidth=2, label='Chronos予測中央値')
# 90%信頼区間
ax.fill_between(forecast_x, lower_90, upper_90, color='#ff9800', alpha=0.15, label='90%予測区間')
# 50%信頼区間
ax.fill_between(forecast_x, lower_50, upper_50, color='#ff9800', alpha=0.3, label='50%予測区間')
ax.axvline(x=T, color='white', linestyle='--', alpha=0.3)
ax.set_xlabel('時刻', fontsize=12, color='white')
ax.set_ylabel('値', fontsize=12, color='white')
ax.set_title('Chronosのゼロショット予測 (amazon/chronos-t5-small)', fontsize=14, color='white')
ax.legend(loc='upper left', fontsize=10)
ax.set_facecolor('#1a1a2e')
ax.tick_params(colors='white')
ax.spines['bottom'].set_color('white')
ax.spines['left'].set_color('white')
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
fig.patch.set_facecolor('#0f0f23')
plt.tight_layout()
plt.savefig('chronos_forecast.png', dpi=150, bbox_inches='tight', facecolor='#0f0f23')
plt.show()
# --- 定量評価 ---
mse = np.mean((ground_truth - median_forecast) ** 2)
mae = np.mean(np.abs(ground_truth - median_forecast))
print(f"MSE: {mse:.4f}")
print(f"MAE: {mae:.4f}")
このグラフから、いくつかの重要な点が読み取れます。第一に、Chronosは事前学習済みモデルだけで、この合成データのトレンドと周期性をかなり正確に捉えています。コードを一行も学習に費やすことなく、ゼロショットで合理的な予測が得られていることは注目に値します。第二に、90%信頼区間(薄いオレンジ)がグラウンドトゥルースをほぼ包含しており、不確実性の定量化が適切に機能しています。Chronosのトークン化 + カテゴリカル分布出力というアプローチが、確率的予測を自然に実現していることの証左です。第三に、予測ホライズンが長くなるにつれて信頼区間が広がる傾向が見られ、これは直感的にも正しい — 遠い未来ほど不確実性が大きくなるという期待に合致しています。
簡易パッチTransformerの実装
最後に、パッチ化の仕組みをより深く理解するために、PatchTSTの核心部分をPyTorchでスクラッチ実装してみましょう。
import torch
import torch.nn as nn
class PatchEmbedding(nn.Module):
"""時系列をパッチに分割し、線形射影で埋め込む"""
def __init__(self, patch_len: int, stride: int, d_model: int):
super().__init__()
self.patch_len = patch_len
self.stride = stride
self.proj = nn.Linear(patch_len, d_model)
def forward(self, x: torch.Tensor) -> torch.Tensor:
# x: (batch, seq_len)
# パッチに分割
patches = x.unfold(dimension=1, size=self.patch_len, step=self.stride)
# patches: (batch, n_patches, patch_len)
return self.proj(patches) # (batch, n_patches, d_model)
class SimplePatchTST(nn.Module):
"""PatchTSTの簡易版(チャネル独立処理)"""
def __init__(
self,
seq_len: int,
pred_len: int,
patch_len: int = 16,
stride: int = 8,
d_model: int = 128,
n_heads: int = 4,
n_layers: int = 3,
dropout: float = 0.1,
):
super().__init__()
self.pred_len = pred_len
self.n_patches = (seq_len - patch_len) // stride + 1
# パッチ埋め込み
self.patch_embed = PatchEmbedding(patch_len, stride, d_model)
# 位置エンコーディング(学習可能)
self.pos_embed = nn.Parameter(torch.randn(1, self.n_patches, d_model) * 0.02)
# Transformerエンコーダ
encoder_layer = nn.TransformerEncoderLayer(
d_model=d_model,
nhead=n_heads,
dim_feedforward=d_model * 4,
dropout=dropout,
batch_first=True,
activation='gelu',
)
self.encoder = nn.TransformerEncoder(encoder_layer, num_layers=n_layers)
# 予測ヘッド: パッチ列 → 平坦化 → 線形射影
self.head = nn.Linear(self.n_patches * d_model, pred_len)
self.norm = nn.LayerNorm(d_model)
def forward(self, x: torch.Tensor) -> torch.Tensor:
# x: (batch, seq_len) — 単変量、チャネル独立
# 1. パッチ埋め込み + 位置エンコーディング
z = self.patch_embed(x) + self.pos_embed # (batch, n_patches, d_model)
# 2. Transformerエンコーダ
z = self.encoder(z) # (batch, n_patches, d_model)
z = self.norm(z)
# 3. 平坦化 + 予測ヘッド
z = z.flatten(start_dim=1) # (batch, n_patches * d_model)
return self.head(z) # (batch, pred_len)
# --- モデルの動作確認 ---
seq_len = 512
pred_len = 96
batch_size = 32
model = SimplePatchTST(seq_len=seq_len, pred_len=pred_len)
# ダミー入力
x = torch.randn(batch_size, seq_len)
y_pred = model(x)
print(f"入力: {x.shape}") # torch.Size([32, 512])
print(f"出力: {y_pred.shape}") # torch.Size([32, 96])
print(f"パッチ数: {model.n_patches}") # 63
print(f"パラメータ数: {sum(p.numel() for p in model.parameters()):,}")
# Attention計算量の比較
print(f"\n--- Attention計算量の比較 ---")
print(f"パッチ化なし (L={seq_len}): {seq_len**2:,} (O(L^2))")
print(f"パッチ化あり (N={model.n_patches}): {model.n_patches**2:,} (O(N^2))")
print(f"削減率: {seq_len**2 / model.n_patches**2:.1f}x")
このコードの出力から、いくつかの設計上のポイントが確認できます。512点の入力系列がパッチ長16、ストライド8で63個のパッチに変換され、Self-Attentionの計算量は $512^2 = 262,144$ から $63^2 = 3,969$ へと約66倍削減されています。パラメータ数は数十万程度であり、TimesFMの200Mやchronos-t5-largeの710Mと比較すると非常にコンパクトです。このコンパクトなモデルでも、パッチ化 + Transformer + チャネル独立という設計の核心はそのまま実装されており、PatchTSTの設計思想の本質を捉えています。
学習ループの実装
この簡易PatchTSTで実際に合成データを学習してみましょう。
# --- 合成データの生成(学習用) ---
np.random.seed(0)
n_samples = 2000
total_len = seq_len + pred_len
# 多様なパターンの合成データ
data_list = []
for i in range(n_samples):
t_arr = np.arange(total_len)
freq = np.random.uniform(0.01, 0.1)
amp = np.random.uniform(1.0, 5.0)
trend_slope = np.random.uniform(-0.02, 0.02)
noise_std = np.random.uniform(0.1, 1.0)
signal = trend_slope * t_arr + amp * np.sin(2 * np.pi * freq * t_arr)
signal += np.random.normal(0, noise_std, total_len)
data_list.append(signal)
data = np.array(data_list, dtype=np.float32)
# 正規化(各サンプルごと)
mean = data[:, :seq_len].mean(axis=1, keepdims=True)
std = data[:, :seq_len].std(axis=1, keepdims=True) + 1e-8
data = (data - mean) / std
X_train = torch.tensor(data[:1600, :seq_len])
Y_train = torch.tensor(data[:1600, seq_len:])
X_val = torch.tensor(data[1600:, :seq_len])
Y_val = torch.tensor(data[1600:, seq_len:])
# --- 学習 ---
model = SimplePatchTST(seq_len=seq_len, pred_len=pred_len, d_model=64, n_heads=4, n_layers=2)
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-3, weight_decay=1e-4)
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=50)
criterion = nn.MSELoss()
train_losses, val_losses = [], []
for epoch in range(50):
model.train()
# ミニバッチ
idx = torch.randperm(X_train.shape[0])[:256]
pred = model(X_train[idx])
loss = criterion(pred, Y_train[idx])
optimizer.zero_grad()
loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
optimizer.step()
scheduler.step()
# 検証
model.eval()
with torch.no_grad():
val_pred = model(X_val)
val_loss = criterion(val_pred, Y_val).item()
train_losses.append(loss.item())
val_losses.append(val_loss)
if (epoch + 1) % 10 == 0:
print(f"Epoch {epoch+1:3d} | Train Loss: {loss.item():.4f} | Val Loss: {val_loss:.4f}")
# --- 学習曲線と予測結果の可視化 ---
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# 学習曲線
axes[0].plot(train_losses, color='#00bcd4', label='訓練損失', linewidth=1.5)
axes[0].plot(val_losses, color='#ff9800', label='検証損失', linewidth=1.5)
axes[0].set_xlabel('エポック', fontsize=12, color='white')
axes[0].set_ylabel('MSE損失', fontsize=12, color='white')
axes[0].set_title('学習曲線', fontsize=14, color='white')
axes[0].legend(fontsize=10)
axes[0].set_facecolor('#1a1a2e')
# 予測結果(検証データの3サンプル)
model.eval()
with torch.no_grad():
preds = model(X_val[:3]).numpy()
for i in range(3):
color = ['#00bcd4', '#ff9800', '#e91e63'][i]
t_ctx = range(seq_len - 100, seq_len)
t_pred = range(seq_len, seq_len + pred_len)
axes[1].plot(t_ctx, X_val[i, -100:].numpy(), color=color, linewidth=1, alpha=0.7)
axes[1].plot(t_pred, Y_val[i].numpy(), color=color, linewidth=2, linestyle='--', alpha=0.5)
axes[1].plot(t_pred, preds[i], color=color, linewidth=2, label=f'サンプル{i+1}')
axes[1].axvline(x=seq_len, color='white', linestyle='--', alpha=0.3)
axes[1].set_xlabel('Time Step', fontsize=12, color='white')
axes[1].set_title('予測 vs 正解', fontsize=14, color='white')
axes[1].legend(fontsize=10)
axes[1].set_facecolor('#1a1a2e')
for ax in axes:
ax.tick_params(colors='white')
ax.spines['bottom'].set_color('white')
ax.spines['left'].set_color('white')
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
fig.patch.set_facecolor('#0f0f23')
plt.tight_layout()
plt.savefig('patchtst_training.png', dpi=150, bbox_inches='tight', facecolor='#0f0f23')
plt.show()

左のグラフ(学習曲線)から、訓練損失と検証損失が50エポックでともに収束していることが確認できます。両者の差が小さく、過学習が抑えられている点に注目してください。これはパッチ化による適切な正則化効果と、CosineAnnealing学習率スケジューラの効果です。右のグラフ(予測結果)では、3つのサンプルに対する予測(実線)とグラウンドトゥルース(破線)を重ねています。トレンド方向と周期のフェーズがおおむね正しく予測されており、わずか2層・64次元の軽量モデルでも、パッチ化Transformerの有効性が実感できます。予測の末端(遠い将来)でやや精度が低下している傾向は、自己回帰ではなくダイレクト予測方式(一度にすべてのステップを予測)の限界を反映しています。
主要モデルの比較まとめ
ここまで紹介した主要モデルを、設計軸ごとに整理します。
| モデル | 年 | アーキテクチャ | パッチ化 | チャネル処理 | 事前学習 | 出力形式 |
|---|---|---|---|---|---|---|
| Informer | 2021 | Encoder-Decoder | なし | 混合 | なし | 点予測 |
| Autoformer | 2021 | Encoder-Decoder | なし | 混合 | なし | 点予測 |
| FEDformer | 2022 | Encoder-Decoder | なし | 混合 | なし | 点予測 |
| PatchTST | 2023 | Encoder | あり | 独立 | マスク再構成 | 点予測 |
| iTransformer | 2024 | Encoder | なし(変数=トークン) | 混合 | なし | 点予測 |
| TimesFM | 2024 | Decoder | あり | 独立 | 次パッチ予測 | 点予測 |
| Chronos | 2024 | Encoder-Decoder (T5) | あり(暗黙的) | 独立 | 次トークン予測 | 確率的(カテゴリカル) |
| Lag-Llama | 2024 | Decoder | ラグ特徴量 | 独立 | 次ステップ予測 | 確率的(分布パラメータ) |
| Timer | 2024 | Decoder | あり | 独立 | 次パッチ予測 | 点予測 |
| Moirai | 2024 | Encoder | あり | ハイブリッド | マスク再構成 | 確率的(混合分布) |
この表から、いくつかの大きなトレンドが見えます。
2021-2022年のモデル(Informer、Autoformer、FEDformer)は、Attentionの効率化に焦点を当てた「教師あり学習専用」のモデルでした。パッチ化も事前学習も行っていません。
2023年のPatchTSTが転換点です。パッチ化とチャネル独立性という2つの設計を導入し、教師あり学習の性能を大幅に向上させるとともに、自己教師あり事前学習の可能性を示しました。
2024年のモデル(TimesFM、Chronos、Lag-Llama、Moirai)は、大規模事前学習による「真の基盤モデル」を目指しています。パッチ化はほぼ標準になり、焦点は事前学習戦略と確率的予測に移っています。

図がこの3年の流れです。効率Attentionの工夫(Informer/Autoformer/FEDformer)→ パッチ化とチャネル独立の確立(PatchTST)→ 変数=トークンの再考(iTransformer)→ 大規模事前学習による真の基盤モデル(TimesFM/Chronos/Moirai/Timer)へと、焦点がアーキテクチャから事前学習へ移ってきました。
まとめ
本記事では、時系列基盤モデルの全体像を、2021年のInformerから2024年のChronos・Moiraiまで、主要なモデルを体系的に解説しました。
- パッチ化は時系列Transformerの最も重要な設計原則であり、計算量削減・意味的な情報密度向上・局所構造の保存という3つの利点を同時に提供します
- チャネル独立処理は、汎用性と過学習抑制の点で多くの場面で有効ですが、チャネル間の相互作用が重要な場面ではハイブリッドアプローチが検討されます
- 事前学習戦略は、マスク再構成(双方向)と次パッチ予測(因果的)の2つが主流であり、タスクに応じた使い分けが重要です
- 確率的予測(Chronosのトークン化、Lag-Llamaの分布パラメータ予測、Moiraiの混合分布)は、予測の不確実性を定量化する実用的な価値を持ちます
- ゼロショット性能は、事前学習済みモデルの汎化能力を示す最も説得力のある指標であり、TimesFMやChronosはこの点で教師あり学習モデルに匹敵する性能を達成しています
時系列基盤モデルの研究は急速に進展しています。NLPの基盤モデルが2018年のBERTから数年で産業応用に広がったように、時系列基盤モデルも実用化のフェーズに入りつつあります。TRACEのようなマルチモーダル検索との組み合わせ、マルチタスク学習(予測 + 分類 + 異常検知を同時に行う)、さらには時系列と言語の統合的な理解に向けた研究が、今後の大きな方向性です。
次のステップとして、以下の記事も参考にしてください。

