"CycleGAN"の論文解説と"GAN"の補足

# はじめに

最近、個人的に注目をしている「CycleGAN」について、原著の論文を読んだので、
「GAN」の説明も含めて、できる限り理解しやすいように解説をしていきます。

ICCV 2017
"[Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks](https://arxiv.org/abs/1703.10593)"
Jun-Yan Zhu, Taesung Park, Phillip Isola, Alexei A. Efros
Berkeley AI Research (BAIR) laboratory, UC Berkeley 

本論文のテーマは、"「循環による一貫性を持つ敵対性ネットワーク」を用いた「教師なし学習」による「画像から画像への変換」"です。

# 概要

提案手法の最終的な目標は、ペアとなる訓練データ無しに（すなわち教師なし学習で）、
ソースドメイン$X$からターゲットドメイン$Y$への画像の変換を行うことです。

<img width="1485" alt="Screen Shot 2018-11-22 at 21.04.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/136786/2afb70cc-7c56-e524-3f93-b2aba7352594.png">

すなわち、訓練データとしてそれぞれがアンペアな二つの画像群を与え、

ウマ $\rightarrow$ シマウマ
景観写真 $\rightarrow$ モネの絵画

というような写像を学習し、一方からもう一方へ自動的に変換が行えるようにするということです。

具体的には、ターゲットの分布$Y$と区別のつかないような分布$G(X)$を生成する写像$G$を「敵対性損失」を用いて学習させます。

しかし、「敵対性損失」を用いるだけでは拘束力に欠けるため、
逆写像$F$と「サイクル一貫性損失」を導入して、$F(G(X))$が$X$を復元できるように矯正をします。
（逆方向の変換に関しても、同様のアプローチを行います。）

上図のように、写真のテイストを変えたり、物体を変身させたり、季節の遷移させたり、
また後ほど紹介をする、画像のエンハンスメントなど、多くの事例で成果を挙げています。

# 導入

本論文は、主に次のことを学習する為の手法について説明しています。

1. ある画像群の特徴を抽出する

2. これらの特徴がもう一方の画像群にどのように変換されるかを理解する

※ ただし、次のようにペアとなる訓練データ無しに学習を進められます。

<img width="500" alt="Screen Shot 2018-11-28 at 16.56.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/136786/cca95524-3f62-f0ee-a6e6-332e2128f8b4.png">

上図のように、

画像$x_i$と対応する画像$y_i$が与えられる $=$ ペア（教師あり学習）
単に（特に対応のない) 画像群$X$と画像群$Y$が与えられる $=$ アンペア（教師なし学習）

として扱います。

もちろん、ペアの訓練データが手に入れば一番良いのですが、それを用意するのは実際には難しく、
例えば、さっきのように景観写真をとある画家の描画スタイルに変換させるなどのタスクでは、
それが「既にこの世には存在しない画家」を対象とする場合、その景観写真に合致する絵を訓練データとして用意するのは不可能です。

よって、そのようなタスクにペアの訓練データ（教師あり学習）を用いるのは、困難かつ実用的ではありません。

したがって、現実的に手に入れられる訓練データとして、単に景観写真の画像群と絵画作品の画像群を与え、
二つのドメイン間の根底にある関係性を学習しようというのが提案手法の最大の目標となります。

