Edited at

【ICLR2019】Discriminatorに流す情報量の上界を考慮してくり。Variational Discriminator Bottleneck: Improving Imitation Learning, Inverse RL, and GANs by Constraining Information Flow

#define D Discriminator

#define G Generator


追記(2018/12/19)

『VARIATIONAL INFORMATION BOTTLENECK』なる先行研究が2年前にGoogle Researchから出ていたようでした


とどのつまり



  • GANs, 模倣学習(GAIL), 逆強化学習(GAILベース)の改良したという話。


    • (GAIL:『一言でいうと模倣学習をGANの枠組みで行う試み。』by arXivTimes)

    • (GAILについてはあまり深く触れません。すみません。。。)




  • 背景: GANsへの問題提起


    • そもそもDはすべての情報を使うべきでない


      • データにはノイズやらドメインバイアスが必ず含まれるから。




    • Dの方がGより学習が早く進むのは当然だけど、均衡させることが難しい。


      • 学習回数の比でカバーすることが最適方策な訳がない。




    • Gが少しずつ生成力をつけている中、Dがあらゆる情報を使ってreal-fake分別するのは公平じゃない。



      • Dはreal,fake共に知っている。Gは自分が生成したものしか知らない。

      • つまり『Gが学習し終わった部分+Gが学習中の部分』以外をDが識別に使うことが卑怯。

      • 逆にこの部分だけをDが使うように制限すれば、常に学習が均衡しGDの学習が進み続けるのではないか。





  • ⇒ GANs系、Dに流し込む情報を(動的に)制限しなければいけなくないですか?


  • やってみた。学習が安定化した。性能が上がった。いろいろ使える。いいこといっぱい。みんな使おうQ.E.D.。


  • ネットワークモデルの改善ではなく確率モデルの改善の研究(たぶん)。つまりはGANs系において、ゲーム理論の文脈に持っていっても勝手に解決してくれないこと(不完全観測だとかプレイヤーが使う情報量だとか?)に着目して必然性に基づいて改良している(っぽい)。つまり大事。


というかんじでした。ここで記事が終わったらさすがに怒られるかなと思ってもうちょっと真面目に書いてみます。


書誌情報


VGAN: Variational Discriminator Bottleneck GAN

(VGANは結局のところだいたいGAN+βVAEです。新規性は「② 情報量を動的に変化させる」の部分だと思います)

背景は先に書いたとおりです。解決したいことは2点、

- ① Dが使う情報量に上界を設ける。

- ② Dが使う情報量を動的に変化させる


準備

まずDを2つに分けます。今まで

D(x) = \hat{y}

としていたところを、

D(E(x)) = \hat{y} \\

ただし\ E(x) = z,\ D(z) = \sigma(w^{T}z+b) = \hat{y}

と置き直します。これは最終層だけをDとして切り離しあとはEncoderだと捉え直しただけであって、一般性は失われません。


① 情報量に上界を設ける

Dが使える情報$z$は、$z$が正規分布の空間に分布してると仮定すればKL-Divergenceを使ってその情報量を評価できます。

→EncoderにはVAEを用いることにします。

ここでDが使う情報量の上界を$I_{c}$(== だいたい0.1~0.5の定数)とすると以下のような制約式を書くことができます。

(ちなみに$I_{c}$はハイパーパラメータです(泣)!しかしそれ以上の恩恵があります!たぶん!)

$$

( 0 \leq\ )\ \mathbb { E } _ { \mathbf { x } \sim p ( \mathbf { x } ) } [ \mathbf { K L } [ E ( \mathbf { z } | \mathbf { x } ) | r ( \mathbf { z } ) ] ] \leq I _ { c }

$$

GANsの目的関数は通常、

$$

\max _ { G } \min _ { D } \mathbb { E } _ { \mathbf { x } \sim p ^ { * } ( \mathbf { x } ) } [ - \log ( D ( \mathbf { x } ) ) ] + \mathbb { E } _ { \mathbf { x } \sim G ( \mathbf { x } ) } [ - \log ( 1 - D ( \mathbf { x } ) ) ]

