Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

DLLab 異常検知ナイト 資料 20180214

4,455 views

Published on

DLLab 異常検知ナイト(エンジニア向け) @ マイクロソフトの発表資料。
前半が外れ値検出アルゴリズムの説明とsklearnを用いたデモ 、後半がディープラーニングを用いた時系列データの異常検知デモ(小松智希による発表)という構成です。

リンク:
- イベントについて:https://dllab.connpass.com/event/77248/
- その他の発表資料など:https://dllab.connpass.com/event/77248/presentation/
- YouTube video:https://www.youtube.com/watch?v=mAvRNKi9UEE&feature=player_embedded

- DLLab: Deep Learning Lab について:http://dllab.ai/

Published in: Technology
  • Be the first to comment

DLLab 異常検知ナイト 資料 20180214

  1. 1. 異常検知ハンズオン DLLab異常検知ナイト 中郷孝祐, 小松智希 Preferred Networks, Inc. 2018/02/14
  2. 2. 目次 ● i.i.d. データの外れ値検出 – 主要な異常検知アルゴリズム実践比較 ● 時系列データのリアルタイム異常検知 – 正常データのみを用いたCNNによる異常検知 2
  3. 3. 主要な異常検知アルゴリズム実践比較 i.i.d. データの外れ値検出
  4. 4. 様々な異常検知アルゴリズム 本ハンズオンでは以下の異常検知アルゴリズムを実際に使用して外れ値検出を行います。 ● Kernel Density Estimation (KDE) ● Gaussian Mixture Model (GMM) ● Local Outlier Factor (LOF) ● Isolation Forest (IF) ● One Class SVM(OCSVM) → 全て scikit-learn の実装を使用 (v0.19.0) ※ 今回の資料は “2.7. Novelty and Outlier Detection” を基に作成しています。 http://scikit-learn.org/stable/modules/outlier_detection.html 4
  5. 5. 外れ値検出 人工データセット ● 外れ値検出 (outlier detection)とは – 全てのデータにラベル(正常・異常)がついていない中で、 とくに振る舞いの異なる点を探す 5
  6. 6. 外れ値検出 人工データセット ● 簡単なデータセットで、外れ値検出を試みる – 正常データ 150点 ○:(-2, -2) or (2, 2) 付近にGaussian noiseを加えて生成 – 外れ値データ 50点 ●:[-7, 7]の空間全体に一様分布している 6 外れ値検出 “異常スコア” 計算
  7. 7. Kernel Density Estimation ● 各データ点 xi にKernel (通常はGaussianを用いる)を重ねることで データ分布 p(x) を表現 ● データの存在確率 p(x) が低いところが異常値と考えられる 7 使用可能なKernel例 http://scikit-learn.org/stable/modules/density.html 4つのデータ点 × に対してKDEを適用した例
  8. 8. Kernel Density Estimation ● 各データ点 xi にKernel (通常はGaussianを用いる)を重ねることで データ分布 p(x) を表現 ● データの存在確率 p(x) が低いところが異常値と考えられる 8 緑色のヒストグラムで与えられるデータ点にKDEを適用
  9. 9. Kernel Density Estimation - hands on - from sklearn.neighbors import KernelDensity clf = KernelDensity(bandwidth=0.2, kernel="gaussian") clf.fit(X) # train model scores_pred = clf.score_samples(X) # return estimated probability -> normality score y_pred = np.where(scores_pred >= threshold, 1, -1) # decide inlier:1 or outlier:-1 9 bandwidth=0.05 bandwidth=0.25 bandwidth=1.0
  10. 10. Kernel Density Estimation - hands on - 10 bandwidth=0.05 bandwidth=0.25 bandwidth=1.0 Hyper parameters bandwidth : 足し合わせるGaussian の 標準偏差の値。大きいほど予測分布 p(x) がなだらかになる。
  11. 11. Gaussian Mixture Model ● データ点の分布を n 個の Gaussian の線形和 で近似し、データ分布 p(x) を表現 – 最適な係数は EMアルゴリズムで求める – データ点数 N が多くなっても KDEより比較的高速に推論できる ● データの存在確率 p(x) が低いところが異常値と考えられる 11 を算出 Expectation- maximization
  12. 12. Gaussian Mixture Model - hands on - from sklearn.mixture import GaussianMixture clf = GaussianMixture(n_components=1, covariance_type='full') clf.fit(X) # train model scores_pred = clf.score_samples(X) # return estimated probability -> normality score y_pred = np.where(scores_pred >= threshold, 1, -1) # decide inlier:1 or outlier:-1 12 n_components=1 n_components=3 n_components=10
  13. 13. Gaussian Mixture Model - hands on - 13 n_components=1 n_components=3 n_components=10 Hyper parameters n_components: 足し合わせるGaussian 数。小さいほど予測分布 p(x) がなだらかになる。
  14. 14. X2(LOF値大) ● Nearest Neighbor 法を拡張したような手法 ● LOF法は周辺のデータとの局所的な関係から異常度を計算 – 密度ベースと書いてあるが実際には距離計算のみから算出 ● 一般の距離ベースの異常値計算手法とは違い、密集度を考慮する – 通常の異常値≒周りのデータへの距離 LOF値≒周りのデータへの距離×周りのデータの密集度 Local Outlier Factor [Breunig, SIGMOD2000] 14 X2 X3 X3(LOF値 小) 分散したデータ集合 密集したデータ集合 X1 X1 (LOF値特 大) https://www.slideshare.net/shoheihido/jubatus-casual2-anomaly より X2 と X3 の異常度はどちらが高い…?
  15. 15. Local Outlier Factor - hands on - 15 from sklearn.neighbors import LocalOutlierFactor clf = LocalOutlierFactor(n_neighbors=20, contamination=0.1) clf.fit(X) # train model scores_pred = clf._decision_function(X) # return float value for “anomaly score” y_pred = clf._predict(X) # return 1 or -1 n_neighbors=10 n_neighbors=35 n_neighbors=80 contamination=0.25 で固定
  16. 16. Local Outlier Factor - hands on - 16 Hyper parameters n_neighbors: 何個のNearest neighborまでを考慮するか 大きいほど緩やかな決定境界面を構成するようになる。 contamination : どの割合のデータまでを outlier とするか。 閾値決定にのみ影響し、異常スコアには影響しない contamination=0.25 で固定 n_neighbors=10 n_neighbors=35 n_neighbors=80
  17. 17. Isolation Forest [Liu et al., 2008] ● 決定木(Decision Tree)の拡張 ● 基本アイデア: 外れ値は正常値に比べて少ない分割数で分離できる →木の深さをスコアとする。 浅い部分で分割されたノードは異常度が高い ● 分割する特徴量・値はランダムに決めて 木を構築 ● 複数の木を作成し、 浅さの平均を最終的な異常スコアとする 17 x < 4? y > 3? y > -3? x < 3?x > -4?y > 5? true false falsefalsetrue true false true false true false true node
  18. 18. Isolation Forest ● 外れ値は少ない条件で分離できる 18 x < 4? y > 3? y > -3? x < 3?x > -4?y > 5? true false falsefalsetrue true false true false true false true node
  19. 19. Isolation Forest - hands on - 19 from sklearn.ensemble import IsolationForest rng = np.random.RandomState(42) clf = IsolationForest(n_estimators=100, max_samples=”auto”, contamination=0.1, random_state=rng) clf.fit(X) # train model scores_pred = clf.decision_function(X) # return float value for “anomaly score” y_pred = clf.predict(X) # return 1 or -1 contamination=0.25 で固定 n_estimators=100, max_samples=200 n_estimators=5, max_samples=200 n_estimators=100, max_samples=20
  20. 20. Isolation Forest - hands on - 20 n_estimators=100, max_samples=200 n_estimators=5, max_samples=200 n_estimators=100, max_samples=20 contamination=0.25 で固定 Hyper parameters n_estimators : 作成する木(弱学習器)の数。多いほど安定しやすいが学習時間がかかる。 max_samples : 各木に対し、何個のデータを用いて学習させるか。多いほど安定しやすいが学習時間がかかる contamination : どの割合のデータまでを outlier とするか。
  21. 21. One Class SVM [Schoelkopf et al., 1999] 21 Manevitz et al, One-Class SVMs for Document Classification, 2001 ● Support Vector Machineの改変版 ● オリジナルデータ空間のサンプルを カーネル関数で特徵空間に射影 ● 元のSVMの目的 – 2クラスを分類する境界面を探す ● OC-SVMの目的 – (1-ρ)割のサンプルを最小の体積に 押し込める境界面を探す ● メリット – 適切なカーネル関数を設計する ことで様々なデータに対応 https://www.slideshare.net/shoheihido/jubatus-casual2-anomaly より
  22. 22. One Class SVM - hands on - from sklearn import svm clf = svm.OneClassSVM(nu=0.5, kernel="rbf", gamma=0.1) clf.fit(X) # train model scores_pred = clf.decision_function(X) # return signed distance to the hyperplane y_pred = clf.predict(X) # return 1 or -1 22 nu=0.3, gamma=0.1 nu=0.9, gamma=0.1 nu=0.3, gamma=0.9
  23. 23. One Class SVM - hands on - Hyper parameters nu: 直感的にはどの割合のデータまでを outlier とするかに対応する。 大きいほど外れ値に対してRobustになる(→細かいデータ分布を無視するようになる) gamma : 使用するKernelの係数に対応。 rbf kernel では、gammaが大きくなるほど細かな挙動をとらえる ようになる 23 nu=0.3, gamma=0.1 nu=0.9, gamma=0.1 nu=0.3, gamma=0.9
  24. 24. 各手法の外れ値検出結果比較 今回は5つの外れ値検出アルゴリズムを 紹介しました 今回のような簡単なベンチマーク データセットではそこまで差は出ません 適用する問題に応じて、 適宜試してみると良さそうです。 24
  25. 25. 手法まとめ 25 アルゴリズ ム KDE GMM LOF IF OCSVM 概要 確率分布p(x)を予測 Non-parametric 確率分布p(x)を予測 Parametric Nearest Neighbor の拡張、密度を考慮 決定木の拡張 木の深さで異常度推定 SVMをラベルなし データに拡張 主用途 Density estimation Density estimation Outlier detection Outlier detection Novelty detection 長所 計算方法が簡単で 分かりやすい Nが大きくなっても 訓練・推論共に高速 Nが大きくなっても 訓練・推論共に 比較的高速 木のアンサンブルで 過学習を防ぐ工夫 Novelty-detection での使用が容易 短所 Nが大きくなると 推論に時間がかかる 初期値依存性が強く 学習が不安定 要ハイパラ チューニング 異常スコアの解釈が 難しい 境界面が複雑に なりがち Nが大きくなると 訓練・推論に時間が かかる 従来手法の苦手分野 ・データ点Nやデータの特徴次元Dが大きくなった場合 ・複雑な非線形変換などの表現 ・時系列データや画像データなどの並進移動不変性の取り扱い Deep learning!
  26. 26. 参考文献 ● scikit-learn document http://scikit-learn.org/stable/ – 特に 2.7. Novelty and Outlier Detection http://scikit-learn.org/stable/modules/outlier_detection.html ● Jubatus Casual Talks #2 異常検知入門 https://www.slideshare.net/shoheihido/jubatus-casual2-anomaly ● Pythonとカーネル密度推定(KDE)について調べたまとめ http://vaaaaaanquish.hatenablog.com/entry/2017/10/29/181949 ● 外れ値検出のアルゴリズム Isolation Forest https://www.slideshare.net/shogoosawa581/2-isolation-forest ● What is the computational complexity of an SVM? https://www.quora.com/What-is-the-computational-complexity-of-an-SVM ● Breunig, Kriegel, Ng, and Sander (2000) LOF: identifying density-based local outliers. Proc. ACM SIGMOD ● Liu, Fei Tony, Ting, Kai Ming and Zhou, Zhi-Hua. “Isolation forest.” Data Mining, 2008. ICDM‘08. Eighth IEEE International Conference on. ● Estimating the support of a high-dimensional distribution Schölkopf, Bernhard, et al. Neural computation 13.7 (2001): 1443-1471.
  27. 27. 時系列データのリアルタイム異常検知
  28. 28. 時系列データのリアルタイム異常検知 時系列データの異常検知の需要は大きい 例えば・・・ ● ラインで動いているロボットが完全に壊れる前に対処したい ● 攻撃を検知するためにトラフィックが異常になった際にアラートを上げたい ● 保有している株の急激な値動きのアラートを出したい ● スマートウォッチで記録している心電図の異常を検知したい このセッションでは、特定パターンで動作するマシンの異常を想定します
  29. 29. 自己回帰モデルによる異常検知 簡単な異常検知手法として、 自己回帰モデルを使った手法がある 時系列データの直前のn点から、次にとる点を 予測する 予測値 直前のN点で線形回帰をし ただけ
  30. 30. 自己回帰モデルによる異常検知 簡単な異常検知手法として、 自己回帰モデルを使った手法がある 時系列データの直前のn点から、次にとる点を 予測する 予測誤差が大きければ、何か異常が起きてい ると判断できる 予測値 直前のN点で線形回帰をし ただけ 実測値 予測誤差
  31. 31. 自己回帰モデルによる異常検知 簡単な異常検知手法として、 自己回帰モデルを使った手法がある 時系列データの直前のn点から、次にとる点を 予測する 予測誤差が大きければ、何か異常が起きてい ると判断できる 線形回帰は表現力が弱いため、 非線形な要素が強い波形に対しては適用が難 しい 線形回帰でやる必要はないので、 ここをディープラーニングに置き換えてみよ う 予測値 直前のN点で線形回帰をし ただけ 実測値 予測誤差 Deep Learning (CNN)
  32. 32. CNNで異常検知 異常データは珍しいためデータが少ないが、 この手法では正常データだけを予測できれば良いので、正常データだけで学習する 次の1ステップ先のデータが、 どのグリッドに入るかを確率値として予測するモデルを構築 グリッドごとの確率にした理由は、多峰性な分布も扱えるため 入力波形
  33. 33. CNNで異常検知 異常データは珍しいためデータが少ないが、 この手法では正常データだけを予測できれば良いので、正常データだけで学習する 次の1ステップ先のデータが、 どのグリッドに入るかを確率値として予測するモデルを構築 グリッドごとの確率にした理由は、多峰性な分布も扱えるため 0.1 0.1 0.4 0.2 0.1 0.1 0.0入力波形 次はこのグリッド に 入りそう
  34. 34. CNNで異常検知 異常データは珍しいためデータが少ないが、 この手法では正常データだけを予測できれば良いので、正常データだけで学習する 次の1ステップ先のデータが、 どのグリッドに入るかを確率値として予測するモデルを構築 グリッドごとの確率にした理由は、多峰性な分布も扱えるため 正常データで予測しているので、これは非常によく当たる 入力波形
  35. 35. CNNで異常検知 異常データは珍しいためデータが少ないが、 この手法では正常データだけを予測できれば良いので、正常データだけで学習する 次の1ステップ先のデータが、 どのグリッドに入るかを確率値として予測するモデルを構築 グリッドごとの確率にした理由は、多峰性な分布も扱えるため 正常データで予測しているので、これは非常によく当たる 正常データだけで学習したモデルで、 異常データを予測するとどうなるか? 0.4 0.2 0.1 0.1 0.1 0.1 0.0入力波形
  36. 36. CNNで異常検知 異常データが少ないので、正常と異常の2値分類をする学習は難しい 正常データだけで学習する 次の1ステップ先のデータが、 どのグリッドに入るかを確率値として予測するモデルを構築 グリッドごとの確率にした理由は、多峰性な分布も扱えるため 正常データで予測しているので、これは非常によく当たる 正常データだけで学習したモデルで、 異常データを予測するとどうなるか? 学習データに含まれていないデータは予測できない 予測のはずれ具合を異常度として扱うことができる 入力波形
  37. 37. 異常検知をしてみよう 2つの正弦波とガウスノイズを合成し、 素朴な方法では検知しにくい波形を作成 これが正常データ Special thanks: Dataset created by Daisuke Motoki
  38. 38. 異常パターン1 どの部分が異常か分かりますか?
  39. 39. 異常パターン1 この例はかなり分かりやすいと思います ある区間だけガウスノイズだけの 波形になっています
  40. 40. 異常パターン1 モデルの出力結果です 赤線が実測値 後ろのヒートマップが確率値を表す 予測に成功すると、 明るい色と赤線が重なる
  41. 41. 異常パターン1 モデルの出力結果です 赤線が実測値 後ろのヒートマップが確率値を表す 予測に成功すると、 明るい色と赤線が重なる 対数尤度を反転させたものをプロット 異常の部分だけ高い値をとっている! 異常が検知できた
  42. 42. 異常パターン2 どの部分が異常か分かりますか? 前のパターンより難しいと思います
  43. 43. 異常パターン2 20回サンプリングした結果を 重ねて図示するとはっきりわかります ある一定区間だけ、 ガウスノイズの分散が大きいです
  44. 44. 異常パターン2
  45. 45. 異常パターン3 もう少し難しい例です どんな異常か分かりますか?
  46. 46. 異常パターン3 含まれる周波数の成分が違いました
  47. 47. 異常パターン3
  48. 48. ここで疑問 Q. ぱっとみすごいように見えるけれど、 正常の波形が固定のパターンだから、パターンマッチでとれませんか? 重ねたらはっきり違いが見えるし、 正常パターン丸暗記して、 差分をとれば検知できるので は?????
  49. 49. ここで疑問 Q. ぱっとみすごいように見えるけれど、 正常の波形が固定のパターンだから、パターンマッチでとれませんか? A. この例だと、検知できますね 周期的なパターンに対する異常検知の場合、 k-近傍法のような手法の方が適していると思います
  50. 50. ここで疑問 Q. ぱっとみすごいように見えるけれど、 正常の波形が固定のパターンだから、パターンマッチでとれませんか? A. この例だと、検知できますね 周期的なパターンに対する異常検知の場合、 k-近傍法のような手法の方が適していると思います Q. 異常検知簡単では???????????????? A. 簡単じゃないです!! もっと難しいケースを考えましょう
  51. 51. 複数チャンネルの異常検知(相関異常)をとる 複数のセンサーを同時に見て、初めて異常と分かるケースは難しい 例として、簡単な例題を考える ● 動作モード1, 2があるマシンがあり、各モードでは固有の動作をしている ● 動作モードを命令するパルス波がある(タイミングはランダム) ● ちゃんとマシンが命令に従っているか検知したい
  52. 52. 正常な例 mode 1 mode 0 mode 1 上のグラフがセンサー値 下のグラフが動作モードを表す モード1は高い周波数で振幅も大 きい モード0は低周波で振幅も小さい
  53. 53. 異常な例 上のグラフがセンサー値 下のグラフが動作モードを表す モード1は高い周波数で振幅も大 きい モード0は低周波で振幅も小さい これは異常パターン 後半で命令と反対のことを実行し ている 一見簡単に見えるが・・・ mode 1 mode 0 mode 1 mode 0 mode 1
  54. 54. 異常な例 上のグラフがセンサー値 下のグラフが動作モードを表す モード1は高い周波数で振幅も大 きい モード0は低周波で振幅も小さい これは異常パターン 後半で命令と反対のことを実行し ている 一見簡単に見えるが・・・ これだけを見ても異常は検知でき ない
  55. 55. 異常な例 上のグラフがセンサー値 下のグラフが動作モードを表す モード1は高い周波数で振幅も大き い モード0は低周波で振幅も小さい これは異常パターン 後半で命令と反対のことを実行して いる 一見簡単に見えるが・・・ これだけを見ても異常は検知できな い 逆にこちらの波形だけを見ても検知 できない 丸暗記で検知は難しい
  56. 56. 正常な例で試した結果 正常データでは、異常度は高くな らない
  57. 57. 異常な例で試した結果 正常データでは、異常度は高くな らない 異常データでは、 後半の予測が全然当たっていな い!! 異常を検知できた
  58. 58. まとめ CNNを使った異常検知手法を紹介しました! 現実の応用では相関異常をとる需要は多そう 例えば・・・ ● 外気温センサーと監視マシンの温度センサを見る ● 外気温が下がるとマシンの温度も下がる ● マシンが熱暴走していないか監視したい CNNは相関異常もとれるので、ぜひ試してみてね
  59. 59. End Special thanks Daisuke Motoki

×