[論文読み] DiscoGAN(2017)

こんにちはぺいぺいです。今回はDiscoGANについての論文読みです。対象論文は、Learning to Discover Cross-Domain Relations with Generative Adversarial Networks(2017)になります。2024年現在、すでに新しいとは言えない論文ではありますが、GANによるドメイン変換に対する基礎知識習得を目的としています。

https://arxiv.org/pdf/1703.05192

# Introduction
2つのドメインの関係性の認識は人間にとっては簡単なものである。例えば、ある服に対して、よくマッチする靴を選んだり、英語からフランス語に訳したりすることができる。

コンピュータにとってはこのタスクは簡単ではない。2つの画像の関係性を認識するというタスクは、一方のドメインから他方のドメインの画像を生成するタスクと置き換えることができる。GAN(敵対生成ネットワーク）の登場により、このタスクは飛躍的な進歩を遂げたが、通常のGANによる画像生成は、画像とその教師データが必要になる。例えば、服Aと似た特徴を持つ服Bの画像を生成したければ、あらかじめそのペアを人間が指定しておかなければならない。この作業には非常に多くの手間がかかる。

この問題に取り組むためにDiscovers cross-domain relations with GANs(DiscoGAN)を本論文では提案している。下記の図は、入力画像、出力画像、DiscoGANの関係性を示している。これらはただの画像の集合であり、人手によるラベリングは一切行われていない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/4f593fe8-6b94-fc3b-7ee7-77759f4005a4.png)

DiscoGANの重要な点は以下の通りである。
* 2つのGANアーキテクチャを使用(2つのGenerator、Discriminator)
* 2つのドメイン（例えばカバンと靴）の画像が1対1の写像になるように学習 → カバンから靴画像を生成し、生成された靴画像から再度カバン画像を生成できるように学習（Reconstruction Loss)
* 実画像と生成画像のドメインが近くなるように学習(GAN Loss)

# Model
## 数式
DiscoGANで使用する数式を説明する。まずは、ドメイン$A$と$B$があるとして、それらのドメイン間の写像を行う関数を以下のように表記する。
* $G_{AB}$：ドメイン$A$からドメイン$B$へのマッピング関数
* $G_{BA}$：ドメイン$B$からドメイン$A$へのマッピング関数

これらの関数に2つのドメイン間の関係性を理解させるには、これらの関数が1対1の全単射写像である必要がある。つまり$G_{AB}$と$G_{BA}$の逆写像である必要がある。

ドメインAの画像$x_A$を$G_{AB}(x_A)$に入力した際の出力の範囲はドメインBの範囲内である必要がある。（ドメインB→Aも同じ）理想的には$x_A = G_{BA}(G_{AB}(x_A))$となるのが望ましいが、それでは制約が強すぎるため、2つの距離$d(x_A, G_{BA}(G_{AB}(x_A)))$を最小化するタスクとして扱う。この距離関数$d$は$L_1, L_2,$Huber loss のいずれかを使用する。

また、$G_{AB}$がドメインBへの写像になることを確実に保証することは難しい。この部分をGANのlossであるadversarial lossが担う。adversarial lossは以下の通り。

$$
L_{GAN} = -E_{x_A\sim P_A}[\text{log}D_B(G_{AB}(x_A))]
$$

これは通常のGANでも使用されているDiscriminatorの$D$とGeneratorの$G$による損失関数である。$D$は入力されたデータが実画像か生成画像かの2値分類を行い、$G$はその損失値が最大化するように($D$を騙すように)学習する。(詳しくはGANの論文を参照）

## Notation and Architecture
GeneratorとDiscriminatorのニューラルネットワークは以下のように表される。
* $G_{AB}:R_A^{64\times64\times3}→R_B^{64\times64\times3}$
* $D_B:R_B^{64\times64\times3}→[0, 1]$

$R$の下付き文字はデータのドメイン、上付き文字は入力や出力画像のサイズを表している。$G_{AB}$は、ドメインAの画像をドメインBへ変換する関数であり、$D_B$は、ドメインBの画像を閉区間[0,1]の値に変換する関数である。1が実画像ラベル、0が生成画像ラベルを示す。

それぞれの$G$は、エンコーダーとデコーダーのペアからなる。エンコーダーは、$4\times4$の畳み込みフィルターで構成され、デコーダーは$4\times4$の逆畳み込み層で構成される。エンコーダーの活性化間数にはleaky ReLUが、デコーダーにはReLUが使用される。エンコーダーやデコーダーの層数はドメインに依存して4から5層で構成される。

$D$のモデルは、基本的には$G$のエンコーダーと同様の構成であり、一層だけ多く畳み込み層を挟んだ後、シグモイド関数にテンソルを入力し、出力を[0, 1]の範囲にする。

## Reconstruction Lossを搭載したGAN
通常のGANは$G$の入力としてノイズ$z$を使用する。生成するデータのラベルを指定できるConditional GANの入力はノイズ$z$とそのデータのラベル$y$である。一方、Disco GANの$D$の入力は2つのドメインのうち、片方の画像のみであり、それをノイズ$z$の代わりに使用する。アーキテクチャの構成は以下の図のようになっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/885aa09a-08cd-dc68-43a3-c57d9dc64a06.png)

