深層生成モデルを巡る旅(3): GAN

# はじめに
「深層生成モデルを巡る旅」シリーズ第3回はみなさんお待ちかねの（？）GANのまとめです. 
GANは綺麗な画像を生成することに長けており, その人気はFlowやVAEと比べても圧倒的です. その一方で, 世にはGANの研究があふれていて, 画像生成に限っても把握するのが困難な状態になっています. 本記事では, 元祖から最新の研究に至る歴史の中で重要と思われるものをジャンル別に紹介したいと思います. 
今回も画像生成のみを扱います. 

# GANの基本
GANそのものについての解説は日本語のものに限っても既に多数あるので, ここでは簡単に触れることとし, 後に続く各手法の紹介に集中したいと思います. ご存じの方は飛ばしてください. 

## 全体像
![2019-11-28-15-44-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/4c61a995-f0a5-3fca-2f1b-2072b83be4bc.png)
[A Beginner's Guide to Generative Adversarial Networks (GANs) | Skymind ](https://skymind.ai/wiki/generative-adversarial-network-gan)

GANは生成器$G$(Generator)と識別器$D$(Discriminator)という2つのニューラルネットからなります. 
生成器はランダムなノイズ画像から偽物の画像を生成し, 識別器は画像が教師データに含まれる「本物」か否かを判定します. 
式で表すなら, 生成器は識別器の正解率を最小化するように, 識別器は正解率を最大化するように学習していきます. 

```math
\min_{G}\max_{D} \mathbb{E}[\log{D(x)}] + \mathbb{E}[\log{(1-D(G(z)))}]
```

ここで, $x$は教師データからサンプルしたデータ, $z$はランダムノイズ, $G(z)$は$z$から生成したデータです. $D(x)$は$x$が本物(教師データからのサンプル)であると判断する確率で, $1-D(G(z))$は$G(z)$が本物でないと判断する確率です.
目的関数を, $D$について最大化, ($D$を固定して)$G$について最小化, と交互に繰り返して両者の性能を高めていきます. 「切磋琢磨」のイメージです.
以上のように, イメージするのはそれほど難しくありませんが, 2つのニューラルネットを交互に訓練して最適解に至るのが難しそうですよね. 
実際, 一方のモデルが悪いままもう一方が強化されてうまくいかないというような問題が起きやすいそうです. 

## VAE・Flowとの比較
ここで, [第1回](https://qiita.com/shionhonda/items/0fb7f91a150dff604cc5)の図をもう一度見てみましょう. 

![2019-11-28-16-11-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/d6a315b2-e497-803b-dfb9-006fa4025eb5.png)
[Flow-based Deep Generative Models](https://lilianweng.github.io/lil-log/2018/10/13/flow-based-deep-generative-models.html).

VAEやFlowと比較した時のGANの最大の特徴は, Encoderを持たないことです. 
代わりに, 識別器を設けて生成器の教師信号に使っています. Encoder-Decoderによる再構成ではなく, このような形である種の官能評価を実現することで, GANは「実際にありそうな画像」を生成することに非常に長けています. 
一方, 密度推定を行わないためデータセットに含まれる一部のモードが無視されてしまう**モード崩壊**が起きやすいです（極端な例だと, MNISTで特定の数字ばかり生成するなど）. また, 識別器が強くなりすぎて生成器が学習できないなど, 学習の安定性にも課題があります. 

# 様々なGAN
20種類の重要なGANたちを, 「画像品質」「学習方法」「生成画像の操作」「画像変換」「その他の応用」という軸で分けてみました（独断と偏見です）. 

## 画像品質
最初は, 花型とも言える画像品質を向上させる研究を見ていきましょう. 
もう1年前になってしまいますが, GANの父であるGoodfellowがこの節で書きたいことをだいたいまとめてくれています. 

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">4.5 years of GAN progress on face generation. <a href="https://t.co/kiQkuYULMC">https://t.co/kiQkuYULMC</a> <a href="https://t.co/S4aBsU536b">https://t.co/S4aBsU536b</a> <a href="https://t.co/8di6K6BxVC">https://t.co/8di6K6BxVC</a> <a href="https://t.co/UEFhewds2M">https://t.co/UEFhewds2M</a> <a href="https://t.co/s6hKQz9gLz">https://t.co/s6hKQz9gLz</a> <a href="https://t.co/F9Dkcfrq8l">pic.twitter.com/F9Dkcfrq8l</a></p>&mdash; Ian Goodfellow (@goodfellow_ian) <a href="https://twitter.com/goodfellow_ian/status/1084973596236144640?ref_src=twsrc%5Etfw">January 15, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

画像は左から順にGAN, DCGAN, Coupled GAN, PGGAN, StyleGANです. 

### "Vanilla" GAN [Goodfellow+, 2014]
元祖GANは先に説明した通りなので, 生成結果のみを示します. 

![2019-11-30-16-11-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/6dd2f635-41e9-039c-b39b-c106e2461d53.png)
[Generative Adversarial Nets](https://arxiv.org/abs/1406.2661)

それぞれの画像において, 一番右の列は隣の列から最も近い教師画像です. 
c), d)はともにCIFAR-10の画像ですが, c)は全結合, d)はCNNのモデルで生成した結果です. CIFA-10になるとなかなか苦しそうですね. 

