188 Views
April 17, 18
スライド概要
2018/04/16
Deep Learning JP:
http://deeplearning.jp/hacks/
DL輪読会資料
DEEP LEARNING JP [DL HACKS] Variational Approaches For Auto-Encoding Generative Adversarial Networks Shintaro Murakami, Dentsu Inc.
書誌情報 論⽂名 Variational Approaches For Auto-Encoding Generative Adversarial Networks. 著者 Mihaela Rosca, Balaji Lakshminarayanan, David Warde-Farley, Shakir Mohamed (DeepMind社) 論⽂URL https://arxiv.org/pdf/1706.04987.pdf Point alpha-GANという新しいGANの⼿法を提唱している。 GANとVAEを組み合わせることで、両⽅の良いところを組み合わせ、より良い特徴表現を学習できる 選定理由 ・実装を通して、GANの学習のための最適化の書き⽅など、今後役に⽴ちそうなノウハウが⾝につく ・近年盛り上がっているGANの事例として興味深い
アジェンダ ・alpha-GANとは ・GANの概要と⽋点 ・VAEの概要と⽋点 ・alpha-GANの仕組み ・実装に向けて ・実装解説 ・実験結果 ・所感
Alpha-GANとは
alpha-GANとは alpha-GANはGenerative Adversarial NetsとVariational Auto Encoderを組み合わせた⼿法。 お互いの⻑所を組み合わせることで、より良い特徴表現を学習できる。 alpha-GAN Real Data X Encoder Encoded Z’ Random Z Code Discriminator Generator Encoded or Random? Generated X’ Discriminator Real or Fake?
Generative Adversarial Nets(GAN)
Generative Adversarial Netsの概要 GeneratorとDiscriminatorが敵対的学習をする。 ・Generatorは特徴空間Zからサンプリングし、画像を⽣成 ・DiscriminatorはGeneratorから来た画像と本物の画像を⾒分けるように学習 ・GeneratorはDiscriminatorを騙すように学習。お互いに競うように学習させることで全体の性能が向上。 Generative Adversarial Nets 教師画像 (real) Discriminator 潜在空間 Z Generator ⽣成画像 (fake) Real or Fake?
Generative Adversarial Netsの概要 特にRadford et al. (2015)によって提案されたDC-GANは、⾼精細な画像⽣成によって世間を驚かせた。 BatchNormalizationの導⼊など、⾰新的な⼿法も提案された。 Math on Face
Generative Adversarial Netsの弱点 ・学習が安定せずパラメータチューニングが必要となる。 ・Generatorが偏ったデータしか⽣成しなくなる”Mode Collapse”が起きる
Generative Adversarial Netsの弱点 Mode Collapseの分かりやすい例 例えばMNISTを学習するときに、「1」だけ異 常にうまく⽣成できるようになってしまった場 合。 全⼒で「1」さえ⽣成すれば、Discriminatorを 騙し続けることができるので、そっちに偏って 学習してしまう。 このような問題を回避するためにW-GANや VEEGANなどの⼿法が開発されている。alphaGANと⽐べてどっちがいいということではな く、alpha-GANにもW-GANの仕組みを取り⼊ れた実装がある。
Generative Adversarial Netsの弱点 おまけ:「いらすとや」の潜在空間を学習をしようとして失敗した例
Variational Auto Encoder(VAE)
まずAuto Encoderについて 普通のAuto Encoder ⼀番基本的な構造。次元圧縮などに⽤いられる。 Auto Encoder データ X Encoder 潜在空間 Z Decoder ⽣成データ X’
Auto Encoderの弱点 学習データのAutoEncodeにしか対応しないため、未知の潜在変数のDecodeは苦⼿。 「潜在空間がスカスカになっている」とも表現できる。 テストデータの Encode-Decode ランダムな潜在変数の Decode 潜在空間内の モーフィング
Variational Auto Encoderの概要 ⼊⼒から直接潜在空間にEncodeするのではなく、⼀旦(μ, σ)にEncodeする。 (μ, σ)をガウス分布のパラメータとして、サンプルしたものを潜在空間Zの変数とする。 これは、Encoderの結果にガウシアンノイズをいれているようなものともとることができる。 さらに、⽬的関数でKL距離を最⼩化することでZ全体の分布を正規分布に近づける。 Variational Auto Encoder 平均 μ データ X 潜在空間 Z Encoder 分散 σ Decoder ⽣成データ X’
Variational Auto Encoderの概要 普通のAutoEncoderよりも「スカスカ」していない潜在空間を学習できるため、ランダムな潜在変数 もうまくDecodeできる。 テストデータの Encode-Decode ランダムな潜在変数の Decode 潜在空間内の モーフィング
⽐較すると⼀⽬瞭然 AutoEncoder Variational Auto Encoder テストデータの Encode-Decode ランダムな潜在変数の Decode 潜在空間内の モーフィング
① 得られる特徴空間Zを望みの分布に近づくように学習させることができる。 ⽬的関数にKL-divergenceという指標を⽤いることで、学習された特徴空間Zの特徴分布が望みの分 布、ここでは平均0、分散1のガウシアン分布になるように学習することができる 望みの分布 データから⽣成された 特徴量Zのzの分布
② Encodeされたzをブレさせることで、学習データを⽔増ししたような効果が得られる。 データxを⼀度(μ, σ)にし、そこからガウス分布に従ってサンプリングすることによりzを得る。 この間に⼊ったガウス分布が、AutoEncoderの中間値にノイズを⼊れるような働きをする。 Variational Auto Encoder 平均 μ データ X 潜在空間 Z Encoder 分散 σ Decoder ⽣成データ X’
感覚的な理解 ガウス分布でノイズが乗ることにより、潜在空間上で「ブレる」ので、データが⽔増しされたような 状態になり、より「隙間なく」学習できる。 Auto Encoder Variational Auto Encoder
潜在空間内でのモーフィング 「数字らしさ」を保ちながらモーフィングすることに成功している。
Variationarl Auto Encoderの弱点 複雑なデータセットを学習しようとすると、若⼲画像がぼやける傾向にある。 VAE DCGAN
alpha-GAN
alpha-GANの概要 GAN 鮮明な画像を⽣成できる VAE 特徴空間の分布を制御できる 2つの⻑所を組み合わせることで、より良い特徴表現を学習できないか?
alpha-GANの概要 この2つを合体させると…
alpha-GANの概要 VAEとGANの良さを組み合わせたのがalpha-GAN alpha-GAN Real Data X Encoder Encoded Z’ Random Z Code Discriminator Generator Encoded or Random? Generated X’ Discriminator Real or Fake?
alpha-GANの概要 VAEの役割をする部分と、GANの役割をする部分があります。 alpha-GAN Real Data X VAEな部分 Encoder Encoded Z’ Code Discriminator Encoded or Random? GANな部分 Random Z Generator Generated X’ Discriminator Real or Fake?
alpha-GANの4つの登場⼈物(独⽴したネットワーク) Encoder Code Discriminator Generator Discriminator サンプルXを特徴空間Zにエンコードする ⽣成された特徴空間Zの分布が正規分布になるようにする 特徴空間Zからサンプルを⽣成する 特徴空間Zから⽣成されたサンプルと実際のデータを識別する
alpha-GANの4つの登場⼈物(独⽴したネットワーク) Encoder サンプルXを特徴空間Zにエンコードする VAE Code Discriminator Generator ⽣成された特徴空間Zの分布が望み通りの分布になるようにする 特徴空間Zからサンプルを⽣成する GAN Discriminator 特徴空間Zから⽣成されたサンプルと実際のデータを識別する
alpha-GANの損失関数 4つの損失関数を組み合わせて最適化している。 Code Discriminator Loss alpha-GAN Real Data X Encoder Reconstruction loss Encoded Z’ Random Z Code Discriminator Generator Generator Loss Encoded or Random? Generated X’ Discriminator Loss Discriminator Real or Fake?
alpha-GANの損失関数 Reconstruction loss Encode-Decodeして画像を元通りに復元できるか Code Discriminator Loss 得られたZの分布が望み通りの形になっているか Generator Loss Discriminator Loss GeneratorがDiscriminatorを騙されているか DiscriminatorがGeneratorを騙せているか
Reconstruction Loss ⼊⼒画像と、AutoEncoderの出⼒のL1ノルムで表される。 ちゃんと⼊⼒画像が復元されているかをチェックする。 AutoEncoderとしての性能をはかる損失関数。 Real Data X Encoder Encoded Z’ Random Z Code Discriminator Generator Encoded or Random? Generated X’ Discriminator Real or Fake?
Code Discriminator Loss ⽣成された特徴空間Zの分布がきちんと望み通りのものに なっているかチェックする。VAE由来の損失関数。 Real Data X Encoder Encoded Z’ Random Z Code Discriminator Generator Encoded or Random? Generated X’ Discriminator Real or Fake?
Code Discriminator Loss ⽣成された特徴空間Zの分布がきちんと望み通りのものに なっているかチェックする。 Real Data X Encoder Encoded Z’ Random Z Code Discriminator Generator Encoded or Random? Generated X’ Discriminator Real or Fake?
Density ratio trick | Code Discriminator Loss ここで、元となったVAEはKL-divergenceを使って得られたZの分布が望み通りになっていることを チェックしていた。しかしながら、KL-divergenceはガウス分布を仮定しているため、それよりも複 雑な分布を仮定できないという⽋点があった。 そこで、density ratio trickという⼿法を使い、KL-divergenceを以下のように近似した。 GANのLoss関数と同じ
Density ratio trick | Code Discriminator Loss この近似により、 Encoderにより⽣成された特徴量とZからランダムにサンプルされた特徴量を識別する識別器Cω をつくり、訓練することで特徴空間Zの分布を望みの分布に寄せることができる。 そのため、この識別器をCode Discriminatorと⾔う。 Real Data X Encoder Encoded Z’ Random Z Code Discriminator Generator Encoded or Random? Generated X’ Discriminator Real or Fake?
Generator Loss おなじみのGANの損失関数。GeneratorがうまくDiscriminatorを騙せているか評価する。 GANとの相違点は、AutoEncoderによってAutoEncodeされたXもGenerated Xとして扱う点。 Real Data X Encoder Encoded Z’ Random Z Code Discriminator Generator Encoded or Random? Generated X’ Discriminator Real or Fake?
Discriminator Loss こちらもGANの損失関数。DiscriminatorがGeneratorにより⽣成されたものとそれ意外を⾒分けられ ているか評価する。こちらもAutoEncoderの出⼒を併⽤。 Real Data X Encoder Encoded Z’ Random Z Code Discriminator Generator Encoded or Random? Generated X’ Discriminator Real or Fake?
Hybrid Loss Functions これらの4つの損失関数をまとめることで、ネットワーク全体を最適化する。 論⽂中ではHybrid loss functionsと呼ばれている。
Hybrid Loss Functions これらの4つの損失関数をまとめることで、ネットワーク全体を最適化する。 論⽂中ではHybrid loss functionsと呼ばれている。 Code discriminator loss Reconstruction loss Discriminator loss Generator loss
Hybrid Loss Functions これらの4つの損失関数をまとめることで、ネットワーク全体を最適化する。 論⽂中ではHybrid loss functionsと呼ばれている。 VAE VAE Reconstruction loss Code discriminator loss GAN Discriminator loss Generator loss GAN
alpha-GANによる顔画像の⽣成結果 ⽣成結果は以下のようになる。 VAEの仕組みを⽤いているにもかかわらず、GANに劣らない鮮明な画像を⽣成することができてい る。 Negative Wasserstein distance DCGAN WGAN-GP AGE alpha-GAN
alpha-GANによる学習結果 Wasserstein distanceによる定量的な評価。 定量的にも、GANに劣らない性能が出ていると⾔える。
alpha-GANによる学習結果 まとめ 他のGANとくらべて画質が良くなったり数値的な向上が得られているわけではないが、 ・GANの学習と同時にAutoEncoderも学習することができる ・VAEのように⽣成される特徴量の分布を制御することができる ・Mode collapseを防ぐことができる ・VAEよりも鮮明な画像を⽣成することができる という嬉しいポイントがたくさんついているというのがalpha-GANの利点。
実装に向けて
利⽤するデータセット GoogleによるQuickdrawDatasetを取り上げる。
QuickDrawDatasetとは Googleが作っている「落書き」のデータセット。 ・5000万のサンプル数 ・100以上のクラス数 と、かなり⼤きなデータセットとなっている。
Quick, Draw webで動くゲームを通して、データ収集をしているのが⾯⽩い点。 https://quickdraw.withgoogle.com/
⽬標:アニメーションの⾃動⽣成システムの構築 QuickDraw DatasetをAlpha-GANで学習することで、「落書きの特徴表現」を学習。 適当に書いた2つの落書き間をモーフィングすることで「落書きが勝⼿に踊り出す」システムの 構築を⽬指す。
参考:motions.cat http://motions.cat/
結果をチラ⾒せ
実装
今回はTensorFlowを利⽤ 村上は普段はkeras愛好家ですが、この機会にTensorflowに慣れ親しもうという考えです。 また、⼀度kerasによるalpha-GANに挑戦したものの、loss関数の設計が複雑なため ⾃由度の低いkerasでは失敗したという苦い経験もあります。
今回はTensorFlowを利⽤ クライアントサイドでWebGLを介してディープラーニング実⾏可能なTensorFlow.jsが発表され、 またtensorflowが盛り上がるのでは…という展望もあります。
TensorFlowはコード量が増える?⾯倒くさい? そんな⾵に考えていた時期が、私にもありました。
tf.layersが素晴らしい tf.layersはTensorFlowの⾼レベルなAPI。まるでKerasのように簡潔にネットワーク構造を記述できる。 重み・バイアスを保存するW, bの初期化、保存などを内部的に⾏ってくれるので楽! 今回はこれをふんだんに使って実装していきます。 tf.layers
alpha-GAN全体像 全体像は複雑だが、個々のパーツは意外と単純。 alpha-GAN Real Data X Encoder Encoded Z’ Random Z Code Discriminator Generator Encoded or Random? Generated X’ Discriminator Real or Fake?
alpha-GAN全体像 まず⼀番簡単なEncoderから⾒ていく。 alpha-GAN Real Data X Encoder Encoded Z’ Random Z Code Discriminator Generator Encoded or Random? Generated X’ Discriminator Real or Fake?
Encoderの構造 Encoderの構造はこのような感じ Encoder Conv2d Input X Reshape ResBlock ResBlock Dense BatchNorm ReLU ResBlock Avg Pooling Avg Pooling Latent Z
Encoderの構造 ⼀つだけ⾒慣れないパーツが。 Encoder Conv2d Input X Avg Pooling ReLU Reshape ResBlock ResBlock ResBlock Dense Avg Pooling Avg Pooling Latent Z
ResBlock 2015年にMicrosoft Researchが発表したDeep Residual Learning(ResNet)で提案された⼿法。 ⾮常に深く層を重ねることが可能で、ResNetでは154層で画像を学習し、⼈間を超える精度を記録した。 ⼊⼒が出⼒に直接Addされているのが特徴。 ResBlock Conv2d Input X BatchNorm Activation Conv2d BatchNorm ADD Activation Output Y
感覚的な理解 バイパス構造があるために、Back Propagationする時に中間をスキップして誤差が伝搬するので、 勾配消失が少なく層を深くすることが可能となっているのでは、と村上は考えています。 ResBlock Conv2d Input X BatchNorm Activation Conv2d BatchNorm ADD Activation Output Y
ResBlockの実装 以上をコードに落とし込むとこのようになります。
Encoderの構造 このResBlockを使ってEncoderを構成していく。 Encoder Conv2d Input X Avg Pooling ReLU Reshape ResBlock ResBlock ResBlock Dense Avg Pooling Avg Pooling Latent Z
Encoderの実装 Encoderの実装はこのような感じ。
alpha-GAN全体像 次はGenerator alpha-GAN Real Data X Encoder Encoded Z’ Random Z Code Discriminator Generator Encoded or Random? Generated X’ Discriminator Real or Fake?
Generatorの構造 Generatorはこのような感じ。だいたいEncoderの逆の構造になってる。 Generator Dense Generator X Tanh ResBlock ResBlock ResBlock ResBlock Reshape ReLU UpSampling UpSampling UpSampling Conv2D Latent Z
Generatorの構造 ここで、UpSamplingに注意。 Generator Dense Generator X Tanh ResBlock ResBlock ResBlock ResBlock Reshape ReLU UpSampling UpSampling UpSampling Conv2D Latent Z
TensorFlowでのUpSampling TensorFlowにはkeras.layers.UpSampling2Dやtorch.nn.UpsampleにあたるAPIが存在しない。 世の中のQiitaの記事にはConvolutional2D() + UpSampling2D() の機能を持つ tf.nn.conv2d_transposeを使うものが多いが、これではResNetを構成できない。 ResBlock Conv2d Input X BatchNorm Activation Conv2d BatchNorm ADD Activation Output Y
TensorFlowでのUpSampling そこでtf.image.resize_nearest_neighborを使う。 実はkerasのUpSample2Dの実装の中でもこのAPIが使われているらしい。 ⾃由度が⾼いので、他の実装でも汎⽤的に使うことができる。
TensorFlowでのUpSampling 以上をふまえて、Generatorの実装はこのような感じになる。
Discriminatorの実装 次はDiscriminator alpha-GAN Real Data X Encoder Encoded Z’ Random Z Code Discriminator Generator Encoded or Random? Generated X’ Discriminator Real or Fake?
Discriminatorの構造 活性化関数がLeakyReLUになっている以外はほとんどEncoderと同じ。 Discriminator Conv2d Input X Avg Pooling Leaky ReLU Reshape ResBlock ResBlock ResBlock Dense Avg Pooling Avg Pooling sigmoid Real or Fake?
Discriminatorの実装 tf.layersのおかげで本当にスッキリ実装できます。
CodeDiscriminator 最後にCodeDiscriminator これは特徴空間を望みの分布にする⼤事なパーツ。 alpha-GAN Real Data X Encoder Encoded Z’ Random Z Code Discriminator Generator Encoded or Random? Generated X’ Discriminator Real or Fake?
CodeDiscriminatorの構造 ここはかなり単純。 CodeDiscriminator Input Z Dense Dense Dense Leaky ReLU Leaky ReLU Sigmoid Encoded or Decoded?
CodeDiscriminatorの実装 tf.layersのおかげで⾮常にスッキリ実装できます。
alpha-GAN完成 以上でalpha-GANに必要なパーツが全部揃いました。 alpha-GAN Real Data X Encoder Encoded Z’ Random Z Code Discriminator Generator Encoded or Random? Generated X’ Discriminator Real or Fake?
Train alpha-GAN
1-15⾏⽬: 下準備
17-62⾏⽬: 計算グラフの構築
17-62⾏⽬: 計算グラフの構築
68-75⾏⽬: ⽬的関数の定義
81-112⾏⽬: Optimizerの構築 GANの学習のために、各ネットワークの変数を収集しておく。 train_modeの概念が無いTensorflow独⾃の下処理。
実装してわかったこと:Adamのパラメータは⾮常に重要 今回唯⼀つまづいたところ。この数値が⾮常に重要で、適当に設定すると全く学習しない。 DCGANの論⽂の成果は、このパラメータをみつけたことであるとも⾔われている。
114-130⾏⽬: ⽣成結果確認のための簡単な関数 結果の可視化はデバッグにおいて⾮常に重要。
132⾏⽬ - : 学習処理 ポイント:AutoEncoderは他の部分の2倍学習させている。Discriminator陣がはやく賢くなりすぎるため。
実験結果
実験内容 Auto AutoEncoder AlphaGAN
実験内容モーフィング この⼆つの絵の間をモーフィング
モーフィング AutoEncoder AlphaGAN
モーフィング
AutoEncode AutoEncoder AlphaGAN
所感
Keras使いからみたTensorFlow やはりKerasよりも頭を使ってプログラミングをすることになるが、昔よりもだいぶ使いやすくなった。 tf.layersが素晴らしい。 Keras = ブロックを組み⽴てるイメージ TensorFlow = ブレッドボード上で配線するイメージ
Keras使いからみたTensorFlow コード上で、演算の定義部分とデータをfeedする部分に距離があるのが若⼲複雑。 教師画像をAutoEncodeする場合と乱数からGenerateする場合で それぞれグラフを作っておかないといけなかったりするのも難しい。 この点はChainerやPyTorchのほうが直感的で良いと感じた。Define by Runは良い。
アプリケーション開発との相性はやはりTensorFlowとKeras とはいえ、今クライアントサイドのGPUを活⽤したDeepLearning実⾏ではTensorFlow/Kerasが 進んでいる印象。Kerasよりも⾃由度の⾼いクライアントサイドDeepLearningツールとしては TensorFlowは良い選択肢かもと感じました。
今後やりたいこと TensorFlowを⽤いたクライアントサイドでの実⾏。 Wasserstein distanceの勉強。