Cramér GANでいらすとや画像生成してみる

このGANは数日前(5/30)に投稿されたもの。

これまでGANのベースラインとして,
vanilla GAN,DCGAN,WGAN,WGAN-gpなどが使われてきた.
この中のWGANやWGAN-gpより優れているという主張が論文内でされている.
(abstで it performs significantly better than the related Wasserstein GAN との記述)

また,twitter上では「WGANは死んだ」などの強めのつぶやきが観測されている.

f:id:yusuke_ujitoko:20170603140649p:plain f:id:yusuke_ujitoko:20170603140657p:plain

その強さを見てみたいので,このCramér GANの論文を読み,
実装していらすとや画像を生成してみたというのが本記事の主旨。
ついでにWGAN-gpも実装して比較した。

f:id:yusuke_ujitoko:20170604160034p:plain

論文の概要

  • 機械学習に使う確率分布間の距離指標には,次の3つの性質が必要
    • sum invariance
    • scale sensitivity
    • unbiased sample gradients
  • 最近注目のWasserstein距離はこのうち前2つは満たすが,最後の1つは満たさない.
    これは深刻な問題につながる
  • そこでWasserstein距離の代わりにCramér距離を使うことを提案
    • Cramér距離は上記3つの要件を満たす
  • Cramér距離を使うCramérGANを提案

距離指標の性質

距離指標としてよく使われるKL divergenceとWasserstein距離の定義をまず確認すると,
分布{P}{Q}間のKL divergenceは {} $$ KL(P \mid \mid Q) = \int_{-\infty}^{\infty} \log \frac{P(dx)}{Q(dx)} P(dx) $$ であり,
そして分布{P}{Q}間のWasserstein距離は、累積分布関数を{F_{p} = \int_{-\infty}^{x} P(dx)  }とすると、
その逆関数を使って、 {} $$ w_{p}(P,Q) = \left( \int_{0}^{1} \mid F_{P}^{-1}(u) - F_{Q}^{-1}(u) \mid^{p} du \right)^{1/p} $$ と表される。
これらKL divergenceとWasserstein距離の違いとしては,
Wasserstein距離は分布の変化には鋭敏ではないが,出力の幾何関係には鋭敏であること.

さて、ここから距離指標の性質について説明していく.
まずパラメータ定義をする。
距離を {\boldsymbol{d}},分布{P, Q}に従う変数を{X,Y}とする.

{\boldsymbol{d}}scale sensitive であるとは,
全部の{X,Y}に対して,以下を満たす{\beta>0}{c>0}があること {} $$ \boldsymbol{d} (cX, cY) \leq \, \mid c \mid^{\beta} \boldsymbol{d}(X, Y) \tag{S} $$

{\boldsymbol{d}}sum invariant であるとは,
{X,Y}に対して独立な、どのような{A}に対しても以下が成り立つこと {} $$ \boldsymbol{d} (A+X, A+Y) \leq \boldsymbol{d}(X, Y) \tag{I} $$

理想的な距離{\boldsymbol{d}}は上の(S)と(I)を満たすと言われているらしい(Zolotarev, 1976).

機械学習向けにはさらに3つ目の性質が距離指標には必要とのこと.
機械学習では{\boldsymbol{d}}をlossとして使う. {Q_{theta}}{\theta}をパラメータとする分布とすると,
lossとして{d(P,Q)}を考えて,このlossを最小化するような{\theta}を見つけたいのだった.
そのためには,3つ目の性質として unbiased sample gradients が必要となる.

またパラメータを幾つか定義する。
{X_{1},X_{2}, \cdots, X_{m}}{P}からサンプリングした変数、
{\delta_{x}}を,異なる{x}に対するディラック関数、
経験分布を{\hat{P}_{m} = \frac{1}{m}\sum \delta_{X}  }
sample loss{\theta \rightarrow d(P, Q)}とする.

