Variational Auto Encoder 〜外れ値検知への応用〜

はじめに

今回は、Variational Auto Encoder(VAE)を外れ値検知に応用した例を示し、その可能性について議論したい。

Variational Auto Encoderとは

詳細な理論はここここで述べたので、今回は概略だけを示す。
観測値X=\{\vec{x}_1,\cdots,\vec{x}_N\}が与えられとき、未観測の値\vec{x}_*を生成する確率分布p(\vec{x}_*|X)を求めたい。これを求めるためBayes推論で使われる変分推論(Variational Inference)を用いると、以下のような処理の流れを得る。

図の「NN」はニューラルネットワークを表す。また、標準正規分布からサンプリングしている部分を赤で示した。入力Xを隠れ変数\vec{z}に射影し(Encoder)、\vec{z}からXを復号する(Decoder)構造を持つ。復号されたX\tilde{X}と記した。この処理の流れをVariational Auto Encoder(VAE)と呼ぶ。「Variational」は変分推論の「変分」から来た言葉である。
Encoder側の2つのNNでパラメータ\vec{\mu}_\phi(X)\Sigma_\phi(X)を計算する。後者は行列である。これらは正規分布のパラメータである。一方、Decoder側のNNではパラメータ\vec{\eta}_\theta(\vec{z})を算出する。これはモデル尤度(確率分布)のパラメータに相当する。EncoderとDecoderの2つを含む全手順を最適化する損失関数には、\vec{\mu}_\phi(X)を0に、\Sigma^{1/2}_\phi(X)を単位行列に近づけるような正則化項が含まれるので、\vec{z}の分布は標準正規分布に近い形状となる。すなわち、任意の変数Xがほぼ標準正規分布に従う確率変数\vec{z}に射影されることになる。これとよく似た手法としてAuto Encoderがあるが、収斂進化のようなものであり、理論的背景は別物である。

外れ値検知の問題設定

今回取り上げるデータセットは、MNISTである。MNISTは下図に示すような手書き数字の画像を集めたものである(下図はhttp://ainow.ai/2017/03/29/110012/から引用した)。

これらの数字の内、「0」を正常データ、「6」を外れ値データとみなす。正常データだけでVAEを訓練し、この訓練済みモデルで外れ値を検出できるか否かを検証する。

ソースコード

今回のコードはここにある。

訓練

6万枚の全画像の中に「0」画像は6903枚ある。この内、5923枚を訓練データ、残りをテストデータとした。mnistの画像はグレイ画像である。今回のVAEの実装では、Decoderの部分に、2値画像を想定したBernoulli分布を用いている。従って、あらかじめ、全画像を2値に変換する処理を行った(make_binarized_mnist.py)。そのあと、train_vae_with_specified_label.pyで訓練を行った。また、ネットワーク構造はnet_2.pyに記載されている。\vec{z}の次元数をD\vec{\mu}_\phi(X)=(\mu_{\phi,1},\cdots,\mu_{\phi,D})\Sigma^{1/2}_\phi(X)=\mathrm{diag}(\sigma_{\phi,1},\cdots,\sigma_{\phi,D})とした。D=100、エポック数を100として訓練を行ったときの損失関数の学習曲線を以下に示す。描画時に使用したファイルは、draw_results_with_specified_label.ipynbである。

訓練後の\vec{\mu}_\phi(X)\Sigma^{1/2}_\phi(X)のそれぞれの全要素の平均値は以下のようになる。

先に説明したように、\mu_\phiは0に近い値に、\sigma_\phiは1に近い値となっていることが分かる。すなわち、近似的に標準正規分布に従う隠れ変数\vec{z}が得られたことになる。

データの分布

訓練済みモデルのEncoder部分を用いて、正常画像(0画像)と外れ値画像(6画像)を隠れ変数に変換した結果が下図である。ただし、t-SNEを用いて100次元を2次元に削減した。正常画像は1000枚、外れ値画像は100枚である。

図の楕円は、Mahalanobis距離の等高線である。内側から1,2,3,4の値を持つ。

しきい値の決定

\vec{z}はほぼ正規分布に従う変数であるから、Mahalanobis距離を用いてしきい値を決定すれば良い。しきい値と各種指標の関係を以下に示す(detect_anomaly.py)。

F値はthresholdが2.7のとき最大値0.97となる。このときのPrecisionとRecallの値はそれぞれ0.95と0.99である。

まとめ

今回は、VAEによる外れ値検知の可能性を探った。正常データで訓練されたVAEのEncoderは正常データを標準正規分布に従う変数に変換する。一方、訓練時に使用しなかった異常データはこの分布から外れた場所に射影されると期待される。この識別はMahalanobis距離を用いれば容易に実現できることを示した。
隠れ変数の次元Dを今回は100とした。最適な次元数については時間をかけてもう少し検討した方が良い。これは今後の課題である。また、しきい値を決定する際に2次元に次元を圧縮したが、これについてもまだ検討の余地はある。

Kumada Seiya

Kumada Seiya

仕事であろうとなかろうと勉強し続ける、その結果”中身”を知ったエンジニアになれる

最近の記事

  • 関連記事
  • おすすめ記事
  • 特集記事

アーカイブ

カテゴリー

PAGE TOP