TAAD:運転条件と計測値を分けて『条件で説明できない逸脱』だけを異常にする

ポンプの振動が大きくなった。これは故障だろうか。答えは「回転数による」。回転数を上げれば振動が増えるのは当たり前で、それは故障ではない。だが回転数を変えていないのに振動が増えたなら、それはベアリングの劣化を疑うべき本物の異常だ。同じ「振動の増加」でも、運転条件が変わったせいか否かで意味が正反対になる

産業機器の故障検知でくり返し問題になるのが、この「当然の変化」と「本物の故障」の取り違えだ。運転条件は刻一刻と連続的に変わり、しかも新しく導入した機器には正常/異常のラベルがほとんどない。この2つの困りごとに同時に答えたのが TAAD(Sun, Ammann, Giannoulakis, Fink, “Continuous Test-time Domain Adaptation for Efficient Fault Detection under Evolving Operating Conditions,” PHM Society European Conference (PHME) 2024, Vol. 8(1); arXiv:2406.06607)である。本記事では、TAAD の2本柱 ―― 「制御変数(運転条件)と計測値の役割分担」「テスト時に適応モジュールだけを学習するドメイン適応」 ―― を、原論文のアーキテクチャ・式・実験まで掘り下げつつ、決定的なデモで腹落ちするまで追いかける。

なお本記事で「SP(System Parameters)」と呼ぶ運転条件は、原論文では 制御変数(control variables)$w$、計測値は センサー計測 $x$ と表記される。以下では直感優先で「SP/運転条件」と原論文記法 $w$ を適宜併記する。

なぜこれを学ぶのか。応用先は2つある。ひとつは、運転条件が動き続ける現場(ポンプ・発電機・モーターなど)で、条件変化を誤検知せずに本物の故障だけを拾う実用的な枠組みを理解すること。もうひとつは、本ブログのコンテキスト考慮型異常検知シリーズ(Time-CAD など)の中で、「文脈をデータの中で分離し、しかもデプロイ後に適応し続ける」 という一段進んだ発想を押さえることだ。

TAADの概念:整備士は走り方を踏まえてエンジン音を判断する

直感は熟練の整備士だ。整備士はエンジン音だけを聞くのではなく、「いま高速を走っているのか、市街地なのか」という走り方を頭に入れたうえで、「その走り方にしてはおかしい音」だけを異常と判断する。高速走行で音が大きいのは当然だから異常にはしない。TAAD はこの「条件を踏まえた判断」を機械学習で再現する。まずはその中核、データの2分割から見る。

最重要アイデア ― SP と計測値を分ける

TAAD の出発点は、センサーから来る変数を意味によって2グループにきっぱり分けることだ。

センサーデータをSP(運転条件)と計測値に分け、条件で説明できない変化を異常とする判定ロジック

ひとつは System Parameters(SP)= 運転条件を表す変数。ポンプなら回転数・圧力設定・流量設定など、人が制御する設定値や外部から決まる条件だ。SP は「いまどういう状況で動いているか」という 問題の文脈 を教えてくれる。整備士の例の「いま高速を走っている」にあたる。

もうひとつは 計測値(Measurements)= 機器の状態を表す変数。振動・温度・実流量など、センサーが測る応答値だ。これは「実際に何が起きているか」を教えてくれる。整備士の例の「カラカラ音が聞こえる」にあたる。

この分離がなぜ効くのか。判定ロジックを言葉にするとこうなる。

  • SP が変化 → 計測値も変化 → 条件変化で説明できる → 正常
  • SP は一定 → なのに計測値が変化 → 条件では説明できない → 異常!

分離をしないモデルは「回転数が上がった→振動が増えた→異常だ」と誤報してしまう。分離があれば、振動の増加が回転数の上昇で説明できるかどうかを問えるようになる。次節では、この切り分けが実際にどれだけ効くかを、具体的なデータで確かめる。

切り分けは本当に効くのか ― デモ

ポンプ監視を模した合成データで、SP(回転数設定)と計測値(振動)を作る。振動は回転数に比例して増え、ノイズが乗る。途中に2種類のイベントを仕込んだ。ひとつは 回転数を上げる運転条件の変化(これは正常)、もうひとつは 回転数は一定なのに振動だけが上昇する真の異常(ベアリング劣化を模す) だ。

SP(回転数設定)と計測値(振動)の時系列。条件変化区間と真の異常区間

