RelativisticGANの論文を読んでPytorchで実装した その1

生きてます
お世話になってる博士の人にRelativistic GANなる論文を教えてもらったので読んだ。相変わらず自分から良さげな論文を探すスキルが向上しない・・みんなどっから情報収集してるんだ

[1807.00734] The relativistic discriminator: a key element missing from standard GAN

点線から点線までは論文と直接関係ない

自分が最初に読んだGANはGenerator(生成器)Discriminator(識別器)の2つを持ってて、識別器は与えられたデータが本物か偽物(生成器が作ったもの)であるかを識別する役割だった。
一方でWGANと呼ばれるやつはGeneratorCriticの2つを持ってた。CriticはどちらかというとWasserstein距離というものを求める役割で上のDiscriminatorと役割は違う。

ところでWGANのようなものはIPM (Integral probability metrics) GANと呼ぶらしい。積分と確率、、うーん、WGAN読んだとき2つの確率分布が似ているかどうかの指標となる距離を求めるには期待値を計算しなくちゃいけなくて、その期待値の計算に積分が出てくるから関係あるのか。測度論について勉強していくとわかってくるのかな。そうでもない?そう・・・

話は戻って初期の頃のGANはGeneratorDiscriminatorの学習バランスが不安定なのが問題と自分が読んできたGANの論文で指摘されていた。

そういえば何で2つの学習バランスが悪いんだっけ。
GeneratorDiscriminatorに自身が作った偽物を渡して返ってくる結果が本物(確率として1に近い値)であるように自身のパラメータを修正していく。学習ステップが初期の頃にGeneratorが作るものが本物のデータとかけ離れていればDiscriminatorは容易に本物と偽物の識別ができるに違いない。

そうなるとGeneratorは返ってきた結果のほとんどが偽物と返ってくるため、本物のデータに近づくための手がかり(教師信号)が得られないんじゃなかろうか。1個でも本物と返ってきたならばその1個に近いサンプルを作れるようにパラメータを修正していって試行錯誤できるけど、色々作ったサンプルが全部偽物と返ってきたら自分ならどうすればいいか分かんなくて挫ける。
でもこれって判別する役割より作る役割のが大変だからなのかなあ。そんなこんなで訓練の改善策としてUnrolledGANなりWGANなり出てきた。

本題

Relativistic GANの改善点はどうやらWGANみたいに1ステップCriticをn回更新、Generatorを1回更新、といったことをせず両モデル1ステップ1回更新で学習するから400%の時間短縮できて、今流行りのWGAN-GPとかより高品質な生成物を作れるぜって書いてある。ス、スゲー!!!
この論文でのGANにおけるDiscriminatorはWGANみたいに距離の最小化の役割も持ってて、かつ偽物か本物かを識別する役割も持ったDiscriminatorと述べてる。

初期の頃に登場していたGANには、Generatorが作った偽物{ \displaystyle x_f}をDiscriminatorに渡したときの確率{ \displaystyle D(x_f)}が高まる(偽物渡してるのに本物と識別されてる)につれて、本物のデータ{ \displaystyle x_r}を渡した確率{ \displaystyle D(x_r)}は反対に下がるべきという特性が失われているらしい。
この論文で初めて2年も前に登場していたGANの重要な特性を知った。考えもせず無知なままなのは罪である。

どうもGeneratorの訓練がうまくいったとして、与えられた入力{ \displaystyle x}がどれだけ現実的(realistic)かを出力する関数{ \displaystyle C(x)}に偽物 { \displaystyle x_f} と本物 { \displaystyle x_r} を渡したら{ \displaystyle C(x_r) \approx C(x_f)}といった状況になってるらしい。どっちも本物っぽいぜ〜 1に近い値出すぜ〜ってことか

いや、別にその状況よくね?とも思ったんだけど、もし { \displaystyle C(x)} に渡す N個のうち半分が本物で半分が偽物と事前に知っていたなら、このような状況はおかしいというか不合理、良くて「うわ〜どれも本物っぽくて迷うな〜〜どうしよっかな〜〜〜わっかんねーからどっちつかずの 0.5 って返しとこ」あたりが自然だよねって述べてる、はず。

マークシートの試験で全8問のうち4問はAが正解と知っているのに全問Bで埋めてる奴はどう考えてもヤバイ・・・中忍試験のように白紙のがまだ理解できる。

じゃあGeneratorの学習が良い方向に進む、{ \displaystyle C(x_f)} が本物っぽくなる(値が大きくなる)につれて{ \displaystyle C(x_r)}は反対に下がるような大事な特性を与えてあげるのがRelativistic GANの特徴なのか。というよりは今まで読んできたGANはこの特性を与えるように工夫したGANだったんだな。

この大事な特性が失われている「どっちも本物っぽいから1に近い値出すぜ」な感じになってるGANの学習と「どっちも本物っぽくて迷うからどっちつかずの 0.5 って返しとこ」な感じのGANの学習ではどう違うのかの説明が論文に述べられてる。

