Telemanom:LSTM予測残差と動的閾値で宇宙機テレメトリの異常を検知する

地上からコマンドを送り、宇宙機がどう応答したかを電流・電圧・温度・各種状態量として記録したテレメトリデータ。このデータに「異常らしきもの」が出たとき、警告を鳴らすか否かを判断するのが異常検知システムの役割です。

しかし、宇宙機の動作はコマンドシーケンスに強く依存します。推進系モジュールへのコマンドが送られた直後にバルブの開度が変化するのは「正常な応答」ですが、何のコマンドも送っていないのに同じ変化が起きたなら「異常」と判断すべきです。従来のルールベース手法(Out-Of-Limit: OOL アラーム)はこのような文脈を考慮できず、コマンド発行のたびに大量の偽陽性を生み出していました。

Hundman ら(NASA ジェット推進研究所・カリフォルニア工科大学)が 2018 年の KDD で発表した Telemanom は、この問題に正面から向き合いました。LSTM を使ってコマンド情報を入力に含めた予測器を構築し、予測と実測の残差から異常を判断するシステムです。残差の閾値設定にはガウス分布を仮定しないノンパラメトリック動的閾値を採用し、さらにpruning(剪定)で偽陽性を大幅に削減します。

この手法が有力な理由は 2 つあります。第一に、NASA の実際のテレメトリデータ(SMAP・MSL)を用いた公開ベンチマークデータセットを伴って発表されており、後続研究の評価基準として広く使われています。第二に、「コマンドを外生変数として残差を計算する」というアイデアが、後の条件付き異常検知の原型になっているからです。本記事ではアーキテクチャの隅々まで分解し、「なぜこの設計で動くのか」を腹落ちできるレベルで解説します。

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。


1. 従来手法の限界と Telemanom の着想

OOL アラームの問題

宇宙機の監視システムで長年使われてきた OOL(Out-Of-Limit)アラームは、各テレメトリチャネルに上限・下限を設定し、その範囲を逸脱したら警告を発する仕組みです。シンプルで実装が容易ですが、根本的な欠点があります。

  • 文脈を無視する: コマンドが送られた後の「正常な応答」も、値が範囲外になれば警告を鳴らす
  • チャネル間の関係を無視する: あるチャネルの値が別のチャネルと「整合していない」という異常を検出できない
  • 人手でのルール設定が必要: システムが複雑になるほどルールの数が爆発し、管理が困難になる

Hundman らが見据えた問題意識は明確です。「閾値ベースのアラームは点異常(単一時刻の値が逸脱する)には対応できても、前後の文脈があって初めて「異常」とわかる文脈異常(contextual anomaly)を検出できない」。

予測残差という発想

Telemanom のコアアイデアは予測器の残差を異常スコアにするというシンプルな考え方です。

正常な動作パターンを学習した予測器があれば、次の時刻の値を「こうなるはずだ」と予測できます。実際の値がその予測から大きくずれていれば、それは「学習した正常パターンから外れている」 = 異常の兆候と見なせます。

重要なのは、コマンド情報を予測器の入力に含める点です。「このコマンドシーケンスが送られた後、テレメトリ値は○○になるはずだ」という予測ができれば、コマンドに起因する正常な変化を「異常ではない」と正しく判断できます。これは TICC のレジーム発見や TAAD の運転条件分離と通底する発想で、「文脈を予測器に与える」ことで条件付き異常検知を実現します(条件付き異常検知:コマンドと関係ベースのアプローチ も参照)。

Telemanom の全体構成

Telemanom は大きく 3 つのモジュールで構成されます。

  1. 予測モジュール: チャネルごとの LSTM が、コマンド情報と過去テレメトリ値から次の値を予測
  2. 閾値モジュール: 予測残差の EWMA(指数加重移動平均)平滑化値に対して、ノンパラメトリック動的閾値を設定
  3. pruning モジュール: 検出された異常シーケンスから偽陽性を除去し、最終的な異常判定を出力

この 3 段構成を順番に深掘りしていきましょう。


2. 入力の構造:コマンドを one-hot エンコードする

Telemanom の設計で最初に目を引くのが、入力行列の構造です。

Telemanom 入力行列:テレメトリ値とコマンド履歴を組み合わせた入力表現

出典: Hundman et al., KDD 2018, Fig. 1

Fig. 1 はある時刻 $t$ における入力行列 $X$ を示しています。各列が 1 タイムステップに対応し、行には「コマンド送受信のフラグ」と「テレメトリの実測値」が積み重なっています。一番下の行(青くハイライトされた部分)がテレメトリの実測値 $y$ で、その上の行群がコマンド情報です。

入力行列の数学的表現

時刻 $t$ の時系列は $X = \{x^{(1)}, x^{(2)}, \ldots, x^{(n)}\}$ で表されます。各ステップの値は $m$ 次元ベクトル $x^{(t)} \in \mathbb{R}^m$($m$ 個の入力変数に対応)です。

時刻 $t$ の入力ベクトル $\bm{x}^{(t)}$ は次のように構成されます。

$$ \bm{x}^{(t)} = \begin{bmatrix} c_1^{(t)} \\ c_2^{(t)} \\ \vdots \\ c_k^{(t)} \\ y^{(t)} \end{bmatrix} \in \mathbb{R}^m, \quad m = k + 1 $$

ここで $c_i^{(t)} \in \{0, 1\}$ は「時刻 $t$ において $i$ 番目のコマンドが送信または受信されたかどうか」を表す二値フラグ($k$ 種類)、$y^{(t)}$ は対象チャネルのテレメトリ実測値です。SMAP では $k = 24$(コマンド種類数)、MSL では $k = 54$ であり、それぞれ入力次元が $m = 25$、$m = 55$ になります。

コマンドの one-hot エンコードが重要な理由

Telemanom コマンドone-hotエンコード:コマンド送受信を0/1バイナリで入力に変換

出典: Hundman et al., KDD 2018, Fig. 3(上部)

Fig. 3 の上部は、6 タイムステップ($t = 106$ から $t = 111$)にわたる入力 $X$ の具体的な数値例です。「Module A にコマンド送信」「Module A からコマンド受信」「Module B にコマンド送信」など、各コマンドに独立した行が割り当てられています。$t = 107$ では Module A にコマンドが送信され、$t = 108$ では受信、$t = 110$ では Module B に送信——というシーケンスが、ベクトルの0/1パターンとして明確に表現されています。

この表現には大きなメリットがあります。たとえばバルブの開放コマンドが $t = 107$ に送られた後、$t = 108$ からテレメトリ値が変化したとします。LSTM はこの「コマンド → 応答」という時系列パターンを学習するので、同じコマンドシーケンスに続く同様の変化を「正常な応答」として予測できます。

予測と残差の計算: LSTM が予測値 $\hat{y}^{(t)}$ を出力すると、残差 $e^{(t)} = |\hat{y}^{(t)} – y^{(t)}|$ を計算します。Fig. 3 の例では、予測 $\hat{y}$ と実測 $y$ の差がほぼゼロに近く、残差 $e$ が極めて小さい(.01〜.04 オーダー)ことが見て取れます。これが正常時の残差の様子です。

SMAP と MSL のデータセット仕様

Telemanom が使用した SMAP(Soil Moisture Active Passive)と MSL(Mars Science Laboratory Curiosity Rover)のデータセットは、NASA の実際のテレメトリから抽出されたものです。

Telemanom データセット統計:SMAP/MSLの異常シーケンス数と点異常・文脈異常の内訳

出典: Hundman et al., KDD 2018, Table 1

Table 1 から読み取れる重要な数字を整理します。SMAP は 55 チャネル、MSL は 27 チャネルで、合計 82 の独立したテレメトリストリームを持ちます。全体で 105 の異常シーケンスが存在し、そのうち 59% が点異常(単発の値の逸脱)、41% が文脈異常(コマンドや時系列文脈との不整合)です。評価対象となったテレメトリ値の総数は約 50 万点にのぼります。

SMAP 入力次元が 25、MSL が 55 である理由: SMAP のテレメトリ値は 1 次元(単一チャネル)ですが、そのチャネルを監視するために参照されるコマンドの種類が SMAP では 24 種類あり、合計入力次元が $24 + 1 = 25$ になります。MSL では関連コマンドが 54 種類あり $54 + 1 = 55$ となります。この「コマンド数 + 1」という構造が per-channel LSTM の設計意図と整合しています。

文脈異常が 41% を占めるという事実は、OOL アラームだけでは対応できない異常が半分近くを占めることを意味します。Telemanom の設計がこの種の異常を狙い打ちにしていることが確認できます。


3. LSTM アーキテクチャ:チャネルごとの独立予測器

なぜチャネルごとに独立した LSTM を使うのか

多変量時系列の予測には、全チャネルをまとめて一つの大きなモデルに入れるアプローチが考えられます。しかし Telemanom はあえてチャネルごとに独立した LSTM 予測器を使います。

この設計の動機は明確です。まず、チャネルの数(82 チャネル)と各チャネルのダイナミクスの多様性を考えると、単一の大きなモデルでは「平均的な振る舞い」しか学習できず、個別チャネルの微細な異常パターンを捉えにくくなります。次に、チャネルごとに独立させることで、異常のトレーサビリティが保たれます。どのチャネルのモデルが大きな残差を出したか、そのチャネルにどのコマンドが関連しているか、という情報を後から追跡できるのです。

さらに、チャネルごとのモデルは並列学習・並列推論が可能で、実際の運用(大量のデータをリアルタイム処理する必要がある)にも適しています。

Telemanom LSTMアーキテクチャ:チャネルごとの独立予測器と残差ベクトル

出典: Hundman et al., KDD 2018, Fig. 1(全体)

Fig. 1 の全体像を見ると、入力行列 $X$ の各列(タイムステップ)が時系列として LSTM に流れ込み、最後のステップで予測 $\hat{y}^{(t)}$ が出力される様子が分かります。現在の予測誤差 $e^{(t)}$ は過去の誤差ベクトル $\bm{e}$ に追記されていき、この誤差ベクトルが閾値判定モジュールに渡されます。

モデルパラメータの詳細

Telemanom モデルパラメータ:隠れ層80ユニット×2層、系列長250の設定

出典: Hundman et al., KDD 2018, Section 4.2

モデルパラメータ表から読み取れる設定値を確認しましょう。隠れ層は 2 層(hidden layers = 2)、各層のユニット数は 80(units in hidden layers = 80)、系列長は $l_s = 250$(sequence length)、学習イテレーション数は 35(training iterations)です。dropout は 0.3、バッチサイズは 64、オプティマイザは Adam を使用しています。

系列長 250 という設定が特に重要です。LSTM は過去 250 タイムステップ分のコマンドとテレメトリを「文脈」として参照して予測を行います。これは 1 タイムステップが数秒〜数分のデータでは数時間分に相当し、現在の観測がどのようなコマンドシーケンスの下で行われているかを把握するのに十分な長さです。

予測の定式化

時刻 $t$ における入力行列は過去 $l_s$ タイムステップのデータを含みます(系列長 $l_s = 250$)。

$$ X^{(t)} = \begin{bmatrix} \bm{x}^{(t – l_s)}, \quad \bm{x}^{(t – l_s + 1)}, \quad \ldots, \quad \bm{x}^{(t-1)} \end{bmatrix} $$

ここで各 $\bm{x}^{(\tau)}$ はコマンドフラグとテレメトリ値を積み重ねた入力ベクトルです。LSTM はこの行列を受け取り、予測長 $l_p = 1$(1 ステップ先)で対象チャネルのテレメトリ値 $\hat{y}^{(t)}$ を出力します。

$$ \hat{y}^{(t)} = f_{\text{LSTM}}\!\left(X^{(t)}\right), \quad \hat{y}^{(t)} \in \mathbb{R}^1 $$

予測が $l_p > 1$ や $d > 1$ の場合はガウスパラメータで複数ステップをまとめて表現できますが、今回は $d = 1$、$l_p = 1$ に固定します(論文 Section 3.1)。

残差(予測誤差)は絶対値で定義されます。

$$ e^{(t)} = \left|y^{(t)} – \hat{y}^{(t)}\right|, \quad \text{ただし } y^{(t)} = x_i^{(t+1)} $$

ここで $y^{(t)}$ は「時刻 $t$ の予測対象」であり、実際には次のステップ $t+1$ の実測値 $x_i^{(t+1)}$(添字 $i$ は対象チャネルの次元)に対応します。LSTM は $x^{(t-l_s)}, \ldots, x^{(t-1)}$ を受け取り、1 ステップ後の $x_i^{(t)}$ を予測するという「1 ステップ先予測」の構成です。

誤差ベクトル $\bm{e}$ の構成: 各ステップの誤差 $e^{(t)}$ を時刻順に並べた 1 次元ベクトルを構築します。

$$ \bm{e} = \bigl[e^{(t-h)},\ e^{(t-h+1)},\ \ldots,\ e^{(t-l_s)},\ \ldots,\ e^{(t-1)},\ e^{(t)}\bigr] $$

$h$ は現在の誤差を評価するために参照する過去の誤差数(論文の実装では $h = 2100$、70 分バッチ × 30 バッチ分に相当)。このベクトル $\bm{e}$ 全体が閾値モジュールへの入力となります。

学習時には、過去の誤差 $e^{(t-1)}, e^{(t-2)}, \ldots$ を入力に追加することで、モデルが「残差のパターン」自体も学習できるようになっています。たとえばコマンド直後には残差が一時的に大きくなるが、数ステップ後に小さくなるという繰り返しパターンを学習することで、コマンド応答期間中の誤検知をさらに抑制できます。

学習が完了した後、テスト期間のデータに対して 1 ステップ先の予測を逐次行い、残差時系列 $\bm{e}$ を生成します。この残差時系列に対して次のモジュールが動的閾値を設定します。

バッチ処理の実装: 論文の実装では、テレメトリ値を 1 分ウィンドウで集約し、70 分分(= 70 タイムステップ)のバッチ単位で評価します(SMAP のダウンリンクスケジュールに対応)。各バッチの評価に使う過去誤差数は $h = 2100$(70 × 30、約 35 時間分)です。


4. EWMA 平滑化と動的閾値

予測残差 $e^{(t)}$ をそのまま閾値と比較すると、ランダムなスパイク(いわゆる外れ値)に過敏に反応してしまいます。LSTM ベースの予測器でも、急激な値変化を完全には吸収できないため、単発のスパイクが偽陽性を引き起こします。Telemanom ではこれを指数加重移動平均(EWMA)平滑化で緩和します。

EWMA による残差平滑化

EWMA 平滑化残差 $e_s^{(t)}$ は再帰式で定義されます。

$$ e_s^{(t)} = \alpha \cdot e^{(t)} + (1 – \alpha) \cdot e_s^{(t-1)} $$

ここで $\alpha \in (0, 1)$ は平滑化係数で、小さいほど過去の残差を重く参照します。

この再帰を $\bm{e}$ の全要素に適用し、平滑化誤差ベクトル $\bm{e}_s$ を得ます。

$$ \bm{e}_s = \bigl[e_s^{(t-h)},\ e_s^{(t-h+1)},\ \ldots,\ e_s^{(t-l_s)},\ \ldots,\ e_s^{(t-1)},\ e_s^{(t)}\bigr] $$

$\bm{e}_s$ は $\bm{e}$ と同じ長さの 1 次元ベクトルです。以降のすべての閾値計算はこの $\bm{e}_s$ を対象とします。

直感的に言えば、EWMA は「加重移動平均」です。直近の残差だけでなく、その前の残差にも指数的に減衰する重みをかけて平均するので、単発スパイクは小さく、持続的な逸脱は大きく残ります。正常時のランダムなノイズによる残差のスパイクは 1 〜 2 ステップで終わりますが、真の異常は連続した大きな残差として現れることが多く、EWMA がこの性質を「増幅」します。

Fig. 3 の具体例(上で引用した入力行列の右下)を見ると、生の残差 $e$ が 0.01〜0.04 の間で揺れているのに対し、平滑化残差 $e_s$ は .012〜.017 のより安定した値になっています。このスケールの残差は「正常」と判定されます。

動的閾値の設定:ノンパラメトリックアプローチ

閾値を決める最も単純な方法は「平均 + $z$ × 標準偏差」というガウス分布を仮定したアプローチです。しかし宇宙機テレメトリの残差分布はガウス分布に従わないことが多く、この方法では閾値が不適切になります。

Telemanom が提案するのはノンパラメトリック動的閾値で、閾値 $\epsilon$ を「残差のヒストグラムから適切な百分位点」として決めるのではなく、閾値設定の「効果」が最大になる $\epsilon$ をデータから直接探すという考え方です。

