はじめに
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
一言で言うと
単一のモデルで複数のドメイン変換を可能とした
特徴
- 単一のgeneratorとdiscriminatorで複数のドメイン変換を可能としたモデル
- mask vector methodを用いることで成功した
- 表情変換タスクで実験したところcycle-GANなどを上回る結果となった
下図左側がこれまでのGAN(cycle-GAN等)の手法。右がStar-GAN。
[1] Figure 2よりアーキテクチャ
この図で説明する。
[1]のFigure 3より最左discriminatorはreal画像、もしくはgeneratorで生成したfake画像を入れ、それがreal or fakeと同時にそのドメインを判定する。
次にgenerator周り。左から2つ目generatorには画像(input image)と生成する画像のドメインを与え、そのドメインの画像(fake image)を生成する。
これ(fake image)を最右部discriminatorに入れて判定させる。
一方でこれ(fake image)を再度generatorに入れ、元のドメインを与え(右から2つ目)画像を生成させる(reconstructed image)。そうすると元の画像に戻るはずなので、このreconstructed imageとinput imageとでcycle-consistencyをとる。
目的関数
adversarial loss
adversarialな目的関数は他のGANと同様、以下のような形。
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を用いる。
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を入れた場合のクラス分類に関する目的関数は以下。
L_{cls}^r = \mathbb{E}_{x, c'} [-\log D_{cls}(c' | x) ]
これを最小化させるよう学習させると、discriminatorは画像のドメインを適切に判定できるようになるだろう。
またfakeなimageを入れた場合のクラス分類に関する目的関数は以下。
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を与えた場合、ヒラリーちゃんの笑った顔が出てくるかもしれない。
そこで以下の目的関数を加える。
L_{rec} = \mathbb{E}_{x, c, c'} [\| x- G( G(x, c), c') \|_1]
目的関数全体
discriminatorの目的関数は
L_{D} = -L_{adv} + \lambda_{cls}L^r_{cls}
となり、generatorの目的関数は
L_{G} = L_{adv} + \lambda_{cls}L^f_{cls} + \lambda_{rec}L_{rec}
となる。
ハイパーパラメータの $\lambda$ は$\lambda_{cls} = 1$ および $\lambda_{rec} = 10$ を用いる。
mask vector
複数のドメインを1つのモデルで変換する場合、固有の問題が浮上する。
例えば「男性の笑った顔」から「男性の怒った顔」へ変換する場合、conditionとして与えるのは「怒った」でいいが、「男性の笑った顔」から「女性の怒った顔」へ変換する場合はどうすればよいか。あるいは属性がよくわからないデータセットがある場合、どうすればよいか。
そこで以下のようなmask vectorを導入する。
\tilde{c} = [c_1, \cdots , c_n, m]
データ $c_i$ の各要素はone-hot vector。
例えば $c_i$ 番目が「男性・怒った・黒髪」なら1つ目の要素を男性、2つ目の要素を女性、3つ目の要素を怒った、4つ目の要素を黒髪、5つ目の要素を金髪として
c_i = \left(
\begin{array}{c}
1 \\
0 \\
1 \\
1 \\
0 \\
\vdots \\
0
\end{array}
\right)
となり、「女性・怒った・金髪」なら
c_j = \left(
\begin{array}{c}
0 \\
1 \\
1 \\
0 \\
1 \\
\vdots \\
0
\end{array}
\right)
となる。属性がよくわからない場合は
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程で以下の画像が生成されました。
書きかけ