Science

敵対的生成ネットワーク(GAN)の理論を解説

敵対的生成ネットワーク(GAN)の理論を解説

 

本記事では、機械学習分野で画像生成等の主流となっている『敵対的生成ネットワーク(Generative adversarial network ; GAN)』の理論的な内容を可能な限り簡単にまとめました。

 

本記事を読むメリット

  1. GANの目的関数の意味がわかる

 

 

GANのネットワークと学習モデル

 

本章では、敵対的生成ネットワーク(Generative adversarial network ; GAN)の定式化を行います。

下記の記事では、生成モデルと学習モデルの間のKLダイバージェンスを最小化することで学習モデルの学習を行いましたがGAN(Vanila GAN)は異なるダイバージェンスの最小化として定式化されます。

 

GANで使用するネットワークを定義

 

GANでは、以下の2種類のネットワークを最初に定義します。

GANのネットワーク

  • \( G : \mathcal{Z} \to \mathcal{X} \) 
  • \( D : \mathcal{X} \to \mathbb{R} \)  

ここで、\( \mathcal{X} \)は、データ\( \mathbf{x} \in \mathcal{X} \)の空間とし、\( \mathcal{Z} \)は、私たちが設定する適当な空間(潜在空間)とします。

また、一般に\(G\)をGenerator, \(D\)をDiscriminatorと呼びます。

具体的に、上記のネットワークは以下のような役割をします。

  • Generator : ある潜在空間からデータのフェイク\(\mathbf{x}_{\text{fake}}\)を生成
  • Discriminator : 本物のデータとGeneratorによるフェイクのデータを識別

この二つのネットワークが敵対し、『切磋琢磨』しながら学習します(具体的に定式化は後述)

そうすることで、データにそっくりな『フェイク』をGeneratorが生成することができます。

以下では、Discriminatorの出力\(D(\mathbf{x}) \in [0, 1]\)とし、\(\mathbf{x}\)が本物のデータである確率を出力するように対応させます。

 

GANの学習モデル

 

GANの学習モデルを定義するためには、潜在空間\(\mathcal{Z}\)上の確率分布\(p_{z}(z)\)を定義する必要があります。

その確率分布\(p_{z}(z)\)は、サンプリングが容易な確率分布ならば特に問題はありません(一様分布やガウス分布等が該当します)

すると学習モデルは、\(P_{z} (z)\)を使って以下のように定義できます。

GANの学習モデル

