ロボットアームの関節モーターが、いつもより大きなトルクを出している。これは故障だろうか。答えは「指令による」。速く大きく動かせと指令したならトルクが増えるのは当たり前で、故障ではない。だが、ゆっくり動かす指令しか出していないのにトルクが増えているなら、それはベアリングの摩擦増大を疑うべき本物の異常だ。同じ「トルクの増加」でも、出した指令で説明がつくか否かで意味が正反対になる。
この記事のきっかけは「コマンドや操作に対する応答をニューラルネットで学習して、異常だけを抽出する先行研究はないのか」という問いだ。結論から言うと、ある。しかもひとつの分野ではなく、データベース・制御工学・ログ解析・宇宙機運用といった複数のコミュニティで、半ば独立に同じ発想が育ってきた。共通する核心はシンプルだ ―― 入力(コマンド・操作・運転条件)で説明できる変動はいったん引き算し、説明できずに残った逸脱だけを異常とする。
なぜこれを学ぶのか。応用先は広い。ひとつは産業機器やロボットの故障検知で、運転条件が動き続けても誤報を出さない枠組みを理解すること。もうひとつは、本ブログのコンテキスト考慮型異常検知シリーズ(TAAD・Time-CAD・TICC・AAD-LLM)を貫く横串として、「文脈を扱う」設計思想を整理することだ。本記事では、この発想の源流から各分野の代表手法までを、図と小さなデモで俯瞰する。

上の地図が本記事の全体像だ。中心にあるのが共通の問い ―― コマンド $u$ に対する応答 $y$ を学び、$u$ で説明できない逸脱だけを異常とする ―― で、そこから5つの系統が枝分かれする。源流のSong (2007)、操作シーケンスを学ぶDeepLog、指令への反応を見るテレメトリ手法、制御システムの残差検知、そしてロボティクスの故障検知だ。これらを順に見ていこう。
前提知識
この記事は異常検知の基礎と、文脈を扱う各手法を前提にすると理解が深まります。
核心 ― 無条件の $p(y)$ ではなく条件付きの $p(y\,|\,u)$ を学ぶ
ふつうの異常検知は、観測されたデータ $y$ そのものの分布 $p(y)$ を学び、確率の低い点を異常とする。しかしこのやり方は、入力や状況によって正常な振る舞いが変わる場面で破綻する。冒頭のトルクの例がまさにそうだ。トルクの値だけを見れば、大きなトルクは「ふつうに起こりうる値」なので、そのままでは異常と区別できない。
そこで発想を変える。データを2種類に分けるのだ。ひとつは 入力(コマンド・条件・状況)を表す変数 $u$、もうひとつは その応答として観測される変数 $y$。そして結合分布 $p(u, y)$ でも周辺分布 $p(y)$ でもなく、条件付き分布 $p(y\,|\,u)$ をモデル化する。「この入力 $u$ のもとで応答 $y$ はどのあたりに出るはずか」を学び、そこから外れた点を異常とする。

