NeurIPS2020読みメモ: Adversarial Sparse Transformer for Time Series Forecasting

以下の論文を読みます。キャラクターの原作とは無関係です。私の誤りは私に帰属します。お気付きの点がありましたらご指摘ください。

Sifan Wu, Xi Xiao, Qianggang Ding, Peilin Zhao, Ying Wei, Junzhou Huang. Adversarial Sparse Transformer for Time Series Forecasting. In Pre-proceedings of the 33rd International Conference on in Neural Information Processing Systems (NeurIPS 2020), 2020. Paper
まとめ
  • 問題設定:
    • 関連するいくつかの時系列(例. 各家庭の15分ごとの電力消費量など)がある。
    • 各時系列について、少し離れた先の特定のパーセンタイルを予測したい。
      • 例えば、 50 パーセンタイルと 90 パーセンタイル、のように。
  • アプローチ:
    • 予測するパーセンタイルごとに Transformer を用意して学習する(曜日や時刻も入力するのが Positional Encoding の役割を担うと思われる)。損失はパーセンタイルに応じたピンボールロスにする。ただし、
      • 予測に無関係なステップを無視し、予測に関係あるステップに注意を集中したいので、アテンションにはソフトマックスではなく α-entmax を用いる(Sparse)
      • Transformer の学習には、ディスクリミネータも利用する(Adversarial)
  • 結果、electricity, traffic の1日後、7日後予測や wind, solar, M4-Hourly の予測のほとんどでも予測性能が既存手法を上回った(誤差の蓄積を回避できた)。
    • 単純な Transformer や Sparse Transformer よりも Adversarial Sparse Transformer がよかった。
    • なお、DeepAR を Adversatial に学習しても性能が向上した。
所感
  • どのようなデータを出力するべきかの指針を与えてくれる敵対的学習は、損失を上手く設計できない場面で(上手く設計できるとは)広く有効そうにみえる。
関連記事目次
GAN
f:id:cookie-box:20180305232608p:plain:w60

時系列予測モデルとして Adversarial Sparse Transformer (AST) なるモデルを提案しているんですが、GAN の要領で Transformer を学習するのが独特です。これによって誤差の蓄積を回避し、長期予測性能を向上させています。

f:id:cookie-box:20180305231302p:plain:w60

GAN って何だったっけ。てか俺誕生日なのになんで論文読まされてるの…。

f:id:cookie-box:20180305232608p:plain:w60

GAN は第3節の背景の一番最後に簡単に説明がありますが、せっかくですし原論文をみてみましょう。

GAN

GAN: Generative Adversarial Networks(敵対的生成ネットワーク)とは生成モデルなんですが、その学習方法が特徴的です。そうですね、いま、手元に人間の顔の画像の訓練データセットがあって、これを利用して人間の顔っぽい画像をランダムに生成したいとします。以下の手順でそんなモデルを得るのが GAN です。
  • 予め適当な空間上の適当な確率分布  p_z(z) を用意します。この分布から生成した z x = G(z; \theta_g) によって画像空間の元に変換します。これでランダムな画像を生成する機構はできました。問題は、この機構によって生成される画像の分布が、画像空間内の「人間の顔っぽいところ」に広がるようにすることです。そうなるように G を学習しなければなりません。
  • となるとそもそも「人間の顔っぽいとは何か」という話になってきますが、訓練データの画像と容易に識別できる画像ならそれは人間の顔っぽくはないだろう、と考えます。ので、訓練データ画像とランダム画像を識別するモデル  D(x; \theta_d) を用意しましょう。 D(x; \theta_d) は訓練データ画像なら 1、訓練データ画像ではないランダム画像なら 0 を取ってほしいです。そうなるように D を学習します。
  • すると G をどう学習するかも定まります。G の目標は、自分が出すランダム画像を、D が訓練データ画像と識別できないようにすることです。
  • DG の目標をまとめましょう。
    •  D の目標は、訓練データ画像には「訓練データ画像だ」と出力し、G から出てきた画像には「ランダム画像であって訓練データ画像ではない」と出力することです。
    •  G の目標は D を欺き、自分が出した画像を「訓練データ画像だ」と出力させることです。
    そしてこの最適化問題を数式でかくとこうです。
     \displaystyle \underset{G}{\rm min} \; \underset{D}{\rm max} \Bigl[ \mathbb{E}_{x \sim p_{\rm data}(x)}\bigl(\log D(x) \bigr) + \mathbb{E}_{x \sim p_z(z)}\bigl(\log (1 - D(G(z)) ) \bigr) \Bigr]