上段が SP(回転数設定)、下段が計測値(振動)である。回転数を上げた中央の区間では、振動も連動して上がっている ―― これは条件で説明できる 正常 な変化だ。一方、回転数が低いままなのに振動だけがじりじり上がる右側の区間が、本物の異常である。値だけを眺めると、両者はどちらも「振動が高い」点で似て見える。ここで2つの検出器を比べる。

素朴な生振動の閾値検出とTAAD的なSP条件付き残差検出の比較

上段は 素朴な検出器で、生の振動に閾値をかける。すると、真の異常を捉えるために閾値を下げた途端、運転条件を変えただけの中央区間まで丸ごと異常と誤検知してしまう(このデモでは条件変化区間の 300 点すべてが誤報になった)。

下段が TAAD 的な検出器だ。正常データで「振動 ≒ 係数 × 回転数 + 切片」という SP からの予測を学習し、実測との 残差 を異常スコアにする。すると、回転数で説明できる中央区間の残差はほぼゼロに張り付き(誤検知 0 点)、回転数一定で振動だけ上がる本物の異常の区間だけが残差として浮かび上がる。「条件で説明できる変動を引き算してから異常を測る」 ―― この一手だけで、誤報が劇的に減るのが見て取れる。

ここまでは「SP からの線形予測との残差」という最小デモで切り分けの効きを見た。原論文の TAAD は、この「予測との残差を異常スコアにする」という骨格を オートエンコーダ(AE)による再構成 で実装する。次節でその再構成ベースの土台を押さえてから、本題のテスト時適応に進む。

土台 ― 再構成ベースの異常検知と残差スコア

TAAD の検出原理は、教師なし異常検知の王道である 再構成ベース だ。健全(正常)なデータだけで AE を訓練すると、AE は「正常なら起こりうる値」を再構成できるようになる。異常なデータが来ると AE はうまく再構成できず、入力と再構成の差(残差)が大きくなる。この残差を異常スコアにする。

再構成ベース異常検知の一般パイプライン:入力X→AE→再構成X̂→残差r̂→正常/異常

出典: Sun et al., PHME 2024 (arXiv:2406.06607), Fig.1

論文の図は、この流れをそのまま描いている。入力 $X_1, X_2, \dots$ を AE に通して再構成 $\hat{X}$ を得て、残差 $\hat{r}$ を計算し、しきい値を超えた区間(右端の赤帯)を異常と判定する。重要なのは、訓練に 異常ラベルを一切使わない こと ―― 正常データの再構成だけを学ぶので、ラベルが乏しい新規機器でも立ち上げられる。

スコアの組み立ては、単純な「残差の大きさ」より少し丁寧だ。論文の定義を式で追う。まず各センサ $i$ ごとに、再構成誤差を訓練時の平均で割った 相対残差 を作る。

$$ \begin{equation} r_i = \frac{|\hat{x}_i – x_i|}{\bar{x}_{\text{train}}} \end{equation} $$

訓練時平均 $\bar{x}_{\text{train}}$ で割るのは、センサごとにスケールがバラバラだと残差を足し合わせられないからだ。これで全センサが「相対的なずれ」という同じ土俵に乗る。次に、$k$ 個のセンサにわたって 平均と最大 を足してその時刻の異常スコアにする。

$$ \begin{equation} s_i = \frac{1}{k}\sum_{j} r_{ij} + \max_{j} r_{ij} \end{equation} $$

平均だけだと「1個のセンサだけ大きくずれた局所故障」が薄まって埋もれる。そこで最大値を足し、「どこか一箇所でも強くずれたら拾う」感度を持たせている。さらに、瞬間的なノイズで誤報しないよう、窓内の 最小値で平滑化(連続して高い時だけ残す)し、最後に訓練時の平均残差 $\bar{r}_{\text{train}}$ の $\alpha$ 倍(論文では $\alpha=1.5$〜$2.0$)を閾値にする。

TAADの異常スコア計算パイプライン:相対残差→平均+最大集約→窓最小平滑化→α閾値

この「相対残差 → 平均+最大で集約 → 窓最小で平滑化 → $\alpha$ 倍の閾値」という4段構えが、TAAD のスコア側の骨組みだ。先ほどの線形デモの「残差を異常スコアにする」を、多変量・多センサに拡張したものと見ればよい。