具体的な実装に関しては、[PyTorch](https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix)と[Torch](https://github.com/junyanz/CycleGAN)で実装されたものがGithub上にあります。

また、本論文中で紹介していない生成結果や失敗例などが[著者のホームページ](https://junyanz.github.io/CycleGAN/)に上がっているので、そちらも合わせてご覧ください。

# Cycle-Consistent Adversarial Networks

これから、提案手法の具体的な内容に入っていきます。

最終的な目標としては、訓練データとして与えられた二つのドメイン$X$と$Y$の写像を学習することであるため、
これを達成するための目的関数には、次の2つの項を導入します。

- 生成イメージの分布とターゲットの分布を一致させる「敵対性損失」

- 写像$G$と逆写像$F$の矛盾を防ぐための「サイクル一貫性損失」

<img width="1546" alt="Screen Shot 2018-11-29 at 20.19.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/136786/3b40242b-95f2-2bd3-3a89-ea0d36c522dd.png">

上図のように、このモデルは「$X$から$Y$への写像$G$」と「$Y$から$X$への写像$F$」の二つの生成器を持ちます。
そして、「ドメイン$Y$の画像$y$」と「ドメイン$X$の画像$x$を変換した$G(x)=Y'$」の真偽を判定するための識別器$D_Y$、
同様にもう一方の生成器$F$に対応する識別器$D_X$も用意します。

理論的には、最適な生成器$G$は「ドメイン$X$」から「ドメイン$Y$に限りなく近い分布$Y'$」へ変換をするはずですが、
それと同じような分布を誘導する写像は無限に考えられ、また、全ての入力が似たような出力にマッピングされ、学習が進まないといったことも起こり得ます。

それゆえに、「循環による一貫性」というものを持たせることで、$F(G(x)) \approx x, \hspace{3pt} G(F(y)) \approx y$ に一致するかどうかを確認し、
$G$と$F$がお互いに「逆写像」かつ「全単射（一対一対応）」であることを検証することができます。

## 敵対性損失

ソースドメイン$X$からターゲットドメイン$Y$への変換の学習に用いられる「敵対性損失」は、次式のように表されます。

```math
\begin{align}
\mathcal{L}_{GAN}(G,D_Y,X,Y)&=\mathbb{E}_{y \sim p_{data}(y)}\bigl[\log D_Y(y)\bigr]\\
&\hspace{1pt}+\mathbb{E}_{x\sim p_{data}(x)}\biggl[\log \Bigl(1-D_Y\bigl(G(x)\bigr)\Bigr)\biggr]
\end{align}
```

$G$: ターゲットドメイン$Y$に近いイメージ$G(x)$を生成する Generator
$D_Y$: 生成されたイメージ$G(x)$と実際のサンプル$y$を識別する Discriminator

しかし、これだけでは直感的に理解をしづらいので、
$G(x)=y'$として、上式を分かり易いように書き下すと、

```math
\begin{align}
-\mathcal{L}_{GAN}(G,D_Y,X,Y)&=\frac{1}{N}\sum_{y}\Bigl(-p_{data}(y)\log D_Y({y})-\bigl(1-p_{data}(y)\bigr)\log\bigl(1-D_Y(y)\bigr)\Bigr)\\
&\hspace{1pt}+\frac{1}{N'}\sum_{y'}\Bigl(-p_{y'}(y')\log D_Y({y'})-\bigl(1-p_{y'}(y')\bigr)\log\bigl(1-D_Y(y')\bigr)\Bigr)
\end{align}
```

$p$は対象が本物である「真の確率分布」を表し、第一項目から順に、

- $p_{data}(y)\log D_Y({y})$ ... $y$を「本物」だと正しく識別できる場合

- $\bigl(1-p_{data}(y)\bigr)\log\bigl(1-D_Y(y)\bigr)$ ... $y$を「偽物」だと正しく識別できる場合

- $p_{y'}(y')\log D_Y({y'})$ ... $y'$を「本物」だと正しく識別できる場合

- $\bigl(1-p_{y'}(y')\bigr)\log\bigl(1-D_Y(y')\bigr)$ ... $y'$を「偽物」だと正しく識別できる場合

それぞれの交差エントロピー誤差を表します。

ただし前提として、ソースである$y$は全てが「本物」であり、生成された$y'$は全てが「偽物」であるため、
$1-p_{data}(y)=0, \hspace{3pt} p_{y'}(y')=0$ を代入すれば、


```math
\begin{align}
-\mathcal{L}_{GAN}(G,D_Y,X,Y)&=\frac{1}{N}\sum_{y}\bigl(-p_{data}(y)\log D_Y({y})\bigr)\\
&\hspace{1pt}+\frac{1}{N'}\sum_{y'}\Bigl(-\bigl(1-p_{y'}(y')\bigr)\log\bigl(1-D_Y(y')\bigr)\Bigr)
\end{align}
```

上式のように、第一項と第四項のみが残り、最初の式が導かれます。

Discriminatorは識別できる精度を上げて、目的関数を大きくする方向へもっていきますが、
Generatorは生成したイメージを本物だと思わせてDiscriminatorを騙すように、
すなわち、先ほどとは逆に目的関数を小さくする方向へもっていきます。

よって、最終的に求める式は、以下のようになります。

```math
\min_G\max_{D_Y} \mathcal{L}_{GAN}(G,D_Y,X,Y)
```

逆方向の変換の学習に関しても、次のように同様の目的関数を導入します。

```math
\min_F\max_{D_X} \mathcal{L}_{GAN}(F,D_X,Y,X)
```

---

本来、Generatorの学習では「ソース」と「生成したイメージ」の分布間距離を縮めるためにJSダイバージェンスの最小化を行いますが、これが成り立つのは $p_{data}=p_{y'}$ のとき、すなわち、与える訓練データの「本物」と「偽物」の割合を一対一にしなければなりません。

したがって、$N=N'=M$ より、

```math
\mathcal{L}_{GAN}(G,D_Y,X,Y)=\frac{1}{M}\sum_{y,{y'}}\Bigl(p_{data}(y)\log D_Y({y})+\bigl(1-p_{y'}(y')\bigr)\log\bigl(1-D_Y(y')\bigr)\Bigr)
```

となります。

Discriminator自体の学習では、先ほどのように交差エントロピー誤差を最小化しますが、
これらの目的関数は正負を反転したものであるため、先ほどのミニマックス法に落とし込んでいる点に関しても正しいことが確認できます。

また、Generatorの学習はソースの識別に依存しないため、最初の項を省いて、

```math
\begin{align}
\mathcal{L}_{GAN}(G,D_Y,X,Y)&=\frac{1}{N'}\sum_{y'}\Bigl(\bigl(1-p_{y'}(y')\bigr)\log\bigl(1-D_Y(y')\bigr)\Bigr)
\end{align}
```

とも表せます。

## サイクル一貫性損失

サイクル一貫性損失に関しては、次のように$L^1$ノルムを用いた期待値の形で表せます。

```math
\begin{align}
\mathcal{L}_{cyc}(G,F)&=\mathbb{E}_{x \sim p_{data}(x)}\bigl[\|F(G(x))-x\|_1\bigr]\\
&\hspace{1pt}+\mathbb{E}_{y \sim p_{data}(y)}\bigl[\|G(F(y))-y\|_1\bigr]
\end{align}
```

$G$: ターゲットドメイン$Y$に近いイメージ$G(x)$を生成する Generator
$F$: ターゲットドメイン$X$に近いイメージ$F(y)$を生成する Generator

式から分かるように、「変換後のイメージから入力データを復元したイメージ」と「元の入力データ」を比較することで損失を算出しています。

<img width="500" alt="Screen Shot 2018-12-01 at 1.05.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/136786/281c749f-aea2-9ddd-7ad9-12511128f5e2.png">

上図は右から順に、入力データ、変換後のイメージ、復元したイメージとなっています。

サイクル一貫性損失を用いて復元されたイメージは入力イメージにかなり近いものになっており、
一番下の例では、航空写真は地図に比べて多くの情報を持っているにも関わらず、地図から航空写真の復元さえもできています。

## 敵対性損失 + サイクル一貫性損失

「敵対性損失」と「サイクル一貫性損失」を組み合わせることで、最終的な目的関数を設定します。

```math
\begin{align}
\mathcal{L}(G,F,D_X,D_Y)&=\mathcal{L}_{GAN}(G,D_Y,X,Y)\\
&\hspace{1pt}+\mathcal{L}_{GAN}(F,D_X,Y,X)\\
&\hspace{1pt}+\lambda\hspace{1pt}\mathcal{L}_{cyc}(G,F)
\end{align}
```

ただし、これらの相対的な重みを制御する係数 $\lambda$ を導入しています。

最後に、下式を求めることでモデルの学習を行います。

```math
G^*, F^* = \arg \min_{G,F}\max_{D_X,D_Y} \mathcal{L}(G,F,D_X,D_Y)
```

# 検証結果

次の5つの先行研究との比較を行いました。

- CoGAN
- SimGAN
- Feature loss + GAN 
- BiGAN / ALI 
- pix2pix 

pix2pixについてはペアの訓練データを用いた学習モデルとなるため、
アンペアな訓練データを用いて学習を行なっている提案手法が、どれくらいそれに近づけるかどうかを検証します。

また、「敵対性損失」と「サイクル一貫性損失」のそれぞれの重要性を確認するために、
それらを組み合わせを変えた幾つかのモデルとの比較を行います。

<img width="1367" alt="Screen Shot 2018-12-01 at 6.13.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/136786/ac0d95dc-401b-7291-d93f-96632655c9c9.png">

上図から分かるように、他のいずれの手法においても望ましい結果が出ていない中、
提案手法は、教師あり学習である「pix2pix」と同等のクオリティの変換を実現しています。


<img width="1309" alt="Screen Shot 2018-11-20 at 3.44.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/136786/345bd452-ee2c-62f0-0c33-23178c3897ee.png">

「Cycle alone」と「GAN+backward」では、そもそもターゲットとしているイメージを生成できず、
「GAN alone」と「GAN+forward」では、入力画像を無視してモード崩壊（Discriminatorを騙しやすいような画像ばかりを生成してしまう現象）が起こっています。

特に取り除かれた写像の方向に対して、モード崩壊を起こすことが確認できます。


# 応用例

## Collection Style Transfer

<img width="977" alt="Screen Shot 2018-11-20 at 4.27.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/136786/9efef7dd-8dac-9c67-4c57-cddb783134ad.png">

<img width="975" alt="Screen Shot 2018-11-20 at 4.27.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/136786/620380e3-c145-6be5-4a7a-5269d48abb93.png">

先行研究である「Neural Style Transfer」とは異なり、ある一つの絵画の作風への変換ではなく、作品群全体の作風の模倣することができます。
すなわち、ゴッホの「星月夜」ではなく、彼の作風が持つ特徴を学習できるということです。

## Object Transfiguration / Season Transfer

<img width="945" alt="Screen Shot 2018-11-20 at 4.28.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/136786/cd3d91ae-29f3-438f-3ef3-4af25db1178f.png">

## Photo Generation from Paintings

<img width="970" alt="Screen Shot 2018-11-20 at 4.28.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/136786/edb02b01-58a1-33be-f6bb-2e42440ed9f8.png">

<img width="500" alt="Screen Shot 2018-11-20 at 3.44.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/136786/3a9a9618-9812-0b33-e139-87a1406ef135.png">

このタスクでは、入力と出力の間で色の構成を保つために、次のような損失関数を追加で導入します。

```math
\begin{align}
\mathcal{L}_{identity}(G,F)&=\mathbb{E}_{y \sim p_{data}(y)}\bigl[\|G(y)-y\|_1\bigr]\\
&\hspace{1pt}+\mathbb{E}_{x \sim p_{data}(x)}\bigl[\|F(x)-x\|_1\bigr]
\end{align}
```

$L^1$ノルムを用いて、「入力」と「生成したイメージ」の分布が近づくように損失関数を設定しています。

## Photo Enhancement

<img width="941" alt="Screen Shot 2018-11-20 at 4.30.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/136786/6e247313-d59e-1da3-5ea0-84922bc3d1f6.png">

ソースには、スマートフォンなど撮像素子の小さいカメラによって撮影された被写界深度の深い写真、
ターゲットには、（撮像素子が大きく、被写界深度が浅い）デジタル一眼レフカメラで撮影された写真を用いることで、
被写界深度のより浅い写真への変換を可能にしています。

## Neural Style Transfer との比較

<img width="940" alt="Screen Shot 2018-11-20 at 4.30.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/136786/227994e7-f6b1-0ee9-cac5-a554ad40b6a4.png">

「Neural Style Transfer」の教師データとして、二つの代表的な作品を与えたものを比較し、
また、平均グラム行列を用いて得られたターゲットの平均的な作風から、作品群全体に対しても同様の比較を行いました。

<img width="936" alt="Screen Shot 2018-11-20 at 4.30.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/136786/300811e5-85b7-7fd5-e580-79885195eca4.png">

「Neural Style Transfer」では、望まれた出力に近い画像を入力に与える必要があることが分かります。

# 今後の課題

<img width="932" alt="Screen Shot 2018-11-20 at 4.31.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/136786/089fdabc-177a-5ea3-e1e1-2cef87847e66.png">

上図は、いくつかの失敗例です。

これまでのタスクのように、色やテクスチャに関する変換は成功していましたが、
ジオメトリを変形するタスクでは、あまり上手くいきません。

例えば、犬から猫への変換のタスクでは、入力はほとんど変化していません。
これは、外観的な見栄えが良く見えるようにGeneratorが調整されていることから引き起こされたと考えられます。

また、与えられた訓練データの特徴によって引き起こされた失敗例もあります。
一番右にあるように、ウマからシマウマへの変換において、望ましい結果となっていません。
このとき、訓練の際には野生のウマとシマウマのデータしか与えておらず、
「乗馬」というヒトを含むような状況は想定していませんでした。

そして、ペアの訓練データを与えた場合とペアでない訓練データを与えた場合では、
いまだに差が出てしまう問題も残っています。
写真からラベルに変換するタスクにおいては、木と建物を混同してしまうといったことがありました。
この曖昧さを解決するためには、何らかの弱い制約が必要だと考えられます。