ChainerでMADE: Masked Autoencoder for Distribution Estimation

Autoregressive/Flowベースのモデル深層生成モデル

このブログでもよく紹介している深層生成モデル(Deep Generative Model)ですが、近年よく研究されている深層生成モデルにはGANベース、VAEベース、Autoregressiveベース、Flowベースのモデルがあります。顔の生成や音声の生成など、近年様々なブレークスルーがメディアで報道されていますが、そうした研究にはこれらのモデルが用いられています。一方、上手くいっている一部の応用を除いてはまだまだ難しいことだらけで、理論的にもわかっていないことが沢山あるテーマでもあります。

上記のモデルの中ではGANベースのモデルが隆盛を誇っている感じがありますが、自分の応用分野ではGANが得意とする綺麗なデータ生成よりも、入力を読ませた時の潜在変数に興味がある場合が多いため、残りの(対数尤度最大化型)モデルに興味があります。これら3つの対数尤度最大化型モデルだとVAEが断トツに使いやすいイメージで応用の論文でもよく見かけます。一方、WaveNetやPixel***あるいは最近出たGlowなどを見ていると、残りの二つのモデルはうまくハマれば極めて強力な生成モデルが出来る印象があります。

MADE(Masked Autoencoder for Distribution Estimation)を実装

そんなわけで、直接研究で使うかどうかは別として最近の発展の勉強がてら、MAF (Masked Autoregressive Flow)IAF (Inverse Autoregressive Flow)で使われているMADE(Masked Autoencoder for Distribution Estimation)をchainerで実装しました。実装したとはいっても、PyTorchの素晴らしい実装が既にあったので、基本的にはそれをChainerに書き直しただけです。

github.com

MADEの基本的なアイデアは、Autoencoderで分布推定をするため、各変数を復元する際に自己回帰の性質を保つようウェイトにマスクをしてやろうというものです。Figure 1を見てもらえればよくわかりますが、非常に単純ですがなるほどという感じ。ちなみにあのBengio兄弟が2000年にこれの1層バージョンを既に提案しており、この論文はそれを多層に拡張したもののようです。まさに天才恐るべし。

どうして実装しようと思ったか

今回そもそもMADEを実装しようと思ったモチベーションは、もともとIAFやMAFを使いたくてそれらの実装を見たらTheanoの実装しかなくて、じゃあIAFやMAFの構成要素であるMADEから作るかと思ったら、それもTheanoの実装しかなかった・・・というところが始まりです。仕方なくMADEからchainer版を作ろう…と思ったところ、機械学習界隈で有名なAndrej Karpathyが素晴らしい実装をPyTorchで公開していたので大いに参考にさせてもらいました。そんなわけで、現在はこのMADE実装を使ってMAFを作っています(そもそもMAFはMADEが出来てしまえばほとんど出来たようなものなので、手元ではほぼ動いています)。

最後に、僕自身の蓄積でいうと、WaveNetが出た2年前の9月はPFNでインターンをしており、その時メインで作っていたモデルはVAEベースのものでしたが、並行してWaveNetの実装も試してみてそれなりに面白そうな結果がでた・・・ぐらいの時点でこの辺の知識はストップしていました。実装と並行して様々なブログや論文で全体像や各手法の勉強をしたので、次のエントリでまとめておきます。