論文読みメモ: An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling

以下の論文を読みます。

Shaojie Bai, J. Zico Kolter, Vladlen Koltun. An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling. arXiv:1803.01271, 2018. [1803.01271] An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling
まとめ
  • 近年の CNN の系列データへの適用事例に着想を得て、シンプルで汎用的な TCN( Temporal Convolutional Networks )を提案した。TCN は再帰構造をもたず(スキップ付きの)畳込みのみで現時点までの入力から現時点の出力を生成する。
  • 11種類の系列データに対するタスク(人工的なタスク、曲に対する予測、文字/単語に対する予測)のほとんどで、TCN は同一モデルサイズ(パラメータ数だと思う)の LSTM、GRU、vanilla RNN よりも高い性能を発揮した。
  • 系列データへのファーストトライアルは RNN 系のニューラルネットに代わって TCN とすべきである。
所感
  • 検証されているタスクの半分が言語データに対するタスクであり、むしろ実際に予測タスクの需要があると考えられる経済データや自然データなどでの検証はなされていない点が気になった。
  • 推論時にその時点までの全データを参照する TCN が長期記憶性で有利なのは当然のようには感じる(というかそれは記憶なのだろうか)。RNN は過去の入力データを保持しない代わりに現時点までの特徴にバックアップしており、RNN と TCN のどちらを採用するか(どう組み合わせるか)は推論時に使用できるメモリサイズに依存しそう。
  • 確かに最初から再帰構造縛りでモデリングする意味はわからないので、現実に系列データをニューラルネットで学習するのはまず利用できるメモリサイズで TCN する方が適当なように思う。
※ キャラクターは架空のものです。私の誤りは私に帰属します。お気付きの点がありましたらコメントでご指摘ください。
f:id:cookie-box:20200101101603p:plain:w60

「系列データに対する様々なタスクにおいて、単純な畳込みニューラルネットの方が伝統的な再帰ニューラルネットより効果的だったので、系列データのモデリングのファーストトライアルは再帰ニューラルネットではなく畳込みニューラルネットに改めるべきだ」というようなアブストラクトですね。なぜ単純な畳込みニューラルネットの方が効果的なんでしょうか? どんなモデルでどんなタスクを検証したのでしょう?

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

確かにどんなタスクを調べたのか気になるね。4節に「系列データのモデリングのタスク」ってまとめられてるのがそれかな。RNN アーキテクチャの性能比較によく使われるタスクを集めたみたい。

