Boost camp週間2追加学習GANS

11568 ワード

Introduction


生成対抗ネットワーク(GANS)は機械学習分野における最新のイノベーション分野の一つである.Generative modelsは、私たちが指定した学習データと非常に似たデータを生成します.例えば、GANSは、これらの顔が真実の人に属していないとしても、顔写真のような画像を作成することができる.These images were created by a GAN:

GANs achieve this level of realism by pairing a generator, which learns to produce the target output, with a discriminator, which learns to distinguish true data from the output of the generator. The generator tries to fool the discriminator, and the discriminator tries to keep from being fooled.

GAN(Generative Adversarial Network)


講義参照.
"Generative"describes a class of statistical models that contrasts with discriminative models. Generative models can generate new data instances.
Formally, given a set of data instances X and a set of labels Y: Generative models capture the joint probability p(X, Y), or just p(X) if there are no labels.
In GAN, Discriminative Model can capture p(Y | X)
例えば、任意の写真データをpdata(x)p{data}(x)pdata(x)の確率分布として表すことができる.そしてそれぞれx 1,x 2,...x_1,x_2,...x1​,x2​,...のデータは、データの任意の特徴を表すことができ、例えば、画像データに眼鏡をかけた男性の割合が小さい場合、眼鏡を表す任意のxix ixiデータに対して、低い確率表現値の確率分布を有する.
このとき,我々の最終目標は,Generatorモデルにより得られた結果pmodel(x)p{model}(x)pmodel(x)を実際のデータの確率分布pdata(x)pdata}(x)pdata(x)と類似させることである.

1. Generative Adversarial Network


Adversarialは「敵対」という意味で,生成モデルで敵対手法を用いたGANについて理解する.
基本GANの構造はDistributorとGeneratorからなる.Distributorは、画像を入力すると0または1の1次元データが出力される分類モデルです.代表的にsigmoid関数を用いて、閾値を0.5を基準として区別する.