では、SP(制御変数 $w$)はこの AE のどこに効くのか。TAAD は AE の入力に計測値 $x$ と制御変数 $w$ の 両方 を与える。$w$ を一緒に入れることで、AE は「この運転条件 $w$ のときに正常なら $x$ はこうなる」という 条件付きの正常像 を学ぶ。だから回転数を上げて振動が増えても、$w$ がそれを説明するので残差は小さい ―― 先のデモの「SP で説明できる変動の引き算」が、AE の中で自然に起きる。

ただし、ここまでは「訓練したその機器で使う」前提だ。現実には、別の機器に持っていったり、センサーが経年で少しずつずれたりして、入力の分布そのものが訓練時とずれる(ドメインシフト)。次節の テスト時適応 が、その溝を埋める。

テスト時適応 ― AEは凍結し、補正を出す適応モジュールだけを学ぶ

TAAD のもう一つの柱が テスト時適応(Test-time Adaptation) だ。モデルをデプロイした後、追加の学習データもラベルもなしに、モデルが新しい環境へ自動で馴染んでいく仕組みである。新入社員が学校に戻らず、職場で働きながら環境に慣れていくイメージだ。

論文のアーキテクチャ図がこの2フェーズを端的に示している。

TAADのアーキテクチャ:a)x,wでAEを事前学習しx̂を再構成 b)AEを凍結し制御変数wから補正Δxを出す適応モジュールを微調整、x̂_t=x̂+Δx

出典: Sun et al., PHME 2024 (arXiv:2406.06607), Fig.2

(a) 事前学習 ―― ソース機器の健全データで、計測値 $x$ と制御変数 $w$ の 両方 を AE に入れて $\hat{x}$ を再構成する(緑=学習中のモデル)。右 (b) テスト時の微調整 ―― ターゲット機器では AE を 凍結(灰色=固定)し、制御変数 $w$ だけを入力とする小さな 適応モジュール $h_\phi$(緑=学習中)を追加する。$h_\phi$ は補正項 $\Delta x$ を出力し、凍結 AE の再構成にこれを足して最終再構成を作る。

$$ \begin{equation} \hat{x}_t = \hat{x}_\theta(x, w) + \Delta x,\qquad \Delta x = h_\phi(w) \end{equation} $$

論文記法に揃えた、自作の対応図がこちらだ。

事前学習はAE(x,w)→x̂、テスト時はAE凍結+適応モジュールh_phi(w)→Δxで補正してx̂_tを作る

ここで設計の肝が2つある。

1) 凍結 + 補正モジュールだけを学ぶ。 デプロイ後に更新するのは適応モジュール $h_\phi$ の重み(と、後述の BN 統計)だけで、事前学習済み AE $f_\theta$ の重みには触れない。なぜわざわざ AE 本体を再学習しないのか ―― テスト時のターゲットデータには 故障が混じっているかもしれない からだ。AE 全体をターゲットデータに合わせて学習し直すと、故障パターンまで「正常」として覚えてしまい(故障データへの過適合)、肝心の異常を見逃す。そこで本体は固定し、ドメインギャップを埋めるための 小さな補正だけ を後付けする。

2) 補正は制御変数 $w$ だけから作る。 これが SP/計測値の分離が効く決定的な点だ。適応モジュール $h_\phi$ の入力は 制御変数 $w$ のみ で、計測値 $x$ は使わない。$w$ は「人が設定する運転条件」なので、機器が壊れていても異常で汚れにくい。つまり TAAD は「運転条件 $w$ で説明できるドメインのずれだけ」を $\Delta x$ で補正し、故障由来のずれ($x$ 側に出る)は補正せず残差として残す。新しい運転条件への適応と、故障の検出能力の維持を、入力の切り分けで両立させている。

補正モジュールに加えて、AE 内部の バッチ正規化(BN)層 の統計量もテスト時に更新する(AdaBN)。BN は入力を訓練時の平均 $\mu$ と分散 $\sigma^2$ で正規化する層だ。

$$ \begin{equation} \hat{x} = \frac{x – \mu}{\sqrt{\sigma^2 + \epsilon}} \end{equation} $$

新しい機器ではこの $\mu, \sigma^2$ が訓練時とずれる。そこで流れてくるターゲットデータの統計量で 指数移動平均(EMA) によって少しずつ更新し、正規化後の特徴を訓練時と同じ土俵に乗せ直す。