上記の図を理解するためにstep by stepで説明する。まずはドメインAからBへの写像だけに着目する。
* $x_{AB} = G_{AB}(x_A)$:
ドメインAの画像$x_A$を$G_{AB}$でドメインBに変換した画像を$x_{AB}$とする。
* $x_{ABA} = G_{BA}(x_{AB}) = G_{BA}(G_{AB}(x_A))$:
ドメインBに写されたドメインAの画像を$G_{BA}$で再度ドメインBに写した画像を$x_{ABA}$とする。これをReconstruction loss（再構成損失）と呼ぶ。
* $L_{CONST_{A}} = d(x_{ABA}, x_A)$:
元のドメインAの画像とドメインBに変換された画像を再度ドメインAに戻した際の距離関数。MSE、cos類似度、hinge-lossなどが使用される。
* $L_{GAN_B} = -E_{x_A \sim P_A}[\text{log}D_B(G_{AB}(x_A))]$:
生成されたドメインBの画像がどの程度実画像と類似しているかを測定する関数。$D_B$が生成画像ではなく実画像であると認識すればするほど、この値は減少する。

これらを踏まえて、$D$と$G$の損失関数は以下のように表される。
$$
L_{G_{AB}} = L_{GAN_B} + L_{CONST_A}
$$

$$
L_{D_B} = -E_{x_B \sim P_B}[\text{log}D_B(x_B)] - E_{x_A \sim P_A}[\text{log}(1-D_B(G_{AB}(x_A))]
$$

これで、一旦$D$と$G$が出揃ったが、この損失関数だけでモデルを学習すると問題が生じる。以下の図を用いて説明する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/6e657c93-3415-9589-6231-c0fc018946f8.png)

これは、GANによるドメイン間写像の成功例と失敗例を表している。理想は(a)のように車画像から顔画像への写像が単写の関係になってくれることである。$L_{CONST_A}$を用いて(a)のような単写写像モデルになることを期待するが、そうはならない。例えば、(b)のような写像になった場合、顔画像から車画像への写像$G_{BA}$は$L_{CONST_A}$により「振動」してしまう。左向きの車が入力されて、右向きの顔を経由して再度車の画像を生成する際、$G_{BA}$は左向きの車を出力するように学習する。一方、右向きの車右向きの顔を経由して再度車の画像を生成する際、$G_{BA}$は右向きの車を出力するように学習する。このようにいつまでたっても収束しなくなってしまう。こうなると、$G_{AB}$はいつまでたっても2つの車の画像に対して同じ顔を出力し続け、いわゆる「モード崩壊」の状態に陥ってしまう。

## 提案手法 Discovery GAN
上記で述べられた、写像が単写にならないモード崩壊と学習の振動問題を解結するために、Disco GANでは、2つの$G$と2つの$D$を使用し、ドメインAからBを生成するタスクとドメインBからAを生成するタスクを当時に行う。みやすさのために再度図を示す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/885aa09a-08cd-dc68-43a3-c57d9dc64a06.png)

ここで注意すべきなのは、A→B→AのGeneratorとB→A→BのGeneratorはパラメータを共有していることである。先行研究との違いは、(b)のように一方向からの生成ではなく、(c)のように双方向から生成していることである。従来のReconstruction lossを使用した研究では、A→B→Aとドメイン移動を行った後、ドメインAにおけるReconstruction lossしか考慮していなかった。これをB→A→Bの場合でも考慮しようという発想である。Discriminatorについても同様である。よって、ネットワーク全体の損失関数は以下のようになる。
$$
L_{G} = L_{G_{AB}} + L_{G_{BA}} =  L_{GAN_B} + L_{CONST_A} + L_{GAN_A} + L_{CONST_B}
$$

