BLOG
投稿日:2021/07/06

Variational AutoEncoder – Fashion MNISTに適用してみる

アカデメイアの小西です。少し前にVariational AutoEncoder (VAE) について仕事で使う機会があったので備忘録も兼ねて記します。

 

VAEとは?

 

Variational AutoEencoder(変分自己符号化機、VAE)とは自己符号化機の一種です。自己符号化機(AutoEncoder, AE)とは、教師なし学習の一種で、画像等の高次元のデータを低次元の潜在変数(latent variable)で表現する事を目的としています。構造としては以下の形になります。

 

入力データ → Encoder → z(潜在変数)→ Decoder → 出力データ

 

上記で、入力データと出力データが近くなるようにEncoderとDecoderを学習させます。

VAEでは、上記の潜在変数として特定の値zではなく、ある種の確率分布zを仮定するのが特徴です。この確率分布が理想的にどのような形をしているかは(おそらく)不明ですが、ガウス分布で近似しそのパラメータ(平均、分散)を変分原理によって求めます。構造としては以下の形になります。

 

入力データ → Encoder → 確率分布(平均μ、分散σのガウス分布)→ z(潜在変数)→ Decoder → 出力データ

 

VAEは、中間状態を分布で表している事から、パラメータを変化させる事で連続的に変化するような画像を取得する事が出来ます。これについては以下Fashion MNISTを例にとって見ていきます。

 

データセットについて

 

データセットとしては、Fashion MNISTを用います。Fashion MNISTはMNISTの代わりに利用する事が想定された衣料品の画像データセットです。MNIST(0〜9までの手書き数字の画像データ)は非常によく用いられていますが、単純すぎる事やあまりに頻繁に使われる事もあり、それを置き換えるものとしてFashion MNISTが提案されました。このデータは、T-shirt/top, Trouser, Pullover, Dress, Coat, Sandal, Shirt, Sneaker, Bag, Ankle bootの10分類からなり、TensorFlow等の機械学習ライブラリから呼び出す事が可能です。一部をmatplotlibを使って表示すると下のようになっています。

ここでは、このデータセットを用いて、VAEのEncoderとDecoderの組を作成し、Encode→Decodeでどの程度元のデータを復元するのか、潜在変数を与える事でどのようにデータを生成するのかを見ていきます。

 

計算内容と結果

 

VAEの学習コードについては概ね以下のKerasの公式ページにあるものを用いています。
https://keras.io/examples/generative/vae/

上記ページはMNISTについてのVAEですが、

keras.datasets.mnist.load_data()

となっている部分を

keras.datasets.fashion_mnist.load_data()

とする事でFashion MNISTについて学習する事が可能です。

以下に、学習済のVAEを用いてEncode→Decodeした例を挙げています。(ここでは潜在変数の次元は2として学習しています)

上記プロットは元データと潜在変数へ変換してからDecodeしたものを比較しており、全体的にぼやけた画像にはなるものの、概ね(柄などを除いて)元の形状を再現している事が分かります。
ただ、右列の上から2つ目の組は元のデータがパンツ(Trouser)なのにDecodeされたものはドレスのように見えます。また、左列の一番下の組はどちらも靴(元データはスニーカー)には見えるものの、Decodeされた方は向きが反転しています。なぜ反転するかはよく分かっていない所ですが、多くの靴(ブーツ、スニーカー、サンダル)が左向きである事に引きずられているのではないかと考えています。

 

元データをEncodeした潜在変数をプロットすると下記のようになります。

 

興味深い事に、各分類についてどのあたりの分布に属しているかの制約を課していないにも関わらず、同じ分類の画像データをEncodeすると近くに分布する事が分かります。また、スニーカー、ブーツ、サンダルなど人が見て直観的に近いと感じるものが実際に近くに分布しているという事も分かります。(シャツ、Tシャツ、プルオーバーなども同様に近くに分布しています。)

 

次に、潜在変数を変化させた時のDecoderの出力の変化を見ていきます。下図は潜在変数z[0]とz[1](上のプロットのlatent0とlatent1に対応します)を[-3.0, 3.0]の範囲で変化させた時のDecode結果を並べたものです(図をクリックすると拡大表示します)。上のプロットの各分類の分布とDecodeの結果が良く合致している事が分かります。例えば、latent0 = 2.5, latent1 = 1.8 あたりは上のプロットだとカバンが多く分布している所ですが、下記プロットのDecode結果でも確かにこの周辺はカバンに見えるものが出力されています。元々のデータが分布していない所(例えば latent0 = -2.5, latent1 = 0.0 あたり)は上手く画像に変換する事が出来ていません。この部分の学習データとEncode済画像の対応について学習出来ていない事を考えるとこれは自然だと思われます。

 

最後に、潜在変数の空間上を連続的に変化させた時のDecode結果をGIFの形で出力してみます。ここでは、(latent0, latent1) = (3.0, 1.25)からスタートして、(-1.5, -3.75)まで変化させています。上のプロットを見ると、(3.0, 1.25)はカバン、(-1.5, -3.75)はパンツのように見えます。

上のGIF動画では、カバン→パンツまで、プルオーバー、Tシャツ、ドレス等を経て画像が変化していく様子が見られます。

 

まとめ

 

ここまで、Fashion MNISTにVAEを適用した例について見てきました。データが比較的単純な事もありますが、潜在変数が2次元というかなり思い切った圧縮を行ってもEncode→Decodeで元データを(柄などの詳細を除いて)良く再現出来、潜在変数の変化に伴ってDecodeされた画像が連続的に変化する所も見られます。

本記事ではアルゴリズム等の部分は概要にとどめ、技術的、数学的詳細には立ち入りませんでした。VAEにバックプロパゲーションをどのように適用するか、変分ベイズ法、多様体仮説など興味深いトピックは多くありますが、その辺りの解説は一旦参考文献に譲ろうと思います。この辺りも、機会があれば(そして私の理解が深まれば)ブログにするかも知れません。ではまた。

 

参考文献

 

ここではVAEの詳細については触れませんでした。VAEの原論文は
D. P. Kingma, M. Welling, “Auto-Encoding Variational Bayes” ICLR (2014)
です。以下のarXivのリンク先から取得出来ます。
https://arxiv.org/abs/1312.6114

 

また、VAEについては日本語でも解説記事が多くあります。例えばQiitaの以下のページなどはChainerでの実装とあわせて解説があります。
https://qiita.com/kenmatsu4/items/b029d697e9995d93aa24

 

Fashion MNISTについては以下の公式GitHubの日本語ドキュメントが参考になります。
https://github.com/zalandoresearch/fashion-mnist/blob/master/README.ja.md

 

KerasのVAEのサンプル。
https://keras.io/examples/generative/vae/