$$ \begin{equation} \mu_t = (1-\alpha)\,\mu_{t-1} + \alpha\,\mu_{\mathrm{batch}}, \qquad \sigma^2_t = (1-\alpha)\,\sigma^2_{t-1} + \alpha\,\sigma^2_{\mathrm{batch}} \end{equation} $$

ここで $\alpha$ は更新率で、小さいほどゆっくり追従する。AdaBN は重みを動かさず統計量だけで分布ずれを吸収するので 軽量・安全・ラベル不要 だ。論文では AdaBN 単体も比較手法(ベースライン)として登場し、TAAD はそこに「$w$ から補正 $\Delta x$ を学ぶ適応モジュール」を足して、AdaBN だけでは取りきれないドメインギャップまで埋める。

この AdaBN による「緩やかなドリフトの吸収」が、TAAD の連続適応の心臓部だ。それがどう効くかをデモで見てみよう。

テスト時適応のデモ ― ドリフトは吸収、鋭い異常は残す

センサーが経年で 緩やかに上昇するドリフト(これは故障ではない)に、ある時点の 鋭い異常(突発故障)を重ねたデータを用意する。訓練時の統計で固定したまま正規化する「適応なし」と、$\mu, \sigma^2$ を EMA で更新する「EMA 適応」を比べる。

適応なしはドリフトで誤報が続き、EMA適応はドリフトを吸収して鋭い異常だけを残す

上段の 適応なし では、ドリフトでスコアがじわじわ押し上げられ、やがて閾値を超えっぱなしになって誤報が止まらない(このデモではドリフト区間で 120 点が閾値超え)。緩やかな正常変化を異常と取り違えているのだ。

下段の EMA 適応 では、$\mu, \sigma^2$ がドリフトに追従して正規化し直すため、緩やかな変化はスコアに現れず 0 付近で安定する(同区間の誤報はわずか 1 点)。それでいて、突発的な鋭い異常は EMA が追いつく前に大きなスパイクとして突き抜ける。「ゆっくりした変化は文脈の更新として吸収し、急な逸脱は異常として残す」 ―― これがテスト時適応の狙いだ。更新率 $\alpha$ は、この「どこまでを正常なドリフトと見なすか」のダイヤルにあたる。

更新率 $\alpha$ は、この「どこまでを正常なドリフトと見なすか」のダイヤルにあたる。デモは概念を最小構成で示したものだが、原論文は実機データでこの効きを定量的に示している。次にそれを見る。

原論文の実験 ― ベースラインとの比較

論文は実産業データ(回転機械の状態監視ログ。複数台の機器を2拠点で運用し、各台の入力は運転条件を表す制御変数と性能・状態を表す計測値からなる多変量)で TAAD を評価する。評価軸は故障検知タスクに即した3つだ。

  • 検出の早さ ―― 報告された故障日の何日前に異常を検出できたか(早いほど良い)。
  • 誤報率 ―― 正常な区間でどれだけ誤って異常と出したか($\mathrm{FP}/(\mathrm{FP}+\mathrm{TP})$、低いほど良い)。
  • 故障前検出数 ―― 故障日の前14日間という直前ウィンドウで、何日を異常と捉えたか。

比較相手は3つの設定だ ―― (a) ベースライン(ドメイン適応なし)、(b) AdaBN(BN 統計だけ更新)、(c) MMD(Maximum Mean Discrepancy で分布を合わせる代表的なドメイン適応)、そして (d) TAAD

baseline/AdaBN/MMD/TAADの故障検知性能比較。各日の予測故障数をプロットし、黄線が報告故障日、赤帯が故障前14日窓

出典: Sun et al., PHME 2024 (arXiv:2406.06607), Fig.3

縦軸は各日の「予測された故障数」、黄色の縦線が実際に報告された故障日、赤い帯が故障前14日のウィンドウだ。理想は 赤帯の中だけスパイクが立ち、それ以外は静か な状態である。(a) ベースラインや (c) MMD は故障日と無関係な平常時にもスパイクが散発し(誤報)、(b) AdaBN は静かすぎて2つ目の故障の手前で反応が鈍い。一番下の (d) TAAD は、故障前ウィンドウで明確に反応しつつ平常時のスパイクが最も抑えられている ―― 「適応で平常時の誤報を消しつつ、故障の立ち上がりは残す」という設計どおりの挙動だ。論文の集計でも、TAAD は適応なしや AdaBN・MMD と比べて誤報率を下げながら、故障を十分早く検出できることが示されている。

