KerasでVariational AutoEncoder

VAEのお話

さて、前回は軽いAutoEncoderを書きました。今回、メインはスライドとgithubにぶん投げてVariational AutoEncoderの解説をします。

Variational AutoEncoderは簡単に言うと生成モデルをディープラーニングでやったものです。簡単じゃない?言い方を変えると、元あるデータを元に意味のあるデータが集まっている概念を作り出す、みたいな感じでしょうか。

例えば数字の画像がいっぱいあってそこから「数字」という概念を学習します。例えば、見た目は似てても数字になってないものとかありますよね(例えば”1″と”I”とか)。でもこういったものを学習して、”I”ではなく”1″であるものの形状の概念みたいなものを捉えるわけです。

さて、でそれをどうやるのかというと「数字の概念」を確率分布として仮定してその分布を求めます。詳しくは以下のスライドにまとめました。

けっこう馴染みがないと難しいと思うので、意味が分かりずらかった人はベイズ統計の概念とか生成モデルとか勉強してみるといいと思います。

VAEの実装

さて、では実装。実は実装はkerasの大元に置いてあるんですよね…

ん、あれうまく動かない….?
実はこの実装間違ってます。何がおかしいのかと思ったらloss関数が違います。

問題はobjectives.binary_crossentropy(x, x_decoded_mean)の部分。これはKerasのobjectivesから関数を呼び出しているわけですが、objectivesの実装を見ると…

これ、実はK.meanで平均をとっています。本来、クロスエントロピーは各要素の和をとってバッチごとに平均をとるのが正しいので、平均をとるだけではうまくいきません。
正しく書き直すと以下のようになります。

これでやっとまともに動きます。個人的な嗜好でそれぞれにK.mean入れてますが、kerasはバッチごとの平均とってた気がするので本当はなくても大丈夫と思います(試してないですが…)。この辺のコード、詳しくは以下にまとめました。ConditionalなVersionも書いたので参考までにどうぞ。
ちなみにConditional版の実装のL2ノルムは趣味です。なくても全く問題ないです。

(追記)
今見てみたらkerasのサンプルがアップグレードしてました(昔のコードだとstd=0.01とかでやってましたがこれだとただのAutoEncoderと変わりません)。
https://github.com/fchollet/keras/blob/master/examples/variational_autoencoder.py

でもやっぱりloss関数部分はまだ完全に直ってないっぽいです(7/30時点)。実際コピペして実行してみるとこんな感じ。

ダウンロードダウンロード (1)

んー、案の定。そのうち改善されるでしょう。

sh-tatsuno

投稿者: sh-tatsuno

データに触れたり、剣道したり

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です