具体的には、候補閾値の集合から最適な $\epsilon$ を選びます。

候補閾値はまず

$$ \epsilon = \mu(\bm{e}_s) + z \cdot \sigma(\bm{e}_s) $$

という形で、$z \in \{2.5, 3.0, 3.5, \ldots, 10.0\}$ を走査して生成します。ここで $\mu(\bm{e}_s)$、$\sigma(\bm{e}_s)$ はそれぞれ平滑化残差の平均と標準偏差です。

これで候補 $\epsilon$ が得られたとして、どの候補が最も良いかをどう判断するのでしょうか。

argmax による最適閾値の選択

Telemanom 閾値計算式:argmax epsilon の最適化とEWMA平滑化残差

出典: Hundman et al., KDD 2018, Section 3.2

Telemanom は最適な $\epsilon$ を次の argmax で選びます(論文 Section 3.2)。

$$ \epsilon^* = \operatorname{argmax}_{\epsilon}\ \frac{\Delta\mu(\bm{e}_s) / \mu(\bm{e}_s) + \Delta\sigma(\bm{e}_s) / \sigma(\bm{e}_s)}{|\bm{e}_a| + |\bm{E}_{\text{seq}}|^2} $$

各項を厳密に定義します。

$$ \bm{e}_a = \{e_s \in \bm{e}_s \mid e_s > \epsilon\} \quad \text{(閾値を超えた平滑化残差の集合)} $$

$$ \Delta\mu(\bm{e}_s) = \mu(\bm{e}_s) – \mu\!\bigl(\{e_s \in \bm{e}_s \mid e_s < \epsilon\}\bigr) $$

$$ \Delta\sigma(\bm{e}_s) = \sigma(\bm{e}_s) – \sigma\!\bigl(\{e_s \in \bm{e}_s \mid e_s < \epsilon\}\bigr) $$

$$ \bm{E}_{\text{seq}} = \text{($\bm{e}_a$ に属する誤差の連続シーケンスの集合)} $$

つまり $\Delta\mu$ は「$\bm{e}_s$ 全体の平均」から「閾値以下の残差だけの平均」を引いた量で、閾値以上の残差を取り除いたとき平均がどれだけ減るかを表します。$\Delta\sigma$ も同様です。

各記号の次元と意味をまとめると:

記号 意味
$\bm{e}_s$ $\mathbb{R}^h$ ベクトル 平滑化誤差の時系列
$\epsilon$ スカラー 候補閾値($z \in \{2.5, 3.0, \ldots, 10.0\}$ で走査)
$\bm{e}_a$ スカラー集合 $\epsilon$ 超の平滑化残差
$\bm{E}_{\text{seq}}$ シーケンス集合 $\bm{e}_a$ 内の連続ブロック
$|\bm{e}_a|$ 整数 $\epsilon$ 超の残差の個数
$|\bm{E}_{\text{seq}}|$ 整数 連続異常ブロックの本数

分子 — 「閾値 $\epsilon$ を使ったときの平均・標準偏差の相対的減少率」の和。良い閾値は「閾値以上の残差を除くと分布がきれいに縮む」という性質をもつので、この値が大きい。

分母 — 過剰検知へのペナルティ。$|\bm{e}_a|$ が大きい(多数を異常判定)と分母が増えスコアが下がる。$|\bm{E}_{\text{seq}}|^2$ は二乗ペナルティで、「多数の短い孤立異常」より「少数の長い連続異常」を強く好むバイアスを与える(真の異常は連続シーケンスとして現れやすいという経験則)。

この argmax を計算することで、ガウス分布を仮定せずに「データ分布に最も適した閾値」を自動的に選べます。

閾値の適用と異常判定

最適閾値 $\epsilon^*$ が決まると、各タイムステップの平滑化残差を判定します。

$$ \text{異常}_t = \begin{cases} 1 & \text{if } e_s^{(t)} > \epsilon^* \\ 0 & \text{otherwise} \end{cases} $$

連続した異常タイムステップをひとまとめにして「異常シーケンス(anomalous sequence)」とします。たとえば $t = 200$ 〜 $t = 215$ が連続して閾値を超えていれば、これが 1 本の異常シーケンスです。

ここまでで、予測→残差→平滑化→閾値最適化→異常シーケンス検出、という流れが完成しました。しかし、このままでは偽陽性が多く残ります。そこで第三のモジュール、pruning が登場します。


5. pruning:偽陽性を動的に除去する

pruning の動機

Fig. 3 の下部(文脈異常の例)を改めて確認しましょう。

Telemanom 文脈異常の例:LSTM予測残差の平滑化と閾値による検出

出典: Hundman et al., KDD 2018, Fig. 3(下部)

この時系列には「False Positive」と「True Positive」がラベルされています。False Positive のピークは確かに閾値を超えていますが、大域的に見ると、この程度の振れ幅は当該チャネルで「普通によく起きる」レベルです。一方 True Positive は、同チャネルの過去の振る舞いと比べてもはっきりと突出したシーケンスです。

pruning はこの「大域的な文脈での相対的な大きさ」を使って偽陽性を除去します。

pruning アルゴリズム

Telemanom プルーニングとスコア計算:偽陽性削減と異常度スコアの正規化

出典: Hundman et al., KDD 2018, Section 3.3

Telemanom 動的閾値のプルーニング:Anomaly 1は再分類、Anomaly 2はkeepの例

出典: Hundman et al., KDD 2018, Fig. 2

Fig. 2 は pruning の具体的な動作を示しています。このシナリオでは異常シーケンスが 2 本(Anomaly 1 と Anomaly 2)あり、最小パーセント減少 $p = 0.1$ を設定しています。