{\boldsymbol{d}}unbiased sample gradients を持つときとは,
sampleのlossが{P}の真のlossと等しいこと.つまり以下のときのこと。 {} $$ \mathbb{E}_{X_{m} \sim P} \nabla_{\theta} \boldsymbol{d} (\hat{P}_{m}, Q_{\theta}) = \nabla_{\theta} \boldsymbol{d} (P, Q_{\theta}) \tag{U} $$ 上の(U)が満たされない場合には,SGDで間違ったminimumに到達してしまう.
一方,(U)が満たされれば,sample lossがQ=Pとなることが確かに言える.

さてこれまで(U),(I),(S)と見てきたが,
KL divergenceとWasserstein距離はこれらを満たしているかというと,

  • KL divergenceは(U)は満たすが,(S)は満たさない
  • Wasserstein距離は(I)と(S)は満たすが(U)は満たさない

ということのようだ。(証明も載っているが省く)

Cramér距離

そこでCramér距離が出てくる.
Wasserstein距離は(U)を満たさないが,このCramér距離は(U)を満たすので,
こちらのCramér距離の方が良いということらしい.

Cramér距離の定義は次のようになる.
分布{P,Q}に対する累積分布関数を{F_{P}, F_{Q}}とすると, {P}{Q}間のCramér距離は, {} $$ l_{2}^{2}(P,Q) = \int_{-\infty}^{\infty} (F_{P}(x) - F_{Q}(x))^{2} dx $$ となる。

この平方根{l_{2}}は距離指標として使える。 また、この{l_{2}}は次の{l_{p}} familyに属する指標でもある。 {} $$ l_{p}(P,Q) = \left( \int_{\infty}^{\infty} \mid F_{P}(x) - F_{Q}(x) \mid ^{p} dx \right)^{1/p} $$ p=1において,この{l_{p}}とWasserstein距離は同一になる.
しかし,p≠1では異なる.
Wassestein距離と同じく,この{l_{p}}の指標も次のdual formをもつ.
(Dedecker and Merlevede ,2007) {} $$ l_{p}(P,Q) = \sup_{f \in \mathbb{F}_{q}} \mid \mathbb{E}_{x \sim P} f(x) - \mathbb{E}_{x \sim Q} f(x) \mid $$

Cramér距離は性質として(U)(I)(S)を満たす。 具体的には、

  • {1 \leq p \leq \infty}において(I)(S)が成り立ち
  • {p=2}のときのみ(U)が成り立つ

Cramér距離はWasserstein距離とKL divergenceのいいとこ取りした指標と言える. 論文ではCramér距離が(U)(I)(S)を満たすことの証明があり,
その後に別の指標として energy distance が導入されている.

この energy distance (Szekely, 2002)はCramér距離の拡張になっている.
具体的には, energy distance の1/2がCramér距離に相当する.
そのため energy distance も(U)(I)(S)を満たすことがわかり, 実装アルゴリズムではこちらの energy distance が使われている。

Cramér GANの実装

Generatorは前述の energy distance を最小化するように学習し,
Discriminatorは energy distance を最大化するように学習する.

f:id:yusuke_ujitoko:20170603155440p:plain:w500

Cramér GANの実装はWGAN-gpによく似ている。
WGAN-gpはImproved WGANという論文タイトルであることを踏まえると、
Cramér GANはImproved Improved WGAN的な位置づけと言えるかも.
注意点としては、

  • Discriminatorの出力ユニットが1つではなく、高次元となること
    (論文では256ユニット。高次元であればあるほどよいと書いてある)
  • BatchNormalizationを使わないこと
  • Dropoutを使わないこと

Cramér GANによるいらすとや画像の生成

これまでと同じくいらすとや画像を使わせていただいて、 GANを試してみる。
生成した画像がこちら.

100epoch

f:id:yusuke_ujitoko:20170604151717p:plain

500epoch

f:id:yusuke_ujitoko:20170604151745p:plain

1000epoch