$$
L_D = L_{D_{A}} + L_{D_{B}}
$$

上記の式の通り、2つのGeneratorと2つのDiscriminatorでそれぞれのLossを計算する。こうすることで、双方向な1対1のマッピングに近い効果が得られる。

# Experiments
## Toy Experiment
通常のGAN、Reconstruction lossを搭載したGAN、DiscoGANの違いを説明するために、2次元のドメインAとドメインBの生成データを用意し、視覚化した。それぞれのドメインのデータは混合ガウス分布から生成されたものである。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/d54121ab-12b8-c1c2-0df8-41750323ef1b.png)

* (a)はA→BのGeneratorが初期状態の図、(b)は通常のGANのGenerator、(c)はReconstruction loss を加えたGANのGenerator、(d)はDiscoGAN
* 図中の色は、Discriminatorの出力を表しており、緑は実データ、紫は生成データと判断している領域であり、等高線はDiscriminatorの出力が同じ値であることを表す
* x印は、ドメインBの異なるmode（混合ガウス分布のそれぞれのピーク）を表している
* 赤やオレンジなどの色は、ドメインAのそれぞれのモードを表しており、異なる色は異なるガウス分布からサンプリングされたということである

理想的なマッピングは、以下の要素を満たすものである
* 全てのx印付近に点がマッピングされる（多様性のある出力、服→靴の変換で例えると靴の範囲内にマッピングする必要がある）
* 同じ色の点が近い箇所にマッピングされる（ドメインAにおいてちょっと値が変わっただけでマッピングの出力ががらりと変わることがない、服→靴で例えると服の模様が少し変わっただけで出力がガラリと変わると困る）
* 違う色の点が近くにマッピングされない（モード崩壊を起こさない、服→靴で例えるとどんな服を入力しても同じ靴を出力されると困る）

これらを踏まえて(a)~(d)を比較する。
* (a)： 初期状態のGeneratorがドメインAの全ての画像を同じ場所に写像している。まだ学習していないため、この写像には意味がない。
* (b)： 通常のGANのGeneratorがドメインAの異なるガウス分布から生成された点を、ドメインBのガウス分布にいくつか重複して写像している。例えば、明るい青とネイビーはドメインAにおいてはそれぞれ異なる分布から生成された点であるが、写像された結果、ドメインBの同一のx付近にマッピングされている。つまり、A→Bは単射になっていない。（=モード崩壊）
* (c)： Reconstruction lossを含めたGAN。(b)と比較すると1つのxに複数の色が集まってしまう傾向は良くなっている（=モード崩壊の減少）。また、Discriminatorの出力の観点でも(b)との違いがある。(b)はドメインBのガウス分布のモード間も緑色だが、(c)はモード間は割と隔たれている。つまり、(b)は実データ間のデータを生成したとしてもDiscriminatorを騙せていることを意味している。これが良いことなのか悪いことなのかに関してはあまり言及されていない。
* (d)：DiscoGAN。(b)、(c)と違い全てのxに対して写像が行われており、1つのxに異なる色が集中することもない。つまり、(b)、(c)と比較して全単射が実現できていることを意味する。

もちろんこれらのシンプルな実験で全てを説明するのは難しいが、Disco GANの全単射への有効性を示す一つの判断材料となる。

## Real Domain Experiment
DiscoGANが2つのドメインの関係性を学習しているかを検証するために、2つのドメイン間の関係性を活用しなければうまく変換できないimage to imageの変換タスクを行った。変換前、後は共に$64 \times 64 \times 3$の画像である。

### 車から車、顔から顔
視点が15度ずつ異なる、3D車モデルの画像で構成されるCar dataset（Advances in Neural Information Processing Systems (NIPS)）を使用して実験を行う。データセットを学習用とテスト用に分割し、学習セットをさらに2分割する。この2分割された学習データをそれぞれAドメインとBドメインとして扱う。さらにモデル学習のために、何度の視点から車を見ているかを予測する回帰モデルも学習セットから作成した。評価のために、テストセットに対して、学習済みのGAN、Reconstruction lossつきのGAN、DiscoGANの3つのモデルで画像変換を行い、角度予測モデルで角度を予測した。結果は以下のようになった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/26ceab37-b74e-777b-ca65-8e91245ba9fb.png)

