今回の論文
今回取り上げるのは、Yuqi Nie、Nam H. Nguyen、Phanwadee Sinthong、Jayant Kalagnanamによる「A Time Series is Worth 64 Words: Long-term Forecasting with Transformers」です。2022年11月27日にarXivで初公開され、ICLR 2023で発表されました。研究分野は、多変量時系列予測と自己教師あり表現学習です。
公開元はarXiv/ICLRで、論文の書誌情報と改訂版v2の本文を参照できます。この記事はv2の構造と実験に基づきます。
選んだ理由は、「複雑なAttentionを作る前に、入力の単位を見直す」という考え方が実装に結び付きやすいためです。需要や設備の稼働量など、数値の履歴を扱うプロダクトに応用する際の判断材料があります。
どんな技術か
PatchTSTは、数値を1時点ずつTransformerに渡す代わりに、連続した複数時点を1つのパッチにまとめて渡す時系列予測モデルです。例えば、1時間ごとの電力使用量を16時間ずつの区間にし、区間同士の関係から将来の使用量を予測します。
もう1つの特徴は、複数の変数を最初から混ぜず、変数ごとに同じモデルを使うことです。100台の機器の系列があっても、100個の別モデルを作るのではありません。共通の重みを、各系列に独立して適用します。
数値を文章にしてLLMへ問い合わせる方式ではなく、数値を直接入力して数値を出力するTransformerです。教師あり予測に加え、隠した区間を復元する事前学習にも使えます。原論文のモデル構造
課題
時系列の予測では、直近の値だけでなく、過去の周期や上昇・下降の形を見る必要があります。しかし、各時点を1トークンにすると、長い履歴ほどAttentionで照合する組が増えます。通常の自己Attentionのスコア行列は、入力長Lに対してL×Lの大きさです。
履歴を間引けばトークン数は減りますが、短いピークや区間内の変動が抜ける可能性があります。一方、履歴を短く切れば、前日や前週のパターンを参照できないかもしれません。需要予測で短期の変化と長期の周期を両方使いたいときに問題になります。
また、1時点の数値だけでは「ゆっくり増えている」「急に上がって戻った」といった形は表せません。局所的な変動を入力の段階でまとめ、長期の関係と役割分担させる余地があります。
変数間の扱いも論点です。すべての変数を混ぜれば、相互関係を使える反面、学習データに偶然ある関係へ適合するおそれがあります。PatchTSTはまず各変数の時間的なパターンを学び、重み共有を通じて複数系列のデータを活用します。これは変数間の関係が不要だと証明したものではなく、モデルにどんな制約を置くかという選択です。
用語解説
- 入力履歴長と予測長
- 入力履歴長Lは過去何時点を見るか、予測長Tは将来何時点を出すかです。PatchTSTでは長い履歴を少ないトークンへまとめますが、予測長を自動で自由に変更できるわけではありません。
- パッチとストライド
- パッチは連続するP時点をまとめた入力単位で、ストライドSは次のパッチの開始位置を何時点ずらすかです。SがPより小さいと区間が重なります。Pは局所情報の粒度、Sはトークン数に影響します。
- チャネル独立と重み共有
- チャネルは、電力使用量や温度などの観測系列です。各チャネルの推論経路を独立させつつ同じ学習パラメータを使うため、共通の時間パターンを学べますが、別チャネルの観測値を直接参照しません。
- インスタンス正規化
- 入力窓ごと、チャネルごとの平均と標準偏差で値の尺度を揃える処理です。PatchTSTでは予測後に尺度を戻します。入力窓間で水準が変わっても変動の形を扱いやすくする工夫です。
- マスク事前学習
- 履歴の一部を隠し、元の数値を復元することで特徴を学ぶ方法です。PatchTSTでは点ではなく区間を隠します。隣接値の補間だけで済む簡単すぎる学習課題を避けることが狙いです。
技術の仕組み
各チャネルを正規化し、短い区間へ切り分けます
入力をバッチ数 × チャネル数M × 履歴長Lと考えると、まず各チャネルのL時点を独立した系列として扱います。入力窓内の平均と標準偏差で正規化し、長さP、移動幅Sでパッチを切り出します。
論文では、末尾の観測値をS個繰り返して追加します。この処理を含むパッチ数は、N = floor((L - P) / S) + 2です。L=336、P=16、S=8なら42パッチになります。単純な間引きと違い、各パッチには区間内の数値列が入ります。ただし、その後の埋め込みが情報を完全に保存する保証はありません。
パッチをベクトル化し、区間間の関係を学びます
各パッチのP個の数値を、学習可能な線形射影でD次元のベクトルへ変えます。さらにパッチの順番を表す位置埋め込みを加え、Transformerエンコーダへ渡します。
エンコーダは自己Attention、フィードフォワード層、残差接続などで構成され、論文ではBatchNormを用います。各チャネル内で、どの過去区間を参照するかを学びます。チャネル間のAttentionは行いませんが、共通の重みにはすべてのチャネルから学習信号が入ります。
Attentionのスコア行列はL×LからN×Nになります。上の例では336²から42²なので、要素数は64分の1です。これは行列サイズの計算例であり、モデル全体が64倍速くなるという意味ではありません。射影、フィードフォワード層、出力層やチャネル数にもコストがかかります。
将来の値をまとめて出力します
教師あり予測では、N個の出力ベクトルを平坦化し、線形ヘッドで将来T時点の数値へ写します。1つ前の予測値を入力へ戻して順番に生成する方式ではなく、指定した期間の値をまとめて出します。
学習には予測値と実測値の二乗誤差を使い、各チャネルの誤差を平均します。最後に入力窓の平均と標準偏差を使って予測値の尺度を戻します。予測期間に対応するヘッドを学ぶため、導入時には「何時間先まで必要か」を決める必要があります。原論文3.1節の処理手順
事前学習では、重ならないパッチを隠します
自己教師あり学習では、予測用ヘッドの代わりに、各パッチ表現からP個の数値を復元する線形層を付けます。ランダムに選んだパッチをゼロにし、隠したパッチ上のMSEで学習します。
重要なのは、この段階ではパッチを重ねないことです。重複する隣のパッチに正解の数値が残ると、隠した区間の内容が漏れるためです。事前学習後は予測用ヘッドへ交換し、ヘッドのみを学ぶ線形プロービングや、モデル全体の微調整を行います。
同じ時系列の特徴学習でも、TS2Vecの文脈を変えた同一時点を近づける対照学習とは学習信号が異なります。PatchTSTは隠した数値の復元を使うため、何を同じ表現にするかに加えて、どの長さの区間を隠すかが設計の焦点になります。原論文の表現学習
実験と結果
論文は、教師ありの長期予測と、マスク事前学習後の予測を検証しています。対象はWeather、Traffic、Electricity、ILI、4種類のETTの計8データセットです。MSEは二乗誤差の平均、MAEは絶対誤差の平均で、いずれも小さいほど良い指標です。以下の値は論文の前処理・評価条件での値であり、電力量などの元単位の誤差ではありません。
パッチ化で、同じ長さの履歴でも改善しました
表1のTrafficは862系列の道路占有率データで、予測長は96時点です。チャネル独立の構造を使い、入力の扱いを比較しています。
| 入力の扱い | 履歴長L | トークン数N | MSE |
|---|---|---|---|
| 各時点をそのまま入力 | 96 | 96 | 0.518 |
| 長い履歴を間引く | 380 | 96 | 0.447 |
| 各時点をそのまま入力 | 336 | 336 | 0.397 |
| パッチ化して入力 | 336 | 42 | 0.367 |
長い履歴を見る効果に加え、同じ336時点でもパッチ化した方が誤差を減らしています。0.397から0.367は約7.6%の相対減少です。単に履歴を短くする高速化ではないことが読み取れます。
同表ではTrafficのパッチあり/なしの学習時間が464秒/10,040秒で、約22倍の差があります。これは論文の設定での学習時間比較です。API応答や1件の推論が22倍速くなることを示すものではありません。原論文の表1
予測精度は条件ごとに見る必要があります
主実験では、ILI以外の予測長を96・192・336・720、ILIを24・36・48・60としています。PatchTST/42は基本的にL=336、PatchTST/64はL=512で、通常設定のP=16・S=8に対応するパッチ数から命名されています。ILIには履歴長などの別設定があります。
表3のTraffic、T=96では、MSEはPatchTST/42が0.367、DLinearが0.410です。一方、ETTh1、T=192では、PatchTST/42が0.414、DLinearが0.405で、DLinearの方が良い結果です。PatchTSTがすべての条件で勝ったわけではありません。
FEDformer、Autoformer、Informerについては、著者らが複数の履歴長で再実行し、各予測課題で良い結果を採用しています。比較対象の履歴長がすべて同一という実験ではない点も、再現時に確認する必要があります。原論文の主評価と表3
事前学習の効果も、適応方法で変わりました
表4の事前学習は、標準設定で履歴長512、重ならない長さ12のパッチ、マスク率40%を使います。100エポックの事前学習後、全体の微調整ではまずヘッドを10エポック学び、続いて全体を20エポック学びます。教師ありの標準設定と入力条件も異なるため、数値差を事前学習だけの効果とは断定できません。
表4のTraffic、T=96では、MSEは教師ありで最初から学ぶ場合が0.367、事前学習後に全体を微調整した場合が0.352です。しかし、エンコーダを凍結してヘッドだけ学ぶ場合は0.399でした。
この条件では事前学習と全体の微調整が有効ですが、凍結した特徴だけで必ず改善するわけではありません。また、表1の自己教師ありの0.349と表4の0.352は、異なる実験設定の報告値として区別します。事前学習済みモデルを入れれば調整不要、という結果ではありません。原論文の表現学習評価と表4
何に使える?
以下は、論文の構造から考えられる開発上の応用です。各業務での効果を原論文が直接実証したものではありません。
店舗や機器ごとの需要予測
多くの店舗の注文数や機器の消費電力を、一定間隔の数値系列として予測する用途です。各系列に共通する増減や周期を同じ重みで学びつつ、推論時にはその系列の履歴から予測できます。
ただし、原型では広告、価格変更、天気予報などの別変数を直接参照しません。それらが需要を強く左右する業務では、外部要因を使うモデルとの比較が必要です。
SaaSの稼働量や処理件数の見通し
テナント別のAPI呼び出し件数やバッチ処理量から、翌日の時間帯ごとの負荷を予測する構成が考えられます。長い履歴を少ないパッチで扱えるため、短い変動と日周期を一緒に参照する設計を試せます。
予測結果を容量計画の候補として表示するなら、実測とのずれを継続監視する必要があります。新規契約や大型リリースによる急増は、過去の形だけでは予測できない可能性があります。
複数の予測期間を持つ社内ツール
同じログから数時間先と数日先を予測したい場合、マスク事前学習したエンコーダを共通化し、期間別のヘッドを学ぶ構成が考えられます。予測期間ごとに特徴抽出まで最初から学ぶ方法と、開発・学習コストを比較できます。
ただし、ヘッドのみの適応で十分か、全体の微調整が必要かはデータ次第です。前節の結果からも、この2つは分けて試す必要があります。
開発や事業へのヒント
モデルを大きくする前に、入力の粒度を見直します
PatchTSTから得られるヒントは、入力単位の設計にも改善余地があることです。数値を1点ずつ扱うのか、局所的な形を持つ区間として扱うのかで、必要なAttentionの大きさも変わります。
小規模な試作なら、まず季節性を使う単純な予測や線形モデルを基準にします。そのうえで、履歴長L・パッチ長P・ストライドSを変え、誤差、学習時間、GPUメモリを測ると、追加の複雑さに見合う価値があるか判断できます。これは導入時の検証案です。
パッチ長は、実時間に直して選びます
P=16が表す時間は、1分間隔なら16分、1時間間隔なら16時間です。同じ設定値でも、業務上の意味は変わります。観測間隔と重要な変化の長さを整理してから、区間の粒度を決めることが大切です。
ストライドを大きくするとトークン数は減りますが、区間の重なり方も変わります。速度だけを目的に値を大きくせず、短いピークや予測先ごとの誤差が悪化しないか確認します。
共通化する範囲を、変数の関係から決めます
多数の系列を共通モデルで扱う設計は、モデル管理を簡潔にする可能性があります。一方、上流の温度が下流の圧力へ影響するような系では、チャネル独立の制約が重要な情報を捨てるかもしれません。
自社データでは、各系列だけで予測する基準と、他変数も使う基準を比較するとよいでしょう。「まとめて学ぶ」と「入力を混ぜる」は別の設計判断だという点が、プロダクトづくりにも役立ちます。
限界
計算面では、Attentionの入力は短くなっても、パッチ数Nに対する二乗の項は残ります。チャネル数が増えれば処理する系列も増えます。さらに平坦化後の予測ヘッドはN・特徴次元D・予測長Tに依存するため、長い履歴や長期予測が無制限に軽くなるわけではありません。
データ面では、主実験は一定間隔の数値系列です。不規則な観測、長い欠測、まったく履歴のない新しい系列に、そのまま適用できるとは限りません。事前学習で人工的に隠したパッチを復元できることも、実際の欠測を正しく補える保証ではありません。
構造面では、チャネル間の依存を直接モデル化しません。重み共有で共通の規則を学ぶことと、予測時に別チャネルの最新値を読むことは異なります。論文もチャネル間の依存を適切に組み込むことを今後の課題に挙げています。
精度と再現性の面では、入力履歴、正規化、乱数、データ分割、微調整の方法を揃える必要があります。実装時は時系列順で評価し、予測対象の将来値や将来期間の統計を前処理へ混ぜないようにします。自己Attentionが入力窓内を双方向に見ても、その窓がすべて予測時点以前なら構いません。
運用面では、主な出力は点予測です。不確実性の範囲や、予測を外した原因を自動で説明する機能ではありません。誤差平均だけでなく、ピーク時の過小予測、系列別の失敗、時間経過による性能変化も測る必要があります。原論文の結果は当時の比較対象に対するもので、現在の全予測モデルへの優位を保証しません。
よくある質問
Q. PatchTSTはLLMですか?
A. 自然言語の生成を目的とするLLMではありません。数値の区間をトークンとしてTransformerへ入力し、将来の数値を出します。原論文では予測モデルと、マスク事前学習による表現学習の両方を扱っています。
Q. パッチ化は、データを間引く処理と同じですか?
A. 異なります。16時点のパッチなら、その16個の数値を線形射影へ渡します。一定間隔の点だけを残す方式ではありません。ただし、埋め込み後もすべての情報が完全に残るとは限りません。
Q. 100変数なら、100個のTransformerを学習しますか?
A. 共通の重みを各変数へ適用します。100組の独立した重みを学ぶ方式ではありません。一方、各変数の履歴を処理する計算は必要で、変数数を増やしてもコストが一定になるわけではありません。
Q. 未ラベルのログさえあれば、すぐ将来予測できますか?
A. ログからマスク復元の事前学習はできますが、将来予測には履歴とその後の実測値で予測ヘッドを学びます。さらに、ヘッドだけの学習と全体の微調整では結果が変わるため、対象期間で比較が必要です。
Q. 複数のセンサーの関係も学べますか?
A. 原型は各チャネルの時間関係を学び、共通の重みに複数系列の経験を蓄えますが、あるセンサーの予測時に別センサーの観測を直接参照しません。変数間の因果的な連動や外部要因が重要なら、それらを使える別構成と比較してください。
今日の学び
この論文は、時系列予測で長い履歴を使うほど計算が重くなり、1時点単位では局所的な形を捉えにくい課題を扱いました。区間をパッチとして埋め込み、チャネルごとに共通のTransformerで処理することで、効率と予測精度の改善を目指しています。
得られるヒントは、モデル構造だけでなく、何を1つの入力単位にし、どこまで重みを共有するかを設計することです。実務では、必要な時間粒度と変数間の関係を整理し、単純な予測基準との比較から価値を確かめられます。