f:id:yusuke_ujitoko:20170604151803p:plain

5000epoch

f:id:yusuke_ujitoko:20170604151820p:plain

27000epoch

f:id:yusuke_ujitoko:20170604151849p:plain 全体の半分はぼやけていて、半分は鮮明に生成できている。
画像の質としてはWGANより向上しているかどうかは分からない…

いつも思うが、うまく行かない時に,
「実装が間違っているのか」、「パラメータチューニング不足なのか」、 「そもそもGANの能力が低いのか」不明..

WGAN-gpとの比較

f:id:yusuke_ujitoko:20170604155904g:plain

画像の質にはそこまで明確に差はない. 質的な観点で言うと,いらすとや画像の生成ではDRAGANがいまのところ一番うまく行ってるかな.

(追記)
このサイズのいらすとや画像で主観評価するのは限界が見えてきたし,そろそろこのテーマも締めようかなと思っています.
もしくはどなたか定量評価する方法を教えて下さい.
論文のタイトルを教えていただくだけでも構いませんのでお知恵を拝借したいです.

この論文では,Cramér GANの特徴として,

  • Increased diversity
  • More stable learning

について記述されているので,少なくとも多様性の方は比較してみて追記したい.

1000epochまでのloss変化

f:id:yusuke_ujitoko:20170604152034p:plain

おまけ:Cramér GANによるMNIST画像生成

f:id:yusuke_ujitoko:20170604153240g:plain

redditCramér GANのスレッドでは,
MNISTではCramér GANはWGAN-gpより僅かに良いという報告もあった.
これはきっと質的な意味での言及だと思う.
f:id:yusuke_ujitoko:20170604174538p:plain

(追記)

Cramer GANについて議論が活発に交わされている.

https://medium.com/towards-data-science/notes-on-the-cramer-gan-752abd505c00 https://medium.com/@marcgbellemare/dear-arthur-38288bae43f5

リグレット解析のメモ

MLP オンライン機械学習本でリグレット解析について勉強した際のメモ.

リグレット解析の概要

リグレット解析(regret analysis)はアルゴリズムが最適な戦略をとった場合と比べてどの程度悪かったのか, そのリグレット(後悔)を測ることでアルゴリズムの性能を測る. リグレット解析自体はオンライン学習だけでなく、ゲーム理論など広い問題設定で利用されている。

リグレット解析の定義

リグレット解析は次のような問題設定を扱う。 プレイヤーは毎回、可能なアクション集合{K}から1つのアクション{\theta \in K}を選択する。 その後に、コスト関数{f}が提示され、その回のコスト{f(\theta)}が決まる。 この操作を何回も繰り返していく。{t}回目のアクションを{\theta^{(t)}}、コスト関数を{f^{(t)}}とする。 コスト関数{f^{(t)}}は毎回全く違っていても、同じでも構わない。

プレイヤーのアクションを決める方法を戦略と呼ぶことにする。 プレイヤーはどのような戦略をとれば合計コスト{\sum^{(t)} f^{(t)}(\theta^{(t)})}を最小化できるか。 そもそもコスト関数{f^{(t)}}がわからない場合でも、合計コストを最小化できるような戦略をとることができるのか。

同じアクションしか取らない戦略を固定戦略と呼び、このアクションを{\theta^{\ast}}とする。 このとき、ある戦略{A}のリグレットは次のように定義される。

ある戦略Aに基づくアクションの合計コストと最適な固定戦略{\theta^{\ast}}による合計コストとの差を戦略{A}のリグレット {Regret_{T}(A)}という。 {} $$ Regret_{T}(A) = \sum_{i} f^{(t)}(\theta^{(t)}) - \sum_{i}f^{(t)}(\theta^{\ast}) $$ 最適な固定戦略をとっている場合と比べて、現在の戦略がどれだけ悪いのかを測り、「あの固定戦略をとっていれば」と考えるのでリグレットと呼ばれる。

戦略