最初に登場したGANの学習方法として論文にはこんなのが載ってた。

{ \displaystyle  \min_{G}\max_{D} V(D,G) = \mathbb{E}_{\boldsymbol{x} \sim p_{data(\boldsymbol{x})}} \ {[}logD(\boldsymbol{x}){]} +  \mathbb{E}_{\boldsymbol{z} \sim p_{\boldsymbol{z}(\boldsymbol{z})}} \  {[}log(1-D(G(\boldsymbol{z}))){]} }

Relativistic GANの方の論文だとDiscriminatorの目的関数はJSダイバージェンスと等しく、そして目的関数を最大化するように学習していくと書いてある。数式だとこんな感じ。

{ \displaystyle  JSD(\mathbb{P} || \mathbb{Q}) = \frac{1}{2}( log(4) + \max_{D:X \to [0,1]} \mathbb{E}_{x_r \sim \mathbb{P}}[log(D(x_r))] + \mathbb{E}_{x_f \sim \mathbb{Q}}[ 1 - log(D(x_f))]  ) }

本物データ分布{ \displaystyle \mathbb{P} }とGeneratorの偽物のデータ分布{ \displaystyle \mathbb{Q}}が近いかを示す指標のJSダイバージェンスを最大化するって二つの分布が遠ざかってる、似てないってことだよな。
{ \displaystyle log(4)}は置いといて、上の式の第二項と第三項の{ \displaystyle D(x_r)}{ \displaystyle D(x_f)}どうなれば大きくなるか。識別器としては{ \displaystyle D(x_r) = 1}{ \displaystyle D(x_f) = 0 }と割り当てるのが役割なので、{ \displaystyle log(D(x_r)) = log(1) = 0}{ \displaystyle 1 - log(D(x_f)) = 1 - log(0) }となっちゃうから{ \displaystyle log(0) }によってJSダイバージェンスは無限大になっちゃうな。最大化だからいいのか

