ラビットチャレンジレポート 深層学習 その5

DCGAN

GAN(Generative Adversarial Network)とは

生成器と識別機を競わせて学習する生成&識別モデル。
Generator(生成器):乱数からデータを生成
Discriminator(識別器):入力データが真値(学習データ)であるかを識別する。
f:id:tibet:20211217130403p:plain

2プレイヤーのミニマックスゲームとは
  • 1人が自分の勝利する確率を最大化する作戦をとる。
  • もう一人は相手が勝利する確率を最小化する作戦をとる。
  • GANでは、価値関数Vに対し、D(識別器)が最大化、G(生成器)が最小化を行う。

 min_Gmax_DV(D,G)
ここを少し解説する。
GANの単一データの損失関数は、バイナリークロスエントロピーで表せる。
 L=-ylog\hat{y}+(1-y)log(1-\hat{y})・・・・(1)

  • 真データを扱うときは、 y=1, \hat{y}=D(x)となるので、(1)にそれぞれ代入すると、

 L=-log\lbrack D(x)\rbrack ・・・(2)

  • 生成データを扱うときは、 y=0, \hat{y}=D(G(z))となるので、これを(1)に代入する。

 L=-log\lbrack 1-D(G(z))\rbrack ・・・(3)
(1)、(2)の2つを足し合わせると、
 L=-(log\lbrack D(x) \rbrack + log\lbrack 1-D(G(z) \rbrack )
複数データをとるために期待値をとち、符号を逆にすると、価値関数は下記のようになる。
 V(D,G)=E_{x~P_{data(x)}}\lbrack logD(x)\rbrack +E_{z~pz(z)}\lbrack log(1-D(G(z)))\rbrack ・・・(4)

判別器を評価する時

D(x)は0~1の範囲を出力するが、真データが来た時、1を出力してほしい。
(4)の右辺第一項は、D(x)=1が来た時、最大化できる。
また、D(G(z))は、生成器が出力したデータの判定なので、偽データとして判定してほしい。
よって、D(G(z))=0が理想である。よって、右辺第二項もこのとき最大化できる。
結果的に、判別器を理想通りに動作させるには、価値関数V(D,G)を最大化するようパラメータを調整することになる。

生成器を評価する時

生成器の理想は、判別器が間違って判定すること(生成器の出力に1を出力すること)である。
(4)の右辺第一項は、生成器には関係ないので無視する。
右辺第二項は、D(G(z))=1を生成するのが望ましい。すなわち、右辺第二項が最小化されることが望ましい。
結果的に、生成器を理想通り動作させるには、評価関数V(D,G)を最小化するようパラメータを調整することになる。

最適化方法

具体的な最適化方法は下記のとおりである。
1. 判別器の性能を更新するよう、価値関数を最大化

  • 生成器のパラメータθgを固定
  • 真データと生成データをm個ずつサンプルする
  •  θ_dを勾配上昇法(Gradient Ascent)で更新

 \dfrac{\partial}{\partial θ_d}\dfrac{1}{m}\lbrack log \lbrack D(x) \rbrack +log \lbrack 1-D(G(z))\rbrack \rbrack

2.生成器の性能を更新するよう、価値関数を最小化

  • 判別器のパラメータθdを固定
  • 生成データをm個ずつサンプル
  • θgを勾配降下法(Gradient Descent)で更新

 \dfrac{\partial}{\partial θg}\dfrac{1}{m}\lbrack log\lbrack 1-D(G(z)) \rbrack \rbrack

なぜ生成器は本物のようなデータを生成するのか

  • 生成データが本物とそっくりな状況とは、 p_g=p_{data}であるはず。
  • 価値関数が p_g=p_{data}の時に最適化されていることを示せばよい。
  • 二つのステップで確認する。
  1. Gを固定し、価値関数が最大値をとる時のD(x)を算出
  2. 上記のD(x)を価値関数に代入し、Gが価値関数を最小化する条件を算出
ステップ1:価値関数を最大化するD(x)の値は?
  • Generatorを固定する。

 V(D,G)=E_{x~P_{data(x)}}\lbrack logD(x)\lbrack +E_{z~pz(z)}\lbrack log(1-D(G(z)))\rbrack
 =\int_x P_{data}(x)log(D(x))+p_g(x)log(1-D(x))dx
y=D(x)、a=P_{data}(x)、b=P_g(x)とおけば、
 V=alog(y)+blog(1-y)

  •  alog(y)+blog(1-y)の極致を求める。

 \dfrac{a}{y}+\dfrac{b}{1-y}(-1)=0
 y=\dfrac {a}{a+b}
y=D(x), a=pdata(x), b=pg(x)なので、
 D(x)=\dfrac{P_{data}(x)}{P_{data}(x)+p_g(x)}
これが、価値関数が最大値をとる時のD(x)の値である。

ステップ2:価値関数を最小化する条件

価値関数のD(x)を上記の値で置き換える。
 V=E_{x~p_{data}}log\lbrack\dfrac{p_data(x)}{P_data(x)+p_g(x)}\rbrack+E{x~p_g}log\lbrack 1-\dfrac{P_{data}(x)}{P_{data}(x)+p_g(x)}\rbrack
 =E_{x~pdata}log\lbrack \dfrac{p_data(x)}{P_data(x)+p_g(x)}\rbrack+E{x~p_g}log\lbrack \dfrac{P_g(x)}{P_{data}(x)+p_g(x)}\rbrack・・・(5)

  • 上記の最小値を調べる必要がある。 P_g, P_{data}は確率分布である。

JSダイバージェンスと(5)の式を比較すると非常に近似した式であることが分かる。このため(5)の最小値を求めるためにJSダイバージェンスを利用する。

  • 価値関数を変形する。

 V=2JS(P_{data}||P_g)-2log2
 min_gVはpdata=pgの時に、最小値-2log2をとる。
よって、GANの学習により、Gは本物のようなデータを生成できる。
学習ステップは下記のようになる。
f:id:tibet:20211217162907p:plain

DCGAN(Deep Convolutional GAN)

  • GANを利用した画像生成モデル
  • 生成器
    • Pooling層の代わりに転置畳み込み層を利用
    • 最終層はtanh、その他はReLU関数で活性化

f:id:tibet:20211217195938p:plain

  • 判別器
    • Pooling層の代わりに畳み込み層を使用
    • Leaky ReLU関数で活性化