Follow The Leader(FTL)

最も単純な戦略として、これまでのコストの合計を最小にするようなアクションを次のアクションとしてとる方法を考えてみる。 この戦略では{t}回目のアクション{\theta{(t)}}を次のように決定する。 {} $$ \theta^{(t)} = \arg \min \sum_{i=1} f^{(t)}(\theta) $$ この戦略はFollow The Leader(FTL)と呼ばれる。 一見うまくいくように見えるが、評価するコスト関数{f^{(t)}}はこれまでのコスト関数とは関係ないかもしれない場合には対応できない。

Regularized Follow The Leader(RFTL)

コスト関数以外にアクションを安定させることを考える。 {t}回目のアクション{\theta^{(t)}}を次のように決めることを考えてみる。 {} $$ \theta^{(t)} = \arg \min \sum_{i=1} f^{(t)}(\theta) + R(\theta) $$ ただし、{R(\theta)}は凸関数であり、{\eta \geq 0}はどの程度正則化を考慮するかのパラメータ。 この戦略をRegularized Follow The Leader(RFTL)と呼ぶ。

(諸々の証明はとばす)

コスト関数の正則化関数で割ったノルム{\lambda}を、 {} $$ \lambda = \max \, f^{(t)T} (\nabla^{2}R(\theta))^{-1} f^{(t)} $$ とし、
実行可能領域の正則化関数で割った直径{D}を、 {} $$ D = \max R(\theta)-R(\theta^{(1)}) $$ とすると、
RFTLのリグレットは次のようになる。 {} $$ Regret_{T}(A) = \sum_{i} f^{(t) T}(\theta^{(t)} - u) \leq 2 \sqrt{2 \lambda D T} $$

この式のリグレットには{\lambda}{D}が含まれている。 この2つの値はトレードオフの関係にある。 もし{D}を小さくしたいのであれば、({D=\max R(\theta)-R(\theta^{(1)})}なので)、{R(\theta)}{R(\theta^{(1)})}が小さくなるような{R}を使いたくなる。 しかしその場合、{\nabla^{2} R(\theta)}の各要素は小さく、その逆行列は大きくなるため、{\lambda}は大きくなる。 問題の特徴を活かして、{D}{\lambda}の両方が小さくなるような正則化関数、コスト関数を設計する必要がある。

Boundary Equilibrium GAN(BEGAN)でいらすとや画像を生成してみる

このBEGANを使って以下のようないらすとや画像を生成するというのが本記事の主旨。

f:id:yusuke_ujitoko:20170530010053p:plain

完全にmode collapseしてしまった。
結構いろいろ試しているものの、パラメータ調整に今のところ失敗。
悲しい。しくしく。

本論文のcontribution(とIntroに書いてある)