$$

ですが、Dの目的関数部分を以下のように修正します。

\begin{array} { l l } { \min _ { D , E } } & { \mathbb { E } _ { x \sim p ^ { * } ( \mathbf { x } ) } \left[ \mathbb { E } _ { \mathbf { z } \sim E ( \mathbf { z } | \mathbf { x } ) } [ - \log ( D ( \mathbf { z } ) ) ] \right] + \mathbb { E } _ { \mathbf { x } \sim G ( \mathbf { x } ) } \left[ \mathbb { E } _ { \mathbf { z } \sim E ( \mathbf { z } | \mathbf { x } ) } [ - \log ( 1 - D ( \mathbf { z } ) ) ] \right] } \\ { \text { s.t. } } & { \mathbb { E } _ { \mathbf { x } \sim \tilde { p } ( \mathbf { x } ) } [ \mathrm { KL } [ E ( \mathbf { z } | \mathbf { x } ) \| r ( \mathbf { z } ) ] ] \leq I _ { c } } \end{array}

そしてお決まりですが、1つの関数にまとめます。

\begin{aligned} \min _ { D , E } \max _ { \beta \geq 0 } & \mathbb { E } _ { \mathbf { x } \sim p ^ { * } ( \mathbf { x } ) } \left[ \mathbb { E } _ { \mathbf { z } \sim E ( \mathbf { z } | \mathbf { x } ) } [ - \log ( D ( \mathbf { z } ) ) ] \right] + \mathbb { E } _ { \mathbf { x } \sim G ( \mathbf { x } ) } \left[ \mathbb { E } _ { \mathbf { z } \sim E ( \mathbf { z } | \mathbf { x } ) } [ - \log ( 1 - D ( \mathbf { z } ) ] ] \right] \\ & + \beta \left( \mathbb { E } _ { \mathbf { x } \sim \tilde { p } ( \mathbf { x } ) } [ \mathrm { KL } [ E ( \mathbf { z } | \mathbf { x } ) \| r ( \mathbf { z } ) ] ] - I _ { c } \right) \end{aligned}

$\beta$はハイパーパラメータ、ではありません。次で$\beta$をうまく使っていきます。


② 情報量を動的に変化させる

先程

\min_{ D , E } \max_{ \beta \geq 0 }\ hoge

というのが出てきましたが、$\beta$を固定しなかったのが面白いポイントです。

式からわかるように$\beta$はDの識別精度の向上を阻害するように働きます。

$\beta$自体はDのモデルの一部ではなく、以下のように更新式を設定します。

$$

\beta \leftarrow \max \left( 0 ,\ \beta + \alpha _ { \beta } \left( \mathbb { E } _ { \mathbf { x } \sim \tilde { p } ( \mathbf { x } ) } [ \mathrm { KL } [ E ( \mathbf { z } | \mathbf { x } ) | r ( \mathbf { z } ) ] ] - I _ { c } \right) \right)

$$

($\alpha _ { \beta }$は緩いハイパーパラメータで、論文ではタスクにかかわらず$\alpha _ { \beta }=10^{-5}$としています。)

この式を先程のDの目的関数にあてはめて日本語訳すると、

もしDに渡す情報量が上限以上だったらβを大きくして情報量を減らせ。

もしDに渡す情報量が上限以下だったらβを小さくしていけ、β=0なら制約項を無視して識別精度の向上に専念せよ。

なるほどなぁという感じですね。。

(自分の経験的にも、この$\beta$は結構絶妙な値で設定しないと全く制約がかからなくなったり逆に制約項のLossが無限に0に近づいてメインの学習が進まなくなったりしてよく辛くなったなぁという思ひ出)


整理

Dの目的関数

\begin{array} { c } { D , E \leftarrow \underset { D , E } { \arg \min } \mathcal { L } ( D , E , \beta ) } \\ { \beta \leftarrow \max \left( 0 , \beta + \alpha _ { \beta } \left( \mathbb { E } _ { \mathbf { x } \sim \tilde { p } ( \mathbf { x } ) } [ \operatorname { KL } [ E ( \mathbf { z } | \mathbf { x } ) \| r ( \mathbf { z } ) ] ] - I _ { c } \right) \right) } \end{array}

