主要なGAN研究の歴史（2019年11月現在）

### こんな人に:point_up_tone1:
2014年に発表されたGAN（Generative Adversarial Network)ですが、画期的な研究故に最近では派生研究が多くてなにがなんやら。。私自身Google先生をフル活用して色々調べてみたものの、主要な関連研究をわかりやすくまとめた日本語文献はなかなか見つけることができませんでした、残念！ということで、本記事はGAN関連の研究の流れのアウトラインを掴みたい人や、それぞれの研究~~を一々調べるのがめんどくさいから~~論文とコードにサクッとワンクリックでとびたい人向けとなっております。ちなみに本記事は、主に[Generative Adversarial Networks - The Story So Far](https://blog.floydhub.com/gans-story-so-far/)を参考に書かせて頂いています。

#####そもそもGANってなんぞや？という方へ
- @triwave33さんの[今さら聞けないGAN(1)](https://qiita.com/triwave33/items/1890ccc71fab6cbca87e)
- SONYのNeural Network Console[公式YouTubeチャンネル](https://www.youtube.com/watch?v=2rC2_-HtpsQ)(全体の概要）
- @typecprintさんの[今さら聞けないGANの目的関数](https://qiita.com/typecprint/items/035478748a811dd29721)（学習過程と目的関数の説明）

などを参考にしてみてください。


### GANファミリーご紹介:family_mwbb:

1.  GAN (Generative Adversarial Network)
2.  CGAN (Conditional Generative Adversarial Network)
3.  DCGAN (Deep Convolutional Generative Adversarial Network)
4.  CoGAN (Coupled Generative Adversarial Networks)
5.  Pix2pix
6.  WGAN (Wasserstein Generative Adversarial Network)
7.  CycleGAN
8.  StackGAN (Stack Generative Adversarial Network)
9.  ProGAN (Progressive Growing of Generative Adversarial Network)
10.  SAGAN (Self-Attention Generative Adversarial Network)
11.  BigGAN (Big Generative Adversarial Network)
12.  StyleGAN (Style-based Generative Adversarial Network)
![GAN (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496974/eb2761e6-3e59-6b6c-8dab-8e2cf5ac2e7c.png)


大家族ですね。(本当はもっともっと大家族です。）ここからそれぞれの研究の

- 研究論文
- コード
- ポイント
- オススメ参考文献（世界には親切で頭の良い人が沢山います）

を紹介していきます。



#### 1. GAN (Generative Adversarial Network)

- [Generative Adversarial Networks](https://arxiv.org/abs/1406.2661)
- [コード](https://github.com/goodfeli/adversarial)
- ポイント：
    - ２つのニューラルネットワーク（GeneratorとDiscriminator)を用いている
    - Generatorは「本物らしい」画像を作成する（最初の画像はランダムノイズから作成）
    - Discriminatorは、Generatorによって生成された偽物の画像と、インプットされる本物の画像を識別する
    - GeneratorとDiscriminatorは以下の目的関数を共有しており、Generatorはこの値を最小化、Discriminatorはこの値を最大化、することを目標に学習を進める
    <img width="484" alt="Screen Shot 2019-11-27 at 6.00.18 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496974/9c8db07f-1f81-359e-89a7-3697d5956920.png">

<img width="1303" alt="Screen Shot 2019-11-28 at 8.33.52 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496974/4d90b4ba-1b5d-67c4-439d-0a1d466b4013.png">

[参照](https://mc.ai/a-tutorial-on-conditional-generative-adversarial-nets-keras-implementation/)

#### 2. CGAN (Conditional Generative Adversarial Network)
- [Conditional Generative Adversarial Nets](https://arxiv.org/abs/1411.1784)
- [コード](https://github.com/PacktPublishing/Advanced-Deep-Learning-with-Keras)
- ポイント：クラス条件ベクトル（下図のy）をGeneratorとDiscriminatorに加えることで、クラスごとに生成する画像を書き分けることができるようになった！
- オススメ参考文献：[今さら聞けないGAN（6）](https://qiita.com/triwave33/items/f6352a40bcfbfdea0476)

<img width="1306" alt="Screen Shot 2019-11-28 at 8.33.59 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496974/87c1f17f-7336-6d9c-0b3c-2de5b9d51b7e.png">


#### 3. DCGAN (Deep Convolutional Generative Adversarial Network)
- [Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks](https://arxiv.org/abs/1511.06434)
- [コード](https://github.com/floydhub/dcgan)
- ポイント：以下の手法を用いて画像のクオリティを向上した
    - プーリング層を、ストライドありのConvolution層に入れ替える（下図）
    - アンサンプリングでは逆畳み込み層を用いる
    - 全結合をなくす
    - 全ての層に対してバッチ正規化を行う（Generatorの出力層と、Discriminatorの入力層以外）
    - Generatorにおいて、出力層以外ではReluを用いる（出力層にはtanhを用いる）
    - DiscriminatorではLeakyReLUを用いる
- オススメ参考文献：[はじめてのGAN](https://elix-tech.github.io/ja/2017/02/06/gan.html)（という題ではありますが、DCGANについての詳しい説明も載っています）
<img width="805" alt="Screen Shot 2019-11-27 at 6.28.38 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496974/abe7ff4f-7af9-08f1-92c5-d3cf1194eaa2.png">

#### 4. CoGAN (Coupled Generative Adversarial Networks)
- [Coupled Generative Adversarial Networks](https://arxiv.org/abs/1606.07536)
- [コード](https://github.com/mingyuliutw/CoGAN)
- ポイント：２つのGANを並列して使用した（最近はそんなにホットではないらしいです）
- オススメ参考文献：[Agustinus Kristiadi's Blog](https://wiseodd.github.io/techblog/2017/02/18/coupled_gan/)
<img width="1150" alt="Screen Shot 2019-11-27 at 7.37.21 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496974/0cd587fc-1d32-5188-335e-d71e32f5ea5b.png">


#### 5. Pix2pix
- [Image-to-Image Translation with Conditional Adversarial Networks](https://arxiv.org/pdf/1612.03242.pdf)
- [コード](https://github.com/phillipi/pix2pix)
- ポイント：画像から画像への変換を高精度で行えるようになった
    - 変換元の画像と変換先の画像が対になっている必要がある（Googleマップの同じ場所の地図と航空写真など）
- オススメ参考文献：[pix2pixを理解したい](https://qiita.com/mine820/items/36ffc3c0aea0b98027fd)
<img width="1346" alt="スクリーンショット 2019-11-28 20.18.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496974/c7eb3f7e-17be-f41f-9bce-1f0ed19b5b06.png">



#### 6. WGAN (Wasserstein Generative Adversarial Networks)
- [Wasserstein GAN](https://arxiv.org/abs/1701.07875v3)
- [コード](https://github.com/eriklindernoren/Keras-GAN)
- ポイント：以下の手法により学習が安定し、モード崩壊も回避
    - 通常のGANに用いられている Jensen-Shannonダイバージェンス（勾配消失問題を引き起こす）の代わりに、Wasserstein距離を用いて損失関数を設計
- オススメ参考文献：[Wasserstein GAN と Kantorovich-Rubinstein 双対性](https://qiita.com/mittyantest/items/0fdc9ce7624dbd2ee134)（Wasserstein距離について詳しく解説してくれています）


#### 7.  CycleGAN (Cycle Generative Adversarial Network)
- [Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks](https://arxiv.org/abs/1703.10593v6)
- [コード](https://github.com/junyanz/CycleGAN)
- ポイント：**対となっていない**２つの画像が訓練データとして与えられた際に、一方の画像からもう一方への変換が行えるようになった
    - 「敵対性損失」（普通のGANで使われている損失関数）にプラスして「サイクル一貫性損失」を用いることで可能となった
    - 5. Pix2pixと「画像→画像変換」という点では似ているが、CycleGANではPix2pixと違って訓練データの画像群が対になっている必要がない！
    - テクスチャや色の変換には強いが、構造的な変換（ex.犬→猫）は難しい
- オススメ参考文献：["GAN"の補足](https://qiita.com/hikaru-light/items/98d06b21b4f3e2bb6ca4)(鍵となるサイクル一貫性損失について解説してくれています）
<img width="724" alt="Screen Shot 2019-11-28 at 11.09.46 AM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496974/1259d8ab-8e3d-2263-ab65-5331ddafc599.png">

できることのイメージはこんな感じです。（画像は[論文](https://arxiv.org/abs/1703.10593v6)を参照）

#### 8. StackGAN (Stack Generative Adversarial Networks)
- [StackGAN: Text to Photo-realistic Image Synthesis
with Stacked Generative Adversarial Networks](https://arxiv.org/pdf/1612.03242.pdf)
- ポイント：テキスト表現のみを用いて高解像度の画像を生成できるようになった
- オススメ参考文献：[【論文メモ:StackGAN】](https://www.nogawanogawa.com/entry/stackgan)

<img width="912" alt="Screen Shot 2019-11-28 at 10.42.25 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496974/1246b9e6-2979-7a84-50ac-e6bfe832208e.png">

論文参照。「この鳥は黒い翼をもち腹部は白いです」というテキストからこの画像が生成されます。

#### 9. ProGAN (Progressive growing of Generative Adversarial Networks)
- [Progressive Growing of GANs for Improved Quality, Stability, and Variation](https://arxiv.org/abs/1710.10196)
- [コード](https://github.com/tkarras/progressive_growing_of_gans)
- ポイント：低解像度の画像から徐々に学習させていき、段階的に高解像度にすることに成功した
- オススメ参考文献：[【Progressive Growing of GANs for Improved Quality, Stability, and Variation】を読んだのでまとめる](https://www.st-hakky-blog.com/entry/2017/11/22/173112)
![ProGAN.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496974/17d66a1a-6a89-f15a-c8bc-fed97a76cc71.jpeg)


#### 10. SAGAN (Self-Attention Generative Adversarial Networks)
- [Self-Attention Generative Adversarial Networks](https://arxiv.org/abs/1805.08318v1)
- [コード](https://github.com/heykeetae/Self-Attention-GAN)
- ポイント：以下の手法を用いて生成画像の精度を向上させた
    - Self Attentionを導入することで、画像全体の処理状態を考慮
    - Spectral Normalizationを、DiscriminatorとGeneratorの双方に適用
- オススメ参考文献：[SAGAN(Self Attention Generative Adversarial Network)のSelf Attention機構をざっくり理解した](https://urusulambda.wordpress.com/2018/07/15/saganself-attention-generative-adversarial-network%E3%81%AEself-attention%E6%A9%9F%E6%A7%8B%E3%82%92%E3%81%96%E3%81%A3%E3%81%8F%E3%82%8A%E7%90%86%E8%A7%A3%E3%81%97%E3%81%9F/)（その名の通り、全体像がつかみやすいです）

<img width="981" alt="Screen Shot 2019-11-29 at 2.02.29 AM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496974/ef7a86e7-83fe-167c-7803-da9554e2bd17.png">

論文参照。Self Attention機構の構造はこんな感じです。

#### 11. BigGAN (Big Generative Adversarial Networks)
- [Large Scale GAN Training for High Fidelity Natural Image Synthesis](https://arxiv.org/abs/1809.11096v2)
- [コード](https://github.com/huggingface/pytorch-pretrained-BigGAN)
- ポイント：SAGANの改善版。Generatorに直行正則化を用いることで過学習を防ぎ、最大512×512ピクセルの高解像度画像を生成できるようになった
- オススメ参考文献：[“Large Scale GAN Training for High Fidelity Natural Image Synthesis” -About BigGAN](https://medium.com/@crosssceneofwindff/large-scale-gan-training-for-high-fidelity-natural-image-synthesis-about-biggan-b1f7c02228a4)　(日本語です）

<img width="941" alt="Screen Shot 2019-11-29 at 6.19.47 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496974/14040ddd-990b-2597-6b94-52f453cac12c.png">


論文中にあるBigGANで生成した画像です。ハイクオリティなのがわかりますね！

#### 12. StyleGAN (Style-based Generative Adversarial Networks)
- [
A Style-Based Generator Architecture for Generative Adversarial Networks](https://arxiv.org/abs/1812.04948)
- [コード](https://github.com/NVlabs/stylegan)
- ポイント：スタイル変換を取り入れ新しいGeneratorを考案することで、1024×1024のサイズで高解像度の画像生成に成功した
- オススメ参考文献：
[StyleGAN「写真が証拠になる時代は終わった。」](https://qiita.com/Phoeboooo/items/7be15acb960837adab21#%E5%85%A8%E4%BD%93%E3%81%BE%E3%81%A8%E3%82%81)

　　　　　　　　<img width="458" alt="Screen Shot 2019-11-29 at 1.51.26 AM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496974/fe544fbd-a0d8-9547-7b41-7c5261a5c774.png">


### 終わりに:upside_down:

最後まで読んでいただきありがとうございます。もっとGANについて細かいとこまで知りたい＆英語でもokという方は、是非こちらの[NIPS 2016 Tutorial: Generative Adversarial Networks](https://arxiv.org/pdf/1701.00160.pdf)を読んでみてください。
皆さんがGANについての全体像をイメージするのに役立てていれば幸いです。（訂正などあれば是非教えてください！）