Yuki’s blog

自身の成果物や好きなことを発信していきたいと思います。情報系のジャンルが多いです。

Generative Adversarial Nets 【GAN】

     

こんにちは。
今回は、2014年に発表された画像生成技術のGenerative Adversarial Nets(GAN)について簡単にまとめていきたいと思います。
以下の落合先生のフォーマットがいい感じなのでこちらに沿ってまとめていきます。
lafrenze.hatenablog.com

http://lafrenze.hatenablog.com/entry/2015/08/04/120205

これはどんなものか?

Generative Adversarial Nets(以下GAN) は2014年にIan J. Goodfellowによって考案された効率的に生成モデルを推定することができる新しいフレームワークである。
訓練データと生成データの分布が一致していくように学習していく。訓練データ(真の分布)に近い分布を求めていく。

先行研究と比べてどこがすごい?

先行研究
  • Boltzmann machines (RBMs)
  • Markov chain Monte Carlo (MCMC)
  • …etc
  • マルコフ連鎖に基づく方法では分布が不鮮明である必要があるが、このネットワークは非常にシャープで縮退した分布をも表すことが可能

マルコフ連鎖についてはまだ勉強していないのでこの辺りは割愛します。ほぼ直訳。
要は、この敵対性ネットワークを用いることで簡単に多くの拡張ができるようになった

技術や手法のポイントはどこ?

2つのモデルDiscriminatorとGeneratorを同時に敵対的に学習させる。

Discriminator

  • DiscriminatorはGeneratorモデルから生成されたものか、訓練データのものかを判定することで学習

Generator

  • GeneratorはDiscriminatorに偽物だとばれないように学習する。Discriminatorが間違えるようにする、訓練データの分布と生成データの分布が一致するように学習。

f:id:Yuki9892:20200702133943j:plain
GANの学習モデル(画像引用)
GAN:敵対的生成ネットワークとは何か ~「教師なし学習」による画像生成 - アイマガジン|i Magazine|IS magazine

この論文内ではDiscriminatorとGeneratorは多層パーセプトロンで構成されており、2つのモデルの学習は誤差逆伝播法(back propagation)とドロップアウトが用いられているようです。生成モデルからのサンプルのみ順方向伝搬(forward propagation)を使用。

最終的には訓練データと生成データが見分けられなくなるまで学習するのでDiscriminatorの正解率が50%になる。

これを数式化していきます。GANの目的関数
f:id:Yuki9892:20200702135643p:plain

 E: 期待値
 x~p_{data}(x): 訓練データ(本物)がDiscriminatorに入力されたとき
 D(x): Discriminatorに訓練データが入力された際の出力

 x~p_{z}(x): 生成データ(偽物)がDiscriminatorに入力されたとき
 G(z): Generatorにノイズzを入力して生成した画像
 D(G(z)) : Discriminatorに生成データが入力された際の出力

Discriminatorの学習

Discriminatorの理想は訓練データが来たら1、生成データが来たら0を出力

訓練データがDiscriminatorに入力されたときにD(x)=1を出力できれば、右辺の第1項
 E_{x ~ p_{data}(x)}[logD(x)]は最大化できる。

生成データがDiscriminatorに入力されたときにD(x)=0を出力できれば、右辺の第2項
 E_{x ~ p_{z}(x)}[log(1 - D(G(z))]は最大化できる。

これを表しているのが左辺の max_{d}です。Gからの生成データと訓練データの2つを正しく判定できる確率を最大化するようにDを学習するわけです。

Generatorの学習

Generatorの理想はDiscriminatorが入力された生成画像に対して1を出力(偽物画像の画像と判定)
右辺第1項は訓練画像がDiscriminatorに入力されたときの評価のため、Generatorには直接関係しないため無視する。

右辺第2項において D(G(z)) = 1を出力すれば右辺第2項を最小化できます。
これを表しているのが左辺にある min_{G}です。

よって、DiscriminatorとGeneratorをこのように敵対的に学習させるということでGenerative Adversarial Netという名前がついてます。

どうやって有効だと検証した?

論文ではMNIST,TFD, CIFAR10のデータセットの画像を生成してその有効性を示しています。

f:id:Yuki9892:20200702143817p:plain
論文より一部引用
黄色い枠で囲われているのが訓練データで、そのほかが生成データです。

議論はある?

  • この手法は高次元空間ではうまく機能しない
  • DiscriminatorとGeneratorの学習をうまく同期させなくていけない
  • Generatorの分布に明示的な表現がない
  • Generatorが生み出す画像に多様性があまりない(モード崩壊)

次に読むべき論文は?

DiscriminatorとGeneratorに畳み込み層を用いたDCGANなどのGANの発展形を読むのが妥当かなと思います。

最後に参考にした記事を載せます。目的関数についてわかりやすく書いてあります。
qiita.com