この論文では以下を提案している。

  • 以下の特徴を持つGANの一種(“BEGAN"としている)
    • シンプルかつロバストな構造
    • 高速に収束する
  • DiscriminatorとGeneratorの学習速度のつりあいの制御方法
  • 画像の多様性と質のトレードオフの制御方法
  • 収束の様子を評価する方法

提案手法

BEGANの概要は以下の通り

  • EBGANと同じようにauto-encoderをDiscriminatorとして使う
  • 通常GANのGeneratorは、訓練データと生成データの分布を直接一致させようとするのに対し、 BEGANのGeneratorは、訓練データと生成データ間でauto-encoderの再構成誤差の分布を一致させるように学習させる
    • 再構成誤差の訓練データと生成データ間のWasserstein距離を目的関数として学習させる

auto-encoder用のWasserstein distance

BEGANではauto-encoderの再構成誤差分布を一致させることを目的としている。
この目的に向けて、まずパラメータを定義する。

{\mathcal{L}: \mathbb{R}^{N_{x}} \mapsto \mathbb{R}^{+} } をauto-encoderの{N_{x}}次元のデータの再構成誤差関数(出力はスカラー)とする。
{\mathcal{D}: \mathbb{R}^{N_{x}} \mapsto \mathbb{R}^{N_{x}} } をauto-encoderそのものの処理(encode、decodeの)関数とする。

これらに基づく、auto-encoderの誤差は {\mathcal{L}(v) = | v - \mathcal{D}(v) |^{\eta}  } と表せる。
なおBEGANでは {\eta = 1}を使っている。
十分大きな画像の場合、この再構成誤差はi.i.dとみなせることと中心極限定理から、
画像ごとの再構成誤差は正規分布で近似できることが知られている。
(実際著者らがデータセットで再構成誤差を調べたところ正規分布になったらしい)

さて、再構成誤差が正規分布であると仮定できると、
再構成誤差のWasserstein距離が解析的に計算できる。
訓練データと生成データを、平均 {m_{1,2} \in \mathbb{R}^{p} }・共分散 {C_{1,2} \in \mathbb{R}^{p \times p}}ガウス分布の変量をとすると、
{\mu_{1} = \mathcal{N}(m_{1}, C_{1}) }
{\mu_{2} = \mathcal{N}(m_{2}, C_{2}) }
と表せる。このとき、Wasserstein distanceの二乗は次のように定義できる。 {} $$ W (\mu_{1}, \mu_{2} )^{2} = \mid\mid m_{1} - m_{2} \mid\mid^{2} + tr(C_{1} + C_{2} - 2(C_{2}^{½} C_{1} C_{2}^{½} )^{½} ) $$ さらに次元が1の場合には、 {} $$ W (\mu_{1}, \mu_{2}) = \mid\mid m_{1} - m_{2} \mid\mid_{2}^{2} + (C_{1} + C_{2} - 2 \sqrt{C_{1} C_{2}}) $$ となる。
ここでもうひとつ仮定を入れる。それは、 {\frac{c_{1} + c_{2} - 2 \sqrt{c_{1} c_{2}}}{\mid\mid m_{1} - m_{2} \mid\mid_{2}^{2}}} が定数になるという仮定。 この仮定のもとでは、 {} $$ W (\mu_{1}, \mu_{2}) \propto \mid\mid m_{1} - m_{2} \mid\mid_{2}^{2} \tag{1} $$ とみなせて問題を単純化できる。 (異常に単純化されたが大丈夫か?と思った)

GANの目的関数

Discriminatorがauto-encoderの誤差の距離(1)を最大化するように学習させたい。

  • {\mu_{1}}を訓練データ{x}の誤差{\mathcal{L}(x)}の変量とし、
  • {\mu_{2}}をGeneratorの関数{G}{N_{x}}次元の一様分布変量{z}における誤差{\mathcal{L}(G(z))}の変量とすると、

誤差の距離(1)を最大化するには以下のいずれかの状況となっている必要がある。 {} $$ \begin{align} (a) \begin{cases} W(\mu_1,\mu_2) \propto m_1 - m_2 \\ m_1 \to \infty \\ m_2 \to 0 \\ \end{cases} (b) \begin{cases} W(\mu_1,\mu_2) \propto m_2 - m_1 \\ m_1 \to 0 \\ m_2 \to \infty \\ \end{cases} \end{align}\ $$ 訓練データの誤差{\mathcal{L}(x)}は0になって欲しいので、(b)を選択する。
{m_{1}}{m_{2}}はそれぞれ{\mathcal{L(x)}}{\mathcal{L}(G(z))}の平均)

さて、DiscriminatorとGeneratorの目的関数を定義しよう。
{\theta_{D}}はDiscriminatorのパラメータ、
{\theta_{G}}はGeneratorのパラメータ、
{z_{D}}{z_{G}}{N_{z}}次元のノイズベクトルとすると、
DiscriminatorとGeneratorの目的関数は {} $$ \begin{align} {\mathcal{L}}_{D} &= {\mathcal{L}}(x;\theta_{D}) - {\mathcal{L}}(G(z_{D};\theta_{G});\theta_{D})\\ {\mathcal{L}}_{G} &= {\mathcal{L}}(G(z_{G};\theta_{G});\theta_{D}) \end{align}\ %]]> $$ と定義できる。 この目的関数では、

  • Discriminatorは、訓練データの再構成誤差が小さくなり、一方で生成データの再構成誤差が大きくなることを目指す
  • Generatorは、生成データの再構成誤差が小さくなることを目指している。

