AI.doll

にゃーん(機械学習, 深層学習, 強化学習のメモ。)

GAN

{} クラスメイトと隔週くらいで論文1本ずつ読んできてお互いに解説し合えば2倍のはやさで読めるし理解深まるくない?みたいになった。 その解説のためにスライド作るならブログにしてそれ見せて説明すれば残しとけて良くない?っておもったのでブログにしてみた。 今週はあとあとCycleGANとかの解説もしたいしGANの最初の論文にしといた。

目次

読んだ論文

Generative Adversarial Networks

概要

端的にいうとGANは教師なし学習で、データの確率分布を学習している。
最大の特徴は学習時、2つのモデル G (Generator)と D (Discriminator)を用意する点である。
 Gはランダムノイズから学習データと同じ形の出力を生成する。(つまりデータが28×28の画像(行列)なら28×28の行列を出力)  Dは与えられたデータが訓練データのもの(つまり、現実に存在するもの)なのか Gが生成したものなのかを判別する。
 Gは自分が生成した出力を Dが訓練データのものと間違うように学習して、 Dはできるだけ正しく判別できるように学習する。 このように、 G Dも目的が明確になり、評価関数を定義できるので、それぞれそれを最適化するように学習すればよい。

理論

以下、データのサンプリングされる空間の全体を X, ランダムノイズのサンプリングされる空間を Zとする。(つまりデータが2次元平面上の1点だとするとX={\mathbb R}^{2})
すでに述べたように、GANの学習ではGenerator  GとDiscriminator  Dの2つを学習する。
 Dは確率を出力するような関数で、その確率というのは(正しく学習されていれば)与えられたxが現実のデータのものである確からしさである。
以上から、GANで使用される評価関数が次式で与えられるのは自然に感じるはず。 $$ V(G, D) = {\mathbb E}_{x\sim p_{data}}\left[\log D(x)\right]+{\mathbb E}_{z\sim p_{z}}\left[\log (1-D(G(z)))\right] $$  p_{data}は訓練データの分布で、 p_{z} zの分布である。( zの分布というのは、学習させる側が決めるもので与えられると考えて良い。)
この評価関数の意味は下図の通り。
( Dの値域が[0, 1]であることに注意すれば \logはどちらも [-\infty, 0]) f:id:doll_r0:20180619201229p:plain これは、 Dのみを見ると、Binary Cross Entropy(BCE) になっていて、 Dは2値分類を学習しているだけだということも分かる。
また、図から Dはこれを最大化しようとして、 Gはこれを最小化しようとしているということも分かる。つまり、 D Gも最適になった時、評価関数の値は、 $$ V^{*}(G, D) = \mathop{\min}_{G}\mathop{\max}_{D} V(D, G) $$ となる。  Dについて最大化するというのは定性的には現実のデータと生成されたデータをできるだけ見分けるようなものを学習しているということだが、具体的には何が学習されているのだろうか?
まず、 Vを最大化するような Dについて考えてみる。
データの確率空間を (X, \sigma(X), p_{data})とすると、 Gとは確率空間 (Z, \sigma(Z), p_{z})から確率空間 (X, \sigma(X), p_g)を引き起こすような確率変数であると考えられる。( p_gはここで初めて書いたが、 Gによって引き起こされる確率空間の確率測度のこと。日本語で上手く説明できないのでこれで許して)
これを用いて、 Vを変形すると、 $$ \begin{align} V(G, D) &= \int_{x\in X}\log D(x) p_{data}(x) dx+\int_{z\in Z} \log (1-D(G(z))) p_{z}(z) dz\\ &= \int_{x\in X}\left\{\log D(x)p_{data}(x) + \log (1-D(x)) p_g(x)\right\} dx \end{align} $$ ここで、a\log(x) + b\log(1-x)の形の最大値は x = \frac{a}{a+b}で与えられることを利用して、 V(G, D)を最大化する Dは、 $$ D(x) = \frac{p_{data}(x)}{p_{data}(x)+p_g(x)} $$ 上式から、 p_{data} = p_gとなるとき、 D(x)は常に0.5であることが分かる。実際、最適な Gに対して p_g = p_{data}となる。 ここからはそれを確かめる。
 Dに関して最大化した Vを $$C(G) := \mathop{\max}_{D}V(G, D)$$ と表し、この時の D D^{\ast}とすると、 $$ \begin{align} C(G) &= \int_{x\in X}\left\{\log D^{\ast}(x)p_{data}(x) + \log (1-D^{\ast}(x)) p_g(x)\right\} dx \\ &= \int_{x\in X}\log\left(\frac{p_{data}(x)}{p_{data}(x)+p_g(x)}\right) p_{data}(x) dx + \int_{x\in X}\log\left(\frac{p_g(x)}{p_{data}(x)+p_g(x)}\right) p_g(x) dx \\ &= \int_{x\in X}\log\left(\frac{p_{data}(x)}{(p_{data}(x)+p_g(x))/2}\right) p_{data}(x) dx + \int_{x\in X}\log\left(\frac{p_g(x)}{(p_{data}(x)+p_g(x))/2}\right) p_g(x) dx - log4 \end{align} $$ ここで -log4が(変形が正しいことは明らかだが)謎に取り出されているのは、最適な p_g p_g=p_{data}だろうという予想のもとそれを代入した時、 C = -\log4だからである。 そして、2つの積分がそれぞれカルバック・ライブラー・ダイバージェンスであることがわかるので、整理すると、 $$ C(G) = KL\left(p_{data}\left|\left|\frac{p_{data}+p_g}{2}\right.\right.\right) + KL\left(p_g\left|\left|\frac{p_{data}+p_g}{2}\right.\right.\right) - \log4 $$ また前半2つのKLダイバージェンスイェンセン・シャノン・ダイバージェンスを用いるとさらに綺麗にかけて、 $$ C(G) = 2\cdot JSD\left(\left.\left.p_{data}\right|\right| p_g \right) - log4 $$ となる。 ここで、JSDにすると嬉しいのは1つにまとまって綺麗なのと、KLダイバージェンスは満たしていない距離の公理をJSDは満たすからである。
この式から、 C(G)を最小とするのはJSDを0(最小)とする、 p_g = p_{data}であることが分かる。(距離なのだから同じだったら0)

以上で、上手く学習されていれば  Gの分布は現実のデータと同じになり、そのときの Dは一様に0.5であることが分かる。

実際に学習する際は、 p_{data}は与えられず、確率分布 p_{data}からサンプリングされた実現値である学習データ(有限)が与えられる。 また、 zに関しても p_zから有限個サンプリングされる。 そのため、1度の \max,  \min操作で最適解は与えられない。さらに、それぞれのサンプルが有限であるため、そのデータに対して完全に最適化すると過学習してしまうという問題もある。
これらの理由から、 \max,  \min操作はそれぞれその勾配方向に移動するというものに置き換えて、これを反復する。
また、学習初期で \log (1-D(G(z))) D(G(z))が0に近くなるため( Gの分布がぜんぜんデータの分布になってないから) その勾配は緩やかであり、学習がなかなか進まないことが分かる。そのため、 Gを更新する際はこの部分を \log (D(G(z)))とする。これにより、 \maxの部分が \minになる。 よって、 D Gも勾配降下を繰り返す。 イメージ的には以下のような感じ。
( Sutton先生のGeneralized Policy Iterationの図から思いついた。) f:id:doll_r0:20180619231855p:plain

実装

もう実装はしたので1ヶ月以内くらいには上げるつもり。