$\ \ \ \ where\ L(D,\ E,\ β)\ is\ the\ Lagrangian$

\begin{aligned} \mathcal { L } ( D , E , \beta ) = & \mathbb { E } _ { \mathbf { x } \sim p ^ { * } ( \mathbf { x } ) } \left[ \mathbb { E } _ { \mathbf { z } \sim E ( \mathbf { z } | \mathbf { x } ) } [ - \log ( D ( \mathbf { z } ) ) ] \right] + \mathbb { E } _ { \mathbf { x } \sim G ( \mathbf { x } ) } \left[ \mathbb { E } _ { \mathbf { z } \sim E ( \mathbf { z } | \mathbf { x } ) } [ - \log ( 1 - D ( \mathbf { z } ) ) ] \right] \\ & + \beta \left( \mathbb { E } _ { \mathbf { x } \sim \overline { p } ( \mathbf { x } ) } [ \operatorname { KL } [ E ( \mathbf { z } | \mathbf { x } ) ] | r ( \mathbf { z } ) ] \right] - I _ { c } ) \end{aligned}

Gの目的関数

\max _ { G } \mathbb { E } _ { \mathbf { x } \sim G ( \mathbf { x } ) } \left[ - \log \left( 1 - D \left( \mu _ { E } ( \mathbf { x } ) \right) \right) \right]

($\mu_{E}$はVAEの出力$\mu_{E}(x)+\Sigma_{E}(x)$の$\mu_{E}(x)$だけをとってきたものです)

右側の図は、$I_{c}$を大きくすると分類の確信度が高く(==分類精度が高くなりやすく)なって、逆もしかりな様子。


個人的な疑問(と憶測)

$Q.$ Dに流す情報量に上界を設ける必要性はわかるが、Dに流す情報を選択できるわけじゃない。ノイズやらドメインバイアスやらがDに流れるかもしれないし、逆に一部の汎用的な情報が流れてくれないかもしれない。そんなんで本当にGは極限まで本物に近いものが作れるのか。

$\hat{A}.$ Dに流れる情報は固定されていない。つまり、Gが勝ち続けるとDはEncoderをいじって取ってくる情報を変える必要がでてきて、Dが取ってくる情報を模索していくうちに、より汎用的な情報を取って汎用的でない情報を捨てるようになり、流れる情報は洗練される。


論文のメインの提案はだいたい以上です。


実験


VGAN: VARIATIONAL GENERATIVE ADVERSARIAL NETWORKS



  • GDの学習回数の比はG1回:D1回/epochと、通常と違って同じにしたようです。

  • 提案手法はVGAN-GPというやつで、GP==gradient penaltyです。


  • FIDは生成された画像同士がどれだけバリエーションを持っているかっていう評価指標。

  • シンプルなGANはしっかりmode collapseしてますね。。。提案手法は安定してFIDを下げ続けることができています。



- CelebAの学習時のLoss。こちらの再現実装?から拝借しました。安定感。


  • はいきれい。


VAIL: VARIATIONAL ADVERSARIAL IMITATION LEARNING

もともとの目的関数が

\underset { \pi } { \max } \min _ { D } \mathbb { E } _ { \mathbf { s } \sim \pi ^ { * } ( \mathbf { s } ) } [ - \log ( D ( \mathbf { s } ) ) ] + \mathbb { E } _ { \mathbf { s } \sim \pi ( \mathbf { s } ) } [ - \log ( 1 - D ( \mathbf { s } ) ) ]

で、

