Edited at

GANの数式を理解する

GANを理解したかったのですが、数式の意味がわからなかったので調べました。5時間くらいかけて、なんとなくわかった気がしたので書いておきます。


概要

今回は、こちらのGAN論文の数式の意味を調べました。

32F3BF02-7D1C-45F2-9062-C5685E5BB2F1.jpeg

DはDiscriminator(識別器)、GはGenerator(生成器)を意味します。Dを騙すG, Gに騙されないDを目指して、DとGを学習させていくようです。


左辺

左辺は、Vを最大にするDと、Vを最小にするGを選択した際の、Vの値という意味でしょうか?

ミニマックス問題というものが関係しているようなので、wikipediaで調べてみると、


ミニマックス法(みにまっくすほう、英: minimax)またはミニマックス探索とは、想定される最大の損害が最小になるように決断を行う戦略のこと


なので、この数式をミニマックス問題として理解すると、DがVを最大化する場合に「Vを最小にするG」を選ぶ問題、となるようです。

Gの学習がミニマックス問題に当たる気がします。


右辺

Dは0~1の値を返すモデルだと理解しました。

正解ラベルは、オリジナルのデータには1、Gが生成したデータには0が振られている、という認識です。


log(0)とlog(1)の計算結果

log(D)がどんな特徴を持つのか、調べました。Dは0~1の値を返すので、D=1とD=0の場合の結果を確認してみます。

log(1) = 0

log(0) = -∞

つまり、1に近いほど値が大きくなり(0に近づき)、0に近いほど値が小さくなる(-∞に近づく)という特徴があるようです。


右辺第一項

xは教師データなので、1に近い値を返せるほど正しいモデルとなります。

logD(x)は、D(x)が1に近いほど値が0に近づき、0に近いほど小さい値(-∞に近い値)になります。


右辺第二項

Gが生成したデータなので、Dは0に近い値を返せるほど、正しいモデルとなります。

log(1-D(G(z))は、D(G(z))が1に近いほど小さい値になり、0に近いほど大きな値(0)に近づきます。


学習方法

冒頭のGANの論文の説明を読むと、DとGの学習を交互に進めるようです。

gan.png


Dの学習

Gを固定して、Vが最大化するように学習します。右辺全体を最大化します。


Gの学習

Dを固定してVが最小化するように学習します。右辺の第二項だけを最小化するようです。


終わりに

雰囲気はわかった気がするので、コードとして実装してみたいと思います。