UnrolledGANでいらすとや画像を生成してみる

これまで実装してきたGANDCGANでは学習の際にDiscriminatorが早く学習しすぎてしまうという問題があった. これに対するアプローチとして,Generatorに先取り学習をさせて,学習を促進させようという方法がある.

そのアプローチを採用しているのがUnrolled GANというネットワークだ。 今回はこの論文を読んで、tensorflowで実装してみる。 これまではkerasを使ってきたが、細かいところをいじるならtensorflowの方が便利。

GANのおさらい

GANの紹介
  • 生成モデルでは通常,尤度を最大化するよう学習するが,GANは尤度計算をexplicitに行わず,GeneratorとDiscriminatorのminimax gameを解く
  • GANは様々な成功を収めてきた
    • 画像生成
    • 画像高解像度化
    • etc.
GANの問題

GANには多くの問題もある

  • Generatorがたった1つの画像や類似した画像しか生成しなくなること(mode collapse)
  • GeneratorとDiscriminatorの学習が収束するのではなく振動すること
  • GeneratorとDiscriminatorのうちどちらかの学習が早く進みすぎると,もう一方のモデルへの伝達される勾配が小さくなり学習が進まなくなること
  • 収束したとしても,Generatorが訓練データの全体分布を生成しないこと(KL divergenceなどを目的関数としているのにも関わらず)
  • 生成画像の評価が難しいこと(Parzen windowを使う方法は,欠点が指摘されている)

本論文では,学習の不安定性とmode collapseに対応するためにDiscriminatorをunrolling optimizationする.

GANの仕組み

Unrolled GANの説明のために,通常のGANの仕組みの説明を導入する。 {} $$ \begin{align} \theta_{G}^{\ast} &= argmin_{\theta_{G}} ~ max_{\theta_{D}} ~ f(\theta_{G}, \theta_{D}) \\ &= argmin_{\theta_{G}} ~~ f({\theta_{G}}, \theta_{D}^{\ast}, \theta_{G}) \\ \theta_{D}^{\ast}(\theta_{D}) &= argmax_{\theta_{D}} ~~ f(\theta_{G}, \theta_{D}) \end{align} $$

ここで{f}{} $$ f(\theta_{G}, \theta_{D}) = \mathbb{E}_{x \sim p_{data}} log(D(x;\theta_{D})) + \mathbb{E}_{z \sim N(0, 1)} log(1-D(G(z;\theta_{G});\theta_{D})) $$

{p_{data}} は訓練データの分布)
Discriminatorの最適値 {D^{\ast}} は,Generatorの生成したデータの確率分布 {p_{G}(x)}を使って,次のように書ける. {} $$ D^{\ast}(x) = \frac{p_{data}(x)}{p_{data}(x) + p_{G}(x)} $$

反復的に パラメータ{\theta^{\ast} = (\theta_{G}^{\ast}, \theta_{D}^{\ast})} を最適解に近づけたいが,上の{f(\theta_{G}, \theta_{D})}{\theta_{G}}のconvexに遠く,{\theta_{D}}のconcaveに遠いため,学習は上手く進まない.

本論文ではこの問題に対処するため,Generatorの訓練を効率的に行うため, Generatorの訓練時に利用したい真の目的関数である{f(\theta_{G}, \theta_{D}^{\ast} (\theta_{G} ))} により近い,{f_{K} (\theta_{G}, \theta_{D}) }を使うことを提案している.

Unrolled GAN

Generatorの学習より,Discriminatorの学習が早く進んでしまうという問題に対し,UnrolledGANでは,Generatorの学習の際にKステップ学習した後のDIscriminatorを利用して勾配計算させている.

前半頑張りすぎて少し力尽きてきたので,ざっくり説明すると以下のようになる.

  • DiscriminatorをKステップ分学習させる.
    このとき,1ステップ学習後のDiscriminatorの勾配を覚えておく.
  • Kステップ分学習させたDiscriminatorを組み込んだモデルでGeneratorの勾配計算をする.
  • Discriminator,Generatorのパラメータを更新する

このようにしてGeneratorにだけ,Kステップ分先取り学習させることにより, GeneratorとDiscriminatorの学習のバランスをとろうというものである.

生成画像

このUnrolledGANでいらすとや画像を訓練データとして、画像生成してみる。 論文に書いてあるとおりK=5の設定でUnrolling optimizationする。 結論から言ってしまうと、論文に記載のネットワーク構造、パラメータ(を画像サイズに合わせて若干修正を加えたもの)で試してみたところ、うまく学習できなかった。

生成画像パターン1

f:id:yusuke_ujitoko:20170517202553p:plain f:id:yusuke_ujitoko:20170517203208g:plain

生成画像パターン2

f:id:yusuke_ujitoko:20170517203007p:plain f:id:yusuke_ujitoko:20170517203332g:plain

DCGANのときよりも微妙かも。
パラメータチューニング不足の感はある。
しかし手元の環境(GPU1個)だと時間がかかるためそこまでパラメータ調整できない。

さて,…次はどのGANを試してみようか…WGANかな.

追記(2017/9/4)

いらすとや画像を顔のみに限定し再度生成した結果。

f:id:yusuke_ujitoko:20170904204817p:plain

実装は以下
https://github.com/Ujitoko/GAN/tree/master/UnrolledGAN