図中のグラフの横軸は、変換前の入力画像の角度、縦軸は変換後の角度である。(a)は通常のGAN、(b)はReconstruction lossを使用したGAN、(c)はDiscoGANを表している。(a)と(b)のグラフを見ると、いくつかの点がクラスターを形成していることがわかる。これは、入力画像の角度に関わらず、同じ角度の画像を出力してしまっている(=モード崩壊）ことを表している。一方、(c)は入力画像と出力画像に相関が見られるため、角度の情報を保存したまま、画像を変換していることがわかる。つまりDiscoGANは2つのドメインの画像の角度の概念を学習していることを示している。画像中の2行目の車画像は入力画像、3行目は出力画像をそれぞれ表している。

つづいてFace dataset（A 3d face model for pose and illumination invariant
face recognition, 2009）を使用して、car datasetと同様の実験を行った。その結果、DiscoGAN(d)だけが、モード崩壊を起こさずに全単射のような関係性の画像を生成することができた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/88e0b689-90e3-ce6b-6e6a-666502a55f5d.png)

### 顔変換
2つのドメイン間にどのくらいの関連性があるかによってどのような出力が得られるかを検証するために、CelebAデータセット（Deep learning face attributes in the wild.）を用いた検証を行った。検証するのは、2つのドメインがほとんど同じ特徴を持つケースである。例えば、2つのドメイン間で性別のみが違うケースや髪の色のみが違うケースなどがこれにあたる。いくつかの出力例をピックアップして示す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/98c8820f-8f2a-d797-39f8-55396cda219f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/843562e5-555d-a4d8-7ce2-84e1a7df54d2.png)

それぞれ上の画像が入力、下の画像が出力を表している。入出力のペアをみると、ドメイン間の1つの特徴の差以外の要素はうまく保存されていることがわかる。例えば(a)の画像では、性別のみが変わり、ポーズや表情などの要素は保存されたままである。(c)の画像は髪の色のみが変わっている。
また、DiscoGANの性質として、段階的なドメイン間変換が可能なことが挙げられる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/a78995b8-9537-db24-c301-7eafd9643db7.png)

例えば(e)の例だと、性別変更 → 髪色変更の流れで画像変換をすることで、結果的に性別反転と髪色変更を行うことができる。

### イスから車、車から顔
これまでの検証では、異なる部分がおおよそ1要素の2つのドメイン間の変換を検証してきた。（性別、髪色など）今度は、共通点が1つしかない2つのドメイン間の変換にDiscoGANを使用するとどうなるかを検証する。3Dのイスモデルデータセットと先ほど使用した車の3Dモデルのcar dataset、白黒顔画像のデータセットのface datasetを使用する。これら3つのデータセットの共通点は、「同一物体の異なる視点からの画像の集合」という点のみである。イス→車と車→イスの変換をDiscoGANで行ったところ、以下のような結果が得られた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/23c74c38-8b3d-1576-db36-10e306c06713.png)

上記画像の結果は、「視点の角度」という情報を残したまま、それ以外のイス、車、顔の特徴のみを損なうことなく変換できていることを意味している。

### エッジ画像から写真
エッジ画像からカラー画像への変換は1つの入力に対して無限の出力が考えられるタスクである（1 to N problem）。DiscoGANはこのようなタスクに対してもリアルな画像を生成することができると検証されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/b25d9b33-1357-1865-a7fa-7cc80d28928a.png)

### ハンドバックからクツ、クツからハンドバック
最後に人間でも難しい、関連性がなさそうな2つのドメイン間の変換について検証する。ハンドバックとクツという関連性の見られない2つのドメインに対してDiscoGANを使用した結果、以下の出力が得られた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2718862/0c470323-77a8-0dd3-7739-181cacde843a.png)

注目すべきは、配色の特徴を引き継いだまま、ドメイン間の変換が行われていることである。それだけではなく、「カジュアルさ」も入力から引き継がれたまま変換されている。

# Conclusion
DiscoGANは、2つのドメイン間のデータ変換をペアの教師データを用意することなく高い精度で実現することができた。今後の研究の一つの方向性としては、テキストドメインと画像ドメイン間の変換が考えられている。