pruning アルゴリズムの正確な手順(論文 Section 3.3):

Step 1: 各異常シーケンス $e_{\text{seq}} \in \bm{E}_{\text{seq}}$ の最大平滑化残差 $\max(e_{\text{seq}})$ を取り出し、降順にソートした集合 $\bm{e}_{\max}$ を構築する。さらに、異常に分類されていない残差の最大値 $\max(\{e_s \in \bm{e}_s \mid e_s \notin \bm{e}_a\})$ を $\bm{e}_{\max}$ の末尾に追加する。

$$ \bm{e}_{\max} = \bigl[e_{\max}^{(1)},\ e_{\max}^{(2)},\ \ldots,\ e_{\max}^{(|\bm{E}_{\text{seq}}|)},\ e_{\max}^{(|\bm{E}_{\text{seq}}|+1)}\bigr] $$

(末尾の要素は「最も大きい正常残差」で、$i$ の添字は $i \in \{1, 2, \ldots, |\bm{E}_{\text{seq}}| + 1\}$。)

Step 2: インデックス $i = 1$ から順に、1 つ前の要素との比率的減少を計算する。

$$ d^{(i)} = \frac{e_{\max}^{(i-1)} – e_{\max}^{(i)}}{e_{\max}^{(i-1)}}, \quad i \in \{1, 2, \ldots, |\bm{E}_{\text{seq}}| + 1\} $$

($e_{\max}^{(i-1)} > e_{\max}^{(i)}$ なので $d^{(i)} \geq 0$。)

Step 3: あるステップ $i$ で $d^{(i)} \geq p$ を満たした場合 → インデックス $j < i$ の全シーケンス(= より大きい最大残差を持つグループ)は 異常のままキープする。$d^{(i)} < p$ になった時点(および以降のすべての $i$)のシーケンスを正常に再分類する。

Fig. 2 の例で確認($p = 0.1$):

$\bm{e}_{\max} = [0.01396,\ 0.01072,\ 0.00994]$(最後の 0.00994 は最大の正常残差)

  • $i = 1$: $d^{(1)} = (0.01396 – 0.01072) / 0.01396 = 0.232 \geq p$ → Anomaly 2(最大残差 0.01396)はキープ
  • $i = 2$: $d^{(2)} = (0.01072 – 0.00994) / 0.01072 = 0.073 < p$ → Anomaly 1(最大残差 0.01072)以降は正常に再分類

Anomaly 2 は最大残差が飛び出ており保持され、Anomaly 1 は次の残差値との差が小さく「通常の変動範囲内」と判断されて除去されます。

ここで $p = 0.13$(実験結果に基づく)。$p$ を大きくするとより積極的に剪定を行い適合率が上がりますが、再現率が下がります。$p$ を小さくすると逆の傾向になります。論文では $0.05 < p < 0.20$ の範囲で安定した結果が得られたと報告しています。

このアルゴリズムの本質は「同じチャネルの異常シーケンスを相対比較する」ことにあります。最大残差が急激に落ちる「ステップ」を見つけ、そこより小さい残差の異常をまとめてカットします。真の異常は他の異常候補より「一段突出」する傾向があるという経験則を利用したヒューリスティックです。


6. 異常スコアの計算

pruning を経て残った真の異常シーケンスに対して、最終的な異常度スコア $s$ を計算します(論文 Section 3.2)。

$$ s^{(i)} = \frac{\max\!\left(e_{\text{seq}}^{(i)}\right) – \epsilon^*}{\mu(\bm{e}_s) + \sigma(\bm{e}_s)} $$

ここで:

  • $e_{\text{seq}}^{(i)}$:$i$ 番目の異常シーケンス内の平滑化残差の集合($\bm{E}_{\text{seq}}$ の第 $i$ 要素)
  • $\max(e_{\text{seq}}^{(i)})$:そのシーケンスの最大平滑化残差
  • $\epsilon^* = \operatorname{argmax}_\epsilon(\cdot)$:Section 4 の argmax で決定した最適閾値(スカラー値)
  • $\mu(\bm{e}_s)$、$\sigma(\bm{e}_s)$:$\bm{e}_s$ 全体の平均と標準偏差

分子 は「その異常シーケンスの最大残差が最適閾値をどれだけ超えているか」(どれだけ突出しているか)を表します。

分母 はチャネル全体の残差分布の「典型的な広がり」(平均 + 標準偏差)です。これで割ることで、スコアがチャネルのスケールに依存しなくなります。温度センサーと電圧センサーのように単位が異なるチャネルを比較可能な共通スケールに正規化します。

$$ s^{(i)} = \frac{\text{(最大残差 − 閾値)}}{\text{(チャネルの残差の典型的な大きさ)}} $$

スコアが高いほど「大きな異常」です。このスコアを使って異常の優先順位付けを行い、監視チームが最初に確認すべきシーケンスを特定します。

履歴を使った偽陽性の追加抑制(論文 Section 3.3): ある程度の運用実績(ラベル付き異常履歴)が蓄積された場合、チャネルごとに最小スコア $s_{\min}$ を設定できます。$s < s_{\min}$ となった異常は正常に再分類します。$s_{\min}$ は「過去の偽陽性のスコア上限」付近に設定すると効果的で、コマンド応答など定期的に大きな残差を生むが正常な動作パターンを自動的に除外します。この機能は pruning(教師なし)を補完する半教師あり機能です。


7. 実験結果と考察

データセット設定と評価方法

実験では SMAP と MSL の各チャネルを独立して評価しています。各チャネルについて、異常が発生する 5 日間を中心とした前後のデータでモデルを学習・評価します。このウィンドウの選択は、計算コストと文脈の長さのバランスを取るための実装上の決定です。

