Edited at

【まとめ】ディープラーニングを使った異常検知

ディープラーニングを使った異常検知が進歩していますが、最新情報を

追うのが大変です。ここで、一度まとめておきたいと思います(2019年7月現在)。

本稿では、以下の内容を記します。


  • ディープラーニングを使った異常検知について、簡単に歴史をまとめます。

  • 最新の手法について、ベンチマークを行います。

コード全体はこちらに置きました。


歴史

完全に独断と偏見で作った歴史です。

全ての論文は読めていないので、ご了承ください。


【2年以上前】AutoEncoderによる異常検知


  • AutoEncoderによる異常検知

    2、3年前はAutoEncoderによる異常検知が主流でした。AutoEncoderでは、元画像と再構築画像との差をとって、その和が大きいとき異常と認識させています。Qiitaの記事でも、AutoEncoderによる異常検知はたくさんありますので、気になる人は探してみてください。


  • Variational AutoEocoder(VAE)による異常検知(その1)

    VAEはAutoEncoderを確率的に扱えるようにしたものです。従って、確率的にあり得るかどうか判定できるため、AutoEncoderよりも異常検知性能が良いとされています。


  • VAEによる異常検知(その2)

    VAEを異常検知に使った場合、頻出画像と似た構図のものは異常と見なされにくい傾向がありました。上記の論文では、損失関数の一部を取り出し、頻出であろうがなかろうが異常を見つけ出すことに成功しています。



【1年前】特徴抽出器による異常検知

DOCは画期的な手法で、ディープラーニングを特徴抽出器として使うことでデータ(画像)に含まれる特徴をある部分に固めてしまう手法です。個人的には、「ディープラーニングによる異常検知は実戦で十分使える!」と感動を覚えました。


【最新】metric learning(距離学習)による異常検知

metric learningは、似たもの同士を固めてプロットする学習方法です。

ディープラーニングの分野で注目を浴び始めたのは、FaceNetが登場した

頃からだと思います。

metric learningは、本来、異常検知のために開発されたものではありません。

特に、FaceNetは人の同定(同一人物かどうか判定)を行うために開発されました。

metric learningの考え方は、nクラスで学習させたモデルがあったとして、n+1クラス目が

出てきたときに再学習させるのは非常に非効率です。そこで、似たもの同士を固めてプロット

しておけば、新たなn+1クラスのデータは既存のnクラスとは全然違う位置にプロットされる

ので、再学習は必要ないというものです。

この考え方は異常検知でも有効で、正常データで学習させたmetric learningのモデルに

異常データを入れると、正常データとは違う場所にプロットされるはずです。従って、

異常検知が可能になる仕組みです。


【その他】可視化について


  • AnoGAN

    AnoGANはGANの表現力を頼りに異常検知する手法です。

    可視化だけではなく、異常スコアの算出もできます。


  • Ano-Unet

    Ano-Unetは、metric learningやDOCに後付け可能な可視化専用のネットワークです。

    ArcFaceに取り付ける場合は、ちょっと変更が必要です。



ベンチマーク

ここからは、以下の手法のベンチマークを行います。


  • DOC

  • L2-SoftmaxLoss

  • ArcFace

コード全体はこちら


条件


  • DOCのepochは5、最適化手法はSGD

  • metric learningのepochは10、最適化手法はAdam

  • バッチサイズは128

  • ベースモデルはMobileNet V2(学習済モデルを使用、つまり転移学習)

  • DOCとL2-SoftmaxLossの異常スコアはLOFで算出

  • それぞれのモデルで10回試行してAUCを算出

  • データはFashion-MNISTとcifar-10を使用

<Fashion-MNIST>

データの内訳は以下のとおりです。

正常は「スニーカー」、異常は「ブーツ」。

個数
クラス数
備考

学習用リファレンスデータ
8000
8
スニーカーとブーツを除く

学習用正常データ
1000
1
スニーカー

テストデータ(正常)
1000
1
スニーカー

テストデータ(異常)
1000
1
ブーツ

※学習用リファレンスデータとは、学習用正常データと見比べるためのデータです。

<cifar-10>

データの内訳は以下のとおりです。

正常は「鹿」、異常は「馬」。

個数
クラス数
備考

学習用リファレンスデータ
8000
8
鹿と馬を除く

学習用正常データ
1000
1
鹿

テストデータ(正常)
1000
1
鹿

テストデータ(異常)
1000
1


実装

コード全体はこちら


  • DOC

    実装はこちらを参考にしてください。


  • L2-Softmax-Loss

    異常検知ではありませんが、こちらで実装しています。


  • ArcFace

    実装は、こちらを参考に(ほとんどコピー)させていただきました。



結果


Fashion MNISTの結果

image.png

L2-SoftmaxLossの圧勝となりました。

中央値が重なって見づらいですが、DOCとの差はAUCの中央値で0.1ポイント

(全体の精度は10%くらい?)の差が出ています。

L2-SoftmaxLossは、以前の結果と食い違っていますが、以前は

データ数も少なく、最適化手法のlrも違う値でした。


cifar-10の結果

image.png

こちらも、L2-SoftmaxLossが一番良い結果となりました。

DOCとの差はさらに大きくなっています。


metric learningの可能性

metric learningは異常検知性能が良いことが分かりました。

さらに、様々な可能性を秘めています。


  • 「異常検知」と「クラス分類」を同時に実行

    metric learningは元々、分類タスクを行うことができます。こちらのArcFaceの事例では、

    ペットボトルの種類を分類しながら、コサイン類似度が小さい場合は、学習していない

    未知のものと見なしています。これはArcFaceに限らず、metric learning全般で行うことが

    できます。つまり、「metric learningでは、異常検知を行いつつ、同時にクラス分類もできる

    ということです。個人的に、これは衝撃的な内容でした。


  • 異常データの分類

    これはやっていないので、推測の域を出ませんが、ImageNetなどの画像で学習させた

    metric learningのモデルでは、全く見たことがない異常のデータを弾き、かつ異常

    モードを特定することができると思われます。例えば、ある製品を画像検査するときに、

    「傷」「へこみ」「変色」などの異常画像を弾きつつ、それぞれ異常の種類に応じて、

    クラスタリングすることも可能になると思われます。つまり、「異常検知を行いつつ、

    同時に異常モードが特定できる(再学習不要)」ということです。cifar-10の画像で

    ここまでできるかどうか分かりませんが、夢がかなり広がります。


まとめると、metric learningは異常検知性能も良いし、クラス分類もできるし、

異常モードの特定もできる凄いヤツ。

つまり、metric learningは最強!ということです。


画像以外のデータへの適用

現在、画像以外のデータを分析しています。

今までは、非ディープラーニングベースでしたが、ディープなL2-SoftmaxLossを使って

異常検知することで、AUCが0.1ポイント(全体の精度は10%)向上しました。

ちなみに、ここでもArcFaceよりL2-SoftmaxLossの方が良い性能を示しました。

ディープラーニングは画像以外のデータでも効果があります。

(8/7追記)

上記のモデル、さらに、アンサンブルをとることでAUCが累計0.25ポイント(全体の

精度は20%)向上しました。ディープ×アンサンブルはやってみる価値あります。

処理は重くなりますが。


まとめ


  • 現在、ディープラーニングによる異常検知で一番性能が良いのはmetric learning

  • metric learningは異常検知のみならず、様々な可能性を秘めている

  • ディープラーニングによる異常検知は、画像以外のデータでも有効