GAN実験2
GANのいろんなパーツについて効果を確認しながら実験していく記事の2
前回はGenerator:Discriminator=1:1で訓練してたらDiscriminatorが圧勝してしまったので、今回はDiscriminatorを抑えて実験してみる。
「Discriminator Lossが0.6以上の場合のみDiscriminatorを訓練」、「Discriminator Lossが0.3以上の場合のみDiscriminatorを訓練」の2パターンを実験した。
Discriminator LossにはBCE Lossを使っているので、Discriminatorの正答率は前者で55%、後者で74%くらいを維持することになる(Discriminator Lossは真画像、偽画像のLossを平均して計算している)。
以下結果
Discriminator Lossがそれぞれ0.6、0.3付近でウロウロしてたのでコントロールは上手くできていた。
明らかにDiscriminator Lossを0.6に維持した方が良い画像を生成できている。
学習の途中を見てても0.6の方が良かった(今度から学習過程をgifにしよかな...)。
前回のDiscriminatorに何も制限を加えないタイプと比べても、0.6は上手く学習が進んでいるように見える。
一方0.3は全体的なクオリティが低めだし、似たような画像を生成している(mode collapse)。
DiscriminatorはGeneratorと拮抗する位が良いのかなと思うものの、0.3と比べてDiscriminatorがさらに強い前回の方が良いのはなぜなのか?
このあたり次回にちょっと調査したい。
*2020/5/1追記
DiscriminatorとGeneratorの訓練比率を「Lossが0.3以上なら1:1、以下なら1:5」みたいにして最低でも5回に1回はDiscriminatorが訓練されるようにしてみた。Lossの動きは(300epoch付近まで)およそ同じだったが、まあまあ綺麗に生成できていた。おそらくGeneratorのみ学習し続けることがよくないのかもしれない。
残差接続とかHinge Lossとかspectral normalizationとか試したいのが多すぎる...
StyleGAN的な構造も試したい...