GeneratorはこのJSダイバージェンスが小さくなるように自身の偽物のデータ分布を本物データ分布に近づけるように学習していく。上の式の場合{ \displaystyle D(x_r) = D(x_f) = \frac{1}{2} }と識別器に割り当てさせるように学習させればJSダイバージェンスが最小になると書いてある。自分はならなかったんですけど(´;ω;`)
{ \displaystyle D(x_f) = 1}{ \displaystyle D(x_r) = 0}となってしまうと{ \displaystyle log(D(x_r)) = log(0)}となってしまうからそれもそっか

JSダイバージェンスの最小化としては{ \displaystyle D(x_r) = D(x_f) = \frac{1}{2} }、次のような感じで徐々に二つの分布が近づくようにしていきたい。(論文の図だとこんなのが載ってる)

f:id:Owatank:20180922181708p:plain


赤が本物のデータで青がGeneratorが作った偽物のデータ

GANの大事な特性が失われていると、{ \displaystyle D(x_f)}のみが増加する。(論文の図)

f:id:Owatank:20180922182244p:plain

どっちも本物っぽいって状況だ。これではJSダイバージェンスは最小にはなってないからGeneratorの学習としてはゴールじゃない
Discriminatorの学習において{ \displaystyle D(x_f)}の変動に対し{ \displaystyle D(x_r)}が変化してないというのはDiscriminatorは識別するための一体何がデータの本物らしさを意味しているのかということをGeneratorの偽物のみから(焦点をおいて)学習していることに繋がっているそうで。本物のデータも参考にして学習してくれよ・・・。そうなるとGeneratorもより本物らしく偽物を作るように学習ができず訓練自体が行き詰まるとか。

理想としては{ \displaystyle D(x_r) = D(x_f) = \frac{1}{2}}な状況。{ \displaystyle D(x_f)}の値が大きくなるのに対して{ \displaystyle D(x_r)}は下がるとDiscriminatorが本物のデータに対しても誤って「偽物」と割り当てる可能性も出てきて、偽物と本物の両方のデータを参考にして本物らしさを学習している感じかな(論文の図)

f:id:Owatank:20180922182949p:plain

Ideal が眩しいぜ

実際にどういう変更を加えるとそういった学習になってくれるのか。
初期のGANのDiscriminatorとGeneratorの各目的関数は次のように定義されてる

{ \displaystyle  \nabla_{\theta_{d}} \frac{1}{m} \sum_{i=1}^{m} {[}logD({\boldsymbol{x}}^{(i)}) + log(1-D(G({\boldsymbol{z}}^{(i)}))) {]}}

{ \displaystyle  \nabla_{\theta_{g}} \frac{1}{m} \sum_{i=1}^{m} log(1-D(G({\boldsymbol{z}}^{(i)}))) }

上で述べてるのはこの定義で訓練すると{ \displaystyle D(x_r)}が変化しない、Generatorの偽物しか参考にしてない悪い状況になるはずで。

Discriminatorの最後の出力層を{ \displaystyle C(x) }、それにシグモイド関数で活性化したものを{ \displaystyle D(x) = sigmoid(C(x)) }と定義しておく。

本物{ \displaystyle x_r } と偽物{ \displaystyle x_f } の両方 { \displaystyle \tilde{x} = (x_r,x_f) } を見比べるようなDiscriminatorは次のように定義すれば実現できるそうだ。

{ \displaystyle D(\tilde{x}) = sigmoid(C(x_r) - C(x_f)) }

思ったよりシンプル。{ \displaystyle C(x_r) - C(x_f) }の時点では確率にはなってなくて、この{ \displaystyle D(\tilde{x}) }は与えられた本物のデータ{ \displaystyle x_r }がGeneratorの偽物{ \displaystyle x_f }より本物らしいといった確率を推定していることを意味する(解釈できる)と書いてある。

逆にGeneratorの偽物の方が本物のデータよりも本物らしいといった確率はこうなる

{ \displaystyle D_{rev}(\tilde{x}) = sigmoid(C(x_f) - C(x_r)) }

このDiscriminatorの定義に従って学習していけばいいんだな。目的関数としては次のようにすればいいそうだ

{ \displaystyle L^{RSGAN}_{D} = - \mathbb{E}_{ (x_{r}\ , \ x_{f}) \sim (\mathbb{P},\mathbb{Q}) } [log(sigmoid(C(x_r) - C_(x_f)))] }
{ \displaystyle L^{RSGAN}_{G} = - \mathbb{E}_{ (x_{r}\ , \ x_{f}) \sim (\mathbb{P},\mathbb{Q}) } [log(sigmoid(C(x_f) - C_(x_r)))] }

Discriminatorの方で考えると{ \displaystyle sigmoid(C(x_r) - C(x_f)) }が 1 に近ければ嬉しいのでlogでくくると log1 = 0になってくはずだから最小化なのかな。

RSGANは Relativistic Standard GANの略でStandard GANについては論文だとこう述べてる。

In the original GAN by Goodfellow et al. [2014], which we refer to as Standard GAN (SGAN), D is a classifier, thus it is predicting the probability that the input data is real.

RelativisticなDiscriminatorは他のGANにも適用できないかと思ってしまうのは自然で、次に一般的な表現というか定義の説明があった。
多くのGANを次のように表現する

{ \displaystyle L^{GAN}_{D} = \mathbb{E}_{ x_{r} \sim \mathbb{P} } [ f_{1} (C(x_r))] + \mathbb{E}_{ x_{f} \sim \mathbb{Q} } [ f_{2} (C(x_f))] }
{ \displaystyle L^{GAN}_{G} = \mathbb{E}_{ x_{r} \sim \mathbb{P} } [ g_{1} (C(x_r))] + \mathbb{E}_{ x_{f} \sim \mathbb{Q} } [ g_{2} (C(x_f))] }

where f1, f2, g1, g2 are scalar-to-scalar functions.

これにRelativisticなDiscriminatorをソイヤ

{ \displaystyle L^{RGAN}_{D} = \mathbb{E}_{ (x_{r}\ , \ x_{f}) \sim (\mathbb{P},\mathbb{Q}) } \ [ f_{1}(C(x_r) - C_(x_f)) ] + \mathbb{E}_{ (x_{r}\ , \ x_{f}) \sim (\mathbb{P},\mathbb{Q}) } \ [ f_{2}(C(x_f) - C_(x_r))] }
{ \displaystyle L^{RGAN}_{G} = \mathbb{E}_{ (x_{r}\ , \ x_{f}) \sim (\mathbb{P},\mathbb{Q}) } \ [ g_{1}(C(x_r) - C_(x_f)) ] + \mathbb{E}_{ (x_{r}\ , \ x_{f}) \sim (\mathbb{P},\mathbb{Q}) } \ [ g_{2}(C(x_f) - C_(x_r))] }

これが・・・Relativistic GAN・・・!ほとんどのGANではGeneratorの{ \displaystyle g_{1}}は無視される、勾配がゼロと書いてある。本物のデータから本物らしさを学ばずに学習してしまう悪い状況じゃん。
RGANの方では非ゼロの勾配を持つそうで、本物データからもGeneratorは影響を受けて学習できる。いいじゃん!!!

もう一つRelativistic average GAN(RaGAN)というものの説明が載ってたんですけど犬の画像がとても可愛くて癒されたので見てほしい。
f:id:Owatank:20180923215626p:plain
食パンと類似した画像なら他にもあっただろうにあえて犬のケツを選ぶセンスすこだ・・・

まずはStandardなRSGAN試したろと思って長くなったので毎度のこと分ける

参考文献というか論文
[1807.00734] The relativistic discriminator: a key element missing from standard GAN
[1807.00734] The relativistic discriminator: a key element missing from standard GAN
[1807.00734] The relativistic discriminator: a key element missing from standard GAN