はじめに
この記事はHakusan mafia Advent Calendar 2017の11日目の記事です。
こんにちは、misogyといいます。普段は機械学習を中心に勉強していて, アルバイトでDNNを組んだり, 研究の手伝いでもDNN組んだりしています。
さて今回はDNNを利用した異常値検知について論文とともに紹介できればと思います。
動機
なぜ異常値検知なんてするの?という話は他の記事に譲ります。
異常検知と変化検知のまとめ 数式なし
異常検知の世界へようこそ
まず, 異常値検知を検討する時にデータとして考えられるケースとしては, 正解データの量(異常値)が不正解データ(正常値)に比べて極端に少ないケースが考えられると思います。
そこで、不正解データ(正常値)のデータのみを学習させることで, 異常値データを入れた時に異常な値が帰ってくるので異常と識別するということをします。
論文
LSTM-based Encoder-Decoder for Multi-sensor Anomaly Detection
今回紹介する論文はこちらです。
lstm(EncoderDecoder)を利用して, 不正解データの波のみを学習させることで, decoderサイドが正解データの波を入れた時にうまく波を再現できないことから,異常を検出します。
学習に必要な損失関数は以下で定義します。簡単ですね。
E = \frac{1}{2}\sum_{k=1}^{n}(x_k - x_k')^2
異常値のスコアリングはどうするかというと, 以下のようにガウス分布を定義し,正常値データのみで最尤推定をしてμとΣを計算した後, そのガウス分布上で以下を計算することによって各時系列での異常値を計算します。
e_i = |x_i' - x_i| \\
μ = \frac{1}{N}\sum_{k=1}^{n}e_k \\
Σ = \frac{1}{N}\sum_{k=1}^{n}(e_k - μ)(e_k - μ)^T \\
a_i = (μ-Σ)^TΣ^{-1}(μ-Σ)
a_iが各時間でのscoreです。これが大きいほど異常値が高くなります。
結果
論文に乗っている通りです。
データが手に入らなくて研究に使っているデータでしか再現していないため,載せられません。
ご了承ください..
ソースコード
実装をGithubで載せています。
間違いがあればPull Request歓迎しています。
misogil0116/EncDecAD