The adding problem そのまま「足し算」かな。以下のような2次元系列が入力で、第2成分がマーカーになっていて、マーカーが付いた数字を足し算しろというタスクだね。
f:id:cookie-box:20200228194641p:plain:w360
LSTM の原論文( https://www.bioinf.jku.at/publications/older/2604.pdf )が初出で、LSTM の登場より前の RNN では解けなかったとある。確かに入力系列の長さが自在に調節できるし、長期記憶性を測るのにうってつけって感じがするかも。「あてずっぽうに予測値を 1.0 にすると MSE が 0.1767 になる」ってあるけど、第1成分を [0,1] の一様乱数から生成するなら以下より MSE は 1.667 になるんじゃと思うんだけど誤植なのかな…?
 \displaystyle \int_{x=0}^1 \int_{y=0}^1 (1 - x - y)^2 dx dy = \frac{1}{6}
Sequential MNIST and P-MNIST MNIST は 28×28=784 ピクセルのグレースケール手書き数字画像だけど、それを長さが 784 の系列データとして入力して分類しろってタスクか…画像は縦と横の広がりがある2次元のデータなのに1次元にして判別しろっていうのも意地悪だな…。
f:id:cookie-box:20200315171206p:plain:w500
それで P-MNIST っていうのはさらにこの長さ 784 の系列データをランダムに並び替えるらしい。全ての訓練データ、テストデータに対して並び替え方は同じだと思う。これは、単に画像データを1次元の系列に解きほぐしたのでは元画像における右隣・左隣のピクセルはまだ隣り合ったままだけど、その横方向のつながりをもぶち壊すために permutation したってことだよね。ますます意地悪だな…。そもそも現実にありうる系列データのパターンに対する性能が大事なのに、系列データに対するファーストトライアルを提案する論文で意図的に自然なパターンをぶち壊していくのってどうなのかな…。
Copy memory これは下図のように「最初に入力した数字の列を覚えておいて、こちらが9を入力し始めたらその1ステップ後から出力すること」ってタスクだね。下図では4桁の数字を覚えさせているけど本当は10桁らしい。まあどうでもいいけど。出力させるまでに何ステップおくかもモデルの性能を測りたい人が適当に決めるんだろうね。
f:id:cookie-box:20200315173233p:plain:w540
JSB Chorales and Nottingham 「J. S. バッハのコラール」は382曲の4声コラール(賛美歌)が、88次元(ピアノの鍵盤数だよね)のベクトルの列で表されているっぽいね。ベクトルの各要素は0か1で、そのとき押されている鍵盤が1になっているっぽいけど、それだと「タンタン」と「ターーン」の区別付かないような…。あと4部合唱ということは同時に1になる成分は高々4つまでなのかな…ウィキペディアの画像をみてもこれ伴奏とかじゃなくて歌唱旋律だよね…まあどっちでもいいけど…。ノッティンガム」は1200曲のイギリス・アメリカのフォーク音楽のデータセットらしい。じゃあこれらのデータセットで何をするのかだけど、Greff 2017 では4分音符ごとの系列にした JSB Chorales に対して次のステップを予測する(このとき負の対数尤度を最小化することを目指す)というタスクになっているみたいだね。
PennTreebank これは言語データで、このデータで文字レベルの系列の学習も、単語レベルの系列の学習もやったらしい。
  • 文字レベルの系列としてみると、訓練データは 5059K 文字、バリデーションデータは 396K 文字、テストデータは 446K 文字含むらしい。"with an alphabet size of 50" ってのは何なんだろう。アルファベットは26文字だと思うんだけど…Miyamoto 2016 をみると、「10K の高頻度語、51 の高頻度文字にプリプロセスされている」とあるね。じゃあ 50 という数は単に決め打ったもので、26文字のアルファベットの他に記号とか文頭・文末のマーカーとかが含まれているのかな…?
  • 単語レベルの系列としてみると、訓練データは 888K 単語、バリデーションデータは 70K 単語、テストデータは 79K 単語含むらしい。
Wikitext-103 PTB より 110 倍大きいデータセットで、語彙サイズは 268K らしい。28K のウィキペディア記事(103M 単語)を訓練データに、60 の記事(218K 単語)をバリデーションデータに、60 の記事(246K 単語)をテストデータにしたらしい。PTB より代表的・現実的なデータセットで、レアな単語を含むのが特徴だとか。
LAMBADA 小説から 10K の節(それぞれの節が4.6 文のコンテキスト文と、1文のターゲット文からなる)を抜き出してきたデータセットみたいだね。ターゲット文の最後の単語が予測対象になるらしい。ターゲット文の最後の単語は、人間にとって、「コンテキスト文があると容易にわかるけどターゲット文だけ見てもわからない」ものになっているんだって。つまりモデルは長い文脈を捉える必要があって、色々なモデルが LAMBADA の予測に失敗しているんだって。LAMBADA タスクの訓練に用いたデータは(LAMBADA じゃないのか?)2662 の小説の全文で、200M 語以上あって、語彙数は 93K だって。
text8 PTB の 20 倍のサイズの、100M 文字を含むウィキペディア由来のデータセットで、文字レベルの言語モデリングに用いたらしい。90M 文字を訓練に、5M 文字をバリデーションに、5M 文字をテストにつかったみたいだけど、どんなデータなのか、文章や記事に区切られているのかとかよくわかんないな…。
…これらをみる限り、「人工タスク」「人工タスク」「人工タスク」「音楽タスク」「言語タスク」「言語タスク」「言語タスク」「言語タスク」だね。系列データってもっと、金融データとか、売上高データとか、気温や天候などの自然現象データとか、遺伝子データとか、色々あると思うんだけど…音楽や小説の次の内容なんかより売上高や天候の方が予測したいはずだし…。それに、言語タスクといっても次の語を予測とかじゃなくて翻訳やサマリーとかある(むしろそっちのが現実に需要がある)と思うし…。

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

確かに後半が言語データセットばかりですね…で、それらに対して再帰ニューラルネットと畳込みニューラルネットを適用した結果どうなったんです?

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

それが Table 1 かな。再帰ニューラルネット側は、LSTM、GRU、vanilla RNN を適用したみたいだけど、比較対象の TCN( Temporal Convolutional Networks )は3節のアーキテクチャを参照ってあるから3節「Temporal Convolutional Networks」を確認しようかな。TCN はこの著者の人たちが汎用的になるように設計したアーキテクチャみたいだけど、新しいものではないらしい。TCN という言葉自体も Lea 2017 に既に出てきているって。TCN は系列データの予測に用いるので、以下を満たすらしい。

  • 畳込み時に未来から過去へのリーケージがないようにする。
  • 任意の長さの入力系列を受け取って、同じ長さの系列を出力できる。
TCN は近年発表された畳込みニューラルネットによる系列データ学習(以下)に着想を得ているみたいだけど、よりシンプルで長期記憶性をもつようにしているみたいだね。まず 3.1 節で系列モデリングとは  L(y_0, \cdots, y_T, f(x_0, \cdots, x_T)) を最小化するような f を見つけることと定式化されている。
 \hat{y}_0, \cdots, \hat{y}_T = f(x_0, \cdots, x_T) \tag{1}
これで多くの系列データに対するタスクがカバーできるけど、翻訳などのような seq2seq タスクはカバーできないって。アウトプットの各データに全てのインプットを利用するからって。…じゃあ翻訳なんかはこのフレームワークに当てはまらないから対象外ってことなんだね。

それで CNN でどうやって系列データに対するタスクに取り組むのかって話だけど、過去を参照せずに入力系列と同じ長さの系列を出すには以下みたいに1次元の FCN にすればいい。

f:id:cookie-box:20200316170220p:plain:w160
FCN(fully-convolutional network)というのは全て畳込み層のみからなるネットワークのことで、画像内の物体認識とかで性能がいいみたいだね。ただ上図のアーキテクチャだと長記憶性をもたせるのに畳込みのフィルタを大きくするか、層数を増やさないといけなくて、あまり重いモデルになるとファーストトライアルに向かない。なので WaveNet よろしく dilated convolutions(下図)を採用する。これで飛躍的に過去のデータを反映できる。
f:id:cookie-box:20200316172603p:plain:w260
一応 dilated convolutions を定式化しておくと以下ね。d 個飛ばしに k 個のデータを取って、i 個目のデータには重み f(i) をかけるってことだね。
 \displaystyle F(s) = (x \ast_d f)(s) = \sum_{i = 0}^{k - 1} f(i) x_{s-di} \tag{2}
これにさらに Residual Connection と Weight Normalization が組み込まれているらしい。これらについては効果があることが実証されてきたって感じで、今回なんで組み込むのかの説明があんまりないかな…? 3節の最後にこの TCN の特徴が RNN と対比して以下のようにまとめられている。
  • ⭕ 並列に計算できる。
  • ⭕ 受容長さをフレキシブルに変更できる(RNN も多段にすれば達成できると思うけど…)。
  • ⭕ 勾配爆発/消失がない。
  • ⭕ 省メモリで訓練できる。
  • ❌ 逆にモデルの利用時には、データを順番に入力していけばいい RNN と違って全てのデータをメモリに載せないとならないので、メモリを食う。
  • ❌ 受容長さが短いドメインから長いドメインにモデルを転移させることができない。
最後のって逆に RNN でもできるのかな…まあ TCN だと原理上無限の過去までみているわけではなくてあるところで打ち切られてはいるけどね。

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

そうですね…今の文脈でいう「系列データに対するタスク」って「現在のステップまでのすべての入力を踏まえた出力を出す」ですが、「1つ前のステップにおける隠れ層の出力を利用しなければならない」なんてルールはないですから、RNN は縛りプレイしている気がします。かといって、この縛りを外すとたくさんのデータを保持しなければ推論できないですね。1つ前のステップまでの情報が1つ前のステップにおける隠れ層の出力に込められているわけではなくなってしまいますから…。

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

RNN の出力は「その時点まですべての系列の特徴を集約したもの」、TCN の出力は「その時点あたりの特徴を集約したもの」だよね。RNN に入力する系列は入力したらもう捨てていいけど、TCN に入力する系列は TCN に参照される可能性がある限り保持しないといけないから、TCN で長期にわたる特徴を捉えようとすることはできるけどメモリが大変で、なんかもうメモリとの相談だよね。もちろん両者を組み合わせることもできて、まさに以下の記事で参照している Lai 2018 は先に TCN して次に RNN してるね。

逆に先に RNN して 後から TCN することもできると思うけど、その時点までの特徴にされる前の生データの系列を参照したいなら先に TCN の方がよさそうかな。どれだけ過去の生データまで参照できるかはメモリとの相談になるけどね。そういう意味では、上のアーキテクチャってなんかごてごてした恣意的なものにみえるけど割と素直なものなのかも。

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

逆に RNN や dilated convolutions 以外に系列データを学習するニューラルネットアーキテクチャってないんですか? まあ極論をいえば全結合とかありますけど…。

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

CNN だって部分を取って全結合するみたいなもんだし…じゃあその部分をどう取るかとか、dilated convolutions のスキップ幅自体でも学習すれば?

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

面倒です。

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

じゃあなんで訊いたし…。

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

Table 1 の結果をみると全て TCN が優れていたということなのですかね。直感的に足し算タスクやコピーメモリータスクはそりゃ再帰させる特徴を経由しない方が有利だろうという気はします。モデルサイズでなく推論時の利用メモリをそろえないとフェアでない気がしますが…。6節の Conclusion には LSTM には最近よい正則化手法が提案されたという話題がありますね。TCN ももっと広まって多くの人に改良してほしいといった感じでしょうか。

おわり