DD(G(z))0 にしようとし、GD(G(z))1 にしようとする敵対が起きていることがわかりますね。ちなみに上の目的関数は、DG に対して最適に学習されている場合は訓練データの分布と G が生成する画像の分布のJSダイバージェンスになります(原論文5ページ)。

f:id:cookie-box:20180305231302p:plain:w60

敵対的って物騒だな…って思ったけど、それを訊くと本格的に敵対してるな。片や欺こうとして、片や見抜こうとしてるんだから。…でもさ、人間の顔っぽい画像の分布がほしいなら、各訓練データに近いほど密度が大きい分布をつくって足し合わせるとかじゃ駄目なの?

f:id:cookie-box:20180305232608p:plain:w60

その近いとは何かという話だと思います。「この方向にこれくらいずらすのは近いのか」とかわからないでしょう。分散を小さめにしたらしたで、元の訓練データ内にあった画像しか出てこないモデルになってしまいますし。元の画像のどれかとかではなく本当にランダムだが見分けにくいようなものがほしくてこのようなことをするのだと思います。見分ける係(D)が人間ではなくてニューラルネットですから人間の感覚との差異はあるでしょうが、それでもかなり上手くいくんでしょう。

Transformer
f:id:cookie-box:20180305231302p:plain:w60

ふーん…それで、Transformer ってのは超ロボット生命体?

f:id:cookie-box:20180305232608p:plain:w60

ではありません。以下の論文で提案されたネットワークで、入力系列を同じ長さの特徴系列にエンコードし、それを利用して適当な長さの出力系列をデコードするものですね。

Transformer

今回の論文でも第3節の背景の The Transformer の箇所に説明がありますね。つまり、Transformer のエンコーダでは「マルチヘッドセルフアテンション」+「全結合」を N 回繰り返します。具体的には以下を N 回繰り返します。
  • d 次元ベクトルが n 個並んだ入力系列 h \in \mathbb{R}^{n \times d} を、
    • W_m^Q \in \mathbb{R}^{d \times d/M}Q_m = h W_m^Q \in \mathbb{R}^{n \times d/M}写像する(d/M 次元ベクトルが n 個並ぶ)。
    • W_m^K \in \mathbb{R}^{d \times d/M}K_m = h W_m^K \in \mathbb{R}^{n \times d/M}写像する(d/M 次元ベクトルが n 個並ぶ)。
    • W_m^V \in \mathbb{R}^{d \times d_v}V_m = h W_m^V \in \mathbb{R}^{n \times d_v} 次元に写像する(d_v 次元ベクトルが n 個並ぶ)。
  • Q_m K_m^\top \in \mathbb{R}^{n \times n} を計算し、各要素を \sqrt{d/M} で割る(n 次元ベクトルが n 個並ぶ)。その上で各 n 次元ベクトルをソフトマックスする。これで得られた \alpha_m を scaled dot-product attention とよぶ。
  • あとは O_m = \alpha_m V_m を計算する(d_v 次元ベクトルが n 個並ぶ)。
  • 以上のことを M ヘッドやった O_1, \cdots, O_M を concat する(M \times d_v 次元ベクトルが n 個並ぶ)。
  • 各ベクトルを全結合し、ReLU で活性化し、さらに全結合する。つまり {\rm max}(0, O W_1 +b_1)W_2 +b_2 とする。これは入力系列と同じ長さの特徴系列である。
余談ですが、BERT では ReLU ではなく GELU(Gaussian Error Linear Units)で活性化していますよね。ともかく、\alpha_m は、例えば長さ5の系列を入力したら、5×5行列になりますが、この1行目が意味するのは、「1番目の位置は、1~5番目の位置にどれだけずつ注目するか」であり、入力系列は自分に注意している(セルフアテンション)ことになります。エンコーダから出力される特徴系列は、前後の文脈を踏まえたその箇所の単語の特徴とでもいうべきものになっているでしょう。

