Variational Approaches For Auto-Encoding
Generative Adversarial Networks
Shintaro Murakami, Dentsu Inc.
DEEP LEARNING JP [DL HACKS]
書誌情報
論⽂名
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を組み合わせた⼿法。
お互いの⻑所を組み合わせることで、より良い特徴表現を学習できる。
Real Data
X
Encoder
Encoded
Z’
Random
Z
Code
Discriminator
Encoded
or
Random?
Generator
Generated
X’
Discriminator
Real
or
Fake?
alpha-GAN
Generative Adversarial Nets(GAN)
Generative Adversarial Netsの概要
GeneratorとDiscriminatorが敵対的学習をする。
・Generatorは特徴空間Zからサンプリングし、画像を⽣成
・DiscriminatorはGeneratorから来た画像と本物の画像を⾒分けるように学習
・GeneratorはDiscriminatorを騙すように学習。お互いに競うように学習させることで全体の性能が向上。
潜在空間
Z
Generator
Discriminator
⽣成画像
(fake)
教師画像
(real)
Real
or
Fake?
Generative Adversarial Nets
特にRadford et al. (2015)によって提案されたDC-GANは、⾼精細な画像⽣成によって世間を驚かせた。
BatchNormalizationの導⼊など、⾰新的な⼿法も提案された。
Generative Adversarial Netsの概要
Math on Face
・学習が安定せずパラメータチューニングが必要となる。
・Generatorが偏ったデータしか⽣成しなくなる”Mode Collapse”が起きる
Generative Adversarial Netsの弱点
Generative Adversarial Netsの弱点
Mode Collapseの分かりやすい例
例えばMNISTを学習するときに、「1」だけ異
常にうまく⽣成できるようになってしまった場
合。
全⼒で「1」さえ⽣成すれば、Discriminatorを
騙し続けることができるので、そっちに偏って
学習してしまう。
このような問題を回避するためにW-GANや
VEEGANなどの⼿法が開発されている。alpha-
GANと⽐べてどっちがいいということではな
く、alpha-GANにもW-GANの仕組みを取り⼊
れた実装がある。
Generative Adversarial Netsの弱点
おまけ:「いらすとや」の潜在空間を学習をしようとして失敗した例
Variational Auto Encoder(VAE)
まずAuto Encoderについて
データ
X
Encoder Decoder
⽣成データ
X’
Auto Encoder
潜在空間
Z
普通のAuto Encoder
⼀番基本的な構造。次元圧縮などに⽤いられる。
Auto Encoderの弱点
学習データのAutoEncodeにしか対応しないため、未知の潜在変数のDecodeは苦⼿。
「潜在空間がスカスカになっている」とも表現できる。
テストデータの
Encode-Decode
ランダムな潜在変数の
Decode
潜在空間内の
モーフィング
Variational Auto Encoderの概要
データ
X
Encoder Decoder
分散
σ
平均
μ
⽣成データ
X’
Variational Auto Encoder
潜在空間
Z
⼊⼒から直接潜在空間にEncodeするのではなく、⼀旦(μ, σ)にEncodeする。
(μ, σ)をガウス分布のパラメータとして、サンプルしたものを潜在空間Zの変数とする。
これは、Encoderの結果にガウシアンノイズをいれているようなものともとることができる。
さらに、⽬的関数でKL距離を最⼩化することでZ全体の分布を正規分布に近づける。
Variational Auto Encoderの概要
普通のAutoEncoderよりも「スカスカ」していない潜在空間を学習できるため、ランダムな潜在変数
もうまくDecodeできる。
テストデータの
Encode-Decode
ランダムな潜在変数の
Decode
潜在空間内の
モーフィング
⽐較すると⼀⽬瞭然
テストデータの
Encode-Decode
ランダムな潜在変数の
Decode
潜在空間内の
モーフィング
AutoEncoder
Variational
Auto Encoder
① 得られる特徴空間Zを望みの分布に近づくように学習させることができる。
⽬的関数にKL-divergenceという指標を⽤いることで、学習された特徴空間Zの特徴分布が望みの分
布、ここでは平均0、分散1のガウシアン分布になるように学習することができる
望みの分布
データから⽣成された
特徴量Zのzの分布
② Encodeされたzをブレさせることで、学習データを⽔増ししたような効果が得られる。
データ
X
Encoder Decoder
分散
σ
平均
μ
⽣成データ
X’
Variational Auto Encoder
潜在空間
Z
データxを⼀度(μ, σ)にし、そこからガウス分布に従ってサンプリングすることによりzを得る。
この間に⼊ったガウス分布が、AutoEncoderの中間値にノイズを⼊れるような働きをする。
感覚的な理解
Auto Encoder
Variational
Auto Encoder
ガウス分布でノイズが乗ることにより、潜在空間上で「ブレる」ので、データが⽔増しされたような
状態になり、より「隙間なく」学習できる。
潜在空間内でのモーフィング
「数字らしさ」を保ちながらモーフィングすることに成功している。
Variationarl Auto Encoderの弱点
VAE
DCGAN
複雑なデータセットを学習しようとすると、若⼲画像がぼやける傾向にある。
alpha-GAN
alpha-GANの概要
GAN 鮮明な画像を⽣成できる
VAE 特徴空間の分布を制御できる
2つの⻑所を組み合わせることで、より良い特徴表現を学習できないか?
alpha-GANの概要
この2つを合体させると…
alpha-GANの概要
Real Data
X
Encoder
Encoded
Z’
Random
Z
Code
Discriminator
Encoded
or
Random?
Generator
Generated
X’
Discriminator
Real
or
Fake?
alpha-GAN
VAEとGANの良さを組み合わせたのがalpha-GAN
alpha-GANの概要
Real Data
X
Encoder
Encoded
Z’
Random
Z
Code
Discriminator
Encoded
or
Random?
Generator
Generated
X’
Discriminator
Real
or
Fake?
alpha-GAN VAEな部分
GANな部分
VAEの役割をする部分と、GANの役割をする部分があります。
alpha-GANの4つの登場⼈物(独⽴したネットワーク)
Encoder
Code
Discriminator
Generator
Discriminator
サンプルXを特徴空間Zにエンコードする
⽣成された特徴空間Zの分布が正規分布になるようにする
特徴空間Zからサンプルを⽣成する
特徴空間Zから⽣成されたサンプルと実際のデータを識別する
alpha-GANの4つの登場⼈物(独⽴したネットワーク)
Encoder
Code
Discriminator
Generator
Discriminator
サンプルXを特徴空間Zにエンコードする
⽣成された特徴空間Zの分布が望み通りの分布になるようにする
特徴空間Zからサンプルを⽣成する
特徴空間Zから⽣成されたサンプルと実際のデータを識別する
GAN
VAE
alpha-GANの損失関数
Real Data
X
Encoder
Encoded
Z’
Random
Z
Code
Discriminator
Encoded
or
Random?
Generator
Generated
X’
Discriminator
Real
or
Fake?
alpha-GAN
4つの損失関数を組み合わせて最適化している。
Reconstruction loss
Code Discriminator
Loss
Generator Loss
Discriminator Loss
Reconstruction loss
Code Discriminator
Loss
Generator Loss
Discriminator Loss
alpha-GANの損失関数
Encode-Decodeして画像を元通りに復元できるか
得られたZの分布が望み通りの形になっているか
GeneratorがDiscriminatorを騙されているか
DiscriminatorがGeneratorを騙せているか
Reconstruction Loss
⼊⼒画像と、AutoEncoderの出⼒のL1ノルムで表される。
ちゃんと⼊⼒画像が復元されているかをチェックする。
AutoEncoderとしての性能をはかる損失関数。
Real Data
X
Encoder
Encoded
Z’
Random
Z
Code
Discriminator
Encoded
or
Random?
Generator
Generated
X’
Discriminator
Real
or
Fake?
Code Discriminator Loss
⽣成された特徴空間Zの分布がきちんと望み通りのものに
なっているかチェックする。VAE由来の損失関数。
Real Data
X
Encoder
Encoded
Z’
Random
Z
Code
Discriminator
Encoded
or
Random?
Generator
Generated
X’
Discriminator
Real
or
Fake?
Code Discriminator Loss
⽣成された特徴空間Zの分布がきちんと望み通りのものに
なっているかチェックする。
Real Data
X
Encoder
Encoded
Z’
Random
Z
Code
Discriminator
Encoded
or
Random?
Generator
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
Encoded
or
Random?
Generator
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
Encoded
or
Random?
Generator
Generated
X’
Discriminator
Real
or
Fake?
Discriminator Loss
こちらもGANの損失関数。DiscriminatorがGeneratorにより⽣成されたものとそれ意外を⾒分けられ
ているか評価する。こちらもAutoEncoderの出⼒を併⽤。
Real Data
X
Encoder
Encoded
Z’
Random
Z
Code
Discriminator
Encoded
or
Random?
Generator
Generated
X’
Discriminator
Real
or
Fake?
Hybrid Loss Functions
これらの4つの損失関数をまとめることで、ネットワーク全体を最適化する。
論⽂中ではHybrid loss functionsと呼ばれている。
Hybrid Loss Functions
Reconstruction loss Discriminator loss
Generator loss
Code discriminator loss
これらの4つの損失関数をまとめることで、ネットワーク全体を最適化する。
論⽂中ではHybrid loss functionsと呼ばれている。
Hybrid Loss Functions
Reconstruction loss Discriminator loss
Generator loss
Code discriminator loss
これらの4つの損失関数をまとめることで、ネットワーク全体を最適化する。
論⽂中ではHybrid loss functionsと呼ばれている。
VAE
GAN
GAN
VAE
alpha-GANによる顔画像の⽣成結果
DCGAN WGAN-GP AGE alpha-GAN
⽣成結果は以下のようになる。
VAEの仕組みを⽤いているにもかかわらず、GANに劣らない鮮明な画像を⽣成することができてい
る。
Negative Wasserstein distance
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全体像
全体像は複雑だが、個々のパーツは意外と単純。
Real Data
X
Encoder
Encoded
Z’
Random
Z
Code
Discriminator
Encoded
or
Random?
Generator
Generated
X’
Discriminator
Real
or
Fake?
alpha-GAN
まず⼀番簡単なEncoderから⾒ていく。
Real Data
X
Encoded
Z’
Random
Z
Code
Discriminator
Encoded
or
Random?
Generator
Generated
X’
Discriminator
Real
or
Fake?
alpha-GAN
Encoder
alpha-GAN全体像
Encoderの構造
Input
X
Encoder
Conv2d
BatchNorm
ReLU
ResBlock
Avg
Pooling
ResBlock
Avg
Pooling
ResBlock
Reshape
Dense
Latent
Z
Encoderの構造はこのような感じ
Encoderの構造
Input
X
Encoder
Conv2d
Avg
Pooling
ReLU
ResBlock
Avg
Pooling
ResBlock
Avg
Pooling
ResBlock
Reshape
Dense
Latent
Z
⼀つだけ⾒慣れないパーツが。
ResBlock
Input
X
ResBlock
Conv2d
BatchNorm
Activation
Output
Y
2015年にMicrosoft Researchが発表したDeep Residual Learning(ResNet)で提案された⼿法。
⾮常に深く層を重ねることが可能で、ResNetでは154層で画像を学習し、⼈間を超える精度を記録した。
⼊⼒が出⼒に直接Addされているのが特徴。
Conv2d
BatchNorm ActivationADD
感覚的な理解
Input
X
ResBlock
Conv2d
BatchNorm
Activation
Output
Y
バイパス構造があるために、Back Propagationする時に中間をスキップして誤差が伝搬するので、
勾配消失が少なく層を深くすることが可能となっているのでは、と村上は考えています。
Conv2d
BatchNorm ActivationADD
ResBlockの実装
以上をコードに落とし込むとこのようになります。
Encoderの構造
Input
X
Encoder
Conv2d
Avg
Pooling
ReLU
ResBlock
Avg
Pooling
ResBlock
Avg
Pooling
ResBlock
Reshape
Dense
Latent
Z
このResBlockを使ってEncoderを構成していく。
Encoderの実装
Encoderの実装はこのような感じ。
次はGenerator
Real Data
X
Encoded
Z’
Random
Z
Code
Discriminator
Encoded
or
Random?
Generator
Generated
X’
Discriminator
Real
or
Fake?
alpha-GAN
Encoder
alpha-GAN全体像
Generatorの構造
Generator
X
Generator
Dense
Reshape
ReLU
ResBlock
UpSampling
ResBlock
UpSampling
ResBlock
Latent
Z
Generatorはこのような感じ。だいたいEncoderの逆の構造になってる。
UpSampling
ResBlock
Conv2D
Tanh
Generatorの構造
Generator
X
Generator
Dense
Reshape
ReLU
ResBlock
UpSampling
ResBlock
UpSampling
ResBlock
Latent
Z
ここで、UpSamplingに注意。
UpSampling
ResBlock
Conv2D
Tanh
TensorFlowでのUpSampling
TensorFlowにはkeras.layers.UpSampling2Dやtorch.nn.UpsampleにあたるAPIが存在しない。
世の中のQiitaの記事にはConvolutional2D() + UpSampling2D() の機能を持つ
tf.nn.conv2d_transposeを使うものが多いが、これではResNetを構成できない。
Input
X
ResBlock
Conv2d
BatchNorm
Activation
Output
Y
Conv2d
BatchNorm ActivationADD
TensorFlowでのUpSampling
そこでtf.image.resize_nearest_neighborを使う。
実はkerasのUpSample2Dの実装の中でもこのAPIが使われているらしい。
⾃由度が⾼いので、他の実装でも汎⽤的に使うことができる。
TensorFlowでのUpSampling
以上をふまえて、Generatorの実装はこのような感じになる。
次はDiscriminator
Real Data
X
Encoded
Z’
Random
Z
Code
Discriminator
Encoded
or
Random?
Generator
Generated
X’
Discriminator
Real
or
Fake?
alpha-GAN
Encoder
Discriminatorの実装
Discriminatorの構造
Input
X
Discriminator
Conv2d
Avg
Pooling
Leaky
ReLU
ResBlock
Avg
Pooling
ResBlock
Avg
Pooling
ResBlock
Reshape
Dense
Real
or
Fake?
活性化関数がLeakyReLUになっている以外はほとんどEncoderと同じ。
sigmoid
Discriminatorの実装
tf.layersのおかげで本当にスッキリ実装できます。
最後にCodeDiscriminator
これは特徴空間を望みの分布にする⼤事なパーツ。
Real Data
X
Encoded
Z’
Random
Z
Code
Discriminator
Encoded
or
Random?
Generator
Generated
X’
Discriminator
Real
or
Fake?
alpha-GAN
Encoder
CodeDiscriminator
Input
Z
CodeDiscriminator
Dense
Leaky
ReLU
Dense
Leaky
ReLU
Dense
Sigmoid
Encoded
or
Decoded?
CodeDiscriminatorの構造
ここはかなり単純。
CodeDiscriminatorの実装
tf.layersのおかげで⾮常にスッキリ実装できます。
alpha-GAN完成
以上でalpha-GANに必要なパーツが全部揃いました。
Real Data
X
Encoder
Encoded
Z’
Random
Z
Code
Discriminator
Encoded
or
Random?
Generator
Generated
X’
Discriminator
Real
or
Fake?
alpha-GAN
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 = ブロックを組み⽴てるイメージ TensorFlow = ブレッドボード上で配線するイメージ
やはりKerasよりも頭を使ってプログラミングをすることになるが、昔よりもだいぶ使いやすくなった。
tf.layersが素晴らしい。
Keras使いからみたTensorFlow
コード上で、演算の定義部分とデータをfeedする部分に距離があるのが若⼲複雑。
教師画像をAutoEncodeする場合と乱数からGenerateする場合で
それぞれグラフを作っておかないといけなかったりするのも難しい。
この点はChainerやPyTorchのほうが直感的で良いと感じた。Define by Runは良い。
アプリケーション開発との相性はやはりTensorFlowとKeras
とはいえ、今クライアントサイドのGPUを活⽤したDeepLearning実⾏ではTensorFlow/Kerasが
進んでいる印象。Kerasよりも⾃由度の⾼いクライアントサイドDeepLearningツールとしては
TensorFlowは良い選択肢かもと感じました。
今後やりたいこと
TensorFlowを⽤いたクライアントサイドでの実⾏。
Wasserstein distanceの勉強。

[DL Hacks]Variational Approaches For Auto-Encoding Generative Adversarial Networks