以上の2つの学習形態から,実際の画像をx,ランダム入力をzと呼ぶと,Distributorはxに対する結果値D(x)を1とし,ジェネレータはzに対する結果値G(z)の結果値D(G(z)を0とすることを学習する.次のように表示されます.VはGANの目的関数です.
Discriminator
max⁡DV(G,D)=Ex∼pdata [log⁡D(x)]+Ex∼pz(z)[log⁡(1−D(G(z))]\max_{D} V(G, D)=E_{\mathbf{x}\sim p_{\text {data }}}[\log D(\mathbf{x})]+E_{\mathbf{x}\sim p_z(z)}[\log (1-D(\mathbf{G(z}))]Dmax​V(G,D)=Ex∼pdata ​​[logD(x)]+Ex∼pz​(z)​[log(1−D(G(z))]
Generator
min⁡GV(G,D)=Ex∼pz(z)[log⁡(1−D(G(z))]\min_{G} V(G, D)=E_{\mathbf{x}\sim p_z(z)}[\log (1-D(\mathbf{G(z}))]Gmin​V(G,D)=Ex∼pz​(z)​[log(1−D(G(z))]
Pytochコードで確認してみます.
import torch
import torch. nn as nn

D=nn. Sequential(
	nn.Linear(784, 128)
	nn.ReLU(),
	nn.Linear (128, 1),
	nn.Sigmoid)
G=nn. Sequential(
	nn.Linear (100, 128),
	nn.ReLU(),
	nn.Linear (128, 784),
	nn.Tanh()
    
criterion =nn. BCELOSS()

d_optimizer = torch.optim.Adam(D.parameters(), Ir=0.01)
g_optimizer = torch.optim.Adam(G.parameters(), Ir=0.01)

# Assume x be real images of shape (batch size, 784)
# Assume z be random noise of shape (batch size, 100)

while True:
	# train D
	loss = criterion(D(x), 1) + criterion(D(G(z)), 0)
	loss.backward()
	optimizer.step()
    
	# train g
	loss = criterion(D(G(z)), 1)
	loss.backward()
   	optimizer.step()
上記のコードでは、次のようにバイナリCrossEntropy LossとしてOptimizerを使用しています.
L(h(x),y)=L(h(x), y)=L(h(x),y)=−ylog⁡h(x)−(1−y)log⁡(1−h(x))-y\log h(x)-(1-y)\log (1-h(x))−ylogh(x)−(1−y)log(1−h(x))
Distributorを基準として,yが1の場合と0の場合にlossを加え,前述の式形式を持つことができる.(符号は逆なので最小化の形と考えられる.)
一方、Generatorのターゲット式を見てみましょう.
min⁡GV(G,D)=Ex∼pz(z)[log⁡(1−D(G(z))]\min_{G} V(G, D)=E_{\mathbf{x}\sim p_z(z)}[\log (1-D(\mathbf{G(z}))]Gmin​V(G,D)=Ex∼pz​(z)​[log(1−D(G(z))]
ここでは,学習の初期段階でD(G(z))の値が0(偽の悪い出力に近い)に非常に近いことを十分に考慮できる.しかし、D(G(z)の値が0に非常に近い場合、1−logD(G(z)1−logD(G(z)1−logD(G(z))のGradientの大きさは十分ではなく、以下の式を変更する.(Heuristically motivated)
max⁡GV(G,D)=Ex∼pz(z)[log⁡(D(G(z))]\max_{G} V(G, D)=E_{\mathbf{x}\sim p_z(z)}[\log (D(\mathbf{G(z}))]Gmax​V(G,D)=Ex∼pz​(z)​[log(D(G(z))]
なぜ傾斜が大きいのですか?
開始段階ではGeneratorが学習時に勾配を上げるとDistributorが0であると確信する段階から素早く抜け出すことができるからである.

0に近い場合の傾きの違いを比較できます.
従って,Pythorchコードに記述されたバイナリCrossEnropy Loss関数がy=1に代入されたときに変形したlog尤度であることを決定できる.
その他の説明
L(h(x),y)=L(h(x), y)=L(h(x),=========================================================================================================================================================================================================log(G,D)]V(G,D)=Ex~pz(z)[log(D(G(z)]最大化

Why Does GAN Work?


上で求めた式に対してmin,maxをとる方法は統計学的にJSDを最小化する方法であり,すなわち2つの分布間の距離を減少させるためである.
min⁡Gmax⁡DV(G,D)\min_{G}\max_{D} V(G, D)Gmin​Dmax​V(G,D)
ここまでがGANの基本形態ですが、ここで変形した(Variants)GANについて解説していきます.

2. DCGAN


Distributor,CNN,GeneratorとしてDe畳み込みネットワークを使用する.
  • プール化層は使用しません.
  • Latentベクトルは算術に用いることができる
  • 3. LSGAN


    Least Squares GAN(LSGAN)
    Proposed a GAN model that adopts the least squared loss function for the discriminator.

  • DistributorはSquareを用いてD(x)が1に近づき,D(G(z)が0に近づくことを学習する.GeneratorもD(G(z))が1に近いことを学びます.

  • GANはDistributorでSigmoidを使用していますが、ここでは使用しません.

  • DCGANよりも優れたパフォーマンス

  • 4. SGAN


    Semi-Supervised GAN
    ランク分けのガン
    Supervised

    Unsupervised
  • Distributorは、画像入力時に既存のクラス+FAKEクラスを学習する必要があり、GeneratorはLatentベクトルとクラスラベルベクトルとともに入力し、擬似画像を生成し、入力したラベルベクトルをだまして予測する必要がある.
  • 上図では,Latentベクトル固定,Labelデータ変更は,キャラクタ固定,キャラクタ挙動(表情)変化の形態と考えられる.
  • 5. ACGAN


    この図は交流GANと他のGANの形態を比較することができる.

    (ACGAN)Auxiliary Classifier GAN
    これは
  • Distributorがしなければならない2つのことです.

    前述したようにDistributorは1です.真偽判別課2つのカテゴリ予測を学習します.SGANではlabel数が#class+1#class+1#class+1であればclass数と同じである.
  • 以降は,学習が進むにつれて性能が向上する.
  • GeneratorよりもDistributorに焦点を当てた方がよさそうです.
  • GANのVariants of Lossの変換を理解し、Labelを追加した場合は、最後にGANの拡張について説明します.

    6.CycleGAN


    Unpaired Image to Image Translation

    Generatorで画像入力を受け付けます.Distributor学習は「馬」と予測でき,Generatorはシマウマ画像の出現時にシマウマを除去する馬の形態を学習する.そして、別のジェネレータでは、このようにして生成された馬が元のシマウマから戻ると、実際に入力されたシマウマのL 2損失を最小化する方法を学び、シマウマ紋のみを除去する方法がループGANである.

    7.StackGAN



    これは、ジェネレータによって生成された結果を生成し、ジェネレータによって高解像度画像を生成する方法である.2つの発電機、各発電機には2つのDistributorが必要です.