はじめに
DeepLearningは今のところ、どのようにしたら上手くいくのかなど、理論的に体系立てて説明するのは難しいようです。そのため、研究者、技術者間ではこうしたら上手くいったよなどのようにノウハウ、テクニックといった形で知識が共有されているといのうが現状ではないでしょうか。
そのDeepLearningモデルの中でもGANは学習が難しいことで知られており、高品質な生成を可能とするためにかなりのノウハウがあり、自分もあまり追えていない状況です。
本記事ではそのGANの学習を改善するテクニック集を網羅的に集めていきたいと思ってます。主に個人的な備忘録のためですが、いい情報がありましたら教えてくださるとありがたいです。
Tips
参考文献は個々のテクニックの解説論文、記事はできるだけ,トピックの下にリンクをおきます。テクニック集など網羅的にまとめてあるものは[1]のように番号のみをのせて、最後にまとめてリンクを貼ります.
1 画像は-1~1の範囲に正規化し、Gの出力にTanh()をかける
[1]
2 ノイズはガウス分布からサンプリングする
[1]
BigGAN(https://arxiv.org/abs/1809.11096) ではTruncation Trickなるものが述べられていて、ガウス分布からサンプリングしてきたノイズがある閾値を超えていた場合、閾値以内に収める処理をする。(生成時のみ。学習時は行わない)
ガウス分布は原点から遠いほどサンプリングされる確率は小さいので、それを切り捨ててしまえば、生成画像の品質は向上すると述べられています。しかし、その分生成画像の多様性とトレードオフになるようです。
3 BatchNormlizationをつかう
[1]
DCGANはこれを入れることで高品質に成功したという印象です。
BatchNormlizationは内部共変量シフトを取り除くためと言われていましたが、実際はそうではないという論文が最近でました。
またPGGANでも共変量シフトを防ぐことは観測されなかったとして、BatchNormは入れていません。
ただ、lossを安定させるなどの効果はでるようで、以前として入れる効果はあるようです。
PGGANはBatchNormの代わりにequalized learning rateとpixelwise future vector normlizationなるものが入っています.
4 最適化手法はAdamがいい
[1]
5 生成画像のしましまはDeconvolutionのせい?
GANで画像を生成すると縞模様のようなものが現れる場合がある。
ここではそれはDeconvolutionでkerenl_sizeがstrideで割り切れないとき畳み込みの不均一によるものだと述べてある。よってdeconvolutionの代わりにBilinearUpsample+Convにするのが良いらしい。
(kerel_size=4,stirde=2のとき縞模様がでないかは未確認)
6 正解labelをを1ではなく0.9などにする。
[2]
generatorの勾配が緩いときDiscriminatorが強くなりすぎる傾向があるので正解labelを1ではなく0.9などにすることでDiscriminatorの確信度を低くする狙いがある.またDiscriminatorの入力にある程度ノイズを載せる試みもある
7 ミニバッチ間の統計量をDiscriminatorの入力に追加する
[2]
GANにはmode collapseと呼ばれるGeneratorが同じような画像しか生成しなくなるという現象がある.
これはGeneratorが本物っぽい画像を1枚だけでも作れれば、それだけでDを騙せてしまうことに起因する。これを防ぐためにminibatchでの統計量(分散など)もDに追加で入力してあげる。これにより,Gが同じような画像ばかりだと本物画像と分散が違いすぎてDを騙せくなり生成画像の多様性が向上する。(minibatch discrimination)
PGGANでは標準偏差を用いたものが使われている。