GANのSOTAとして注目されている、BEGAN: Boundary Equilibrium Generative Adversarial Networks( https://arxiv.org/abs/1703.10717 )をpytorchで実装して日本人顔の生成を行いました.
論文の解説記事はたくさんあるので、ここでは詳しい解説はしませんが、
・Discriminatorがautoencoderになっている
・複数のLossがあり、Lossごとの学習のバランスを取る方法が提案されている (←これがないと全く学習できません)
・収束判定を簡単にできる
解説は、
・Boundary Equilibrium Generative Adversarial Networks [arXiv:1703.10717] – ご注文は機械学習ですか? ( http://musyoku.github.io/2017/04/16/Boundary-Equilibrium-Generative-Adversarial-Networks/ )
・BEGAN: State of the art generation of faces with Generative Adversarial Networks | ( https://blog.heuritech.com/2017/04/11/began-state-of-the-art-generation-of-faces-with-generative-adversarial-networks/ )
この辺りが参考になると思います。
実装ですが、まず、できるだけ論文の通りの実装をしたのですが、ちゃんと動いてくれなかったです。。
その後、以下のように試行錯誤をしました。データセットは20万枚の日本人の顔写真を使っています。
論文通り実装
→全く顔らしきものが生成されない
↓
DiscriminatorのInputにガウシアンノイズを入れる
→状況変わらず
↓
Discriminatorが弱すぎると思い、Dの構造をUnet( https://arxiv.org/abs/1505.04597 )に変える
→少し顔っぽくなったものの、形は崩れている
↓
Unetでは顔の抽象化がうまくできていないと思い、Dの構造の後半とGをDCGANのGに変える
→かなり顔っぽくなったものの、少し形が崩れている
↓
DにDropoutを入れたり、学習率を変えたり、ガウシアンノイズを入れたり、こまかいパラメータ調整をした。(DとGのOutputにTanhやsigmoidが入るとうまく動かないみたいでした。)
Iteration=100000での現状のモデルでの生成結果が以下です
まあまあいい結果になったと思いますが、まだまだ崩れている部分も多少ありますので、パラメータ調整がさらに必要みたいです。
パラメータ調整に2週間くらいかかったので、誰かがもっと安定した手法やテクニックを提案してくれるのを待ってます
こちらの記事では、
1epoch目で本物のデータの再構築ができていない場合は学習を打ち切り、ハイパーパラメータを見直した方が良さそうです。
と書かれていたのですが、私の感覚としては、逆に再構築が出来すぎていると、うまくいかないということもありました。顔写真を顔として再構築するのではなく、写真として再構築してしまっているためだと思います。
顔以外でもうまくいくのかな〜、時間があればBedroomのDatasetでもやってみます。
コードはリファクタリング終わったらUpする予定です。Pytorchでの実装なのでそんなに難しいことはしていません。