Recurrent Batch NormalizationをTensorFlowで実装した

要するにLSTMの内部でバッチ正規化を行うということ。

論文と実装は以下の通り。

本実装は以下の先行実装に依拠しており、ここに感謝する次第である。

前者はTensorFlow実装、後者はTheano実装であるが、前者は後者を参考にして実装された。本実装はさらに前者の実装に対して自分用に手を加えたということである。なおTensorFlow 0.10でのみ動作確認をしている。

本実装ではBN_LSTMCellクラスが定義されている。使い方の注意点は、BN_LSTMCellのインスタンスを作成する際、引数に'is_training'を取るということである。これはバッチ正規化に関して、学習時と評価時で振る舞いを変えるためのものである。より具体的に言うと、学習時には各ミニバッチについて統計量(平均と分散)を計算してバッチ正規化を行う必要があるのだが、評価時の各ミニバッチに対しては改めて統計量を計算する必要はなく、学習データ全体から求められる確定した統計量に基づいてバッチ正規化を行うのである。

今後はGRUやSGU, MGUなどにrecurrent batch normalizationを実装する予定である。

FIT2016の企画 「ここから始める情報処理 ~画像、音声、テキスト、検索、学習、一気にまとめてチュートリアル~」 のスライドまとめ

Facebookにて、山崎俊彦氏がまとめていらっしゃったので、こちらにもメモ的に残しておこうということ。

WaveNetの各種実装:TensorFlow, Chainer, and Keras

  • TensorFlow実装

github.com

  • 番外編:WaveNetによる音声生成の高速化実装(学習ではない)

Fast Wavenet: An efficient Wavenet generation implementation
github.com
どれくらい高速か、というと論文の通りにナイーブに実装すると、層の数Lに対して2^Lに比例するオーダーだったのが、Lの1次に比例するオーダーになるそうだ(下図参照)。
f:id:tam5917:20160925115303p:plain

現在、もっとも開発が盛んなのはTensorFlow実装のリポジトリだろうか。生成の高速化実装も取り込まれた。充実感がある。
これらが実際に使い物になるかどうかはまた別の問題である。

MGUとかSGUといったLSTMの簡略化版をTensorFlowで実装した

それぞれは以下の通り(ただしTensorFlow 0.12でのみ動作確認):

これらは基本的にLSTMの構造を簡略化して、ゲートやパラメータ(重み行列)の数を減らしている。例えばMGUはLSTMの約半分のパラメタ数になっている。こうすることで可視化や解析がしやすくなったり、学習時間やデコードの時間が減らせるので嬉しい。また、パラメタ数削減によりL1正則化と類似した効果も期待できるだろう(ホントに?)。ちなみに上記論文で比較対象に挙がっているGRU (Gated Recurrent Unit) はパラメタ数的にLSTMの約3/4になっている。

LSTMの各構成要素(ゲートとか)のうち、どれが一番性能が効くのか、ということをきちんと調べた論文は以下が挙げられる。

これら論文によれば、性能を一番左右するのはForget gateだそうで、またForget gateのbiasは1.0にすると良いらしい。TensorFlowにおけるLSTM実装は既にそうなっている。上記各ネットワークアーキテクチャにおいて、簡略化されても残るのはForget gateの機能だったりする。