この目的関数はWGANのものと似ているが、大きく以下の点で異なっている。

  • 正規分布の誤差の分布を扱っていること
  • Wasserstein distanceの計算を単純化していること。WGANではK-リプシッツ性を必要としていたのに対して提案手法では気にしていない

Equilibrium(平衡)

上記の目的関数をうまく機能させるには、 GとDの学習速度をバランスさせる必要がある。

Generatorによる生成データを訓練データと見分けられないような「釣り合い」の状態は、 誤差分布の期待値は等しくなるはずである。 {} $$ \begin{align} {\mathbb{E}}[{\mathcal{L}}(x)] = {\mathbb{E}}[{\mathcal{L}}(G(z))] \end{align}\ $$ 通常GANでは、この状態を目指すように学習させるのだが、 今回は、{\frac{c_{1} + c_{2} - 2 \sqrt{c_{1} c_{2}}}{\mid\mid m_{1} - m_{2} \mid\mid_{2}^{2}}} が定数になるという仮定を置いたのを思い出してほしい。 この釣り合いの状態では{m_{1} - m_{2} \rightarrow 0}となり仮定が成り立たなくなる。

この問題を解決するために、 釣り合いの状態を目指さず、 {} $$ \begin{align} \gamma = \frac{{\mathbb{E}}[{\mathcal{L}}(G(z))]}{{\mathbb{E}}[{\mathcal{L}}(x)]} \tag{2} \end{align}\ $$ の状態を満たすように、ハイパーパラメータ{\gamma \in (0,1)}を導入し、学習をコントロールする。

BEGAN

