GANとは
GAN(Generative Adversarial Networks)とは、敵対的生成ネットワークのことで、論文https://arxiv.org/abs/1406.2661で提案されたものです。
GANでは、訓練されたGeneratorを利用して、本物に近い偽物のデータをたくさん生成できるようになります。
GANの仕組みは、フェイクデータを生成するGeneratorと、データが本物か偽物かを判断するDiscriminatorによって構成され、お互いを競い合わせるように学習させることで、性能の良いGeneratorを育てます。
GANは、偽札作りと、それを見破る警察の関係に例えられます。Generatorは本物に近い偽札を作れるように学習され、Discriminatorは偽札を見破ることができるように学習されます。最初は、両方とも能力は低いのですが、お互いに競い合っていくうちに、優秀になっていきます。
GANでは、GeneratorとDiscriminatorをバランスよく学習させることが重要であり、その点が難しいポイントでもあります。何も考えずに組んでしまうと、Discriminatorの方が優秀になってしまってGeneratorがフルボッコでやられてしまい、成長しないことがよくあります。欲しいのは、優秀なGeneratorの方なので、Generatorを大切に育ててやる必要があるのです。
DCGANとは
DCGAN(Deep Convolutional GAN)とは、論文https://arxiv.org/abs/1511.06434で提案されたモデルです。GANの改良版で、GeneratorとDiscriminatorを競わせながら学習を進める点は変わりません。GANより自然な画像を生成できるようになります。
GANとの違いは、全結合ではなく畳み込みを利用している点や、バッチノーマライゼーションを使っていたりする点です。
図は、歩行者の画像を生成するGeneratorを育てるためのDCGANの構成です。ランダムノイズからGeneratorでフェイク画像を生成して、トレーニング用画像(本物)と混ぜてDiscriminatorに入れ、偽物か本物かを判断するというものです。
ネットワークを組むときのポイントとしては、活性化関数に、通常の物体検出などに用いられるReLUではなくLeaky ReLUを用いる点と、画像サイズのシュリンクにはMaxPoolingの代わりに畳み込みのストライドを用いる点が挙げられます。共に、スパースになることを避けるためです。(ReLUだと、入力が0以下に対しては0が出力されてしまい、勾配がなくなってしまうので、それを避けるためにLeaky ReLUが用いられる。また、MaxPoolingを用いると、画像の細かな情報が欠落してしまうため、畳み込みのストライドを用いて画像サイズをシュリンクする。)
やはりDCGANでも、GeneratorとDiscriminatorをバランスよく育てるのは難しく、学習率を調節したり、そもそもDiscriminatorの方のネットワークを浅くしたりして調整しなければなりません。
また、バランスよく育ったとしても、Mode Collapseという現象(似たような画像しか生成されなくなる)が起きたりします。これに対しては、いくつか対策がありますが、Minibatch Discriminationという対策によって軽減したりします。
まとめ
DCGANについて、ざっと説明しました。GANは、様々な応用が研究されていて、将来が楽しみな分野でもあります。ですが、学習を安定させるのが難しく、その他、様々な問題に対する対策をとるのがとても面倒です。私の経験では、学習自体にも結構時間がかかりましたし、バランスよく学習するために様々な工夫が必要でした。また、Mode Collapseの対策としてMinibatch Discriminationを導入するだけでも、結構大変でした。ディープラーニングのフレームワークがこの辺のことを解決してくれる機能を持ってくれると助かりますね。今後に期待です。