### Deep Convolutional GAN [Radford+, 2015]
先ほどのGANをfully-convolutionalにするなどのテクニックを加えてより高品質な画像を生成できるようにしたものが**deep convolutional GAN (DCGAN)** です. 
生成器は4層の転置畳込み（逆畳み込み）というシンプルな構造になっています. 

<img width="547" alt="2019-12-01-13-58-14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/5f7c7e85-e61f-7992-417f-fab972c87c71.png">

このシンプルな構造ゆえ, [TensorFlow](https://www.tensorflow.org/tutorials/generative/dcgan), [PyTorch](https://pytorch.org/tutorials/beginner/dcgan_faces_tutorial.html), [Chainer](https://github.com/chainer/chainer/tree/master/examples/dcgan)などの主要フレームワークでチュートリアルとして使われています. 小さい画像なら普通のGPU1枚で動くということもあって, 個人レベルでは最も人気のGANという印象があります. いろいろな方がいろいろな画像を生成していておもしろいので, 興味のある方は調べてみてください. 私も過去にChainerのサンプルコードを少しいじって寿司の画像を生成したことがあります（[SushiGAN](https://qiita.com/shionhonda/items/1c43081a4c038667a694)）. 

こちらはLSUNの寝室の画像で学習したものです. 64x64くらいの画像は結構綺麗に生成できます. 

<img width="538" alt="2019-12-01-14-09-14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/b429c4d6-86b4-70ae-a5ec-aff2a835bef2.png">

また, DCGANに限られた機能ではありませんが, 潜在空間上でzどうしを足し引きすることで, 画像空間上で意味のある演算をすることも可能です. 

<img width="507" alt="2019-12-01-14-12-32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/f7f23460-a09e-7e28-7a11-465003ebb6c7.png">

[Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks](https://arxiv.org/abs/1511.06434)

### Self-Attention GAN [Zhang+, 2018]
単純な畳込みは局所的な演算しかできないので, 層をとても深くしないと画像上の離れた点間で一貫性を保つのが難しいのですが, **self-attention GAN (SAGAN)** は, 特徴マップの変換に**自己注意機構 (self-attention mechanism)** を加えたことで画像の大域的な情報を表現することに成功しました. 

<img width="516" alt="2019-12-01-14-20-35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/94dd73f7-6fb9-3d28-5efb-3c276e7dce5b.png">

今度はImageNetの128x128の画像を綺麗に生成しています（クラス指定あり）. 

<img width="1058" alt="2019-12-01-14-29-02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/3a4b4af1-dd3c-8fd3-b4a9-37e00901a8b2.png">

なお, 自己注意機構の他にも, ヒンジ損失の導入, スペクトル正規化（後述）, two-timescale update rule (TTUR; 生成器と識別器で異なる学習率を使うこと)といった工夫があり, これらはすべて後のBigGANに継承されています. 
ちなみに, この論文の第二著者にはGoodfellowがいます. 

[Self-Attention Generative Adversarial Networks](https://arxiv.org/abs/1805.08318)

### Progressive GAN [Karras+, 2018]
GANの学習を動かしてみた方は実感があると思いますが, 単純に画像の解像度を上げようとすると, 学習が不安定になったり, モード崩壊が起きやすくなったりします. そこで, 学習初期は4x4の低解像度で始めて, 徐々に層を追加しながら1024x1024の高解像度画像を生成できるようにするのが**progressive growing GAN (PGGAN)** です. 

<img width="484" alt="2019-12-01-18-59-04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/02945e7f-2d22-3931-a285-377e976f7734.png">

層を追加するときには下図の(a), (b), (c)の順に, αの値を大きくしながら「ソフトに」追加します. 

<img width="494" alt="2019-12-01-19-19-14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/96b74be5-5265-c199-d8b4-59143fbea915.png">

この他にも, 識別器にミニバッチ内の標準偏差を入れて多様性を向上させるなどの工夫を入れて, 1024x1024の画像を生成した結果がこちらです！

[![Progressive Growing of GANs for Improved Quality, Stability, and Variation](https://img.youtube.com/vi/G06dEcZ-QTg/0.jpg)](https://www.youtube.com/watch?v=G06dEcZ-QTg)

CelebAの顔が芸能人らしくなっているのもわかりますね. なお, この学習に使われているCelebA-HQというデータセットは, この研究のために新たに作られたものです. 

[Progressive Growing of GANs for Improved Quality, Stability, and Variation](https://arxiv.org/abs/1710.10196)

### StyleGAN [Karras+, 2019]
**StyleGAN**はPGGANの著者陣による最新作で, 生成器にスタイル変換由来の**AdaIN (adaptive instance normalization)** というモジュールを採用し, 高画質でリアルな画像を生成することに成功しました. 

<img width="444" alt="2019-12-02-12-53-08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/01fa56d2-0a64-ac46-999a-80ed26f5f06b.png">

PGGAN (a)と比べると, StyleGAN (b)は次のような特徴があります. 

- マッピングネットワークと合成ネットワークからなる
- マッピングネットワークで正規分布に従う潜在変数$z$を学習可能な分布に従う中間潜在変数$w$に変換する
- 合成ネットワークの最初の入力はすべての要素が1のテンソルで固定する
- 合成ネットワークの途中のAdaIN層で, 中間潜在変数$w$をアフィン変換してから**スタイルとして**取り込む
- 髪の毛先の動きのような確率的な要素を反映させるため, 合成ネットワークの随所でノイズを足す

AdaIN層では元の特徴マップ$x$の平均と分散をスタイル特徴マップ$y$に合わせるような操作を行います. 

$$
\mathrm{AdaIN}(x,y) = \sigma(y)\frac{x-\mu(x)}{\sigma(x)}+\mu(y)
$$

生成結果は驚くべきクオリティです. ぜひ動画でご覧ください. 

[![A Style-Based Generator Architecture for Generative Adversarial Networks](https://img.youtube.com/vi/kSLJriaOumA/0.jpg)](https://www.youtube.com/watch?v=kSLJriaOumA)

顔のリアルさもさることながら, 顔を変化させていく過程のどこを切り取っても極めて自然な画像になっているところが, これまでのGANとは一線を画しています. 

潜在変数を$z_1, z_2$と2つ用意して, 合成ネットワークのある層で入力を$w_1$から$w_2$に切り替えることで, 顔のスタイルを混ぜることもできます. 

<img width="837" alt="2019-12-02-13-58-24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/effa7527-5ba2-314a-efe3-fd77cf7c1c8b.png">

また, StyleGANの訓練データとして, CelebA-HQよりも年齢や人種の多様性に富んだFFHQというデータセットを作成しました. 

[A Style-Based Generator Architecture for Generative Adversarial Networks
](https://arxiv.org/abs/1812.04948)

### BigGAN [Brock+, 2019]
本節の最後に紹介するBigGANは, 基本的にはSAGANをより大きなスケールでやってみたというものです. 
まず, ImageNetの512x512の画像でSAGANのベースラインに対してバッチサイズを8倍, チャンネル数を1.5倍にしたところ, これだけで**Frechet Inception Distance**（低いほうが良い）と**Inception Score**（高いほうが良い）が大幅に改善しました. 
さらに, クラス変数に対する埋め込み共有, 重みの直交性による正則化, 潜在変数の分割などのテクニックを加えて性能を改善しています. 

<img width="631" alt="2019-12-02-14-11-57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/3ef1c6ee-b466-132c-c67e-bc4ea9ac987f.png">

生成結果はこちらです. 

<img width="712" alt="2019-12-02-14-58-15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/e121b578-4808-0294-4dea-a3988c985b3f.png">

[Large Scale GAN Training for High Fidelity Natural Image Synthesis](https://arxiv.org/abs/1809.11096)

## 学習方法
ここまで, GANによる美しい生成結果を載せてきましたが, 実際は鴨の水掻きよろしく丹念なチューニングが必要です. 次は, 学習の安定化やモード崩壊の防止に向けた, 学習方法に注目した研究を紹介していきます. 
ここからは短めに書きます. 詳細は元論文をご参照ください. 

### Unrolled GAN [Metz+, 2017]
**Unrolled GAN**は先に識別器のパラメータ更新を$K$回行い, その損失で生成器のパラーメータ更新をしてから, 識別器のパラメータを1回更新時に戻す（unroll）というものです. これは賢い識別器で生成器を導くイメージで, モード崩壊を起きにくくする効果があるそうです. 
次の図で, 上段がUnrolled GAN, 下段が通常のGANです. Unrolled GANではターゲットのすべてのモード（クラスタ）を再現できています. 

<img width="761" alt="2019-12-02-16-12-39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/4b97a620-aa48-31cc-ec47-aab17fb9096e.png">

[Unrolled Generative Adversarial Networks](https://arxiv.org/abs/1611.02163)

### Wasserstein GAN [Arjovsky+, 2017]
通常のGANの目的関数は, 最適な識別器の下では**Jensen-Shannonダイバージェンス**と捉えることができます. しかし, JSダイバージェンスは2つの分布（訓練画像と生成画像）が重ならない部分では発散してしまい, 勾配消失が起きやすくなります. そこで, 分布に重なりがないところでも滑らかな（Lipschitz連続な）**Wasserstein距離**を目的関数に使ったのが**Wasserstein GAN (WGAN)** です. WGANの訓練では, 識別器はW距離を推定し, 生成器が推定されたW距離を最小化します. また, W距離で要請されるLipschitz制約を満たすため, 識別器の重みをクリッピングします. 詳しくは論文のほか, [10-12]も参考になるかもしれません. 

通常のGANとWGANの学習曲線を比較してみます. このように, JSダイバージェンスは途中でスパイクが入って不安定ですが, 

<img width="322" alt="2019-12-02-17-05-34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/547bf3ff-beac-6b80-a977-627d93e8c2ed.png">

W距離は学習初期からずっと滑らかになっています. 

<img width="322" alt="2019-12-02-17-06-05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/f3198434-fd93-935e-3374-2e2b0c14bbb9.png">

識別器の損失に勾配に関する正則化(**gradient penalty**)を入れた[**WGAN-GP**](https://arxiv.org/abs/1704.00028)という改良版もあります. 

[Wasserstein GAN](https://arxiv.org/abs/1701.07875)

### Spectrally Normalized GAN [Miyato+, 2018]
GANの登場以来進められてきた学習の安定性のための研究（WGANなど）の中で, 識別器の[**Lipschitz連続性**](https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%97%E3%82%B7%E3%83%83%E3%83%84%E9%80%A3%E7%B6%9A)が重要であるということが指摘されていました. そこで, 識別器の各層の**スペクトルノルム**を正規化してLipschitz連続性を保証したのが**Spectrally Normalized GAN (SNGAN)** です. 
具体的には, 重み行列$W$を最大特異値$\rho(W)$で割るという操作をしています. 

```math
\tilde{W} = \frac{W}{\rho(W)}
```

これで各層がLipschitz連続になり, 全体としてもLipschitz連続性が保たれます. 

実験では, バッチ正規化やWGAN-GPなど他の正規化・正則化手法と比較しても高性能でハイパーパラメータに頑健であることが示されました. 

<img width="358" alt="2019-12-02-21-24-11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/dea1678d-3208-cc7c-a9dd-7bf69c9b272a.png">

また, 調節すべきパラメータもスケーリングファクターのみと使いやすいところも特徴です. 執筆時点で被引用数690で, BigGANにも採用されるなど, かなり人気で効果の実証された手法です. 

[Spectral Normalization for Generative Adversarial Networks](https://arxiv.org/abs/1802.05957)

### HoloGAN [Nguyen-Phuoc+, 2019]
HoloGANは, StyleGANの生成器を元に, 3次元構造を考慮した画像生成を可能にしました. HoloGANの合成ネットワークは図のように, 3次元畳込み, 3次元の回転, 3次元畳込み, 2次元への写像, 通常の2次元畳込み, という構造になっています. 

<img width="691" alt="2019-12-02-21-42-05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/dd783c46-606a-6af7-572d-9de5a384f5b8.png">

画像生成の背後に3D表現を陽に設けることで, 潜在変数で角度を調節できるようになります. ただし, 識別器に与えるのは2次元画像なので, 訓練データに3Dモデルは必要ありません. 

このようにCelebAの顔画像を並べて回転させることができます. 

![ezgif.com-optimize.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/90c4ccc8-8d9a-d5b7-4aeb-6bc844a4ab5a.gif)

車の360度回転もこの通りです. 

![cars_azi_small.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/5c8fc475-5080-c60e-5f01-1010cc31ae28.gif)
[HoloGAN: Unsupervised learning of 3D representations from natural images](https://arxiv.org/abs/1904.01326)

### Prescribed GAN [Dieng+, 2019]
**Prescribed GAN (PresGAN)** は, 事前分布だけでなく尤度もモデル化するという, GANとVAEのいいとこ取りとも言えるアプローチでモード崩壊を防ぎました. 

```math
p_\theta(\boldsymbol{x}|\boldsymbol{z})=\mathcal{N}(\boldsymbol{x}|\mu_\theta(\boldsymbol{z}),\Sigma_\theta(\boldsymbol{z}))
```

<img width="486" alt="2019-12-02-23-22-54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/329ee530-7d36-7604-97d5-92e3decd3022.png">

モード崩壊の対策はシンプルで, 損失関数にエントロピー正則化の項を入れるだけです. $\lambda$は正則化の度合いを決めるハイパーパラメータです. 

```math
\mathcal{L}_\text{PresGAN}=\mathcal{L}_\text{GAN}-\lambda \mathbb{E}_{p_\theta(\boldsymbol{x})}[\log p_\theta(\boldsymbol{x})]
```

画像を$p_\theta(\boldsymbol{x}|\boldsymbol{z})$をサンプリングするところでは, [前回](https://qiita.com/shionhonda/items/e2cf9fe93ae1034dd771)登場したreprametrization trickを使います. 

FFHQでの生成結果によると, StyleGANのような質を維持したまま多様性を増すことができたそうです（左: StyleGAN, 右: PresGAN）. 論文には量的評価もあります. 

<img width="503" alt="2019-12-02-23-39-49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/ec5d7b1a-1147-ccde-9dcf-a280341b07be.png">

[Prescribed Generative Adversarial Networks](https://arxiv.org/abs/1910.04302)

## 生成画像の操作
次は生成画像を操作する方法, あるいはdisentanglementについてこれまで紹介していなかったものを見ていきます. SAGANやBigGANはクラス指定をしていますし, StyleGANやHoloGANはdisentanglementを含んでいるので, 既に登場しているアプローチではあります. 

### Conditional GAN [Mirza+, 2014]
**Conditional GAN (CGAN)** は, 生成器と識別器をクラス変数$y$で条件付けたモデルとして設計します. Conditional VAEのアナロジーで考えて問題ないと思います. 

<img width="383" alt="2019-12-03-00-10-30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/35a634c4-9ac2-6a53-f2ba-2bee8bf8228d.png">

[Conditional Generative Adversarial Nets](https://arxiv.org/abs/1411.1784)

### Information Maximizing GAN [Chen+, 2016]
CGANのように, 属性を指定する変数$c$を使って特徴のdisentanglementを行ったのが**Information Maximizing GAN (InfoGAN)** です. 
MNISTの例で例えると, InfoGANでは, $c$は数字の種類や線の太さなどの属性を表現し, $z$はノイズ（画像の確率的な要素）とします. CGANとは異なり, 識別器に$c$を入力することはしません. その代わり, $c$と画像$x$の相互情報量が高くなるように目的関数を設計します. 相互情報量を直接計算するのは難しいので, VAEでやったように近似事後分布$Q(c|x)$を導入して変分下限$\mathcal{L}_I(G,Q)$を使います. 

```math
\mathcal{L}_\text{InfoGAN}=\mathcal{L}_\text{GAN}-\lambda \mathcal{L}_I(G,Q)
```

このような目的関数で学習をさせると, 図のように$c$に意味のある情報を持たせることができます. 

<img width="509" alt="2019-12-03-11-19-38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/830e1bc8-b89b-9d2b-d44c-ada91fdb2acc.png">
[InfoGAN: Interpretable Representation Learning by Information Maximizing Generative Adversarial Nets](https://arxiv.org/abs/1606.03657)

## 画像変換
続いて紹介するのは, 画像変換のためのGANです. これらのGANは, ラフな線画を写真のように変換するなど, 楽しい応用をいろいろと考えることができます. 

### pix2pix [Isola+, 2017]
**pix2pix**は, 「線画と写真」, 「航空写真と地図」のような画像ペアに対して, 片方をCGANの条件として入力し, もう片方を生成するという枠組みで画像変換を行うGANです. 生成器は入力を画像とするため**U-Net**で実装されます. 

<img width="419" alt="2019-12-03-13-13-35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/bd6e6ed7-35ed-8c0a-3cbe-dde36e0ffab5.png">

損失関数には, 生成画像と実画像のL1損失も加えます. 

```math
\mathcal{L}_\text{pix2pix}(G,D)=\mathcal{L}_\text{CGAN}(G,D)+\lambda \mathcal{L}_{L1}(G)
```

また, pix2pixなどの画像変換系のモデルには, 識別器側に**PatchGAN**と呼ばれる画像の局所領域を切り出して識別する手法が使われています. 詳しくは[14]などをご参照ください. 

変換の結果がこちらです. 

![2019-12-03-13-10-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/e1d80cda-69e3-7561-3557-0fb122748536.png)

この結果は非常にセンセーショナルで, 後にアーティストを含む多くの人がpix2pixを使ったプロジェクトを公開しました. その一部は更新版の論文にも掲載されています. 

<img width="876" alt="2019-12-03-13-31-34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/35e50c19-45ad-27ac-1043-bc231ba935a2.png">

興味のある方は[公式サイト](https://phillipi.github.io/pix2pix/)などで調べてみてください. また, 最近は[vid2vid](https://arxiv.org/abs/1808.06601)のように動画への適用も進んでいます. 

[Image-to-Image Translation with Conditional Adversarial Networks](https://arxiv.org/abs/1611.07004)

### CycleGAN [Zhu+, 2017]
pix2pixでは「航空写真と地図」のようにペアの画像が必要ですが, 実際には画像がペアになっているケースは多くありません. そこで, ペア画像がなくても変換できるように改良を加えたのが**CycleGAN**です. ちなみに, この論文はpix2pixと同じチームによってpix2pixの4ヶ月後に書かれたものです. この分野の発展は本当に速いですね. 

さて, CycleGANでは, 画像のドメイン$X$と$Y$（例えばシマウマとウマ）を考え, 生成器$G:X\rightarrow Y, F:Y\rightarrow X$とそれぞれのドメインに属するかを判定する識別器$D_X, D_Y$を用意します. 
すると, 後はpix2pixと同じように考えて, $G$と$D_Y$, $F$と$D_X$をセットにして学習させます. また, 「$F(G(x))$は$D_Y$によって$Y$と判定されるべき」というような**cycle consistency loss** も損失関数に加えます. 

<img width="671" alt="2019-12-03-13-44-12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/f2e5f28d-5074-cc89-c560-5bf0d17762c7.png">

このような工夫により, 「モネの絵と写真」や「シマウマとウマ」のようなペア画像が手に入らない変換も可能になりました. 

![2019-12-03-13-39-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/f43f8632-1d92-8dfe-ac0f-617c7707a8a6.png)

CycleGANも多くの方が応用を試しており, その一部が[公式サイト](https://junyanz.github.io/CycleGAN/)で紹介されています. 

[Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks](https://arxiv.org/pdf/1703.10593.pdf)

### SPADE [Park+, 2019]
**SPADE (spatially-adaptive (de)normalization)** は, セグメンテーションからの画像生成に特化したモデルで, これまでにない写実的な画像を生成するとともに, スタイル転写を可能にしました. 
根幹となるSPADE層では, バッチ正規化のスケールγとバイアスβを, セグメンテーションを畳み込んで得られる（空間適応的な）テンソルに置き換えています. これにより, 同じラベルの領域でも繊細な違いを生み出しリアリティの向上に貢献しています. 

<img width="201" alt="2019-12-03-14-03-19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/32ae0b05-9324-5a43-3b0b-639767a3cfc4.png">

また, 入力するノイズ$z$として, スタイル画像をエンコードしたものを与えることで, 下図のようなスタイル転写が可能になりました. 

<img width="643" alt="2019-12-03-14-01-12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/5837cec5-0658-f622-45ae-a13364593e2e.png">

[Semantic Image Synthesis with Spatially-Adaptive Normalization](https://arxiv.org/abs/1903.07291)

## その他の応用
最後は, 分類できなかった応用例を簡単に見ていきます. 「GANでこんなこともできるのか！」という気持ちで読んでいただければ幸いです. 

### StackGAN [Zhang+, 2017]
画像→画像の変換ができるなら文章→画像の変換もできます. **StackGAN**は, LSTMで入力文をエンコードし, そのベクトルから文の意味に合った画像を生成することができます. このような「文章からの画像生成」に興味を持った方は, [16,17]が参考になるかもしれません. 

<img width="315" alt="2019-12-03-15-51-17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/f131ed60-3761-a689-bcfc-3df9b5ac2c5a.png">

[StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks](https://arxiv.org/abs/1612.03242)

### Super Resolution GAN [Lediig+, 2017]
**Super Resolution GAN (SRGAN)** は名前の通り超解像のためのGANです. 図のように, 生成器はskip connection付きの残差ブロックを何段も重ねた構造になっています. 

<img width="624" alt="2019-12-03-16-03-51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/376846b1-765e-59dc-2a53-e0622c377733.png">

ご覧の通り, エッジの鮮明な超解像画像が得られます. 

<img width="660" alt="2019-12-03-16-06-20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/50f0eb46-6b04-80a4-78b4-ad804d264125.png">

[Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network](https://arxiv.org/abs/1609.04802)

### Conditional Analogy GAN [Jetchev+, 2017]
**Conditional Analogy GAN (CAGAN)** はデータの入れ方を工夫して, 服の**仮想試着 (virtual try-on)** を可能にしました. 生成器は着用画像$x_i$, 商品画像$y_i$, 試着したい商品画像$y_j$の3つ組を入力とし, 試着画像$x_j$を出力します. 識別器は$x$が実画像で$(x,y)$の組が正しい組み合わせになっているかを判定します. 

<img width="304" alt="2019-12-03-16-11-16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/e86ca8d7-337a-650e-6b46-5032ebfcdb57.png">

こちらが生成結果です（右から2列目）. 

<img width="324" alt="2019-12-03-16-11-40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/6e7d5d78-cdd4-8798-f796-d321274dc8be.png">

最新の研究では動画への適用も進んでいます（[FW-GAN](http://openaccess.thecvf.com/content_ICCV_2019/html/Dong_FW-GAN_Flow-Navigated_Warping_GAN_for_Video_Virtual_Try-On_ICCV_2019_paper.html)）. 

[The Conditional Analogy GAN: Swapping Fashion Articles on People Images](https://arxiv.org/abs/1709.04695)

### SinGAN [Shaham+, 2019]
**SinGAN**は1枚の画像で学習し, そこから同じような要素を持つ任意のサイズ・アスペクト比の画像を生成するという少し変わったGANです. 
モデルは図のような階層型のネットワークになっており, 畳込みのみで実装されているため, アップサンプルのスケール$r$を変えることで任意のサイズの画像を生成できます. 

<img width="585" alt="2019-12-03-16-27-27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/1f135b5d-06ff-a12b-ab5a-256affab2e6c.png">

$z$の入れ方を工夫することでpaint to image, 画像編集, harmonization, 超解像, 動画化など幅広い応用ができるというところが強みです. 実用上役に立つ場面がたくさんありそうですね. 

<img width="669" alt="2019-12-03-16-30-17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144878/e598b52d-0a76-526c-3463-1b46fd365048.png">
[SinGAN: Learning a Generative Model from a Single Natural Image](https://arxiv.org/abs/1905.01164)

# おわりに
最後までお読みいただきありがとうございました！
本記事では, 20種類のGANを「画像品質」「学習方法」「生成画像の操作」「画像変換」「その他の応用」という軸で分けて紹介しました. 
GANの発展は凄まじく, ときどき整理しないと全体像を把握するのが難しいので, 記事を執筆していく中で大いに自分の勉強になりました. 読んでくださった方のためにもなれば幸いです. 
気が向いたら続編を書くかもしれません. 

# 参考文献
[1] Shion Honda. "[画像認識 第9章 さらなる話題](https://www.slideshare.net/ShionHonda/9-139767735)." 2019.
xpaperchallengeの勉強会で発表したときの資料です. 

[2] Zhaoqing Pan et al. "[Recent Progress on Generative Adversarial Networks (GANs): A Survey](https://ieeexplore.ieee.org/document/8667290)." IEEE Access. 2019.
私の知る限り最新のGANサーベイ論文なのですが, PGGANなどNVIDIAの研究に触れられていないのが気になります. 

[3] 高橋智洋. "[SSII2019TS: Shall We GANs?​ ～GANの基礎から最近の研究まで～](https://www.slideshare.net/SSII_Slides/ssii2019ts11)." 2019.

[4] ⽚岡裕雄. "[敵対的生成ネットワーク（GAN）](https://www.slideshare.net/cvpaperchallenge/gan-133159239)." 2019.

[5] Masahiro Suzuki. "[GAN（と強化学習との関係）](https://www.slideshare.net/masa_s/gan-83975514)." 2017.

[6] Mario Lucic et al. "[Are GANs Created Equal? A Large-Scale Study](https://arxiv.org/abs/1711.10337)." NIPS. 2018.
Google BrainによるGANのメタ分析. 各手法を公平な条件で比較し直しました. 論文で報告される値は選択バイアスなどがかかっていることが多いので, Googleの計算資源でこのようなメタ分析をするのは分野の発展に重要ですね. 

[7] Karol Kurach et al. "[A Large-Scale Study on Regularization and Normalization in GANs](https://arxiv.org/abs/1807.04720)." ICML. 2019.
同じく, Google BrainによるGANのメタ分析. こちらは正則化・正規化手法に注目しています. 

[8] Kento Doi. "[StyleGAN解説 CVPR2019読み会@DeNA](https://www.slideshare.net/KentoDoi/stylegan-cvpr2019dena)." 2019.

[9] Jason Brownlee. "[A Gentle Introduction to BigGAN the Big Generative Adversarial Network](https://machinelearningmastery.com/a-gentle-introduction-to-the-biggan/)." 2019.

[10] Lilian Weng. "[From GAN to WGAN](https://lilianweng.github.io/lil-log/2017/08/20/from-GAN-to-WGAN.html)." 2017.

[11] [Wasserstein GAN [arXiv:1701.07875] – ご注文は機械学習ですか？](http://musyoku.github.io/2017/02/06/Wasserstein-GAN/)

[12] [織姫と彦星の遠距離恋愛で学ぶいろいろな距離 - Qiita](https://qiita.com/shionhonda/items/e784e27deb7753156e23)

[13] Kento Doi. "[[DL輪読会]HoloGAN: Unsupervised learning of 3D representations from natural images](https://www.slideshare.net/DeepLearningJP2016/dlhologan-unsupervised-learning-of-3d-representations-from-natural-images)." 2019.

[14] [【DeepLearning】Patch GANのPatchとは？ - 0.5から始める機械学習](https://nodaki.hatenablog.com/entry/2018/07/27/235914)

[15] Shion Honda. "[思い描いた画像を簡単に生成！セグメンテーションを写実的な画像に変換するGauGANとは | AI-SCHOLAR](https://ai-scholar.tech/treatise/gaugan2-ai-140/).", 2019.

[16] Shion Honda, Seitaro Shinagawa, Keito Ishihara, and Hiroyuki Osone. "[Bridging between Vision and Language](https://www.slideshare.net/ShionHonda/bridging-between-vision-and-language)." 2019.

[17] [Issues · nlp-survey-text2image/nlp-survey-text2image](https://github.com/nlp-survey-text2image/nlp-survey-text2image/issues)