Help us understand the problem. What is going on with this article?

【一問一答】マヅコの知らない「異常検知」の世界

これから異常検知を勉強される初心者、中級者の方のために一問一答集を作ってみました。

実際にあった質問も含まれますが、ほとんどの質問は、私が勉強しながら疑問に思ったことです。

なお、各質問には私の失敗談を添えております。皆さんは私のような失敗をしないよう
祈っております(^^)。異常検知に特化した内容となっておりますので、ご了承ください。

初心者の方向け

勉強の仕方編

Q:異常検知を勉強したいのですが、何から手をつけて良いのか分かりません。
A:書籍を買って読むのがおススメです。

最初、私はネット情報で勉強していました。しかし、それにも限界があります。
ところが、書籍(入門 機械学習による異常検知)を買って読んだところ、かなり知識を
得ることができました。最初から、書籍を買っていれば、一年くらい得することができたのに...
と思うこともあります(^^;

ただ、こちらの本はディープラーニング系は載っていません。しかし、ディープラーニングに通じる
技術がたくさん載っていますので、ディープラーニング系の異常検知をやる方であっても一読する
ことをおススメします。

「ディープラーニング系の異常検知」の書籍は、今のところ見かけたことはありませんが、こちら
コードを動かしながら学ぶことができるかもしれません。

前処理編

Q:スコアが全然出ません。
A:まずは、可視化してみてください。

異常検知に限らず、データ分析全般にいえることですが、データが与えられたとして分析を
いきなり始めるのではなく、可視化するプロセスは必ずやった方が良いです。

これにより、データ分析の難しさをある程度推測することもできますし、思わぬ気付きも
あるかもしれません。あるいは、データ収集の問題点が浮き彫りになることもあります。

多次元で可視化するのが難しければ、t-sneを使えば可視化できます。最近ではUMAPという
速い手法も出てきています。

ダウンロード (1).png
上の例は、Fashin-MNISTのデータを使ってt-sneで可視化した一例です。

上の例のように、いくらか分布が異なれば「異常検知ができそう!」とか見積ることが
できます。あるいは、完全に分布が分かれれば、あえて機械学習を使う必要がなく、
ルールベースの判定法でも良いかもしれません。「機械学習をしなくて良い方法を考える
という考え方も大切です。

「可視化の次は分析!」といきたいところですが、前処理も十二分に検討しましょう。
0-1変換が良いのか、標準化が良いのか、あるいは対数変換を使うのか...

音の分析では、0-1変換→標準化に変更するだけで、AUC(通常0.5~1.0となる、高ければ
高いほど良い)が0.05上がったこともあります(^^;

あるいは、K近傍法など距離ベースの異常検知手法は、スケール(0~1変換)を揃える
必要があります。これを忘れるだけで、精度が数十%降下することもあります。

手法編

Q:ディープラーニングがカッコイイから、とりあえずディープラーニングにデータを突っ込めばいいんでしょう?
A:初手、ディープラーニングはやめた方が良いです。時間が溶けます。

初手オートエンコーダは非常に有効だと思います。オートエンコーダは学習も安定していて
ある程度のスコアも保証してくれます。

それ以外のディープラーニング系は調整に時間がかかるため、最後の手段として試した方が良いです。
結論として初手は、Isolation Forest(IF)やLOF(もしくはオートエンコーダ)がおススメです。

実は、ディープラーニングが得意とする画像系のデータであっても、従来からある手法(IFやLOF)を
使うことで、ある程度のスコアを出すこともできます。もちろん、こららの手法はテーブルデータ
(表形式のデータ)でもかなりのスコアを出してくれます。これらの手法の良いところは、パラメータ
調整が少ないところです。また、計算時間の短さもメリットが大きいです。

失敗談として、ディープラーニング系の手法をテーブルデータに適用したお話しです。

今やディープラーニングは、画像系をはじめテーブルデータでもSOTA(スコアが最も高い)を
達成するようになってきました。下の表はテーブルデータにディープラーニング系の異常検知
手法(GOAD)を適用したものです。

image.png
(表はClassification-Based Anomaly Detection for General Dataより引用)

しかし、この手法は使ってみると分かるのですが、パラメータ依存性が非常に高く、再現性を
担保することも難しいです。(アフィン変換をランダムに行うのですが、このランダム性が
非常にやっかい)

従って、論文に書いてあるようなスコアを出すためには安定する乱数や、パラメータを見つける
必要があります。さらに、論文では出てこないような調整ノウハウも存在することがあり、
多くの時間が溶ける可能性があります。

使えるコスト・時間・人員を考えて手法を選んだ方が良いです。これらが潤沢にあれば
ディープラーニング系でも良いですし、厳しければIFやLOFを検討しましょう。

ハードウェア編

Q:エッジ処理で異常検知をしたいです。おススメのハードウェアはありますか?
A:価格ならラズパイ4、使いやすさならJetsonNano、安定性ならPCです。

価格でいうとラズパイ4が圧倒的です。5千円強のお値段でディープラーニングが
ある程度の速度で動きます。下の例は異常検知しながら、異常部分を可視化した
例です。

なお、このデモはラズパイ3を使ってMobileNetV2を動かしています。
ラズパイ4で動かすと9FPSくらい出ます。

ただ、ラズパイのセットアップは非常に面倒くさいです。最近は@karaage0703 さんが
こちらでshellコードを公開してくれているため、非常に楽になっています。

JetsonNanoは使いやすいです。価格は1万円強とすこし高いですが、JetCardという
非常に使いやすいパッケージを用意してくれているため、すぐに使えるようになります。
速度はラズパイ4より少し速いです。

これらのハードウェアは価格面、サイズの面で非常に優秀です。しかし、電源の安定性や
熱の問題に細心の注意を払わないと、シャットダウンしてしまうことがあります。
従って、どうしてもダウンしてマズイところはPCを使うのが妥当です。

と書いてきましたが、一番のおススメはやはりラズパイ4です。価格も優れていますが、
実績もあるハードウェアなので、信頼性もある程度高いです。私の経験では、2か月
工場で作動させっぱなし(中では機械学習が動いていた)にしても、問題なく動き
ました。

中級者の方向け

勉強の仕方編

Q:書籍を読んだり、コードを動かしたりしたのですが、飽きました。面白い勉強方法はありませんか?
A:Kaggleなどのコンペに出てみましょう。あるいは、論文を読んでも面白いかもしれません。

コンペに出るのは学びが多いです。メリットは以下のとおりです。

  • 前処理から始まり、コードの管理、手法の検証など一連の作業を学ぶことができる
  • 論文を読む習慣が付く、そして読む速度が速くなる
  • 仮説を考える習慣が身に付く
  • 素晴らしい方とお知り合いになれる

実は最後が非常に重要で、コンペに出るとライバルと呼べる方と知り合えるかもしれません。
ときには、その方とチームを組みディスカッションや論文の紹介など、非常に貴重な情報交換が
できることもあります。また海外の強い人の動向も知ることができ、英語でディスカッション
することもできます。

一人で勉強していては、ゆっくりとした速度でしか成長できません。やはり、仲間やライバルが
いると成長する速度は速く(体感10倍くらい(^^))、お互いに良い刺激を与えることが
できます。

論文読み単独でも面白いときはありますが、やはり論文を読むのは非常に体力が必要です。
従って、これだけやっていても長続きせず、断続的に読むことになる可能性もあります。
しかし、コンペに出れば締め切りが決まっている分、読む速度も速くなりますし、
モチベーションが上がります。コンペ×論文読みセットがおススメです。

前処理編

Q:精度が100%になりました。これ以上やることはないですか?
A:念のため、コードに間違いがないか検証しましょう。

仕事やコンペでデータをいじっていて、精度100%が出たら、その結果は疑ってかかるべきです。
前処理や後処理でミスしている可能性が高いです。

一番手っ取り早い検証方法は、異常スコアをグラフにするべきです。

image.png

上記は異常スコアの一例です。

スコアがこのように入り乱れていると、ある程度信頼できます。
ところが、スコアが完全に二分されていると、前処理や後処理でミスしている可能性が高いです。

ディープラーニングを使っている場合は、下記のように可視化してみて、ちゃんと異常部分を
見ているのか検証してみても良いでしょう。

image.png

私がミスったのは、画像を回転させる前処理を入れたときに、画面の明るさが変わってしまい、
画像の異常部分ではなく、画像の明るさで異常を判定していたときがありました。
一瞬「AUC1.0、ヨッシャー!」となりましたが、幻の結果となりました(^^;

「精度100%は都市伝説」くらいに考えた方が良いです。

手法編

Q:どうしても精度が伸びません。貪欲に最新手法を試すべきでしょうか?
A:今使っている手法でもう少し粘ってみましょう。

異常検知の分野でも、日々最新手法が登場しています。しかし、それらの手法は精度が少し
改善した報告がほとんどです。これらの論文は再現性が担保されていないものも多く、皆さんが
お持ちのデータに適合するかも不明瞭です。データ数が少ないと性能を発揮しないかもしれません。
つまり、最新手法に変えたからといって、うまくいく可能性は非常に低いです。

2~3年に一度、ブレイクスルーとなるような論文も登場しますが、それはいずれ噂となり、皆さん
の耳にも届いてくると思いますので、最新論文に手を出すのはしばらく待ちましょう。
よって、今の手法でもう少し粘るのが時間的に一番有効です。

具体的には、

あとは以下のような前処理が効くときがあります。

  • ぼけた画像を破棄する
  • 正常画像を刻んで細かく検査させる
  • 正常データをいくつかのグループに分けて異常検知する

私の経験談として、一年前に深層距離学習(ArcFace)を使った異常検知を試しました。
その後、深層距離学習の最新手法をいくつか試しましたが、精度は上がりませんでした。
さらに、深層距離学習以外の手法にも手を出しましたが、精度が上がっても少し、中には
再現しなくて精度が下がったものもありました。

つまり、最新手法を試したからといって、精度が劇的に上がることは稀です。
最新手法が出るたびに、それらに手を出していたら、時間が溶けます。

ハードウェア編

Q:ラズパイで異常検知をして、かつ極限まで速度を上げたいです。おススメの手法はありますか?
A:ハードウェアの進化を待つか、職人技(TensorFlow lite)を使いましょう。

ラズパイ4を使えば、モデルのサイズによりますが、10FPSくらいの速度は出ます。
これだけでも非常に使えるシーンはあるかと思います。ただ、それ以上の速度となると
結構険しい道が待っているかもしれません。

TensorFlow liteはモデルを量子化することで、速度が大体2倍になるらしいです。
「らしい」というのは私が使ったことないためです(^^;。この手のモデル変換は結構
ハマることが多く、時間が溶けることが多いです。私は、OpenVINOというIntel製のモデル変換
技術を使ったことがありますが、かなり難儀しました。結局、@PINTO さんのお力を借りて
モデルを若干変更することで何とか変換できました。私一人では無理でした。

つまり、量子化などのモデル変換は、使える人が限られています。かなりの職人技です。
高度な知識・経験が要求されます。これらを使いたい人は、上記の記事や@PINTO さんの
レポジトリなどを参考にしながらチャレンジしてみてください。

最近、JETSON XAVIER NXが発売されました。ラズパイ4が登場して1年も経たないうちに
新たなハードウェアが登場したことになります。速度はJetson Nanoの2倍速いという噂も
聞こえてきます。このようにハードウェアの進化は早く、少し待てば高速なハードウェアが
出てくるかもしれません。高速化したいけど、急がない人はハードウェアの進化を待っても
良いかもしれません。

おわりに

ディープラーニングに対し、かなり懐疑的な内容になってしまいましたが、ディープラーニングは
調整を頑張れば、かなりのスコアを出すことが期待できます。そして、使いこなせるようになると
もはや調整が必要なくなる(勘所が分かる)瞬間が来ます。ここまでくると、こっちのものです。

私の場合、ArcFace+自己教師あり学習が使い慣れていますが、ArcFace側のパラメータをいじる
ことはありません。いじるところはエポック数くらいです。また、ISやLOFのパラメータ調整
もほとんど行いません。従って、一度お馴染みの手法を確立してしまえば、どんな手法を使うのか
頭を悩ませる時間は無くなります。

一番言いたかったのは、新たな案件が来たとして、未知の手法を使うのではなく、まずは
使い慣れた手法でとことん粘ってみましょうということです。結局、新たな手法を使っても、
使い慣れた手法で粘った方が良いスコアが出ます。手法をころころ変えていると、「データでは
なく、手法を見てる」に過ぎないです。

分析で一番時間をかけているのは、学習のさせ方・前処理の工夫・データのクレンジング・
ドメイン知識の勉強など、データの裏側を探索する作業がほとんどです。そこを頑張れば、
時にはAUCで0.2~0.3くらい底上げすることもできますので、辛抱強くデータを見てください。

shinmura0
自己紹介はツイッターをご覧ください。 https://twitter.com/shinmura0
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした