① GANの性能評価の難しさ
GANには明示的な損失関数が存在しない。じゃあ一体どうやってGANの性能のよさを評価すればいいのだろうか。
生成されたサンプルの質を統計的に評価できる、二つの性能評価尺度を紹介します。
1. Inception Score(IS)
この方の記事がわかりやすいです。あとこの方が用いてる具体例も。
以下では、この方の記事が簡潔に纏まっていたので引用させていただきました。
---以下引用---
ISは、GANの性能をどのような観点から測っているかというと、
- 画像識別器が識別しやすいかどうか
- 識別先のクラスのバリエーションが多様化どうか
の二つの観点である。
xi を生成した画像(iは画像のインデックスで総数は Nとする)、y をラベル(クラス)とすると、上の1. は条件付き分布 p(y|xi)のエントロピーが小さくなることを意味する。一方で 2. は、p(y|xi)を i について積分した周辺分布 p(y)のエントロピーが大きくなることを意味する。そこで、両分布間の距離を測るためにKLダイバージェンスを用い、これを i について平均化したうえでexpを取ったものがinception scoreである。
---引用終了---
ただこのISだと、生成される画像のバリエーションが少ない場合でも、生成期が高性能と判断されてしまう可能性があります。
2. Frechet Inception Distance(FID)
こちらもGANを評価する際に使用される評価指標である。GANで生成した画像の分布をA1、GANで生成したい画像の分布A2の距離を計算したのがFID。FIDは値が小さいほど生成画像が良い画像と評価される。
画像の分布A1、A2の平均ベクトルをμ1、μ2、共分散行列をΣ1、Σ2とするとFIDは以下で表される。
② 訓練の難しさ
GANは明確な目的関数がないので、でのように訓練すればいいかが難しい。
以下では、3つの目的関数を紹介する。
・MinMax GAN

・NS GAN
数学的な保証はないが実用的なパフォーマンスを発揮する
・Wasserstein GAN
数学的な根拠もあり、パフォーマンスも優れている
JSD違い、パラメータの最適点付近でも勾配が消失しない。
GANの損失関数を設計し直して、JSダイバージェンスを使っていたところをWasserstein距離に変更することで、学習を高速化及び安定させることができた
こちらの記事がわかりやすいです。
③訓練での工夫
1. 入力の正規化
2. バッチ正規化
生成器に用いた場合、時折悪影響を及ぼす
3. 識別器をより多く訓練する
生成期が何も生成しないうちに、識別器をよく訓練しておく
訓練サイクル内で識別器をより多く訓練する
4. ReLUではなくLeaky ReLU、max poolingよりave pooling
情報損失を最小限に抑え、情報の流れは正しくし、おかしな誤差逆伝播は避ける。