ここで効いているのが先述の設計判断だ。MMD のように分布全体を合わせにいくと、故障で生じた分布変化まで「合わせて」しまい検出感度が鈍る恐れがある。TAAD は補正を制御変数 $w$ 由来に限定するので、運転条件のずれだけを吸収し、故障由来のずれは残す。この「何を適応し、何を残すか」の線引きが、表面的には似た手法群の中で TAAD を際立たせている。

ここまでで TAAD の2本柱と実験的な裏づけがそろった。最後に、コンテキスト考慮型異常検知の地図の中での位置づけを確認する。

位置づけ ― 文脈を「分離」し「適応」し続ける

大域モデル・Time-CAD・TAADの文脈の扱い方の比較

文脈をどう扱うかで手法は分かれる。文脈を考慮しない 大域モデル は、運転条件の変化をそのまま異常と誤検知してしまう。Time-CAD はカレンダーのような外部文脈を明示的に与えて判定を条件づける。これに対し TAAD は、文脈(運転条件)を 制御変数 $w$ として入力に取り込み、さらに デプロイ後も補正モジュールと BN 統計を連続的に適応 させる点が新しい。

整理すると、TAAD は次の4つを同時に満たす数少ない手法だ。

  • 運用文脈の統合:制御変数 $w$ を AE の明示的な入力として使う。
  • 非定常と定常の分離:適応を $w$ 由来の補正 $\Delta x$ に限ることで、条件変化と故障を切り分ける。
  • 環境への適応:テスト時に $h_\phi$ と BN 統計を更新し、新しい機器・環境に連続追従する。
  • 概念ドリフト耐性:AdaBN の EMA 更新で、時間とともに変わるパターンに直接対応する。

$w$ の取り込みと分離が前2つを、テスト時適応が後2つを担保し、2つのアイデアが相互補完的に働く。

まとめ

TAAD のエッセンスを整理する。

  • 再構成ベース + 制御変数の入力:健全データだけで AE を訓練し、入力に計測値 $x$ と制御変数 $w$ の両方を与える。$w$ で説明できる変動は再構成され、説明できない逸脱だけが残差(=異常スコア)に残る。スコアは相対残差を「平均+最大」で集約し、窓最小で平滑化して $\alpha$ 倍閾値にかける。
  • テスト時適応:デプロイ後は AE 本体 $f_\theta$ を 凍結し、制御変数 $w$ から補正 $\Delta x$ を出す 適応モジュール $h_\phi$ だけを学習(加えて BN 統計を AdaBN で EMA 更新)。本体を再学習しないので、テストデータに混じる故障へ過適合せず、検出能力を保ったまま新環境に馴染む。
  • 何を適応し何を残すか:補正を「異常で汚れにくい制御変数 $w$」だけから作るのが肝。運転条件のドメインずれは $\Delta x$ で吸収し、故障由来($x$ 側)のずれは残す。MMD のように分布全体を合わせにいく手法と違い、適応が検出感度を潰さない。
  • 位置づけ:文脈を「外から与える」Time-CAD に対し、TAAD は文脈を データ内で分離し、デプロイ後も適応し続ける。実機データの比較でも、適応なし・AdaBN・MMD より誤報を抑えつつ故障を早期に捉えた。

「条件で説明できる変化は正常、説明できない逸脱だけが異常」という TAAD の発想は、運転条件がほぼ静的という前提を置けない多くの実システムで効いてくる。続けて、外部文脈を明示的に与える Time-CAD や、運転条件のような潜在モードをデータから発見する TICC と読み比べると、「文脈」を 与える / 分離する / 発見する という3つの流儀の違いがくっきり見えてくるはずだ。

Time-CAD:コンテキストを考慮した時系列異常検知
カレンダーなどの外部文脈を明示的に与えて異常判定を条件づける手法。TAADが文脈をデータ内で分離するのに対し、こちらは外から与える対照的アプローチ。
TICC:相関構造で時系列の『レジーム』を発見する
運転条件のような潜在モードを相関構造から教師なしで発見する手法。TAADがSPとして条件を明示的に分けるのに対し、TICCは条件そのものをデータから掘り起こす。
OmniAnomaly:確率的RNNによる多変量時系列の異常検知
潜在変数で文脈を確率的に吸収する代表的な再構成系手法。文脈の扱い方を比較する起点として読める。