以下の論文を読みます。キャラクターの原作とは無関係です。私の誤りは私に帰属します。お気付きの点がありましたらご指摘ください。
- 問題設定:
- 関連するいくつかの時系列(例. 各家庭の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
時系列予測モデルとして Adversarial Sparse Transformer (AST) なるモデルを提案しているんですが、GAN の要領で Transformer を学習するのが独特です。これによって誤差の蓄積を回避し、長期予測性能を向上させています。
GAN って何だったっけ。てか俺誕生日なのになんで論文読まされてるの…。
GAN は第3節の背景の一番最後に簡単に説明がありますが、せっかくですし原論文をみてみましょう。
GAN
GAN: Generative Adversarial Networks(敵対的生成ネットワーク)とは生成モデルなんですが、その学習方法が特徴的です。そうですね、いま、手元に人間の顔の画像の訓練データセットがあって、これを利用して人間の顔っぽい画像をランダムに生成したいとします。以下の手順でそんなモデルを得るのが GAN です。- 予め適当な空間上の適当な確率分布 を用意します。この分布から生成した を によって画像空間の元に変換します。これでランダムな画像を生成する機構はできました。問題は、この機構によって生成される画像の分布が、画像空間内の「人間の顔っぽいところ」に広がるようにすることです。そうなるように を学習しなければなりません。
- となるとそもそも「人間の顔っぽいとは何か」という話になってきますが、訓練データの画像と容易に識別できる画像ならそれは人間の顔っぽくはないだろう、と考えます。ので、訓練データ画像とランダム画像を識別するモデル を用意しましょう。 は訓練データ画像なら 、訓練データ画像ではないランダム画像なら を取ってほしいです。そうなるように を学習します。
- すると をどう学習するかも定まります。 の目標は、自分が出すランダム画像を、 が訓練データ画像と識別できないようにすることです。
- と の目標をまとめましょう。
- の目標は、訓練データ画像には「訓練データ画像だ」と出力し、 から出てきた画像には「ランダム画像であって訓練データ画像ではない」と出力することです。
- の目標は を欺き、自分が出した画像を「訓練データ画像だ」と出力させることです。
敵対的って物騒だな…って思ったけど、それを訊くと本格的に敵対してるな。片や欺こうとして、片や見抜こうとしてるんだから。…でもさ、人間の顔っぽい画像の分布がほしいなら、各訓練データに近いほど密度が大きい分布をつくって足し合わせるとかじゃ駄目なの?
その近いとは何かという話だと思います。「この方向にこれくらいずらすのは近いのか」とかわからないでしょう。分散を小さめにしたらしたで、元の訓練データ内にあった画像しか出てこないモデルになってしまいますし。元の画像のどれかとかではなく本当にランダムだが見分けにくいようなものがほしくてこのようなことをするのだと思います。見分ける係()が人間ではなくてニューラルネットですから人間の感覚との差異はあるでしょうが、それでもかなり上手くいくんでしょう。
Transformer
ふーん…それで、Transformer ってのは超ロボット生命体?
ではありません。以下の論文で提案されたネットワークで、入力系列を同じ長さの特徴系列にエンコードし、それを利用して適当な長さの出力系列をデコードするものですね。
Transformer
今回の論文でも第3節の背景の The Transformer の箇所に説明がありますね。つまり、Transformer のエンコーダでは「マルチヘッドセルフアテンション」+「全結合」を 回繰り返します。具体的には以下を 回繰り返します。- 次元ベクトルが 個並んだ入力系列 を、
- を計算し、各要素を で割る( 次元ベクトルが 個並ぶ)。その上で各 次元ベクトルをソフトマックスする。これで得られた を scaled dot-product attention とよぶ。
- あとは を計算する( 次元ベクトルが 個並ぶ)。
- 以上のことを ヘッドやった を concat する( 次元ベクトルが 個並ぶ)。
- 各ベクトルを全結合し、ReLU で活性化し、さらに全結合する。つまり とする。これは入力系列と同じ長さの特徴系列である。
ところで、最終的にほしいのはそんな特徴系列ではありません。例えば機械翻訳であれば、英語の文章をドイツ語の文章に翻訳したものなどがほしいはずです。なのでそのような出力系列を得るデコーダを用意します。デコーダには「文頭トークン、*、*、*、*」(* は未知)という系列を入れて、エンコーダと同様にマルチヘッドセルフアテンションしてまず を得ます。が、このとき scaled dot-product attention が * に注意しないように、自分より後ろへの注意を0にします。なのでこの層は Masked Multi-Head Attention とよばれていますね。次に、再度マルチヘッドセルフアテンションしますが、この段では にエンコーダからの出力 を取り込みます。自分への注意ではなく、特徴系列に注意するわけです。その後 全結合-ReLU-全結合 します。これをやはり 回繰り返した後に、全結合-softmax して最終出力をします。これは例えば「すべてのドイツ語の単語上の確率分布」のようなものにすべきでしょう。こうして最初の単語を得て、次は「文頭トークン、最初の単語、*、*、*」をデコーダに入力してデコードを繰り返します。
問題設定
時系列予測も「現時点までの数ステップを参照してこれから未来の数ステップを予測する」と考えれば機械翻訳のようなものですよ。問題設定を確認しましょう。第3節の最初ですね。いま、手元に という 本の時系列があるとします。各 は の元です。これが興味のある時系列ですね(ターゲット時系列とよぶようです)。これに加えて、 という説明変数の時系列もあるとします。これは時間変化するものでも時間変化しないものでも構いませんが、未来の値も予測に利用しているようなので、未来の値が予めわかるものでないといけませんね。そしていま予測したいのは、 本の各時系列の今後 ステップ間の パーセンタイルです。モデルは以下になります。
時刻 | ||||||
---|---|---|---|---|---|---|
説明変数 | ||||||
ターゲット時系列 | ||||||
ターゲット時系列 |
時刻 | ||||||
---|---|---|---|---|---|---|
説明変数 | ||||||
ターゲット時系列 | ||||||
ターゲット時系列 |
まあそうかもしれないけど。
あとここにきて気付いたんですが、説明変数 は Transformer でいう Positional Encoding とかトークンタイプエンコーディングの位置付けなんですね。例えば月や曜日などとありましたし。Figure 2 に Positional Encoding はありませんし。あ、Positional Encoding は、機械翻訳ではその単語が何単語目かという特徴ベクトルですね。それを予め各単語ベクトルに足し合わせてからマルチヘッドセルフアテンションに流します。Transformer は再帰や畳込みを行わないので、そうでもしないとその単語が文章の1番目にあったのか、2番目にあったのかが本質的に区別されませんからね。
えっと、結局どうやって未来の時系列を予測するの?
4節をみてまとめましょう。
とまあ、これだけなら純粋に Transformer を利用して時系列予測したという話です。しかし、本論文で提案しているのは Adversarial Sparse Transformer (AST) です。ただの Transformer と違って Adversarial で Sparse なんです。あ、敵対的なのとか忘れてた…。
Sparse
先に Sparse の説明からいきましょう。
Sparse
時系列を予測するのに、過去の数ステップにしか注目したくなくて、関係ないステップには全く注目したくないという気持ちがあります(過去のどのステップが未来予測に関わってくるかは時系列によると思うんですが)。必要なステップへの注意に集中したいんです。しかし、 はソフトマックスの結果ですから、小さい要素でも完全にゼロにはなりません。そこで α-entmax を採用します。以下で提案されたものですね。つまり、 です。ここで、 は ReLU、 は要素がすべて1のベクトルで、 は に応じてただ1つ定まる閾値です。 はスパースさの度合いを定めるパラメータで、 のとき は softmax と一致するそうです。 のときは sparsemax なるものになるそうです。参照している論文の Figure 3 にいくつかの に対するグラフがありますね。 のときは がどれだけ小さくても小さな正の値になりますが、 が大きくなるほどゼロに切り捨てられる範囲が広がってくることがわかると思います。ステップ関数に近づいてきますね。この論文では を採用するようです。え、 何その式の形…全然ソフトマックスっぽくないんだけど…。
そうですね…元々 α-entmax は参照論文の (10) 式として定義されていて、これだとベクトル の最適化を含んでしまうので、 の最適化に落とし込んだのが今回の式のようなんですが、詳細は参照論文をよく読まなければなさそうです。
Adversarial
最後に Adversarial の説明です。
Adversarial
ここまでで現時点までの時系列から向こう何ステップかの予測値を生成する Sparse Transformer を用意しましたが、これを普通に学習するのではなく、ディスクリミネータも導入して学習します。ディスクリミネータには LeakReLu で活性化した3層の全結合層を用いたそうです。以降、Sparse Transformer のことをジェネレータとよびかえます。学習の1イテレーションは以下です。- データセットからランダムに をサンプリングします。 とします。
- 現時点のジェネレータで を予測します。 とします。ディスクリミネータに と判定させるのがジェネレータの目標です。
- 以下を小さくするようにジェネレータを更新します。
- 以下を小さくするようにディスクリミネータを更新します。
…それって90パーセンタイルの予測になるの? だって、仮に が を完璧に予測できたらその損失ってゼロになるけど、それは90パーセンタイルの予測じゃなくない?
完璧に予測できたらそうなるでしょうが、まず完璧に予測できないとして、「上振れはしてもほとんど下振れしない予測値」にはなっていると思います。それくらいの意味しかないと思いますよ。本当に90パーセンタイルを予測したかったら、90パーセンタイルのアノテーションデータが必要だと思いますし。
検証結果
検証は 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 よりは誤差が大きいようですが。
敵対的学習がそれだけ有効だったってこと? …でもさ、予測モデルの学習って正解データがあるんだよな。正解に合わせるように学習しさえすればいいんじゃないのか? なんでわざわざ敵(ディスクリミネータ)を用意して敵対させなきゃならないんだ…。
今回の特徴は再帰的に何ステップも予測を続けていく点だと思います。例えば一期先予測を大きい側に 謝るのと、小さい側に 誤るのとでは、絶対誤差の観点ではどちらも同じだけの誤りです。しかし、「現時点までの時系列に続けてその値が観測されることは尤もらしいだろうか」という観点では同じ誤りではない可能性があります。ディスクリミネータ視点、片や「この系列は訓練データらしい(訓練データにあってもおかしくない)」、片や「この系列は訓練データらしくない」となっている可能性があります。そして、後者に陥ってしまったら、そこから先の予測は途端にくるってくる可能性があるかもしれません。だったら後者を優先して修正しなければならない…とか。