ところで、最終的にほしいのはそんな特徴系列ではありません。例えば機械翻訳であれば、英語の文章をドイツ語の文章に翻訳したものなどがほしいはずです。なのでそのような出力系列を得るデコーダを用意します。デコーダには「文頭トークン、*、*、*、*」(* は未知)という系列を入れて、エンコーダと同様にマルチヘッドセルフアテンションしてまず O を得ます。が、このとき scaled dot-product attention が * に注意しないように、自分より後ろへの注意を0にします。なのでこの層は Masked Multi-Head Attention とよばれていますね。次に、再度マルチヘッドセルフアテンションしますが、この段では V_m = h_{\rm embed} W_m^V にエンコーダからの出力 h_{\rm embed} を取り込みます。自分への注意ではなく、特徴系列に注意するわけです。その後 全結合-ReLU-全結合 します。これをやはり N 回繰り返した後に、全結合-softmax して最終出力をします。これは例えば「すべてのドイツ語の単語上の確率分布」のようなものにすべきでしょう。こうして最初の単語を得て、次は「文頭トークン、最初の単語、*、*、*」をデコーダに入力してデコードを繰り返します。

f:id:cookie-box:20180305231302p:plain:w60

…処理が込み入ってるけど、Transformer は系列から系列を得るのに使えるんだな。入力文章の各位置に前後の文脈を反映させてエンコード文章にして、デコードするときはそこまででデコードできている範囲で前後の文脈を反映させてからエンコード文章を取り込むって感じか…ってあれ? いまは機械翻訳じゃなくて時系列の予測をしたいんだよな?

問題設定
f:id:cookie-box:20180305232608p:plain:w60

時系列予測も「現時点までの数ステップを参照してこれから未来の数ステップを予測する」と考えれば機械翻訳のようなものですよ。問題設定を確認しましょう。第3節の最初ですね。いま、手元に  \{y_{i, 1:t_0}\}_{i=1}^S という S 本の時系列があるとします。各 y_{i,t}\mathbb{R} の元です。これが興味のある時系列ですね(ターゲット時系列とよぶようです)。これに加えて、X_{i,1:t_0} \in \mathbb{R}^{t_0 \times k} という説明変数の時系列もあるとします。これは時間変化するものでも時間変化しないものでも構いませんが、未来の値も予測に利用しているようなので、未来の値が予めわかるものでないといけませんね。そしていま予測したいのは、S 本の各時系列の今後 \tau ステップ間の \rho パーセンタイルです。モデルは以下になります。

 \hat{Y}_{\rho, t_0+1:t_0+\tau} = f_\rho(Y_{1:t_0}, X_{1:t_0+\tau})
\rho ごとにモデルを用意するようですね。以下にイメージをかきましょう。例えば50パーセンタイルと90パーセンタイルを予測するとして、50パーセンタイルモデルは以下の青字の箇所を入力に緑字の箇所を出力します。90パーセンタイルモデルは以下の青字の箇所を入力にオレンジの字の箇所を出力します。まあ入力はどちらも同じなんですが。
時刻1\cdotst_0t_0 + 1\cdotst_0 + \tau
説明変数X_1\cdotsX_{t_0}X_{t_0+1}\cdotsX_{t_0+\tau}
ターゲット時系列 1y_{1,1}\cdotsy_{1,t_0}y_{1,t_0+1}^{(50)}\cdotsy_{1,t_0+\tau}^{(50)}
\vdots\vdots\ddots\vdots\vdots\ddots\vdots
ターゲット時系列 Sy_{S,1}\cdotsy_{S,t_0}y_{S,t_0+1}^{(50)}\cdotsy_{S,t_0+\tau}^{(50)}
時刻1\cdotst_0t_0 + 1\cdotst_0 + \tau
説明変数X_1\cdotsX_{t_0}X_{t_0+1}\cdotsX_{t_0+\tau}
ターゲット時系列 1y_{1,1}\cdotsy_{1,t_0}y_{1,t_0+1}^{(90)}\cdotsy_{1,t_0+\tau}^{(90)}
\vdots\vdots\ddots\vdots\vdots\ddots\vdots
ターゲット時系列 Sy_{S,1}\cdotsy_{S,t_0}y_{S,t_0+1}^{(90)}\cdotsy_{S,t_0+\tau}^{(90)}
ターゲット時系列 1 のみに注目すれば (y_{1,1}, \cdots, y_{1, t_0}) から (y_{1,t_0 + 1}, \cdots, y_{1, t_0 + \tau}) への機械翻訳のようなものでしょう?

f:id:cookie-box:20180305231302p:plain:w60

まあそうかもしれないけど。

f:id:cookie-box:20180305232608p:plain:w60