$$Q_{\theta_{G}(\mathbf{x} \mid \mathbf{z}) \equiv \int d\mathbf{z} p_{z}(z)  \delta \left( \mathbf{x} – G(\mathbf{z}) \right) $$

ここで、\(\theta_{G}\)は学習モデルのパラメータを表します。

この学習モデルを用いて、データの背後にある確率分布を近似し、統計的に類似した偽物データ\(\mathbf{x}_{\text{fake}}\)をサンプルすることを目指します。

$$\mathbf{x}_{\text{fake}} \sim Q_{\theta_{G}}(\mathbf{x})$$

 

GANのネットワークの可視化

 

具体的に上記のネットワークを可視化すると以下のようになります。

GANのネットワークGANのネットワーク

 

簡単に図の説明をすると、Generatorは\(p(\mathbf{z})\)によって生成される\(\mathbf{z}\)を入力として、\(\mathbf{x}_{\text{fake}}\)を出力します。

Discriminatorは、実際のデータ\(\mathbf{x}_{\text{data}}\)とGeneratorによるフェイクのデータを\(\mathbf{x}_{\text{fake}}\)を入力して、入力が実際のデータである確率\(D(\mathbf{x})\)を出力します。

上述で説明した『切磋琢磨』とはGeneratorは\(D(\mathbf{x}_{\text{fake}}) = 1\)となることを目指し、Discriminatorは\(D(\mathbf{x}_{\text{fake}} = 0)\)かつ\(D(\mathbf{x}_{\text{data}} = 1)\)を目指すという意味です。

このような敵対的学習が再現される目的関数を下記で紹介していきます。

 

GANの目的関数

 

本章では、GANを学習するための目的関数を説明していきます。

ゴールは、GANの目的関数を設定する気持ちがわかることです。

GANの目的関数

 

GANの学習は、データを生成する確率分布\(p_{\text{target}}\)とのKLダイバージェンス最小化の代わりに以下のような関数を用いて学習が行われます。

$$V(G, D) = \underset{\mathbf{x} \sim p_{\text{target}}}{\mathbb{E}} \left[\log D(\mathbf{x})  \right] + \underset{\mathbf{z} \sim p_{z}}{\mathbb{E}} \left[\log \left( 1 – D(G(\mathbf{z})) \right)  \right]$$

 

上述で説明した学習モデル\( Q_{\theta_{G}} \)を用いると以下のように表せます。

\begin{align} V(G, D) &= \underset{\mathbf{x} \sim p_{\text{target}}}{\mathbb{E}} \left[\log D(\mathbf{x})  \right] + \underset{\mathbf{x} \sim Q_{\theta_{G}}}{\mathbb{E}} \left[\log \left( 1 – D(\mathbf{x}) \right)  \right]\\ &= \int d\mathbf{x} p_{\text{target}}~(\mathbf{x}) \log D(\mathbf{x}) + \int d\mathbf{x} Q_{\theta_{G}}(\mathbf{x}) \log \left( 1 – D(\mathbf{x}) \right) \\ &= \int d\mathbf{x}\left\{ p_{\text{target}}~(\mathbf{x}) \log D(\mathbf{x}) +  Q_{\theta_{G}}(\mathbf{x}) \log \left( 1 – D(\mathbf{x}) \right) \right\} \end{align}

この目的関数が大きくなるときは、Discriminator ; \(D\)は本物のデータとフェイクのデータを正しく識別できるときです。

逆に、この目的関数を小さくなるときは、Discriminator : \(D\)がフェイクのデータに騙されている状態です。

つまり、GANの目的関数は、\(V(G, D)\)を使って以下のように定義できます。

  • Generatorの目的関数

$$V_{G}(G, D) \equiv  V(G, D)$$

  • Discriminatorの目的関数

$$V_{D}(G, D) \equiv~ – V(G, D)$$

 

\( V(G, D) \)の定義から、このように目的関数が定義されるのは直感的に理解できますね。

GANの目的関数の最小化

 

GANの目的関数が定義されたので、目的関数最小化問題に帰着されました。

一般には、深層学習でお馴染みの勾配降下法が使用されます。

GANの勾配降下法

  • Generatorの最適化
$$\theta_{G}^{(t+1)} \leftarrow \theta_{G}^{(t)}~ – \epsilon \nabla_{\theta_{G}} V_{G}(G, D)  $$

 

  • Discriminatorの最適化
$$\theta_{D}^{(t+1)} \leftarrow \theta_{D}^{(t)}~ – \epsilon \nabla_{\theta_{D}} V_{D}(G, D)  $$

 

ここで、学習率を\(\epsilon \in \mathbb{R}_{+} \)とし、DiscriminatorとGeneratorのパラメータをそれぞれ\(\theta_{D}\), \(\theta_{G} \)としました。

 

このような最適化問題の定常解は、以下の条件を満たします(Nash均衡)

最適化問題の定常解\(G^{\ast}\), \(D^{\ast}\) 

$$ V(G^{\ast}, D^{\ast}) =  \underset{G}{\min}  \underset{D}{\max} V(G, D) $$

 

最終的には、GANの最適化問題を\(\underset{\theta_{G}}{\min}  \underset{\theta_{D}}{\max} V(G, D)  \)まで帰着することができました。

あとは、これを最適化問題を解くような実装を行えばOKですね…

しかし、本当にこの最適化は生成モデルを近似するのに相応しいのでしょうか?

通常の生成モデルの場合、KLダイバージェンスの最小化は\( p_{\text{target}} = Q_{\theta} \)となるように設計されているので納得はいきますが、今回の場合はどうでしょう…

この点に関して、次章では解説していきます。

 

GANの最適解

 

今回は、上述で導出した最適化問題の解が、学習モデルとして相応しいのかを検証していきます。

つまり、最適解\(G^{\ast}\)に対して下記が成り立つことを示していきます。

$$Q_{\theta_{G}} = p_{\text{target}} $$

また、後半ではKLダイバージェンス最小化による学習手法との違いを説明します。

Discriminatorの最適化

 

まずは、Discriminatorの最適化を考えます。

すなわち、\( \underset{D}{\max} V(G, D)  \)を解いていきます。

汎関数\(V(G, V) \)は微分可能なので、以下の変分問題の解を考えれば良いですね。

$$\frac{\delta V(G, D) }{\delta D(\mathbf{x})} = 0 $$

\(V(G, D\)の変分を具体的に計算すると以下のようになります。

\begin{align} \delta V(G, D) &=  \delta \int d\mathbf{x}\left\{ p_{\text{target}}~(\mathbf{x}) \log D(\mathbf{x}) +  Q_{\theta_{G}}(\mathbf{x}) \log \left( 1 – D(\mathbf{x}) \right) \right\} \\ &= \int d\mathbf{x} \delta D(\mathbf{x}) \left\{ \frac{p_{\text{target}}(\mathbf{x})}{D(\mathbf{x})}  – \frac{ Q_{\theta_{G}}(\mathbf{x}) }{\left( 1 – D(\mathbf{x}) \right)} \right\}   \end{align}

 

この括弧の中が0とする\( D(\mathbf{x}) = D^{\ast} (\mathbf{x}) \)が解となります。

具体的には、以下のようになります。

$$D^{\ast}(\mathbf{x}) = \frac{p_{\text{target}}(\mathbf{x})}{p_{\text{target}}(\mathbf{x}) + Q_{\theta_{G}}(\mathbf{x}) }$$ 

 

次に、Generatorの最適解を考えていきます。

 

Generatorの最適化

 

次にGeneratorの最適化を考えていきます。

まずは、前節で導出した\(D^{\ast}\)を\(V(G, D) \)に代入し、以下のように変形します。

\begin{align}V(G, D^{\ast}) &= \int d\mathbf{x}\left\{ p_{\text{target}}~(\mathbf{x}) \log \frac{p_{\text{target}}(\mathbf{x})}{p_{\text{target}}(\mathbf{x}) + Q_{\theta_{G}}(\mathbf{x}) } +  Q_{\theta_{G}}(\mathbf{x}) \log \frac{Q_{\theta_{G}}(\mathbf{x}) }{p_{\text{target}}(\mathbf{x}) + Q_{\theta_{G}}(\mathbf{x}) } \right\} \\ &= \text{D}_{\text{KL}}\left(p_{\text{target}} \Bigg\| \frac{Q_{\theta_{G}} + p_{\text{target}}}{2} \right) + \text{D}_{\text{KL}}\left(Q_{\theta_{G}} \Bigg\| \frac{Q_{\theta_{G}} + p_{\text{target}}}{2} \right) – \log{4}  \end{align}

 

この\(V(G, D^{\ast})\)を最小するにするためには、最後の式のKLダイバージェンスが両方とも0になれば良いので、以下のような条件が導かれます。

$$p_{\text{target}} = \frac{Q_{\theta_{G}} + p_{\text{target}}}{2} = Q_{\theta_{G}}$$

KLダイバージェンスより条件は厳しくなりましたが、\(p_{\text{target}} = Q_{\theta_{G}} \)となることが示されました。

これで、最適化の解が学習モデルのパラメータとして相応しいことが確認できました。

これらから、GANはKLダイバージェンスではなく、以下で定義されるJensen-Shannonダイバージェンスを最小化する最適化であることがわかりました。

$$ \text{JSD}(p_{\text{target}} \| Q_{\theta_{G}}) \equiv \frac{1}{2} \left( \text{D}_{\text{KL}}\left(p_{\text{target}} \Bigg\| \frac{Q_{\theta_{G}} + p_{\text{target}}}{2} \right) + \text{D}_{\text{KL}}\left(Q_{\theta_{G}} \Bigg\| \frac{Q_{\theta_{G}} + p_{\text{target}}}{2} \right) \right) $$

 

Jensen-Shannonダイバージェンスの解説に関しては、下記が参考になります。

Jensen-Shannonダイバージェンスは、Kullback Leibler divergenceを対称化した者になっています。

 

GANを実装するときの最適化

 

理論上では、\(V(G, D)\)の期待値を評価する必要がありますが、現実的ではありません。

そのため、実際\(V(G, D)\)を計算するときは、実際にGeneratorから生成された偽物サンプルと実際のデータ点の平均を取ることで近似的に評価します。

また、実際のライブラリで実装ときは、Binary Cross Entropyによる表現を理解しておくことで様々な教科書の実装例が理解しやすくなります。

 

Binary Cross Entropyによる表現

 

Pytorch等でGANを実装する場合、誤差関数\(V(G, D)\)をBinary Cross Entropy(BEC)で表現して使用するのが一般的です。

本節では、どのようにBECを使用して表現するのかを説明します。

まずは、ご存知の方も多いかもしれませんが、BECを以下のように定義します。

Binary Cross Entrpy

\(t \in \{0, 1\}\), \(D(\mathbf{x}) \in [0, 1]\)に対して、BCEを以下で定義する。

$$L_{\text{BEC}} = – \mathbb{E} \left[t \log D(\mathbf{x}) – (1 – t) \log (1 – D(\mathbf{x})) \right]$$ 

 

このとき、本物のサンプルに対して\(t = 1\)を割り当て、偽物のサンプルに対して\(t=0\)を割り当てることで\(V(G, D)\)を表現することができます。

実際、本物のサンプルに対しては、以下のように計算できます。

$$L_{\text{BCE}:t = 1} = \underset{\mathbf{x} \sim p_{\text{target}}}{\mathbb{E}} \left[\log D(\mathbf{x})  \right] $$ 

また、偽物サンプルに対しての結果も以下のようになります。

$$L_{\text{BCE}: t=0} = \underset{\mathbf{z} \sim p_{z}}{\mathbb{E}} \left[\log \left( 1 – D(G(\mathbf{z})) \right)  \right] $$ 

 

目的関数の期待値をサンプル平均に置き換える

 

期待値を解析的に評価することは現実的ではないため、期待値を以下のようにサンプリングした系列の平均で近似します。

サンプリングによる期待値の近似

仮に\(p(\mathbf{x})\)に従うサンプル点\(\{\mathbf{x}^{(i)}\}_{i=1}^{M}\)が彫られたとき、期待値を以下で近似する。

$$\mathbb{E}_{\mathbf{x} \sim p(\mathbf{x})} \simeq \frac{1}{M} \sum_{i=1}^{M} \mathbf{x}^{(i)}$$

このサンプリングによる期待値の近似をGANの目的関数に使用します。

具体的には、\(M\)個の\(\{\mathbf{z}^{(i)} \}_{i=1}^{M}\)から生成される\(M\)個の偽物サンプルと\(M\)個のデータ\(\{\mathbf{x}_{(j)} \}_{i=1}^{M} \)を利用し、\(V(G, D\)を近似的に以下で評価します。

サンプルリング平均によるGANの目的関数の評価

$$V(G, D) \simeq \frac{1}{m} \sum_{i=1}^{M} \left[\log D(\mathbf{x}^{(i)}) + \log (1-D(G(\mathbf{z}^{(i)})))  \right] $$

 

 

GANを実装するときのネットワーク形状

 

ここまでの議論は、ネットワークの形状を固定せずに議論を進めていました。

つまり、実装の際は適当なネットワークを洗濯すれば良いことになります。

また、DiscriminatorとGeneratorのネットワークを同じような形状にする要請もないので、どのように設計するのかはユーザに自由になっています。

しかし、片方に複雑なモデルを使用し、もう一方に単純なモデルを用意した場合は、直感的にはうまくいかないような気がしますね…

 

参考資料

 

下記に参考文献・参考URLを示します。

 

参考文献

 

参考文献を説明していきます。

 

実践GAN 敵対的生成ネットワークによる深層学習

 

実装のテクニック等も詳しく書いてあります。

 

ディープラーニングと物理学 原理がわかる、応用ができる 

 

物理的な定式化が最高です。

 

参考URL

 

参考URLを解説します。

 

原論文です。普通に読みやすいです。

とてもわかりやすい解説です。他の記事も非常に勉強になります。

 

 

 

 

まとめ

 

GANを定式化し、生成モデルとしてどのように学習するべきかを説明しました。

GANは、他の生成モデルのようにKL ダイバージェンス最小化で定式化されていないところが特徴です。

本記事には、誤植や理解の勘違いが含まれている可能性があります。

もし間違いを見つけた場合は、筆者のTwitter(努力のガリレオのTwitterはこちら)や記事のコメント欄にそっとコメントしてください…

本記事が皆様の役に立つことを願います…

 

ABOUT ME
努力のガリレオ
【運営者】 : 東大で理論物理を研究中(経歴)東京大学, TOEIC950点, NASA留学, カナダ滞在経験有り, 最優秀塾講師賞, オンライン英会話講師試験合格, ブログと独自コンテンツで収益6桁達成 【編集者】: イングリッシュアドバイザーとして勤務中(経歴)中学校教諭一種免許取得[英語],カナダ留学経験あり, TOEIC650点