\begin{aligned} J ( D , E ) = \min _ { D , E } \max _ { \beta \geq 0 } & \mathbb { E } _ { \mathbf { s } \sim \pi ^ { * } ( \mathbf { s } ) } \left[ \mathbb { E } _ { \mathbf { z } \sim E ( \mathbf { z } | \mathbf { s } ) } [ - \log ( D ( \mathbf { z } ) ) ] \right] + \mathbb { E } _ { \mathbf { s } \sim \pi ( \mathbf { s } ) } \left[ \mathbb { E } _ { \mathbf { z } \sim E ( \mathbf { z } | \mathbf { s } ) } [ - \log ( 1 - D ( \mathbf { z } ) ) ] \right] \\ & + \beta \left( \mathbb { E } _ { \mathbf { s } \sim \tilde { \pi } ( \mathbf { s } ) } [ \mathrm { KL } [ E ( \mathbf { z } | \mathbf { s } ) \| r ( \mathbf { z } ) ] ] - I _ { c } \right) \end{aligned}

だそう。

それぞれでGAILを上回っている。(GAILはOpenAI baselineに実装が入っているくらい大事な手法らしい…)


  • KL_Lossを示したこの右側の図がちょっとおもしろくて、ちゃんと流してほしい情報量の上限$I_{c}$以下をキープしつつ地味にその上限に近づき続けている様子がわかる。


VAIRL: VARIATIONAL ADVERSARIAL INVERSE REINFORCEMENT LEARNING


  • 逆強化学習(デモから報酬関数を推定する)。

もともとの目的関数が

D ( \mathbf { s } , \mathbf { a } , \mathbf { z } ) = \frac { \exp \left( f \left( \mathbf { z } _ { g } , \mathbf { z } _ { h } , \mathbf { z } _ { h } ^ { \prime } \right) \right) } { \exp \left( f \left( \mathbf { z } _ { g } , \mathbf { z } _ { h } , \mathbf { z } _ { h } ^ { \prime } \right) \right) + \pi ( \mathbf { a } | \mathbf { s } ) }

(zは状態sをEncodeしたもの)で、

\begin{aligned} J ( D , E ) = \min _ { D , E } \max _ { \beta \geq 0 } & \mathbb { E } _ { \mathbf { s } , \mathbf { s } ^ { \prime } \sim \pi ^ { * } \left( \mathbf { s } , \mathbf { s } ^ { \prime } \right) } \left[ \mathbb { E } _ { \mathbf { z } \sim E ( \mathbf { z } | \mathbf { s } , \mathbf { s } ^ { \prime } ) } [ - \log ( D ( \mathbf { s } , \mathbf { a } , \mathbf { z } ) ) ] \right] \\ & + \mathbb { E } _ { \mathbf { s } , \mathbf { s } ^ { \prime } \sim \pi \left( \mathbf { s } , \mathbf { s } ^ { \prime } \right) } \left[ \mathbb { E } _ { \mathbf { z } \sim E \left( \mathbf { s } , \mathbf { s } ^ { \prime } \right) } [ - \log ( 1 - D ( \mathbf { s } , \mathbf { a } , \mathbf { z } ) ) ] \right] \\ & + \beta \left( \mathbb { E } _ { \mathbf { s } , \mathbf { s } ^ { \prime } \sim \tilde { \pi } \left( \mathbf { s } , \mathbf { s } ^ { \prime } \right) } [ \mathrm { KL } [ E ( \mathbf { z } | \mathbf { s } , \mathbf { s } ^ { \prime } ) \| r ( \mathbf { z } ) ] ] - I _ { c } \right) \end{aligned}

となる(そう)。


  • 凄そう(KONAMI)


まとめ


  • そもそも今までDに全部の情報を流していたのはダメでしょという問題提起から始まり、画像生成系と強化学習系で見事に性能の向上を果たした。

  • 個人的にディープエンコード系の問題全般で見直してみるべき話な気がしている。

  • あと、GANとVAEって相性がいいんだなぁと感じた。


    • 去年DeepMindがGAN+VAEでAlphaGANというのを出していたけど(こちらは明らかな問題が合ったし)今回の方が圧倒的感。




  • GDの学習を均衡させることを、GDのLossを直接モニタリングするわけではない方法で実現したというのは(自分が色々知らないだけかもしれないけど)以外だった


以上!