左は無条件に $y$ だけを見た図だ。星印の着目点は $y \approx 2$ で、これは正常データにもたくさんある「ありふれた応答値」なので、$y$ の値だけ見ていては見逃してしまう。右は入力 $u$ を横軸に取り、$u$ から期待される応答 $E[y\,|\,u]$(濃い線)と、その許容範囲(帯)を学んだ図だ。すると同じ着目点が、「$u$ が大きいのに $y$ が小さい」という文脈の中での大きな逸脱として浮かび上がる。残差が許容範囲を突き抜けているから、はっきり異常と判定できる。これが条件付き異常検知の一枚絵だ。
この考え方を最初に明確な手法として定式化したのが Xiuyao Song・Mingxi Wu・Christopher Jermaine・Sanjay Ranka の “Conditional Anomaly Detection”(IEEE TKDE, 2007) である。彼らは属性を、状況を表す 環境属性(environmental attributes)$u$ と、振る舞いを表す 指標属性(indicator attributes)$y$ に分けた。そして $u$ 側と $y$ 側それぞれをガウス混合分布でモデル化し、両者を結ぶ写像(どの環境成分のときどの指標成分が出やすいか)を学ぶ。新しい点が来たら「その環境のもとで、観測された指標がどれだけ出にくいか」を条件付き確率で測り、異常スコアにする。彼らが挙げた動機の例も、まさに「単独では正常に見える値が、文脈を条件にすると異常になる」というものだった。本ブログのTAADで紹介した「運転条件(SP)と計測値の分離」は、この条件付き異常検知の考え方をニューラルネット時代に引き継いだものだと言える。
源流が押さえられたところで、もっとも直感的な応用 ―― ロボット関節 ―― で、この「指令から期待応答を引く」操作を具体的に見てみよう。
ロボット関節 ― 指令の運動から「期待トルク」を引き算する
ロボットアームの関節は、条件付き異常検知の格好の舞台だ。なぜなら、関節に出すべきトルクは指令した運動からかなり正確に計算できるからである。これを 逆動力学(inverse dynamics) という。関節の角度 $\theta$、角速度 $\dot\theta$、角加速度 $\ddot\theta$ が分かれば、必要なトルクは物理法則でほぼ決まる。

