Wasserstein GANを熟読する

#初めに
GANの一種にWasserstein GAN（WGAN）と呼ばれるものがあります。実際に実装したことがある人なら分かる通り、WGANはDCGANと比べて圧倒的に学習が安定しています。WGANの実装はLossと訓練の回数をちょちょいと変えれば良いだけで、**簡単に実装できます。**しかし、なぜ急にLossを変えたりしたりしたのでしょうか。**どうやってWGANのLossにたどり着いたのでしょうか。**今回は論文からそういった過程を含めて解説しようと思います。
この記事を書くのに用いているスライドの画像は[SlideShare](https://www.slideshare.net/ssusera4bf2d/wasserstein-gan-242878112)にあげています。

# WGANに至るまで
![スライド2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398959/6235a8aa-001a-eddf-70a2-f88b861bf8a5.jpeg)
[WGANの論文](https://arxiv.org/abs/1701.07875)では、WGANに至るまでに、非教師学習、GANについての話から展開していっています。今回はこの順に沿って解説も進めていきます。
## 非教師学習
![スライド3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398959/257e0cbe-9b22-38c7-cc4a-8d74eb8f3486.jpeg)
まずDeep learningの基本的な戦略について、まず**世の中にある画像などの対象はとても素晴らしい完全無欠な確率密度分布からサンプリングされているものである**と仮定します。学習するモデルは、そういった**真の確率分布を模倣**することを目指します。
![スライド4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398959/6306feb2-db51-0e1a-ecde-6f6a5d538734.jpeg)
じゃあどうやって真の確率分布を模倣するか、基本的には**確率密度関数同士の距離を表してくれるKullback–Leibler divergence(KLD)を最小化させるという問題に帰着させます。**
普段私達がよく使うCross Entropy Loss もKLDを最小化させることに対応しています。
しかし、常に真の確率分布の存在を仮定しても良いのでしょうか。
![スライド5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398959/8d7e7367-4102-60f8-1921-e82f14d03514.jpeg)
画像などの対象が低次元の多様体から構成されている状況が多く、そういったケースではKLDがうまく定義できないという問題が起こってしまいます。つまり、**KLDの最小化を考えることが問題の解決にならない状況が多い**ということです。私の数学的素養が足りないため、ここをクリアに解説はできませんが、「低次元の多様体から構成されている」を画像で例えると、画像データが、画像のピクセル数×RGBの次元に存在する点であると考えると、画像全体を考えても、その超空間に局所的にしか点が存在しないということを言っています。（RGBの値をランダムに決めて出力してもノイズが出るばかりで、猫の画像とかが生まれたりする確率はほぼないわけです。）
![スライド6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398959/f554e21e-c02a-283d-0436-85acf33f3d03.jpeg)
こういった問題に対処するために先人たちはノイズ項を追加するという手段を取りました。（なぜノイズを入れれば大丈夫なのかは分かりません・・・）しかし、この方法には弱点が存在ます。それは画像がぼやけてしまうことでした。
![スライド7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398959/712d99d6-e3e1-d26e-717f-1fb4c5d47b66.jpeg)
そこで、加えられたものをノイズではなく引数（潜在変数）と考えて、直接画像を生成する方法が取られました。こういった手法をとれば、諸々の問題を解決できます。
**こういったアプローチの好例がGANやVAEであったというわけです。**
GANの実装とかでよく、潜在変数を`noise`と書いている実装があるのもこのためでしょうね。

## GAN
![スライド10.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398959/ce059a5c-a6c1-f4f9-c7f2-2cddc23dd563.jpeg)
先程、GANやVAEを挙げましたが、それぞれには図のような特徴があります。
一見すると良い点が多いGANに軍配が上がりますが、非常に学習が不安定なのはGANの大きな欠点であります。
![スライド11.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398959/fbbf4d8a-648b-bf6a-a6f8-3ae727d767fb.jpeg)
そこでWGANの論文では、GANの安定性を上げるためにGANの収束性、それに直結する**モデルの距離関数**に着目しました。
![スライド12.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398959/46c01428-cb88-829f-c257-da2a90cc4f66.jpeg)
もちろんDeep leearningの学習は微分の値を用いて進めていくため、**距離関数の連続性が非常に重要**であるということは容易に想像できます。
![スライド13.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398959/9171cb42-b5c0-545e-2784-0ef0da17ec5f.jpeg)
![スライド14.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398959/462bbb38-1546-fd19-b041-ad8bea4c4ab6.jpeg)
そこで新たな距離関数を探して行くわけですが、どうやら連続性という観点ではEM Distance(Wasserstein Distance)が優れている模様であるとわかりました。よってEM Distanceを用いたGANを考えます。

## WGAN
![スライド16.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398959/ad081302-9cc3-15d0-d8d6-58abea3885aa.jpeg)
![スライド17.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398959/a22115ed-e866-ad27-e7ef-24429d2e922e.jpeg)
![スライド18.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398959/2d22b322-4843-44ae-faa4-10e4a489e631.jpeg)
しかし、EM Distanceをよく見てみると式の中にinfが存在しています。無限大とコンピュータの相性はすこぶる悪いため、このままではEM Distanceを使用することはできないのですが、数学的に関数（GeneratorやCritic(Discriminator)）が**リプシッツ連続**ならinfをsupに変形できるため、コンピュータが計算可能になります。
![スライド19.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398959/3bdebc41-8754-5bd7-8d0a-b156e18677bd.jpeg)
![スライド20.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398959/31442c8a-be95-47c7-6394-412307ab2b80.jpeg)
じゃあどうやってリプシッツ連続にするのかというと、WGANの論文では重みをクリッピングするという手法をとっています。しかし、この方法はWGANの著者が論文中でterribleと評している通り、デメリットが存在します。これに関しては後に[Gradient Penalty](https://arxiv.org/abs/1704.00028)という手法で解決されています。
![スライド21.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398959/5b948f5c-f4db-981d-e662-cfa81d839c63.jpeg)
WGANのアルゴリズムについて、これに至るまでに様々な考察がなされていましたが、通常のGANのプロセスと異なる部分は青色にハイライトした部分だけです。WGANの成果も素晴らしいものだと思いますがその過程にある考えもしっかりと理解して糧にしていきたいですね。

# WGANは何が優れているか
![スライド23.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398959/793cd4f2-7854-8770-9ecd-a8c514c3ccbd.jpeg)
![スライド24.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398959/46e28fbf-a052-2f4c-5519-a021264a8ae9.jpeg)
![スライド25.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398959/7e11929a-6c52-4e91-84d0-44356f718b28.jpeg)
この図では通常のGANやWGANの勾配の値がそれぞれ<font color="Red">赤線</font>、<font color="DeepSkyBlue">水色線</font>になっています。図を見るに、サンプルが存在する点（緑点）ではWGANの勾配が線形に近く0にはならないため、**勾配消失を起こし得ない**ということがわかります。また、勾配消失を起こし得ないため、どんなにCriticが強くなろうと勾配が存在するため、**CriticとGeneratorのバランスを考えなくて良くなります。**また、この勾配が消失しないというのはモード崩壊を防ぐ役割があります。というのも、**モード崩壊はCriticが強すぎたり弱すぎたりして形が固定されているということが原因とされています。**よって、勾配消失が起こらないWGANではCriticの形が固定されているということがないため、モード崩壊が起こりません。

# 実験結果
![スライド26.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398959/2ba48676-41c9-abd8-01ca-bb6f6ea50663.jpeg)
![スライド27.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398959/fe550536-ad95-1d7a-9528-00c9455874cb.jpeg)
![スライド28.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398959/350e4b58-a639-d74d-d0ff-fe757f8e66c2.jpeg)
![スライド29.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398959/829d311a-a341-6afd-6e32-eda3f5fc86a2.jpeg)
実験結果ではステップ毎のWD(Wasserstein Distance)とJSD(Jensen-Shannon Divergence)の値と生成画像が示されています。この図からはどちらも生成画像の質は変わっていっていますが、JSDの値が早々に飽和していくのと違ってWDの値はコンスタントに下がり続けていることがわかります。よって、**WDの値と画像の質に相関がある**ということが言えます。しかし、ここで留意したいのが、WDの値がGeneratorを評価する普遍的な指標ではないということです。

# まとめ
![スライド31.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398959/f1370f12-3384-3d6a-33c9-1c4b1e8af2d1.jpeg)
WGANの成果は図にまとめられます。個人的にはやはりモード崩壊が起こらないというのが大きいと思います。モード崩壊はハマったら抜け出せない泥沼なので・・・