ここのところ、画像処理関連をやってみています。
以前pix2pixをいじっていましたが、そこでも使われているGANs(Generative Adverarial Networks)という技術を、なにかしら自分の趣味の範囲で利用できないかなあと試してみています。
初期に提案されたDCGANは非常に衝撃的だったのですが、いかんせんハイパーパラメータのチューニングがシビアでした。学習がうまくいかないとmode collapseという現象を起こし、まったく意味不明な画像しか生成できなくなります。
この辺りの数理的理解が進んできて、mode collapseを起こしにくい新しい手法が提案されています。
chainer-gan-libという、Chainer開発元であるPreferred Networkが複数種類のGANsを実装、公開しています。主にこちらを使って画像生成を試してみています。
- https://github.com/pfnet-research/chainer-gan-lib
- フレンズ画像を生成させてみたい-画像収集編+DCGAN
- フレンズ画像を生成させてみたい-画像収集編(2) wiki, twitter
ただ、やはり少ない画像数でこれを行うことは難しいなあというのが実際やってみての感触です。
GANsでは生成器と識別器、2つのネットワークを交互に学習します。生成器はある分布に従う潜在変数の存在を仮定し、そこからサンプリングした乱数から画像を生成します。識別器は、生成器が生成した画像群を負例、訓練用に用意した画像を正例としてそれらを正しく分類するようなネットワークです。
生成器と識別器を交互に学習させることで、生成器は識別器の正例群が持つ画像の特徴を捉えた画像を生成できるようになる、というのがGANsの大まかな仕組みです。生成器と識別器はそれぞれ反対方向の目的関数に向かって最適化されるので、最終的にお互いの訓練誤差が均衡した状態が理想となります。
正例の画像があまりに少ないと、識別器の損失(誤差)がかなり小さな値にとどまってしまい、生成器は正例の画像をほぼそのまま覚えてしまうようです。つまるところ、「十分な数のデータがないと特徴を正しく捉えられない」というある種当たり前の結論に至りました。
人間だったら少ないサンプルからそれっぽいことが学習できるんですけどねえ…と思ったところでGANsの転移学習はできないのか、ということをこれを書きながら思いました。
何かしらの画像をうまく生成できるだけのモデルを予め学習させておき、それをベースにfine tuningすればもう少しマシな結果が出るのでは、という予想です。
これは一度試して見る価値はあるかもしれませんね…そのモデルを学習させるためのデータをどうやって用意するか、という課題はありますけど。