iTransformer: Inverted Transformers Are Effective for Time Series Forecasting
iTransformer: Inverted Transformers Are Effective for Time Series Forecasting は、多変量時系列予測モデル "iTransformer" を提案する論文である。Tsinghua University (清華大学) School of Software, BNRist [脚注BNRist] の Yong Liu らによって著された (他に Ant Group [脚注Ant] 所属の著者も)。2023 年に arXiv にプレプリントが発表され、2024 年の ICLR に採択された。
"iTransformer" は Transformer の基本構成要素 (マルチヘッドアテンション層、FFN、層正規化) はそのまま用いつつ、適用対象を「各時刻の観測ベクトルの列」から「各チャネルの時系列の列」に転置したモデルである。つまり、L_in×C 次元の入力に対し、各チャネルごとの長さ L_in の系列全体を "variate token" に埋め込み、これにマルチヘッドアテンション層を適用し、チャネル間の相関を学習する。層正規化は各 variate token (Ex. 名古屋の過去 1 週間の毎時気温系列を正規化、静岡の…) に適用される。予測系列はエンコード後の各 variate token から線形変換によって生成する (エンコーダのみの構成でデコーダは持たない)。
参照期間 T=96、予測機関 S∈{96, 192, 336, 720} を平均した多変量予測タスクで検証した結果、iTransformer の Traffic データセットでの平均 MSE は 0.428 であり、PatchTST の 0.555、RLinear [脚注RLinear]の 0.626 を下回った。ECL データセットでの平均 MSE も 0.178 と、PatchTST 0.216、RLinear 0.219 を下回った。
著者らは、近年単純な線形予測モデルが既存の Transformer 型予測モデルの性能を上回る例が報告されており、Transformer の時系列予測への適性が疑問視されているが、これは同一時刻のチャネル系列を 1 つの "temporal token" に埋め込んで時間方向にセルフアテンションする使い方が多変量時系列予測に適していないためであると主張している。
参考文献
- paper
- Yong Liu, Tengge Hu, Haoran Zhang, Haixu Wu, Shiyu Wang, Lintao Ma, Mingsheng Long. iTransformer: Inverted Transformers Are Effective for Time Series Forecasting. Proceedings of the 12th International Conference on Learning Representations (ICLR 2024), 2024.
iTransformer の構造
iTransformer は参照期間のタイムスタンプ (L_in,)、参照期間の観測値 (L_in, C) を受け取り、予測結果 (L_out, C) を出力する。予測期間のタイムスタンプと観測値は、公式実装上受け取っていはいるが、使用していない。
iTransformer は、Transformer の基本構成要素 (マルチヘッドアテンション層、FFN、層正規化) はそのまま用いつつ、適用対象トークン列を「各時刻の観測ベクトルの列」ではなく「各チャネルの時系列の列」としたものである。したがって、マルチヘッドアテンションはチャネル間の相関を、順伝播は各チャネルの時系列の表現を学習することになる。エンコーダのみの構成でデコーダは持たない。
共変量があれば追加トークンとして取り込む。このときトークン列は、「チャネル1、…、チャネルC、時刻、曜日、日、月日」といったものになる。
規定値としてはモデル次元数 512、中間層次元数 2048、ヘッド数 8 とされておりこれはオリジナル Transformer の値そのままであるが、実験スクリプト上はヘッド数以外はデータセットによって調整されている。また、エンコーダ層数の規定値は 2 であるが、これもデータセットによって調整されている。また、活性化関数は GELU であり、モデルの入口で参照期間内で系列標準化をして出口で逆変換する (これらは調整可能であるが変更されていない)。
iTransformer 全体
- x_enc (L_in, C)、x_mark_enc (L_in, n_feat) を受け取る。ただし、x_mark_enc はタイムスタンプから以下の 5 (4) 列の特徴を抽出し各列を -0.5~0.5 の値に正規化したものである。
- その分が時間の何分目か (0〜59 分) ※ 時間ステップが 1 時間未満の場合のみ。
- その時刻が何時か (0〜23 時)
- その日が週の何日目か (1〜7 日)
- その日が月の何日目か (1〜31 日)
- その日が年の何日目か (1〜365 日)
- チャネルごとに時間平均を引いて時間分散 + 1e-5 の平方根 (時間標準偏差) で割って標準化する。この時間平均と時間標準偏差は後の逆変換用に保持する。
- x_enc (L_in, C)、x_mark_enc (L_in, n_feat) を DataEmbedding_inverted 層 (以下) で (C + n_feat, d_model) 次元に変換する。
- x_enc を (C, L_in) 次元に、x_mark_enc を (n_feat, L_in) 次元に転置して (C + n_feat, L_in) 次元にconcat する。
- 時点ごとに d_model 次元に線形変換し (C + n_feat, d_model) 次元にする。
- ドロップアウトする。
- エンコーダを適用する。
- エンコーダ層 (後述) を 2 層適用する。
- 層正規化を適用する (ここでは各トークンが各チャネルの時系列なので、系列が標準化されることになる)。
- エンコーダ出力の (C + n_feat, d_model) 各トークンに共有重みの Linear(d_model, L_out) を適用し、(C + n_feat, L_out) 次元にし、転置して (L_out, C + n_feat) 次元にし、末尾 n_feat ステップを捨てて (L_out, C) 次元にする。
- 保持しておいた時間平均と時間標準偏差で標準化の逆変換をする。
エンコーダ層
- (C + n_feat, d_model) 次元の入力を受け取る (ア)。
- MultiheadAttention 層 (以下) を適用する。
- Q, K, V それぞれに Linear(512 → 8×64) を適用し、[B, N', 8, 64] に reshape して 8 ヘッドに分割する。
- 各ヘッドで Q と K のスコア行列 [B, 8, N', N'] を計算し、sqrt(64)=8 で割って softmax し、softmax 後の重みに Dropout(p=0.1) を掛ける。
- この重みと V の積を取り、形 [B, N', 8, 64] に戻してから [B, N', 512] に連結する。
- Linear(512 → 512) で出力を射影する。
- Dropout(p=0.1) する。
- (ア) から残差接続する。
- nn.LayerNorm(512) を適用する (イ)。
- (イ) に kernel_size=1 の Conv1d (512 → 2048) を適用する (各トークンごとの Linear と等価)。GELU 活性化、Dropout(p=0.1) する。
- kernel_size=1 の Conv1d (2048 → 512) を適用し、Dropout(p=0.1) する。
- (イ) から残差接続する。
- nn.LayerNorm(512) を適用する。
- これがこの層の出力 [B, N', 512] である。