CNNで系列モデリングをするTemporal Convolutional Network(TCN)

<br>
この記事では**時系列モデリングにはRNNよりCNNのほうが有効である**と提唱してる[論文](https://arxiv.org/pdf/1803.01271.pdf)と、その中で提案されている手法**Temporal Convolutional Network(TCN)**について紹介します

### 論文概要

タイトル : An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling

論文URL : https://arxiv.org/pdf/1803.01271.pdf

Date : 2018/04/19

### 背景

深層学習の文脈で時系列モデリングと言えばRNNと多くの人が思うでしょうし、多くの本の"時系列モデル"の項にもRNNが載せられています。しかし、2016~2018年には音声合成や機械翻訳などの一部の分野でConvolutionを用いた手法がRNN系の手法より優れているという研究が出てきています。

そこで、このCNN系がRNN系よりも優れているのは一部の分野に限ったことなのか？一般的にCNN系のほうが優れているのではないか？という疑問を解決するために、あらゆる時系列モデリングに関するタスクでRNN系の手法とCNN系の手法を実験によって比較することを考えます。

結果からいうと、様々なタスク全般的にCNN手法のほうが優れていることがわかったのですが、事実だけ鵜呑みにしないためにも詳細を見ていきます。

<br>

まずは、CNNで時系列モデリングをするための手法**Temporal Convolutional Network(TCN)**についてです。この手法自体はWaveNet[Oord et al. 2016]などの近年のCNNを用いた系列モデリング手法を、ドメインに依存せず汎用的にするためにシンプルにしたものと言えるでしょう。

### Temporal Convolutional Network(TCN)

一番最初に論文中の図を載せておきます。使われている手法をひとつずつ確認してきます。

<img width="395" alt="image-20200323145515533.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322266/4f295eff-df15-bcc5-d0e9-92b4ccd419a4.png">




#### TCN = 1D fully-convolutional network + casual convolutions

論文中では、TCN = 1D fully-convolutional network + casual convolutionsと説明されています。あまり難しく考える必要はなくて、下の図のように、系列ベクトルを1次元フィルタでどんどん畳み込んでいくだけです。

重要な点は２つで、

- 各層で入力と出力の長さを同じにするためにゼロパディングを用いていること
- 決して未来のデータを用いて予測しないために、自分より前のステップの情報のみを使って畳み込んでいること

その都合で、パディングは左側に集中しています。

<img width="689" alt="image-20200323150916924.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322266/6b64b3ec-e4ed-be3b-ffb9-e3834f867d6c.png">


しかし、これでは長い系列をモデリングすることがうまくいきません。というのも、例えば、1000ステップ前の情報を使いながら予測するモデルを作りたいとすると、上図のようにフィルタのサイズがk=3なら層の深さがn=1000/3程度必要になります。つまり、このままでは層の深さの線形サイズしか過去の情報を考慮できないということです。本当にほしいのはとても長い過去の情報も参照できるモデルなので、この点を改良します

#### Dilated Convolutions

この手法は以前から使われている手法[Yu et al . ICLR 2016]で、WaveNetなどでも用いられています。下図のように畳み込む情報を$(d-1)$個ずつ飛ばして選びます。$d=2$なら1個ずつ飛ばして畳み込みます。これの利点は$d$の設定次第では、層の深さに対して指数関数的に参照できる過去情報の長さが増える点です。実際下の図の設定では、$d=2^i$($i$は層のインデックス)に設定されているため、層が増えるたびに2,4,8,...と参照できる過去データの数が増えていきます。

上の図を見れば分かりますが、いままでの手法だと参照しているデータがかぶっています。それに比べて、下の図の手法は一切かぶらずに過去の情報を利用しています。これは、$d=2^i$のときにこうなるのであって、フィルタサイズ$k$と$d$の設定によってはかぶったりすることもあります。

タスクやデータの長さに応じて$k$と$d$、層の数$n$を変えられる点で柔軟性に優れています。すごい遠い過去の履歴を参照したいタスクもあれば、直近の情報を重視したいタクスもありますから。

<img width="500" alt="image-20200323152015264.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322266/dac8e007-c89a-c39a-d110-ea1d5d8b4d53.png">


#### Residual Connections

別段工夫のないResidual Connectionが実装されています。特に系列が長くなったときにこれがあると学習が安定します。

<img width="300" alt="image-20200323154514043.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322266/b52b2f3c-d031-f061-2cae-c9f33a5a88b1.png">


<img width="400" alt="image-20200323154503750.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322266/fe8c9f61-4676-6c24-d055-af41895659e8.png">


<br>

### 利点と欠点

RNNと比べたときのTCNの優れている点と欠点をまとめておきます。

#### 利点

- 並列計算

RNNは前のステップの計算が終わらないと次のステップの計算ができませんが、TCNは全て並列で計算を行うことができます

- 考慮したい系列長の柔軟性

さきほど説明したように$k,d,n$を調整することで、様々なタスクに最適なモデルにできます。

- 勾配の安定性

RNNはステップ間で勾配を伝播するので系列が長くなると勾配消失問題に直面しますが、TCNはステップ間が独立に計算されるので計算が安定します。

- 学習時にメモリを消費しない

GRUやLSTMは特に系列が長くなると、各ゲートの重みを保存しなくてはいけないのでメモリを消費する。TCNはメモリの消費量が系列の長さではなく層の深さにしか依存しない。

#### 欠点

- 予測時にメモリを消費する

GRUやLSTMは要約された隠れ状態を保存しておけばいいだけなのに対して、畳込んだ系列情報全てを保存しなくてはいけないTCNはメモリを消費する。

- パラメータ依存性

良くも悪くも$k,d,n$のパラメータ依存で大きくモデルが変わるので、ドメインが変わる際にはパラメータを決め直す必要がある。



### 実験

ここからは実験によってTCNとRNN系の手法のどちらが優れているかを検証している部分です。検証のためのタスクは11個あり、大きく3つの種類に分けられます。各タスクについて知りたい人は論文を参照してください。

- 人工データによるストレステスト(耐久テスト)
- 音声処理
- 言語処理

とりあえず最初に全体の結果を見てみます。TCNがLSTMやGRUに比べて安定して成果を出していることが分かります。

<img width="526" alt="image-20200323155633544.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322266/a820b4d3-0e4d-626f-4fbd-a8d1bf4b6bc4.png">


<br>

また、単純なGRUやLSTMではなくそれをドメイン用に改良したSOTAモデルとの比較も見てみます。
データ数が異なっていたりするので単純比較はできませんが、音声/言語分野のタスクではSOTAモデルには勝てていません。論文中ではこれについて、今まで系列モデリングするCNNに注目が集まっておらず研究が少ないためであると述べられています。実際TCNはシンプルで汎用的なモデルであるわけですし、WaveNetなどのドメイン用に改良されたモデルはSOTAを達成しているのでこの比較はあまり意味がないかもしれません(論文中では補足の部分にこのvsSOTAの表が載っている)。

<img width="677" alt="image-20200323155856092.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322266/97a51e15-be62-48da-392c-203c767bbec9.png">

<br>

### まとめ

自然言語処理ではTransformer, 音声処理ではWaveNetなどが流行している中で、もはや系列モデリングにCNNの構造を用いるのは当たり前のことになっているのかもしれまん。しかし、ちゃんと管理された実験による比較をすることで理解が一歩先に進むような気がします。

実装は論文中に[GithubのURL](https://github.com/locuslab/TCN)が載せられているので参考にしてください。

余談ですが、[arxivTimes](https://github.com/arXivTimes/arXivTimes)にも[この論文が取り上げられていて](https://github.com/arXivTimes/arXivTimes/issues/668)、そこで[下のような論文](https://arxiv.org/abs/1803.04037)も紹介されていました。

<img width="607" alt="image-20200323161251095.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322266/a8a3ed6a-97e3-f7fe-95c3-4499e473b0f2.png">




### 参照

[Yu et al . ICLR 2016]Yu, Fisher, and Vladlen Koltun. “Multi-Scale Context Aggregation by Dilated Convolutions.” *ICLR 2016 : International Conference on Learning Representations 2016* , 2016.

[Oord et al. 2016]Oord, Aäron van den, et al. “WaveNet: A Generative Model for Raw Audio.” *SSW*, 2016, p. 125.