以上を踏まえてBEGANの目的関数を、 {} $$ \begin{align} {\mathcal{L}}_{D} &= {\mathcal{L}}(x) - k_{t} \cdot {\mathcal{L}}(G(z_{D})) \tag{3} \\ {\mathcal{L}}_{G} &= {\mathcal{L}}(G(z_{G})) \tag{4} \\ k_{t+1} &= k_{t} + \lambda_{k}(\gamma {\mathcal{L}}(x) - {\mathcal{L}}(G(z_{D})) \tag{5} \end{align}\ $$ としている。
著者らはPropotional Control Theoryという枠組みとして提案しており、 {\gamma{\mathbb{E}} \left[{\mathcal{L}}(x) \right] = {\mathbb{E}} \left[{\mathcal{L}}(G(z))\right] }の釣り合いを保つことを目的としている。

はじめは{k_{0} = 0}と初期化する。 {\lambda_{k}}{k}のpropotional gainで、0.001を用いている。

この目的関数は、式(2)を保つフィードバック系となっている。
例えば学習初期には、

  • Gは簡単にautoencoderが再構成できるデータを生成するので、{\mathcal{L}(G(z))}は小さい。
  • また,kが小さいと、式(3)における{\mathcal{L}(x)}の重要性が増すため、Discriminatorは訓練データの再構成誤差を小さくするよう学習する。

よって、このとき{\mathcal{L}(x) > \mathcal{L}(G(z))}となっているため、 式(5)からkが徐々に大きくなっていく.

{k}が大きくなってくると、式(3)における{\mathcal{L}(G(z_{D}))}の重要性が増す。 そうなるとDiscriminatorはこの{\mathcal{L}(G(z_{D}))}を大きくするよう学習するため、 訓練データと生成データの区別をするような学習が促進される。 一気に学習が進んだときには,今度は式(5)からkが小さくなり調整される.

最終的には,式(3)の{{ \mathcal{L}}_{D} = {\mathcal{L}}(x) - k_{t} \cdot {\mathcal{L}}(G(z_{D})) = 0}となる平衡状態へ達する.

一方,Generatorは,式(4)でひたすら生成データの誤差が小さくなるよう学習する. (Discriminatorからすると,生成データと訓練データの区別が難しくなっていく)

いらすとや画像の生成

このBEGANでいらすとや画像を生成してみた。
結論からいうと、mode collapseしてしまいうまく行かなかった。
かなり綿密なパラメータ調整が必要のよう。

誤差など

f:id:yusuke_ujitoko:20170530010947p:plain mode collapseが起きた40000epochあたりで誤差が激減している。

生成画像

学習開始(0epoch)

f:id:yusuke_ujitoko:20170530005500p:plain

うっすらと何かが見え始める(1000epoch)

f:id:yusuke_ujitoko:20170530005512p:plain

輪郭が現れてくる(5000epoch)

f:id:yusuke_ujitoko:20170530005538p:plain

肌色が付き始める(6000epoch)

f:id:yusuke_ujitoko:20170530005600p:plain ここからしばらく変化なしの状態が続く。

色んなmodeが現れる(33000epoch)

f:id:yusuke_ujitoko:20170530005913p:plain

mode collapse状態になる(45000epoch)

f:id:yusuke_ujitoko:20170530010001p:plain

以降はずっとmode collapseしたまま…(100000epoch)

60000epochあたりから、背景が白固定になる。

f:id:yusuke_ujitoko:20170530010053p:plain

animation(チカチカするので注意)

f:id:yusuke_ujitoko:20170530011340g:plain

BEGANはmode collapseしやすいのがよく分かった。
パラメータ調整は今後も続けて、うまく行ったら追記することとする。

"How to Train a GAN" at NIPS2016 workshopのメモ

NIPS2016でのWorkshop on Adversarial Training「How to train a GAN」での,
GANを学習させるTipsのまとめ。

Workshopの動画 (30分程度で軽めなので観てみると良いと思います) www.youtube.com

以下は登壇者による↓のメモ
https://github.com/soumith/ganhacks

前置き

GANは現状House of cardsのようなもの.

  • Generator,Discriminatorが上手く学習しているのかわからない
  • 上手く言ってると思ったら突然崩壊する
  • モデルの評価が難しい

まだまだ発展途上で,今後新たなアルゴリズムや理論が登場する見込み.
だが現状,以下のようなテクニックは重要と思われる.
(以下のテクニックはZero scienceで単なるHackだと述べている)

1. 入力を正規化する

  • Discriminatorへ入力する訓練データ画像を-1から1の範囲に正規化する
  • Generatorの出力が-1から1の範囲となるよう,Generatorの出力層でtanhを使う

2. 誤差関数を修正する

JS divergenceから誤差関数を導くと,Generatorの学習の際には、{min (log 1-D)}を目的関数とすることとなるが、 実用的には {max log D}を使ったほうがよい。

  • 前者は勾配消失しやすい
  • Goodfellow et. al,(2014)参照

3. 球形のZを使う

Generatorに入力するノイズを一様分布からサンプリングするのではなく、
f:id:yusuke_ujitoko:20170528190404p:plain

ガウス分布からサンプリングする方がよい。
f:id:yusuke_ujitoko:20170528191319p:plain

  • ガウス分布上の点同士の内分点をもとに画像生成する場合には、 単純に点と点を結ぶ線分上の内分点を使うのではなく、 大きな球上の点同士とみて内分点を決定するとよい。 (DCGAN paperでこのミスがあったらしい)
  • 詳しくはTom Whiteの Sampling Generative Networksコード参照

4. BatchNormalization

  • 訓練データと生成データでそれぞれミニバッチ群をつくる。
    (一つのミニバッチに訓練データと生成データが混ざらないようにする)

  • BatchNormalizationを使わないときには、個々のデータに対して正規化処理を行う

f:id:yusuke_ujitoko:20170528191855p:plain

5. スパースな勾配にならないようにする(ReLUやMaxPoolを避ける)

  • スパースな勾配を使うと、GANのmini max gameが不安定になる
  • GeneratorとDiscriminatorの両方でLeakyReLUは有効
  • Downsamplingには、Average PoolingやConv2d+strideを使う
  • Upsamplingには、 PixelShuffleやConvTranspose2d + strideを使う

6. SoftでNoisyなラベルを使う

  • Labelをsoftにする
    訓練データ=1、生成データ=0というラベルであれば、例えば以下のようにする
    • 訓練データのラベルを0.7〜1.2の間のランダム値にする
    • 生成データのラベルを0.0〜0.3の間のランダム値にする
    • Salimans et. al. 2016 参照
  • Discriminatorのラベルをnoisyにする
    • Discriminator学習時に時々ラベルを反転させるなど

7. DCGAN/Hybrid Modelを使う

  • 使えるならDCGANを使う
  • DCGANを使えず、他のモデルでも安定しないときには、hybrid modelを使う
    • KL + GAN
    • VAE + GAN

8. 強化学習の安定学習のためのトリックを取り入れる

  • 強化学習でも学習が不安定になる深刻な問題がある

    • David house?のpaperを読むべき
  • Experience Replayを使う

    • 過去の生成画像をバッファしておき、ときどきそれらを用いる
    • 過去のGeneratorとDiscriminatorを覚えておき、ときどき現世代のGeneratorとDiscriminatorと入れ替える
  • Deep Deterministic Policy Gradientsに対して成功した安定学習のためのトリックを使う
  • Pfau & Vinyals (2016)を参照

9. Adam Optimizerを使う

  • Adamを使う(Radford et. al., 2015参照)
    • 良い結果が出てるlearning rateはだいたい同じ
  • もしくはDiscriminatorに対してはSGDを使い、Generatorに対してはAdamを用いるとよい。

10. 失敗を早めに発見する

  • Discriminatorの誤差が0になったら失敗
  • 勾配の大きさをチェックする。100を超えていれば失敗
  • うまく行っているときには、Discriminatorの誤差の分散は小さく、徐々に小さくなっていく。 一方、分散が大きくスパイクがあるときは失敗
  • Generatorの誤差が安定的に小さくなっているときには、ゴミのような無関係な画像でDiscriminatorを騙している可能性がある。

11. 理論なしで,GeneratorとDiscriminatorのlossがバランスするように制御しない

  • Generatorの学習回数とDiscriminatorの学習会数の比をスケジューリングするのは難しい。
  • もし試みるのであれば、直観的に行うのではなく、理論に基づいて行うほうがよい。

12. ラベルが手元にあるなら使う

  • 何らかの意味を持つラベルが手元にあれば、Discriminatorがサンプルを分類するよう学習させるとよい
    • Auxillary GANs

13. ノイズを入力に混ぜる

14. Discriminatorを多く学習する

  • noiseがあるときには特にDiscriminatorを多く学習する
  • (実際には)GとDの学習回数比を見つけるのは難しい

15. Batch Discrimination

  • 1つのデータを分類するのではなく,バッチごとに分類する手法
  • うまくいく場合とうまくいかない場合がある

16. Conditional GANsの離散変数を使う

  • Embedding layerを使う
  • 画像に追加のチャネルとして付与する
  • embedding dimensionalityを低く保ち、画像チャネルサイズにupsamplingする

17. Generatorの学習時とテスト時両方でDropoutを使う

質疑

登壇者によるhackは有意義だが,これらhackを越えたtheoretical prospectを得るにはどうすればいいの?

hackを越えたところに到達するには, GANがどのように学習するかにfocusする必要がある. そのためには個々のデータに着目するのではなく, lossとデータの関連を見つけるのが重要