GANを学びたいけれど、価値関数の数式に困惑している人へ

#GANの価値関数（目的関数）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/4398e951-48b5-24bb-92b2-12d3fe3a600c.png)

本記事ではGANを学び始めたら見かけてしまう、一見複雑そうな上記の式を解説していく


#GANのモデル
まずはGANのモデルと学習の流れを軽く見てみる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/2ad532ec-cc55-ee56-6f79-764bb8812bfb.png)


##順伝播（Discriminatorに判定させてみる）
・Generatorがノイズ（例えば100次元のベクトル）から画像っぽいものを生成する
もちろん最初はでたらめな画像しか生成できない

・Discriminatorには本物の画像、もしくはGeneratorが生成した画像のどちらかをランダムに入れる

・Discriminatorがスコアを出すときは<b>シグモイド関数</b>を使うため、
<b>本物だと思ったら1を出力、Generatorが生成した画像(偽物）だと思ったら0を出力する</b>

正確にいうと<b>「Discriminatorに来た画像が本物である確率」</b>

##逆伝播（Discriminatorの重みを更新するとき）
<b>Discriminatorの理想は本物が来たら1を出力して、偽物が来たら0を出力</b>

・ここはシンプルに画像分類をしたときのCNNの重みの更新と同じ
GANだからと言って新しい何かがあるわけではない
正しく判定（本物が来たら1を出力して、偽物が来たら0を出力）できるように重みを更新する

##逆伝播（Generatorの重みを更新するとき）
<b>Generatorの理想はDiscriminatorが間違って判定（偽物の画像に対して1を出力）すること</b>

・これは実装上のポイントにもなるが
Generatorの重みを更新するときは、誤差がDiscriminatorを通ってくるため
Discriminatorの重みの更新を止めなければならない

もしDiscriminatorの重みの更新を止めなかったら、Discriminatorの重みが偽物に対して1を出力するようになってしまう（今はGeneratorの理想に近づくような更新がされているため）

#本題へ
GANの価値関数（再掲）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/7cdfc5ad-143f-ba10-5523-43d85238a98b.png)

###右辺について###

$E$：期待値
$x$~$p_{data}(x) $：本物の画像がDiscriminatorに来たとき
$D(x)$：Discriminatorに本物の画像が来たときのスコア

$x$~$p_z(x)$：Generatorが生成した画像（偽物）がDiscriminatorに来たとき
$G(z)$：Generatorがノイズzから生成した偽物画像
$D(G(z))$：Discriminatorに（Generatorが生成した）偽物の画像が来たときのスコア


###logのグラフ
log(x)のxの値が大きいほどlog(x)は大きくなる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/63921802-cea7-9e9c-0c71-c928904e9a7e.png)


#Discriminatorを評価するとき
<b>・Discriminatorの理想は本物が来たら1、偽物が来たら0を出力すること</b>
##右辺第一項
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/876eda2e-8145-de7d-0100-673c98545602.png)
上記の式を言語化すると、<b>本物の画像がDiscriminatorに来たときのDiscriminatorのスコア</b>である

本物の画像のため、シグモイド関数の出力は０～１の内、<b>１</b>を出力してほしい

理想的な出力である$D(x)=1$を出力できれば、結果的に上記の式（右辺第一項）を<b>最大化</b>できる


##右辺第二項
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/38655806-a72f-97d3-b3f4-406453e93296.png)
上記の式を言語化すると
<b>Generatorが生成した画像（偽物）がDiscriminatorに来たときのDiscriminatorのスコア</b>である

偽物の画像のため、シグモイド関数の出力は０～１の内、<b>０</b>を出力してほしい

理想的な出力である$D(G(z)))=0$を出力できれば、$log(1-0)$になり
結果的に上記の式（右辺第二項）を<b>最大化</b>できる

##Discriminatorまとめ
上述のようにDiscriminatorの理想通り（本物の画像には1を出力、偽物の画像には0を出力）になれば、
第一項と第二項はどちらも最大になる（大きい値と大きい値を足し合わせているので右辺トータルも最大）

このことを表しているのが、価値関数の左辺にある$max_D$である



#Generatorを評価するとき
<b>・Generatorの理想はDiscriminatorが間違って判定（偽物の画像に対して1を出力）すること</b>

<b>・右辺第一項はGeneratorに関係ないので無視する</b>
##右辺第一項
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/e84c6149-fb39-9f7e-4ee4-33ff7b1c3a22.png)
<b>本物の画像がDiscriminatorに来たときのDiscriminatorのスコア</b>を表している

これはGeneratorとは関係がないのでGeneratorを評価するときは無視する

##右辺第二項
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/f12d1568-b6a2-5b41-20fe-b5eb03aec415.png)
<b>Generatorが生成した画像（偽物）がDiscriminatorに来たときのDiscriminatorのスコア</b>を表している

GeneratorはDiscriminatorが間違ってほしい
Generatorにとっては、偽物画像に対してDiscriminatorが<b>1</b>を出力するのが理想

理想的な出力である$D(G(z))=1$を出力できれば、$log(1-1)$になり
結果的に右辺第二項を<b>最小化</b>できる

##Generatorまとめ
上述のようにGeneratorの理想通り（Generatorの生成した画像に対してDiscriminatorが1を出力）になれば、第二項は最小になる（第一項は無視、第二項最小化で右辺トータルは最小）

このことを表しているのが、価値関数の左辺にある$min_G$である

#全体まとめ
文字が多くて圧倒されてしまいがちな式だが、
「GeneratorとDiscriminatorのそれぞれの理想の状況ってどうなんだっけ？」と落ち着いて考えていけば、「そんな複雑なことを表している式ではないんだな」ということが理解できると思う