あとここにきて気付いたんですが、説明変数 X_t は Transformer でいう Positional Encoding とかトークンタイプエンコーディングの位置付けなんですね。例えば月や曜日などとありましたし。Figure 2 に Positional Encoding はありませんし。あ、Positional Encoding は、機械翻訳ではその単語が何単語目かという特徴ベクトルですね。それを予め各単語ベクトルに足し合わせてからマルチヘッドセルフアテンションに流します。Transformer は再帰や畳込みを行わないので、そうでもしないとその単語が文章の1番目にあったのか、2番目にあったのかが本質的に区別されませんからね。

f:id:cookie-box:20180305231302p:plain:w60

えっと、結局どうやって未来の時系列を予測するの?

f:id:cookie-box:20180305232608p:plain:w60

4節をみてまとめましょう。

  • 現時点までのターゲット系列と説明変数系列 (Y_{1:t_0}, X_{1:t_0}) をエンコーダに入力し、特徴系列 (h_1, \cdots, h_{t_0})エンコードする。
  • 未来の説明変数系列 (X_{t_0 + 1:t_0 + \tau}) と特徴系列 (h_1, \cdots, h_{t_0})デコーダに入力し、順次 \hat{y}_{t_0 + 1}, \cdots, \hat{y}_{t_0 + \tau} をデコードする。
    • 明記されていませんが、このとき最初に機械翻訳における文頭トークンに相当するものとして (Y_{t_0}, X_{t_0}) がフィードされていると思うんです。そうでなければ、特徴系列に注目する主体がいませんから。また、Figure 2 に明記されていませんが Masked Multi-Head Attention であるはずです。
とまあ、これだけなら純粋に Transformer を利用して時系列予測したという話です。しかし、本論文で提案しているのは Adversarial Sparse Transformer (AST) です。ただの Transformer と違って Adversarial で Sparse なんです。

f:id:cookie-box:20180305231302p:plain:w60

あ、敵対的なのとか忘れてた…。

Sparse
f:id:cookie-box:20180305232608p:plain:w60

先に Sparse の説明からいきましょう。

Sparse

時系列を予測するのに、過去の数ステップにしか注目したくなくて、関係ないステップには全く注目したくないという気持ちがあります(過去のどのステップが未来予測に関わってくるかは時系列によると思うんですが)。必要なステップへの注意に集中したいんです。しかし、\alpha_m はソフトマックスの結果ですから、小さい要素でも完全にゼロにはなりません。そこで α-entmax を採用します。以下で提案されたものですね。つまり、\alpha_{\rm entmax}(h) = [ (\alpha - 1) h - \tau {\bf 1}]^{1/(\alpha - 1)}_{+} です。ここで、[\cdot]_+ は ReLU、{\bf 1} は要素がすべて1のベクトルで、\tauh に応じてただ1つ定まる閾値です。\alpha > 1 はスパースさの度合いを定めるパラメータで、\alpha=1 のとき \alpha_{\rm entmax}(h) は softmax と一致するそうです。\alpha=2 のときは sparsemax なるものになるそうです。参照している論文の Figure 3 にいくつかの \alpha に対するグラフがありますね。\alpha = 1 のときは h がどれだけ小さくても小さな正の値になりますが、\alpha が大きくなるほどゼロに切り捨てられる範囲が広がってくることがわかると思います。ステップ関数に近づいてきますね。この論文では \alpha = 1.5 を採用するようです。

f:id:cookie-box:20180305231302p:plain:w60

え、 何その式の形…全然ソフトマックスっぽくないんだけど…。

f:id:cookie-box:20180305232608p:plain:w60

そうですね…元々 α-entmax は参照論文の (10) 式として定義されていて、これだとベクトル p の最適化を含んでしまうので、\tau の最適化に落とし込んだのが今回の式のようなんですが、詳細は参照論文をよく読まなければなさそうです。

Adversarial
f:id:cookie-box:20180305232608p:plain:w60

最後に Adversarial の説明です。

Adversarial

