けの〜のブログ

ガッキーでディープラーニングして教育界に革命を起こす

GANについて DCGAN,CycleGAN

ネット上で参考にした情報のまとめ

 

ネット上で参考にした記事を備忘録的に記録しました

https://elix-tech.github.io/ja/2017/02/06/gan.html

http://tech-blog.abeja.asia/entry/everyday_gan

 

 

GAN(Generative Adversarial Net)について

概要

訓練データを学習しそれらのデータと似たような新しいデータを育成するモデルのことを生成モデルと呼びます。別の言い方をすると、訓練データの分布と生成データの分布が一致するように学習していくようなモデルです。GANはこのような生成モデルの一種です。

 

通常、モデルが持つパラメータ数に対して訓練データの量が圧倒的に大きいため、モデルは重要な特徴を捉えることを求められます。

 

GAN以外にもVAE(Variational Autoencoder)などあります。GANは学習が不安定だが他の手法に比べてくっきりとした画像が生成される傾向があるようだ。

 

GANの仕組み

GANではGeneratorとDiscriminatorという二つのネットワークが存在する。

Generatorは訓練データと同じようなデータを生成しようとします。一方、discriminatorはデータが訓練データから来たものか、それとも生成モデルから来たものかを識別します。

紙幣の偽造者と警察の関係のように、お互いが偽札を作るため、偽札を見破るために技量を上げていく、という例え話がよくされるらしい。

Discriminatorが、与えられたデータが訓練データなのか生成データなのか見分けられなくなルような状態ではDiscriminatorの正答率は50%になるようだ。

 

GANのObjectiveについて

具体的にどのように学習を行うか。

ガッキーの画像について考えていきたいと思う。

xというのがガッキーの画像データ(Discriminatorが訓練データと判定しなければいけないデータ)で、xはある確率分布P data(x)に従っているとする。

 

zはノイズを表す、このzは何らかの事前に決めた分布 Pzに従う要素。

Generatorはzを入力として、偽物を作り出す。

f:id:keno-lasalle-kagoshima:20171218134406p:plain

DiscriminatorはD(x)=1

GeneratorはD(G(z))=1

またDiscriminatorはD(G(z))=0

を出力するように学習する。

学習時はDiscriminatorとGeneratorを交互に更新していく。

Discriminatorがうまく分類できるようになるとD(x)は大きくなり、また偽物だとバレてD(G(z))は小さくなる。

逆にGeneratorがうまく偽物を作れるようになるとD(G(z))は大きくなる。

この学習で良い偽物を作れる理由を述べたいと思います。 以下 pzG(z)から誘導される確率分布pg(x) と書くことにすると、 良い偽物が作れるようになる理由は、この最適化問題の global optimum が pg(x)pdata(x)が一致する時だからです。以下でそれを確認します。

まず、G を固定した際、最良の DG は以下のように計算できます。 objective L

L(G,D)=pdata(x)log(D(x))dx+pz(z)log(1D(G(z)))dz=pdata(x)log(D(x))+pg(x)log(1D(x))dx

と書き直せますが、f(x)=alog(x)+blog(1x) の最大値は x=a/(a+b)で取るから

DG=pdatapdata+pg

となります。これを用いてちょっと計算すると

maxDL(G,D)=Expdata[log(pdatapdata+pg)]+Expg[log(pgpdata+pg)]=log(4)+2JS(pdata||pg) .

ここで JS は Jensen-Shannon divergence。JS は pdata=pg となる際に最小値を取るので、上式はこの時に最小となります。

以上をまとめれば、objective L を min max 最適化をしていけば、 確率分布が一致するという意味で G は対象の data を良く模倣できるようになる、というのが理論的な根拠となります。

DCGAN(Deep Convolutional GAN)について

CNN(Convolutional Neural Network)を用いたモデル

CNNを使ったGANで最初に高解像度画像の生成に成功したのはLAPGANらしいが、何段にも分けて画像を生成する必要があったらしい。

DCGANでは一発で高解像度画像を生成することに成功したようだ。

 

またGANは学習が難しいことが知られているが、学習をうまく進めるための様々なテクニックが紹介されているようだ。

poolingをやめる

全結合層ではなくglobal average poolingを行いDiscriminatorで出力する(安定性は増すが収束が遅くなるようだ)

Batch Normalizationを使う

各層でのデータ分布を正規化することで学習を速くしたりパラメーターの初期化をそれほど気にしなくてもよくなる。過学習を防ぐ効果もあるようだ。

Generatorの出力層とdiscriminatorの入力層には適用しないようにする。

 

参考記事

https://elix-tech.github.io/ja/2017/02/06/gan.html

http://tech-blog.abeja.asia/entry/everyday_gan