異常の評価は「ラベル付きの異常シーケンス」単位で行います。真陽性(TP)の定義は「検出された異常シーケンスが、ラベル付き異常シーケンスと時間的に重なる」場合です。これは「point-adjust」評価と呼ばれるもので、後の研究で批判(1 点でも重なれば全シーケンスを TP とカウントするため、精度が水増しされる)されていますが、本論文発表時点での標準的な評価方法でした。

主な結果

Telemanom 結果表:各閾値手法の適合率・再現率・F0.5スコア比較

出典: Hundman et al., KDD 2018, Table 2

Table 2 は各閾値アプローチの精度・再現率・$F_{0.5}$ スコアを示しています。$F_{0.5}$ スコアは $F_1$ スコアの変形で、適合率(Precision)を再現率(Recall)より重く評価します($F_\beta = (1 + \beta^2) \cdot \frac{P \cdot R}{\beta^2 P + R}$、$\beta = 0.5$)。これは「偽陽性を見逃しの少なさより重視する」という判断で、人間のレビューコストを考慮した実用的な選択です。

最良結果は Non-Parametric w/ Pruning($p = 0.13$) で、適合率 87.5%・再現率 80.0%・$F_{0.5}$ スコア 0.71 を達成しています。Pruning なしの場合($p = 0$)では適合率が 48.9% まで下がり、再現率は 84.8% に上がります。Pruning が適合率を 38.6 ポイント引き上げる(48.9% → 87.5%)効果を持ちながら、再現率の低下は 4.8 ポイント(84.8% → 80.0%)に留まっていることが分かります。

ガウス尾部(Gaussian Tail)アプローチは閾値の $\epsilon_{\text{norm}}$ 設定に依存し、最良でも $F_{0.5} = 0.68$($\epsilon_{\text{norm}} = 0.01$、$p = 0.13$)にとどまります。Normality Test(D’Agostino-Pearson 検定)で残差分布が正規分布でないと判定されたチャネルに対してガウス尾部を強制適用すると、最適でない閾値が設定されるためです。

適合率-再現率トレードオフ

Telemanom 適合率-再現率プロット:ノンパラ手法がガウス尾部法を大きく上回る

出典: Hundman et al., KDD 2018, Fig. 4

Fig. 4 は各手法・パラメータ設定のプレシジョン-リコール平面でのプロットです。オレンジの丸(Non-Parametric、Pruned)が青の四角(Gaussian Tail、Non-Pruned)より右上に位置していることが明確に見て取れます。同じ再現率 0.8 付近でも、ノンパラ手法は適合率 0.90 近くを達成している一方、ガウス尾部手法は 0.70 台にとどまります。

Pruning のパラメータ $p$ を変えると($p = 0.03$ から $p = 0.25$ までの点がプロット上に並んでいます)、$p = 0.13$ 付近が最良の $F_{0.5}$ トレードオフを与えています。$p$ を大きくする(強い Pruning)と精度が上がりリコールが下がる「右上から左上へ」の動き、小さくすると逆の動きをすることが視覚的に確認できます。

予測誤差の内訳

Telemanom 予測誤差比較:SMAP/MSLの平均LSTM予測誤差(MAE)

出典: Hundman et al., KDD 2018, Table 3

Table 3 は SMAP と MSL それぞれの平均 LSTM 予測誤差(MAE)を示しています。SMAP では 5.5%、MSL では 6.8%、合計 5.9% という小さな予測誤差を達成しています(テレメトリ値の正規化後のスケール)。MSL の方が誤差がやや大きいのは、Curiosity Rover の動作が多様で訓練データで全パターンをカバーしにくいためです。この低い予測誤差が、閾値判定の高精度を支えています。予測器が正常パターンを正確に再現できているほど、異常時の残差が際立ちます。


8. 異常タイプ別の性能と文脈異常の重要性

文脈異常への対応

Table 1 で確認したとおり、全異常の 41% は文脈異常です。著者らはこの種の異常について「OOL アラームや距離ベース手法(DBSCAN など近傍法)では見逃しやすく、時間的文脈を理解するモデルが必要だ」と論文中で強調しています。

LSTM がコマンド情報を入力として受け取ることで、「このコマンドシーケンスの後なら、この程度の変化は正常」という文脈依存の予測ができます。文脈異常の検出において、ノンパラ手法 + Pruning が単純な閾値法より大きく優位に立つのはこのためです。

具体的には、論文の Section 4.3 で「文脈異常(contextual)の 41% が,距離ベースや限界値ベースの手法では検出できない」と述べており、Telemanom はその大部分をカバーできると報告しています。

論文 Table 4 は異常タイプ別の再現率(ノンパラ + pruning)を示しています。

データセット 点異常(Recall) 文脈異常(Recall)
MSL 78.9% 58.8%
SMAP 95.3% 76.0%
合計 90.3% 69.0%

点異常は 90.3% と高再現率を達成している一方、文脈異常は 69.0% と低くなっています。これは予測機構でカバーできない「より複雑なコマンド依存パターン」が 30% 程度残ることを示しており、さらなる特徴エンジニアリング(コマンド粒度の向上、関連チャネル情報の活用)が必要と論文は指摘しています。

パフォーマンスの Sources

Telemanom の高い精度を実現している主な要因をまとめると:

1. コマンド情報の組み込み: 外生入力としてのコマンドシーケンスにより、コマンド起因の正常変化を「異常ではない」と正しく予測できます。これが文脈異常への対応力の根幹です。

2. per-channel の独立 LSTM: 82 チャネルそれぞれのダイナミクスを個別に学習するため、チャネル特有の振る舞いパターンを精密に捉えます。

