機械学習

Temporal Convolutional Network (TCN) の実装 (Keras)


CNNによる時系列データ解析

普通の機械学習の本では、RNNは時系列データに使い、CNNは画像データに使うと解説されています。しかし、時系列データ用のCNNもあり、RNNをベースにするものより、パフォーマンスが良いことが多いようです。実際、Kaggleの時系列コンペでは、畳み込み層によるWaveNet[1]やTCN[2]が好成績を上げています。TCNの論文[2]中には、RNNとの比較が多くあり、多くの例でTCNのパフォーマンスが優っているようです。統計モデリングが適していると思える問題でも、ほとんどの場合、TCNのような深層ネットワークの方がパフォーマンスが良い気がします。

難しい内容は論文を読むことにして、畳み込み層を時系列データに使う重要なアイデアを示した図を貼っておきます。

Inputが入力の時系列データ、Outputが各時刻で予測したいデータです。例えば、OutputはInputを1時刻ずらしたものです。Hiddenが畳み込み層で、casual paddingにより、各ノードは未来のInputに依存しなくなります。つまり、時刻t_nでのOutputは、t_{n+1},t_{n+2},...のInputに依存しません。Hiddenの部分では、Residual Blockが使われ、深層化されます。Residual BlockはResNet[3]で開発され、画像の識別で驚異的なパフォーマンスを出しています。ResNetの論文は2015年に出て、既に5万件の引用を超えています!他分野へのインパクトも踏まえて、ノーベル賞に値すると思えますが、どうでしょうか。

実装  

TCNの実装をPythonでやってみます。TCNはPythonのパッケージが公開されていて、Kerasと組み合わせて使えます。”pip install keras-tcn”でTCNをインストール出来ます。Tensorflowのバージョンは2.2になります。次が、実装例のNotebookになります。ここからダウンロード出来ます。

TCN層は全てデフォルトの設定にしています。詳しくはマニュアルにあります。この例では、sin関数にガウスノイズを加えた時系列データを入力として、少し未来の値(入力のシフト)を予測すべき出力にしています。最後の図が検証用データになります。青が入力で、オレンジが予測値です。学習後のネットワークは、ガウスノイズの平均値付近をちゃんと予測してそうです。当たり前ですが、t=0付近は、入力が少ないので予測精度が良くはありません。

感想  

パッケージ(keras-tcn)のおかげで、実装はかなり簡単でした。実装例では約9万個の重みパラメータでしたが、かなり高速に収束しました。汎用のGPU(数万円程度)で1分程度です。TCNはシンプルを売りにしてますが、実際に引数の設定も分かりやすいと思いました。次は、もう少し複雑な時系列データを試してみたいと思います。

引用
[1]Oord et al., WaveNet: A Generative Model for Raw Audio, arXiv:1609.03499 (2016)
[2]Bai et al., An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling, arXiv:1803.01271 (2018)
[3]He et al., Deep Residual Learning for Image Recognition, arXiv:1512.03385 (2015)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です