図のように、指令角度(上段)から角速度・角加速度(中段)が決まり、それらから期待トルク(下段)が計算できる。単純化した1関節モデルなら、期待トルク $\hat\tau$ は次の3項の和で書ける。
$$ \begin{equation} \hat\tau = I\,\ddot\theta + b\,f(\dot\theta) + mgl\sin\theta \end{equation} $$
第1項 $I\ddot\theta$ は慣性(速く加速するほど大きなトルクが要る)、第2項 $b\,f(\dot\theta)$ は摩擦(動く向きに逆らう力で、ここでは $f(\dot\theta)=\tanh(5\dot\theta)$ で近似)、第3項 $mgl\sin\theta$ は重力(腕の姿勢で変わる)だ。正常な関節では、実測トルク $\tau$ はこの $\hat\tau$ にノイズが乗っただけのものになる。
ここがポイントだ。指令から計算した $\hat\tau$ を実測 $\tau$ から引くと、正常時はノイズ程度の小さな残差しか残らない。ところがベアリングが劣化して余分な摩擦が生じると、その余分なトルクは指令からは説明できないので、残差として大きく現れる。「速く動かしたからトルクが大きい」のは $\hat\tau$ がちゃんと説明してくれるので残差には出ず、「指令では説明できない余分なトルク」だけが残差に残る。条件付き異常検知の理想形である。
それでは、この残差検知が「指令を無視した素朴な検知」とどれだけ違うのか、データで確かめよう。
デモ ― 条件付き残差は「条件変化」に惑わされない
ロボット関節の動作を模した合成データを作る。途中に2種類のイベントを仕込む。ひとつは指令の振幅を上げる「運転条件の変化」(速く大きく動かす=正常)、もうひとつは末尾近くに摩擦が増大する「真の異常」だ。そして2つの検出器を比べる。検出器Aは生トルクの大きさにそのまま閾値をかける(指令を無視)。検出器Bは指令の運動 $(\ddot\theta,\,\dot\theta,\,\theta)$ から期待トルクを最小二乗で学習し、その残差にかける。
import numpy as np
rng = np.random.default_rng(7)
N = 1200
t = np.linspace(0, 24*np.pi, N)
# 指令(運動)。中央区間で振幅を上げる=運転条件の変化(正常)
amp = np.ones(N); amp[N//2:3*N//4] = 1.8
theta = amp*np.sin(t)
thdot = np.gradient(theta, t)
thddot = np.gradient(thdot, t)
# 正常な逆動力学 tau = I*角加速度 + b*摩擦 + g*重力
I, b, g = 1.2, 0.5, 0.8
tau = I*thddot + b*np.tanh(5*thdot) + g*np.sin(theta) + rng.normal(0, 0.05, N)
# 真の異常:末尾の一区間に余分な摩擦トルクを注入(ベアリング劣化)
fault = slice(7*N//8, 7*N//8 + 60)
tau[fault] += 0.9*np.sign(thdot[fault])
# 検出器A:生トルクの大きさに閾値(指令を無視)
scoreA = np.abs(tau)
thrA = scoreA[fault].min()*0.999 # 真の異常を全部拾える最小閾値
detA = scoreA >= thrA
# 検出器B:指令の運動から期待トルクを学習し、その残差に閾値
train = slice(0, 3*N//4) # 異常を含まない前半で学習
X = np.column_stack([thddot, np.tanh(5*thdot), np.sin(theta)])
coef, *_ = np.linalg.lstsq(X[train], tau[train], rcond=None)
resid = np.abs(tau - X @ coef)
thrB = resid[fault].min()*0.999
detB = resid >= thrB
# 中央の「条件変化区間」(正常なのにトルクが上がる)での誤報を数える
cond = slice(N//2, 3*N//4)
print("学習した係数(I,b,g) =", coef.round(3))
print("検出器A 条件変化区間の誤報 =", int(detA[cond].sum()), "/300")
print("検出器B 条件変化区間の誤報 =", int(detB[cond].sum()), "/300")
出力は次のようになる。
学習した係数(I,b,g) = [1.197 0.501 0.791]
検出器A 条件変化区間の誤報 = 221 /300
検出器B 条件変化区間の誤報 = 0 /300
まず、最小二乗で学習した係数 $(1.197, 0.501, 0.791)$ が真の物理パラメータ $(1.2, 0.5, 0.8)$ をきれいに復元している。正常データだけから「指令とトルクの関係」を正しく学べたということだ。仕込んだデータそのものを見ておこう。

上段が指令角度、下段が計測トルクだ。中央のオレンジ帯が「速く大きく動かす」運転条件の変化で、ここではトルクの振幅も連動して大きくなっている ―― これは指令で説明できる正常な変化だ。右端の赤帯が摩擦増大の真の異常で、トルクが普段の波形からずれている。値だけ眺めると、中央の大トルクも右端の異常も「トルクが大きい」点で似て見えてしまう。そこで肝心の誤報数を比べると、検出器Aが条件変化区間300点のうち221点を異常と誤判定したのに対し、検出器Bは0点だった。生トルクと残差の時系列を並べると、この差は一目瞭然になる。

上段の検出器A(生トルク閾値)では、真の異常(右の赤帯)を拾える閾値まで下げると、中央の条件変化区間(オレンジ帯)が丸ごと閾値を超えてしまい、大量の誤報(赤点)が出ている。「速く動かしたせいでトルクが大きい」だけなのに、異常と取り違えているのだ。下段の検出器B(条件付き残差)では、指令で説明できる中央区間の残差はノイズ程度に張り付き、摩擦が増えた右の異常区間だけが残差として突き抜ける。「指令で説明できるぶんを引き算してから異常を測る」という一手で、誤報が劇的に減るのが見て取れる。
このロボット関節の例は、逆動力学という明示的な物理モデルが使えるので残差を線形回帰で学べた。だが一般には、入力と応答の関係は非線形で、過去の履歴にも依存する。そこで登場するのが、ニューラルネットで $\hat y = f(u, y_{ 入力に対する応答をニューラルネットで学び、残差を異常スコアにする方法は、大きく予測型と再構成型に分かれる。サイバーフィジカルシステムの異常検知サーベイ(Luo et al., ACM Computing Surveys, 2021)でも、この2つが残差生成の二大潮流として整理されている。 予測型(forecasting-based) は、過去の入力 $u_{1:t}$ と応答 $y_{1:t}$ から次の時刻の応答 $\hat y_{t+1}$ を当てに行く。実測 $y_{t+1}$ との差 $\|y_{t+1}-\hat y_{t+1}\|$ が残差だ。LSTMで次状態を予測する手法が代表で、後述するロボットやテレメトリの故障検知でよく使われる。「次に何が起こるはずか」を予測し、外したぶんを異常とみなす素直な発想である。 再構成型(reconstruction-based) は、入力と応答をまとめた窓 $[u, y]_{t-w:t}$ をオートエンコーダで一度低次元の潜在 $z$ に圧縮し、また復元する。正常データだけで訓練すると、正常パターンは上手に復元できるが、異常パターンは復元しきれず再構成誤差 $\|x-\hat x\|$ が大きくなる。AE・VAE・USAD・OmniAnomaly などがこの系統だ。ここで入力 $u$ を窓に含めておけば、「この指令のもとでのこの応答」という条件付きのパターンを丸ごと圧縮・復元することになり、暗黙のうちに $p(y\,|\,u)$ を学んでいることになる。 どちらの残差を使うにせよ、入力 $u$ をモデルに与えることが条件付き化の鍵だ。では具体的に、$u$ はモデルのどこに、どう入れればよいのか。実はやり方にいくつかの流儀がある。 「入力 $u$ をモデルに与える」と一口に言っても、$u$ をネットワークのどこにどう注入するかで、表現力と頑健性が変わってくる。代表的な3つの流儀を見ておこう。 (a) 入力連結(concatenation) が最も単純だ。コマンド $u$ を応答履歴 $y_{ (b) FiLM(Feature-wise Linear Modulation) は、$u$ から生成したスケール $\gamma(u)$ とシフト $\beta(u)$ で、応答側の中間特徴 $h$ を $\gamma(u)\odot h + \beta(u)$ と変調する。$u$ が「応答特徴の感度そのものを切り替えるダイヤル」として働くので、「この指令のときは特徴3を強調し、別の指令では抑える」といった掛け算的な条件付けができる。レジーム(運転モード)ごとに応答の質が大きく変わる場面で効く。 (c) 2タワー(期待値ヘッド+ばらつきヘッド) は、$u$ から期待応答 $\mu(u)$ だけでなく、許容ばらつき $\sigma(u)$ も同時に出力する。スコアを生の残差ではなく標準化残差 $(y-\mu(u))/\sigma(u)$ にできるので、「指令によって応答のばらつき幅自体が変わる」不等分散(heteroscedasticity)に強い。OmniAnomaly が応答の分散まで確率モデルで学ぶのも、この発想の延長にある。後で見るように、この $\sigma(u)$ による標準化は誤報を大きく減らす鍵になる。 どの流儀でも、学習は正常データだけで行い、$u$ で説明できる応答を再現できるようにする。問題は、学んだモデルから「異常スコア」をどう作り、どこで線を引くかだ。ここがもう一つの作り込みどころである。 条件付きモデル $\hat y = f_\theta(u, y_{ 学習フェーズでは、正常運転ログ $\{(u_t, y_t)\}$ だけで条件付きモデルを訓練し、ついでに正常時の残差の統計 $\mu_r,\,\sigma_r$ を見積もっておく。検知フェーズでは、新しい時刻の残差 $r_t$ を $s_t = (|r_t|-\mu_r)/\sigma_r$ と標準化してから、閾値 $\tau_t$ と比べる。ポイントは2つ ―― 残差の標準化と閾値の動的化だ。順に、なぜそれが効くのかをデータで確かめる。 入力 $u$ によって、正常な応答のばらつき幅そのものが変わることはよくある。激しく動かす指令のときは応答も大きく揺れ、静かな指令のときはほとんど揺れない。この不等分散があると、生の残差に一律の閾値をかけるのは危うい。 上の実験では、入力 $u$ が大きいほど正常な応答のばらつき $\sigma(u)$ が増えるデータを作り、ばらつきの小さい $u\approx2$ の領域に中程度の異常オフセットを仕込んだ。上段の生残差で見ると、この異常を確実に拾える閾値まで下げると、$u$ の大きい高ばらつき域の正常なゆらぎが軒並み閾値を超え、誤報が157点も出る。異常自体は小さいので、大きな正常ゆらぎに埋もれてしまうのだ。下段は、別個の正常データから推定した $\sigma(u)$ で残差を割った標準化残差だ。すると全域でばらつきが一様な目盛りになり、低ばらつき域の異常が相対的に大きく突き出る。同じ recall=1 の条件で誤報は18点まで激減した。約9分の1だ。「どれだけ大きいか」ではなく「その入力のもとで何σ分はみ出したか」で測るのが、条件付き異常検知のスコア設計の要諦である。 もう一つの作り込みが閾値だ。運転条件が変われば、予測誤差の「平常レベル(床)」自体がゆっくり変わることがある。固定閾値はこれに追従できない。 実験では、平滑化した予測誤差 $e_s$ に3か所の異常スパイクを置き、さらに後半で誤差の床がなだらかに上がる正常な区間(運転条件の変化)を作った。上段の固定閾値(初期の静かな区間で平均+3σにチューニング)は、床が上がった後半区間の正常なゆらぎを片端から異常と誤判定し、誤報が34点に膨らむ。下段の動的閾値は、少し手前までの移動窓で $\mu+z\sigma$ を逐次更新する。床の上昇に閾値が追従するので、後半区間の誤報が抑えられ、誤報は17点に半減した。スパイク状の真の異常は、床が上がってもなお閾値を突き抜けるので取りこぼさない。これは、テレメトリ手法の Telemanom(Hundman et al., KDD 2018) が採用した非パラメトリックな動的閾値の考え方を簡略化したものだ。Telemanom は予測誤差を平滑化したうえで、移動統計から閾値を決め、さらに誤報を刈り込む工夫まで備える。条件付き残差で減らした誤報を、閾値の作り込みでさらに絞る ―― この二段構えが実用手法の定石である。 標準化と動的閾値でスコアを作り込めることが分かった。次は、これらの道具立てが各分野でどう使われているかを見ていこう。まずはアクチュエータ指令を明示的に入力に含める制御システムだ。 上下水道・発電・化学プラントといった制御システム(CPS/ICS)は、ポンプやバルブへのアクチュエータ指令と、圧力・流量・水位といったセンサ応答がペアで取れる、条件付き異常検知の本場だ。 正常運転データから「この指令ならセンサはこう応答するはず」というモデル $\hat y = f(u, y_{ この分野のベンチマークとして広く使われるのが SWaT(Secure Water Treatment, 51次元) と WADI(Water Distribution, 123次元) だ。どちらもポンプ・バルブの開閉状態(=指令)とセンサ値が同じ多変量時系列に並んでおり、本ブログのUSAD記事やOmniAnomaly記事でも評価に登場する。指令とセンサを区別せず全変数を放り込んでも残差検知は動くが、「指令は原因・センサは結果」という因果の向きを意識すると、誤報の少ない条件付きモデルになる。 ここまでは応答が連続値(トルク・圧力・流量)の話だった。だが「操作」が離散的なイベントの列である場合 ―― つまり操作そのものの順序を学ぶ場合も、まったく同じ発想が使える。 システムのログは、内部で実行された操作・コマンドの列そのものだ。「ファイルを開く→書き込む→閉じる」という順序には正常な型があり、そこから外れた順序は異常を示す。これを学ぶのが DeepLog(Du et al., ACM CCS 2017) だ。 DeepLogはまずログメッセージをパースして、メッセージの型を表すログキーの列に変換する。そしてLSTMを使い、直前 $h$ 個(標準では $h=10$)のキー列から、次に来るキーの確率分布を予測する。予測の上位 $g$ 個(標準では $g=9$)の候補に実際の次キーが入っていれば正常、入っていなければ異常と判定する。図の例では、直前の列に続く次キーとしてモデルは $k3, k1, k5, \dots$ を高確率で予測しているが、実測が $k9$ だったとすると、それは上位候補から外れているので異常とみなされる。 DeepLogには2段構えがある。いま述べたログキー列の予測モデル(操作の順序の異常)に加えて、各ログに付随するパラメータ値(処理時間など)を予測する回帰モデル(操作の中身の異常)を持つ。さらに、正常時のLSTM出力からワークフロー(実行パスの分岐・並行・ループ)を抽出して、異常を診断する仕組みもある。評価にはHDFSログやOpenStackの仮想マシン生成ログが使われた。注目すべきは、これも本質的に「直前の操作列という文脈 $u$ のもとで、次の操作 $y$ がどれだけ出にくいか」を条件付き確率で測っている点だ。応答が連続値か離散イベントかが違うだけで、発想はロボット関節やCPSとまったく同じである。本ブログのAAD-LLM記事で扱った、ログをLLMで解釈する手法も、この延長線上にある。 操作シーケンスでは「予測外のキーが来た」ことが異常のサインだった。逆に、「指令を出したのに、来るべき応答が来ない」ことを異常とする見方もある。それを最も洗練させているのが宇宙機テレメトリの分野だ。 機器に指令を出したら、それに応じた応答が返ってくるはずだ。逆に言えば、指令を出したのに期待された応答が起きない、あるいは普段と違う応答になること自体が、異常の強いサインになる。 図のように、正常なら指令イベント(オレンジの線)のあと応答がしかるべく遷移する(緑)。ところが指令を出したのに応答がぴくりとも動かない(赤)なら、期待された応答との差が異常として検出される。テレメトリ(遠隔計測データ)の異常検知では、Telemanom(Hundman et al., NASA JPL, KDD 2018) がこの分野の基礎を築いた。LSTMで各計測チャネルの次の値を予測し、予測誤差に対して非パラメトリックな動的閾値を当てて異常を判定する。予測型残差の典型である。 さらに大規模なベンチマークとして ESA-ADB(European Space Agency Anomaly Detection Benchmark, 2024) が公開された。約17.5年分・7億点超の実テレメトリに、数百種類の指令(テレコマンド)のイベントが含まれ、844件の注釈イベントのうち148件が異常としてラベル付けされている。この benchmark の設計思想がまさに本記事のテーマそのもので、論文は「指令に対して反応がない、あるいは反応が普段と違うことが異常の判定に重要」であり、また「指令情報は、稀だが正常なイベントを異常と取り違えないためにも必要」だと明言している。指令という文脈を与えることで、「珍しいけれど指令どおりの正常な挙動」と「指令で説明できない本物の異常」を切り分けられるわけだ。評価指標には、適合率を重視した event-wise の F0.5 スコアが採用されている。 指令を文脈にするとき、もうひとつ忘れてはいけない実務上のクセがある。コマンドを出した直後、応答はしばらく過渡的に変化してから新しい平常値に落ち着くということだ。立ち上がりの最中は値が大きく動くので、コマンドを無視した素朴な検知器は、この「指令どおりの正常な遷移」を異常と取り違えてしまう。 上段は、2回のコマンド(オレンジの点線)のたびに応答が指数的に立ち上がって新しいレベルへ遷移する様子だ。緑の破線が「コマンドから期待される遷移 $\hat y$」で、正常応答はこの曲線によく沿っている。下段で残差を比べると、素朴な残差(全体平均からのずれ)はコマンド直後に大きな山を作り、これがそのまま誤報源になる(過渡区間の平均残差は約0.25)。一方、コマンドから期待される遷移を引いた条件付き残差は過渡区間でもほぼ平坦(同約0.03)で、コマンドと無関係に応答が落ち込む右の赤帯(真の異常)だけがくっきり立ち上がる。約8倍の差だ。「指令を出したのだから、しばらくは応答が動いて当然」という当たり前を、$\hat y$ に織り込んでおくことで、過渡応答を異常から外せる。実装上は、応答にコマンドからの経過時間や直近のコマンドを特徴として与える、あるいはコマンド直後の一定窓をマスクする、といった工夫に対応する。 ここまで5つの系統を見てきた。いずれも入力で説明できる変動を引き算するという共通の核を持つが、評価には共通の落とし穴がある。最後にそれを押さえておこう。 時系列異常検知の論文では point-adjust という評価のクセに注意が要る。これは「ある異常区間のうち1点でも検出できたら、その区間全体を正解とみなす」という後処理で、論文の高いF1スコアの多くがこの下駄を履いている。 上の図は、まったくのランダム検出器の性能を素のF1と point-adjust 後のF1で比べたものだ。素のF1が $0.21$ なのに対し、point-adjust 後は $0.42$ へと跳ね上がる。区間が長ければ、でたらめに撃っても「区間のどこか1点」には当たりやすいので、スコアが水増しされるのだ。条件付き残差で誤報を減らした手法どうしを公平に比べるには、point-adjust に頼らない評価(PR-AUCや、区間の重なりを評価する range ベースの指標、VUS など)を併用するのが安全だ。この点は時系列異常検知サーベイの記事で詳しく扱っている。 評価の注意も押さえたところで、本記事で見てきた手法群を「文脈の扱い方」で整理しよう。 「コマンド・操作に対する応答を学んで異常を抽出する」という発想は、文脈(入力・条件)をどう扱うかで、いくつかの流儀に分かれる。本ブログのコンテキスト考慮型異常検知シリーズと合わせて整理すると、次の表になる。 どの流儀も、根っこは同じだ。正常な振る舞いは入力・条件・文脈に依存して変わるという事実を受け入れ、その依存を引き算したうえで残った逸脱を異常とする。ロボット関節なら逆動力学で、CPSならLSTM残差で、ログなら次キー予測で、テレメトリなら指令への応答予測で ―― 道具は違っても、引き算する対象は「入力で説明できる変動」で一貫している。あなたの問いにあった「コマンドへの応答を学んで異常だけを抽出する」アイデアは、半世紀近い制御理論の残差生成(FDI)から最新のテレメトリ benchmark まで、確かに連綿と受け継がれてきた王道なのだ。 本記事では、「コマンド・操作に対する応答を学習し、入力で説明できない逸脱だけを異常とする」発想の先行研究を俯瞰しました。 「正常な振る舞いは入力・条件で変わる」という当たり前の事実を正面から扱うのが、条件付き異常検知の強みです。続けて、文脈を分離・適応するTAAD、外から与えるTime-CAD、教師なしで発見するTICCと読み比べると、「文脈」を扱う設計思想の地図がくっきり見えてきます。残差の作り方 ― 予測型と再構成型

コマンド $u$ をどこに入れるか ― 条件付けの3つの流儀

スコアの作り込み ― 残差を標準化して動的に閾値をかける

なぜ標準化するのか ― 不等分散を $\sigma(u)$ で割る

なぜ閾値を動かすのか ― 動的閾値で床の変化に追従する

制御システム ― アクチュエータ指令を入力に含める

操作シーケンスそのものを学ぶ ― DeepLog

指令への「反応の欠如」を異常にする ― テレメトリ手法

コマンド直後の「過渡応答」を異常にしない

評価の落とし穴 ― point-adjust の水増し

文脈をどう扱うか ― 5つの流儀
流儀
文脈の扱い方
代表手法
本ブログ記事
入力→応答の残差
入力で応答を予測/再構成し残差を見る
Song(2007) / CPS残差 / Telemanom / DeepLog
本記事
文脈を分離する
入力(SP)と応答を分け残差化、デプロイ後も適応
TAAD
TAAD
文脈を与える
外部コンテキスト(カレンダー等)を明示入力
Time-CAD
Time-CAD
文脈を発見する
潜在レジームを教師なしで抽出
TICC
TICC
文脈を言語化する
ドメイン知識を言語でLLMに渡す
AAD-LLM
AAD-LLM
まとめ