3. EWMA 平滑化: 単発スパイクによる偽陽性を抑制し、持続的な異常を際立たせます。

4. ノンパラメトリック動的閾値: ガウス分布を仮定しないため、歪んだ分布を持つ残差に対しても適切な閾値を設定できます。

5. Pruning: チャネル内での相対比較により、「正常範囲内での最大値」が過剰に検出されることを防ぎます。


9. ESA-ADB との関係と後続研究への影響

Telemanom は 2018 年の発表以来、時系列異常検知のベンチマーク論文として広く参照されています。特に重要なのは、SMAP と MSL データセットを NASA の実際のテレメトリから作成して公開したことで、多くの後続研究がこのデータセット上で性能を競っています。

欧州宇宙機関(ESA)が 2022 年に発表した ESA-ADB(ESA Anomaly Detection Benchmark) も Telemanom のフレームワーク(特に per-channel LSTM 予測)を採用・拡張したシステムとして位置づけられています(ESA-ADB ベンチマーク も参照)。

一方、Telemanom の評価方法については批判もあります。point-adjust 評価は「1 点でも異常区間と重なれば TP」とカウントするため、精度が過剰評価されます。VUS(Volume Under the Surface)や affiliation などの新指標を使うと、従来の評価より大幅に厳しい数字が出ることが知られています。

また、DC-VAEOmniAnomaly、USAD などの後続手法は、SMAP と MSL で Telemanom を大きく上回ることを主張していますが、評価条件(point-adjust の使い方、ハイパーパラメータの選択方法)が論文ごとに異なるため、単純な数値比較には注意が必要です(時系列異常検知サーベイ:評価の落とし穴参照)。


10. 実用上の設計判断とトレードオフ

バッチ処理とオンライン推論

Telemanom の閾値計算モジュールはバッチ処理を前提にしています。テスト期間の全残差 $\bm{e}_s$ が揃ってから argmax を計算するため、厳密なリアルタイム推論とは相性が悪いです。

しかし著者らは「システムは各ストリームに最後のバッチデータを処理してから最新バッチを評価する仕組みにもなっており、リアルタイム処理にも適応可能」と述べています。直近の固定ウィンドウ(例えば直近 $h = l_s \cdot 3 = 750$ ステップ分)だけで $\mu, \sigma$ を更新する近似もできます。

ハイパーパラメータの感度

$p = 0.13$(pruning 閾値)と $z \in [2.5, 10.0]$(閾値探索範囲)は実験的に決定されています。Fig. 4 のプロットから分かるように、$p$ の変化は性能に大きく影響します。異なるドメインに適用する際は、少量のラベル付きデータでこれらの値を再調整することが推奨されます。

ただし、$z$ の下限が 2.5(つまり「平均から 2.5 標準偏差以上」が閾値の最小値)という設定は、極めて小さな残差の変動を「異常」と判定することを防ぐ合理的なガードです。

スケーラビリティ

per-channel の独立 LSTM は並列実行が容易で、82 チャネルを同時に処理できます。著者らの実験環境では 1 チャネルあたり数分の学習時間で収束しており、GPU 並列化により実用的なスケールで動作しています。一方、チャネル間の相関(たとえば 2 つのセンサーが同時に異常な関係になる)は各 LSTM が独立しているため直接は考慮できません。これは SARAD や CAD のような多変量同時モデリングと比べた Telemanom の制約です。


11. 再実装のための全記号・全手順リファレンス

以下は論文を手元に置かずに再実装できるよう、記号・次元・手順を一箇所にまとめたリファレンスです。

全記号一覧

記号 型・次元 定義
$m$ 整数 入力次元(コマンド種類 $k$ + テレメトリ 1 次元 = $k+1$)
$k$ 整数 コマンド種類数(SMAP=24, MSL=54)
$l_s$ 整数 系列長(論文値 250)
$l_p$ 整数 予測長(論文値 1)
$d$ 整数 予測チャネル数(論文値 1)
$x^{(t)}$ $\mathbb{R}^m$ 時刻 $t$ の入力ベクトル(コマンドフラグ $k$ 個 + テレメトリ値 1 個)
$\hat{y}^{(t)}$ $\mathbb{R}$ LSTM の予測値(次ステップのテレメトリ)
$y^{(t)}$ $\mathbb{R}$ 予測対象の実測値 = $x_i^{(t+1)}$($i$ は対象チャネルの次元)
$e^{(t)}$ $\mathbb{R}_{\geq 0}$ 絶対残差 = $\lvert y^{(t)} – \hat{y}^{(t)} \rvert$
$h$ 整数 閾値計算に使う過去誤差数(論文値 2100)
$\bm{e}$ $\mathbb{R}^h$ 誤差ベクトル = $[e^{(t-h)}, \ldots, e^{(t)}]$
$\alpha$ $(0,1)$ EWMA 平滑化係数
$e_s^{(t)}$ $\mathbb{R}_{\geq 0}$ EWMA 平滑化残差(再帰式で定義)
$\bm{e}_s$ $\mathbb{R}^h$ 平滑化誤差ベクトル = $[e_s^{(t-h)}, \ldots, e_s^{(t)}]$
$z$ 実数 閾値候補の $\sigma$ 倍数(走査範囲 $\{2.5, 3.0, \ldots, 10.0\}$)
$\epsilon$ $\mathbb{R}$ 候補閾値 = $\mu(\bm{e}_s) + z \cdot \sigma(\bm{e}_s)$
$\epsilon^*$ $\mathbb{R}$ argmax で選ばれた最適閾値(スカラー)
$\bm{e}_a$ 集合 閾値超の平滑化残差 $\{e_s \in \bm{e}_s \mid e_s > \epsilon\}$
$\bm{E}_{\text{seq}}$ 集合の集合 $\bm{e}_a$ 内の連続シーケンス群
$\Delta\mu$ $\mathbb{R}$ $\mu(\bm{e}_s) – \mu(\{e_s \in \bm{e}_s \mid e_s < \epsilon\})$
$\Delta\sigma$ $\mathbb{R}$ $\sigma(\bm{e}_s) – \sigma(\{e_s \in \bm{e}_s \mid e_s < \epsilon\})$
$\bm{e}_{\max}$ $\mathbb{R}^{|\bm{E}_{\text{seq}}|+1}$ 各異常シーケンスの最大残差(降順)+ 最大正常残差を末尾に追加
$d^{(i)}$ $[0,1)$ pruning の減少率 = $(e_{\max}^{(i-1)} – e_{\max}^{(i)}) / e_{\max}^{(i-1)}$
$p$ $(0,1)$ pruning の最小減少率閾値(論文値 0.13)
$s^{(i)}$ $\mathbb{R}_{\geq 0}$ 異常シーケンス $i$ の異常度スコア
$s_{\min}$ $\mathbb{R}$ 履歴ベースの最小スコア閾値(オプション)