ここまでで現時点までの時系列から向こう何ステップかの予測値を生成する Sparse Transformer を用意しましたが、これを普通に学習するのではなく、ディスクリミネータも導入して学習します。ディスクリミネータには LeakReLu で活性化した3層の全結合層を用いたそうです。以降、Sparse Transformer のことをジェネレータとよびかえます。学習の1イテレーションは以下です。
  • データセットからランダムに  [ X_{1:t_0 + \tau}, Y_{1:t_0 + \tau} ] をサンプリングします。Y_{\rm real} \equiv  Y_{1:t_0 + \tau} とします。
  • 現時点のジェネレータで  \hat{Y}_{t_0 + 11:t_0 + \tau} を予測します。Y_{\rm fake} \equiv  Y_{1:t_0}  \circ \hat{Y}_{t_0 + 11:t_0 + \tau} とします。ディスクリミネータに D(Y_{\rm fake} )=1 と判定させるのがジェネレータの目標です。
  • 以下を小さくするようにジェネレータを更新します。
     \mathcal{L}_\rho (Y_{t_0+1:t_0+\tau}, \hat{Y}_{t_0 + 11:t_0 + \tau}) + \lambda \mathbb{E}[ \log( 1 − D(Y_{\rm fake} )) ]
  • 以下を小さくするようにディスクリミネータを更新します。
     \mathbb{E}[ - \log( D(Y_{\rm real} )) - \log( 1 − D(Y_{\rm fake} )) ]
ここで \mathcal{L}_\rho (Y_{t_0+1:t_0+\tau}, \hat{Y}_{t_0 + 11:t_0 + \tau}) は通常の学習の損失ですが、y_{i, t}\hat{y}_{i, t} と予測したときの損失の定義は、例えば 90 パーセンタイルの予測だったら、「上振れしたときは上振れ幅の 0.1 倍、下振れしたときは下振れ幅の 0.9 倍」です(論文は誤植だと思います)。基本的に絶対誤差なんですが、90パーセンタイルの予測だったら下振れ側に厳しく、10パーセンタイルの予測だったら上振れ側に厳しいイメージですね。

f:id:cookie-box:20180305231302p:plain:w60

…それって90パーセンタイルの予測になるの? だって、仮に \hat{y}_{i, t}y_{i, t} を完璧に予測できたらその損失ってゼロになるけど、それは90パーセンタイルの予測じゃなくない?

f:id:cookie-box:20180305232608p:plain:w60

完璧に予測できたらそうなるでしょうが、まず完璧に予測できないとして、「上振れはしてもほとんど下振れしない予測値」にはなっていると思います。それくらいの意味しかないと思いますよ。本当に90パーセンタイルを予測したかったら、90パーセンタイルのアノテーションデータが必要だと思いますし。

検証結果
f:id:cookie-box:20180305232608p:plain:w60

検証は electricity, traffic, wind, solar, M4-Hourly データセットで行ったようです。electricity, traffic については以下の記事で図示しました。

誤差の指標として6ページの (8) 式のρリスクを導入していますが、これは50パーセンタイルの予測であれば単なる絶対パーセント誤差ですね。90パーセンタイルの予測であれば、上振れに甘く、下振れに厳しくなります。

Table 2, Table 3 は electricity, traffic の1日後、1週間後予測ですが(Table 2 は50パーセンタイル、Table 3 は90パーセンタイル)、AST のρリスクが既存手法に比べて最小になっていますね。AST の左隣2列が T, ST となっていますが、これは単なる Transformer と Sparse Transformer でしょう。T より ST の方がよく、ST より AST の方がさらによいことがはっきりわかりますね。Table 6 には wind, solar, M4-Hourly の結果がありますが、50パーセンタイルは一貫して AST が最良ですが、90パーセンタイルについては DeepState や DeepAR がよい場合もありますね。

面白いのは、Table 5 で DeepAR にも敵対的学習を施してみている点です。DeepAR も敵対的学習によって性能が向上することがわかります。向上後も AST よりは誤差が大きいようですが。

f:id:cookie-box:20180305231302p:plain:w60

敵対的学習がそれだけ有効だったってこと? …でもさ、予測モデルの学習って正解データがあるんだよな。正解に合わせるように学習しさえすればいいんじゃないのか? なんでわざわざ敵(ディスクリミネータ)を用意して敵対させなきゃならないんだ…。

f:id:cookie-box:20180305232608p:plain:w60

今回の特徴は再帰的に何ステップも予測を続けていく点だと思います。例えば一期先予測を大きい側に d 謝るのと、小さい側に d 誤るのとでは、絶対誤差の観点ではどちらも同じだけの誤りです。しかし、「現時点までの時系列に続けてその値が観測されることは尤もらしいだろうか」という観点では同じ誤りではない可能性があります。ディスクリミネータ視点、片や「この系列は訓練データらしい(訓練データにあってもおかしくない)」、片や「この系列は訓練データらしくない」となっている可能性があります。そして、後者に陥ってしまったら、そこから先の予測は途端にくるってくる可能性があるかもしれません。だったら後者を優先して修正しなければならない…とか。

おわり