論文まとめ StarGAN: Unified Generative Adversarial Networks for Multi-Domain Image-to-Image Translation

# はじめに  
StarGANをざっくりまとめてみた。

literature 
[1] Y. Choi, et. al. "StarGAN: Unified Generative Adversarial Networks for Multi-Domain Image-to-Image Translation"
https://arxiv.org/abs/1711.09020

既に日本語でもまとめたものが存在する。  
松尾研のJun Hozumi氏
https://www.slideshare.net/DeepLearningJP2016/dlstargan-unified-generative-adversarial-networks-for-multidomain-imagetoimage-translation

# 一言で言うと  
単一のモデルで複数のドメイン変換を可能とした

# 特徴  
1. 単一のgeneratorとdiscriminatorで複数のドメイン変換を可能としたモデル
2. mask vector methodを用いることで成功した
3. 表情変換タスクで実験したところcycle-GANなどを上回る結果となった

下図左側がこれまでのGAN（cycle-GAN等）の手法。右がStar-GAN。

<img width="430" alt="star-gan_img01.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/48e7ae20-b90d-ca5d-c50a-5c03a6cea84d.png">
[1] Figure 2より

# アーキテクチャ  
この図で説明する。

<img width="838" alt="star-gan_img02.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/6bab1e57-f91b-f60b-7fe7-c0b338e430dd.png">
[1]のFigure 3より

最左discriminatorはreal画像、もしくはgeneratorで生成したfake画像を入れ、それがreal or fakeと同時にそのドメインを判定する。

次にgenerator周り。左から２つ目generatorには画像（input image）と生成する画像のドメインを与え、そのドメインの画像（fake image）を生成する。

これ（fake image）を最右部discriminatorに入れて判定させる。

一方でこれ（fake image）を再度generatorに入れ、元のドメインを与え（右から２つ目）画像を生成させる（reconstructed image）。そうすると元の画像に戻るはずなので、このreconstructed imageとinput imageとでcycle-consistencyをとる。

# 目的関数  
## adversarial loss  
adversarialな目的関数は他のGANと同様、以下のような形。

```math
L_{adv}  = \mathbb{E}_{x} [\log D_{src}(x) ] + \mathbb{E}_{x,c} [\log (1 - D_{src}(G (x, c) )]
```

ここで $D_{src}$ はdiscriminatorからのreal or fake判定の出力。ドメイン・クラスの出力は $D_{cls}$ 。

deisciminator的にはこれを最大化させ、generator的には最小化させるよう学習する。

実際には学習を安定させるため、wasserstein-GAN[2]で用いられているlossにgradient penalty[3]を加えた以下のlossを用いる。

```math
L_{adv}  = \mathbb{E}_{x} [D_{src}(x) ] - \mathbb{E}_{x,c} [D_{src}(G (x, c) ] - \lambda_{gp} \mathbb{E}_{x}[(\| \nabla_{\hat{x}} D_{src}(\hat{x}) -1 \|)^2]
```
## Domain Classification Loss  
discriminatorにrealなimageを入れた場合のクラス分類に関する目的関数は以下。

```math

L_{cls}^r  = \mathbb{E}_{x, c'} [-\log D_{cls}(c' | x) ]
```

これを最小化させるよう学習させると、discriminatorは画像のドメインを適切に判定できるようになるだろう。

またfakeなimageを入れた場合のクラス分類に関する目的関数は以下。

```math

L_{cls}^f  = \mathbb{E}_{x, c} [-\log D_{cls}(c | G(x, c)) ]
```

generator的にはこれを最小化させるよう学習させれば、与えられたドメインに変換できるようになるだろう。

## reconstruction loss  
cycle-GANで言うところのcycle-consistency。

上記adversarial lossとdomain classification lossを用いると、generatorは与えられたクラスでリアルな画像を生成するようになるが、元の画像のコンテンツを維持する保証はない。つまりトランプ大統領の怒った画像と「笑う」というconditionを与えた場合、ヒラリーちゃんの笑った顔が出てくるかもしれない。

そこで以下の目的関数を加える。

```math
L_{rec}  = \mathbb{E}_{x, c, c'} [\| x- G( G(x, c), c') \|_1]
```

## 目的関数全体 
discriminatorの目的関数は

```math
L_{D} = -L_{adv} + \lambda_{cls}L^r_{cls}
```

となり、generatorの目的関数は

```math
L_{G} = L_{adv} + \lambda_{cls}L^f_{cls} + \lambda_{rec}L_{rec}
```

となる。

ハイパーパラメータの $\lambda$ は$\lambda_{cls} = 1$ および $\lambda_{rec} = 10$ を用いる。

# mask vector  
複数のドメインを１つのモデルで変換する場合、固有の問題が浮上する。

例えば「男性の笑った顔」から「男性の怒った顔」へ変換する場合、conditionとして与えるのは「怒った」でいいが、「男性の笑った顔」から「女性の怒った顔」へ変換する場合はどうすればよいか。あるいは属性がよくわからないデータセットがある場合、どうすればよいか。

そこで以下のようなmask vectorを導入する。

```math
\tilde{c} = [c_1, \cdots , c_n, m]
```

データ $c_i$ の各要素はone-hot vector。

例えば $c_i$ 番目が「男性・怒った・黒髪」なら１つ目の要素を男性、２つ目の要素を女性、３つ目の要素を怒った、４つ目の要素を黒髪、５つ目の要素を金髪として

```math
c_i =  \left(
    \begin{array}{c}
      1 \\
      0 \\
      1 \\
      1 \\
      0 \\
      \vdots \\
      0
    \end{array}
  \right)
```
 
となり、「女性・怒った・金髪」なら

```math
c_j =  \left(
    \begin{array}{c}
      0 \\
      1 \\
      1 \\
      0 \\
      1 \\
      \vdots \\
      0
    \end{array}
  \right)
```

となる。属性がよくわからない場合は

```math
c_j =  \left(
    \begin{array}{c}
      0 \\
      0 \\
      0 \\
      0 \\
      0 \\
      \vdots \\
      0
    \end{array}
  \right)
```

とすればいい。



# reference
[2]M. Arjovsky, S. Chintala, and L. Bottou. Wasserstein gen- erative adversarial networks. In Proceedings of the 34th In- ternational Conference on Machine Learning (ICML), pages 214–223, 2017.  

[3]I. Gulrajani, F. Ahmed, M. Arjovsky, V. Dumoulin, and A. Courville. Improved training of wasserstein gans. arXiv preprint arXiv:1704.00028, 2017

# sample program  
こちらにサンプルプログラムを作りました。
https://github.com/masataka46/star-GAN-TF

ImageNetから取って来たシャム猫、トラ猫、アビシニアン猫の変換タスクとしました。

学習170epoch程で以下の画像が生成されました。

![resultImage_180722_1070_cat_04_210.png](https://qiita-image-store.s3.amazonaws.com/0/116706/b5126a4a-3168-1764-a9db-7e92d2ad360e.png)


<font color='red'>書きかけ</font>