アルゴリズム全体の実行手順

入力: チャネル i のテレメトリ時系列 + コマンド時系列

[Phase 1: 学習]
1. x(t) = [c_1(t), ..., c_k(t), y(t)] を構築  (m = k+1 次元)
2. 訓練データ(正常期間)で per-channel LSTM を学習
   - 2 層 × 80 ユニット, ls=250, dropout=0.3, Adam, 最大35エポック(早期停止あり)

[Phase 2: 誤差収集]
3. テスト期間の各ステップ t で:
   ŷ(t) = LSTM(x(t-ls), ..., x(t-1))
   y(t) = x_i(t+1)  [次ステップの実測値]
   e(t) = |y(t) - ŷ(t)|
4. e = [e(t-h), ..., e(t)]  (h=2100 の誤差ベクトルを構築)

[Phase 3: EWMA 平滑化]
5. e_s(t) = α·e(t) + (1-α)·e_s(t-1)  ですべての t に適用
   → es = [e_s(t-h), ..., e_s(t)] を構築

[Phase 4: 動的閾値の決定]
6. for z in {2.5, 3.0, 3.5, ..., 10.0}:
     ε_cand = μ(es) + z·σ(es)
     e_a = {es_i ∈ es | es_i > ε_cand}
     E_seq = {連続シーケンス of e_a}
     Δμ = μ(es) - μ({es_i < ε_cand})
     Δσ = σ(es) - σ({es_i < ε_cand})
     score(ε_cand) = (Δμ/μ(es) + Δσ/σ(es)) / (|e_a| + |E_seq|²)
   ε* = argmax score(ε_cand)
   → E_seq, e_a を ε* に対して確定

[Phase 5: Pruning]
7. e_max = [max(eseq_1), ..., max(eseq_|E_seq|)]  (降順ソート)
   e_max.append(max({es_i ∉ e_a}))  ← 最大正常残差を末尾に追加
8. for i in {1, 2, ..., |E_seq|+1}:
     d(i) = (e_max[i-1] - e_max[i]) / e_max[i-1]
     if d(i) < p:  # p=0.13
       シーケンス i 以降を正常に再分類; break
     else:
       シーケンス i-1(インデックス j < i)はキープ

[Phase 6: スコア計算]
9. 残った各異常シーケンス i に対して:
   s(i) = (max(e_seq(i)) - ε*) / (μ(es) + σ(es))

[オプション Phase 7: 履歴スコア閾値]
10. チャネルが高頻度で誤検知する場合は s_min を設定:
    if s(i) < s_min → 正常に再分類

この手順を各チャネルに対して独立に実行し、結果を集約することで全チャネルの異常マップを得ます。


まとめ

本記事では、Hundman ら(KDD 2018)の Telemanom を以下の観点から深掘り解説しました。

  • コマンド one-hot エンコード: コマンドを外生変数として入力に組み込むことで、コマンドに起因する正常な変化を「異常ではない」と正しく予測できる。これが文脈異常への高い検出力の源泉
  • per-channel 独立 LSTM: 82 チャネルそれぞれのダイナミクスを個別に学習し、細粒度のトレーサビリティと並列処理を実現
  • EWMA 平滑化: 単発スパイクによる偽陽性を抑制し、持続的な逸脱を際立たせる指数加重移動平均
  • ノンパラメトリック動的閾値: ガウス分布を仮定せず、argmax 最適化で「閾値設定の効果が最大になる $\epsilon^*$」をデータから自動選択
  • pruning: 検出された異常候補を最大残差の降順にソートし、急落点より小さい候補を偽陽性として除去。適合率を 48.9% → 87.5% に引き上げる

Telemanom の位置づけ: 「コマンドを与えれば、何が正常応答かを予測できる」という発想は、時系列異常検知において「文脈を明示的に与える(explicit context)」手法の原型です。後の TAAD(テスト時適応による運転条件分離)や AAD-LLM(言語でコンテキストを記述)へ続く設計思想の源流として、Telemanom は重要な論文です。

関連記事


参考文献

Hundman, K., Constantinou, V., Laporte, C., Colwell, I., & Soderstrom, T. (2018). Detecting Spacecraft Anomalies Using LSTMs and Nonparametric Dynamic Thresholding. Proceedings of the 24th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining (KDD 2018), 387–395. https://doi.org/10.1145/3219819.3219845 / arXiv:1802.04431