THEMIS:凍結した時系列基盤モデルの埋め込みでゼロショット異常検知

新しいセンサー群や新しい工場ラインに異常検知を導入するたびに、私たちは「そのデータ専用のモデル」を一から学習させてきました。正常データを集め、オートエンコーダや確率的RNNを訓練し、しきい値を調整する——この一連の作業は時間もコストもかかります。しかもラベル付きの異常は現実にはほとんど手に入りません。

ここで素朴な疑問がわきます。画像や言語では「事前学習済みモデルの埋め込みをそのまま使う」ことが当たり前になったのに、なぜ時系列の異常検知では毎回ゼロから学習し直すのか? GPTやCLIPのように、膨大なデータで学んだ汎用表現を「凍結したまま」使い回せないのでしょうか。

THEMIS (Yadav et al., arXiv:2510.03911, 2025) は、まさにこの発想を時系列異常検知に持ち込んだ手法です。アイデアは驚くほどシンプルです。時系列の基盤モデル(Chronos)のエンコーダを凍結し、そこから取り出した埋め込みベクトルを、埋め込み空間での外れ値検出(スペクトル分解やLOF)にかけるだけ。異常検知のための学習は一切行いません。それでも、NASAの火星探査機データ(MSL)では専用に訓練された深層モデルを上回るSOTAを達成します。

THEMISを理解すると、次のような場面で武器になります。

  • 新規導入の高速化: データセットごとの再学習なしに、その場で異常検知を立ち上げる(ゼロショット)
  • ラベルなし運用: 異常ラベルが手に入らない設備監視・ヘルスモニタリングで、事前学習表現だけで検出する
  • 解釈性の確保: 自己類似行列という「見える」中間表現を経由するため、なぜ異常と判定したかを可視化できる

本記事の内容

  • THEMISの直感 — なぜ「凍結した基盤モデルの埋め込み」で異常が見えるのか
  • 窓化と自己類似行列(WASM)の作り方($L=512$、$d=768$、絶対コサイン類似)
  • スペクトル残差スコア・LOF・平均類似スコアの数理(固有分解と外れ値の関係)
  • SPOTによる適応しきい値とゼロショット手順
  • サーベイ: MSL/SMAP/SWaT* でのaffiliation F1比較、ハイパーパラメータ頑健性
  • Pythonによる機構実証(統計特徴を簡易な凍結エンコーダ代理にして、生値空間より埋め込み空間で異常が浮き上がることを再現)

なお最初に正直にお断りします。本記事のPythonデモはChronos本体のSOTA再現ではありません。基盤モデルのダウンロードや巨大な行列計算を避けるため、各窓を小さな統計特徴に写す「簡易な凍結エンコーダの代理」を使い、THEMISの骨格(埋め込み→自己類似→スペクトル/LOF)が本当に効くのかという機構だけを確かめます。論文の数値そのものはサーベイ節で別に紹介します。

前提知識

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

時系列基盤モデルの全体像
ChronosやTimesFMなど、時系列の事前学習モデルを体系的に解説。THEMISが利用するChronosの位置づけがわかります。
LOF(局所外れ値因子)による異常検知
局所密度の比で外れ値を測るLOF。THEMISの外れ値検出アダプタの一つです。
マハラノビス距離による異常検知
「正常からの距離」で異常を測る古典手法。埋め込み空間での距離ベース検出の素地になります。

THEMISとは — 「表現は借りる、判定は差し替える」

THEMISの概念図 窓から凍結基盤モデル埋め込み自己類似行列外れ値検出

まずイメージから入りましょう。THEMISの設計思想は「料理人を雇わず、出来合いの高級食材を使う」ことに似ています。

従来の時系列異常検知は、データセットごとに専属の料理人(モデル)を雇い、その厨房(正常データ)で一から修行させる方式でした。一方THEMISは、すでに世界中の時系列で修行を積んだ料理人——時系列基盤モデル(Chronos)——が下ごしらえした食材(埋め込み)を、そのまま受け取ります。Chronosの重みは一切更新しません(凍結)。THEMIS側がやるのは、その食材を「外れ値検出という最後の一皿」に仕立てることだけです。

上の概念図の通り、処理は4段階に分かれます。

  1. 窓化: 入力時系列を長さ $L=512$ の窓に切る
  2. 埋め込み: 凍結したChronosエンコーダに通し、各窓を高次元(次元 $d=768$)の埋め込み列に写す
  3. 自己類似行列(WASM): 埋め込みどうしの類似度を並べた行列 $S$ を作る
  4. 外れ値検出(アダプタ): $S$ にスペクトル分解やLOFをかけ、各時刻の異常スコアを出す

論文の全体像(Figure 1)は、(a) 埋め込み生成 → (b) 異常スコアアダプタ → (c) 異常の可視化という3つのブロックで描かれています。次の図は、この3ブロック構成を本記事用に描き起こしたものです。

THEMISのアーキテクチャ 埋め込み生成から外れ値検出可視化までの3段パイプライン

(論文Fig.1を参考に作図。本論文はarXivの perpetual non-exclusive ライセンスのため図の直接転載はせず、構成を自作で再現しています。)

(a)では入力時系列を長さ $L=512$ の窓に切り、凍結したChronosエンコーダ $F$ に通して埋め込み列 $Z_t \in \mathbb{R}^{L \times d}$($d=768$)を得ます。(b)では埋め込みから自己類似行列(WASM)を作り、スペクトル残差やLOFなどの「アダプタ」で異常スコア $s_t$ を出し、SPOTで適応しきい値 $\delta$ を決めます。(c)では検出した異常区間を時系列に重ねて出力します。

ここでの肝は、ステップ4(=(b)のアダプタ)が「差し替え可能なモジュール」になっていることです。論文はこれを「アダプタ」と呼びます。Chronosという豊かな表現の上に、好きな外れ値検出器を載せられる。基盤モデルが進化すれば食材の質が上がり、外れ値検出の研究が進めば調理法が増える——両者を独立に進化させられるモジュラー設計が、THEMISの構造上の特徴です。論文も今後の発展として、Toto など他の基盤モデルへの差し替えや、より洗練された外れ値検出器の採用を挙げています。

そして決定的に重要なのは、この全工程に「異常検知のための学習」が一つも含まれていない点です。Chronosは予測(forecasting)だけを目的に事前学習されており、異常ラベルを一切見ていません。それでも異常が見える——なぜそんなことが可能なのか。まずは「埋め込み空間で異常が浮き上がる」という現象から見ていきましょう。

なぜ「凍結した埋め込み」で異常が見えるのか

異常検知の難しさは、「正常とは何か」を一般的に定義できないことにあります。時系列には季節性・トレンド・ノイズ・概念ドリフトが入り混じり、異常も点異常・文脈異常・集合異常と多彩です。専用モデルはこの「正常の定義」をデータから必死に学習しますが、それには大量の正常データと調整の手間がかかります。

THEMISの賭けは、「正常らしさ」はすでにChronosの表現の中に埋め込まれている、というものです。Chronosは約55種類もの多様な時系列(金融・医療・エネルギー・製造・センサ網)で事前学習されています。膨大な「ふつうの時系列の振る舞い」を浴びてきたため、その埋め込み空間では、典型的なパターンは密に集まり、珍しいパターンは周縁の疎な領域に押し出される——という性質が自然に生まれていると期待できます。

これは表現学習の一般則とも整合します。良い表現空間では、意味的に似たものは近く、異質なものは遠くに配置されます。だとすれば、異常とは「埋め込み空間で正常クラスタから遠い点」に他なりません。専用に学習しなくても、幾何学的な外れ値として捉えられるはずです。

この直感を、後ほどPythonで実際に確かめます。生の時系列の値をそのまま並べた空間と、(簡易な)埋め込みに写した空間とで、異常がどれだけ分離されるかを比べます。先に結論の図を見ておきましょう。

生値空間と埋め込み空間のPCA比較

左が生の窓ベクトルをPCAで2次元に落とした図、右が埋め込み(の代理)空間です。生値空間では異常(赤)が正常(青)の塊に紛れていますが、埋め込み空間では赤がより周縁の疎な領域へ散る傾向が見えます。表現を経由するだけで異常が外れ値として浮き上がる——これがTHEMISが成立する根拠です。

ただし高次元の埋め込みをそのまま外れ値検出にかけるのは効率も悪く、構造も見えにくい。そこでTHEMISは「埋め込みどうしの関係」を一枚の行列に凝縮します。それが自己類似行列です。

窓化と自己類似行列(WASM)の構成

THEMISの入力は、生の時系列そのものではありません。Chronosの事前学習時の文脈長に合わせ、長さ $L=512$ のスライディング窓に区切ります。

時系列 $D_{\text{test}} = (x_1, x_2, \dots, x_T) \in \mathbb{R}^T$ を、各窓 $(x_t, x_{t+1}, \dots, x_{t+L-1})$ に分け、これを凍結エンコーダ $F$ に通します。エンコーダは各窓に対して埋め込みテンソル $Z_t \in \mathbb{R}^{L \times d}$ を返します。ここで $d=768$ は埋め込み次元です。つまり1つの時刻ごとに1本の $d$ 次元ベクトルが得られ、それぞれが局所的な時間パターンを符号化しています。

計算量を抑えるバッチ化

系列全体で類似行列を作ると、長さ $T$ の系列で $T \times T$ のメモリが必要になり、現実的ではありません。そこでTHEMISは埋め込み列を、重なりのないバッチ(各バッチに $B$ 個の窓)に区切ります。各バッチの埋め込みをまとめた行列を $Z_{\text{batch}} \in \mathbb{R}^{B \cdot L \times d}$ とし、その中だけで自己類似行列 $S \in \mathbb{R}^{B \cdot L \times B \cdot L}$ を計算します。これで計算量を局所に閉じ込めます。

論文は窓数 $B \in \{1, 4, 16\}$ を試し、主結果はすべて $B=16$ で報告しています(基盤モデルは chronos-t5-base、$L=512$・$d=768$ はChronosの事前学習仕様にそのまま合わせています)。$B$ は「1枚のWASMにどれだけ広い文脈を入れるか」を決めるつまみで、大きいほど類似構造を広域で見られる代わりにメモリを食います。論文の付録(Fig.4)では、$B$ を $1 \to 4 \to 16$ と増やすほどF1が単調に向上することが示されています。広い文脈をまとめて見るほど「正常の支配的構造」がはっきりし、スペクトル分解の切れ味が増すためです。

バッチサイズBに対するF1 大きいほど向上

(論文Fig.4を参考に作図。本論文はarXivのperpetual non-exclusiveライセンスのため図の直接転載はせず、傾向を自作で再現しています。)

固有ベクトル数 $k$ をどう選んでも、$B$ を大きくするほどF1が押し上がる関係が見て取れます。次に、このバッチ内でどう類似度を測るかを見ます。

絶対コサイン類似で類似度を測る

行列 $S$ の各要素は、2つの埋め込み $z_i, z_j$ の類似度です。THEMISはコサイン類似度の絶対値を使います。

$$ \begin{equation} S[i, j] = \left| \frac{\langle z_i, z_j \rangle}{\|z_i\|_2 \cdot \|z_j\|_2} \right| \end{equation} $$

ここで $\langle \cdot, \cdot \rangle$ は内積です。なぜ絶対値を取るのでしょうか。コサイン類似度は $+1$(同じ向き)から $-1$(真逆)まで動きますが、時系列では「真逆の位相パターン」も「強い関係」の一種です。絶対値を取ることで、正の相関も負の相関も等しく「関係が強い」と扱えます。逆に、$|\cos| \approx 0$ になるのは「無関係(直交)」な埋め込みどうしで、これこそ異常のサインになります。

この行列を、論文は WASM (Windowed Absolute Similarity Matrix) と呼びます。以後 $S$ と書きます。実際にWASMを可視化すると次のようになります。

自己類似行列WASMのヒートマップ

明るいほど類似度が高く、暗いほど無関係であることを示します。正常な区間どうしは互いに明るく(似ていて)、水色線で示した異常位置の行は、全体的に暗くなる——つまり系列の他の部分と「つながりが薄い」ことが読み取れます。この「構造からの孤立」が、次に説明するスペクトル分解で異常スコアに変換されます。

ここまでの「窓 → 凍結埋め込み → バッチ化 → WASM → スペクトル分解 → 正規化 → SPOT」という一本道を、式とともに一枚にまとめておきましょう。

バッチ化WASM構成とスペクトル残差スコアのデータフロー

(論文Sec.3.2〜3.3を参考に作図。各式は論文本文から書き起こしています。図の直接転載はしていません。)

上段が埋め込み生成($Z_t \in \mathbb{R}^{L \times d}$ を $B$ 窓ぶん集めて $Z_{\text{batch}}$ を作る)、中段が絶対コサインのWASM、下段が固有分解からスコア $s_t$、そしてSPOTによるしきい値判定までの流れです。この一本道のどこにも勾配学習はありません。WASMという一枚の行列に情報を凝縮したら、あとはそこから異常スコアを引き出すだけです。THEMISはここに複数の「アダプタ」を用意しています。

異常スコアアダプタ① — スペクトル残差スコア

THEMISの最も強力なアダプタがスペクトル分解(spectral decomposition)です。アイデアは「正常データは類似構造の中で一貫したまとまりを作る。異常はそのまとまりを乱す」というものです。

固有分解で「正常の骨格」を取り出す

WASM $S$ は対称行列なので、固有分解できます。

$$ \begin{equation} S = Q \Lambda Q^\top \end{equation} $$

ここで $Q = [q_1, \dots, q_{B \cdot L}]$ は固有ベクトルを並べた行列、$\Lambda = \mathrm{diag}(\lambda_1, \dots, \lambda_{B \cdot L})$ は固有値の対角行列です(昇順に並べます)。

固有値の大きい固有ベクトルは、類似構造の中で支配的な(多くの点が共有する)パターンを表します。正常データはこうした主要パターンに沿って分布するので、上位 $k$ 個の固有ベクトルを取れば「正常の骨格」を張る部分空間が得られます。

$$ \begin{equation} E = [q_{B \cdot L – k + 1}, \dots, q_{B \cdot L}] \end{equation} $$

これは行列 $E$ の各行 $e_t$ が、時刻 $t$ の点を「正常の主部分空間」に射影した座標になっている、と読めます。

主部分空間からの「はみ出し」を異常スコアにする

各点 $t$ の異常スコアは、この主部分空間への整合の低さで定義します。

$$ \begin{equation} s_t = 1 – \frac{\|e_t\|_2}{\max_j \|e_j\|_2} \end{equation} $$

式の意味を順に追いましょう。$\|e_t\|_2$ は、点 $t$ が主部分空間にどれだけ強く乗っているか(整合度)です。正常点はこの値が大きく、異常点は小さくなります。それを最大値で割って $[0,1]$ に正規化し、$1$ から引くことで「主部分空間に乗らない点ほどスコアが高い」という向きに揃えます。

この発想はグラフベースの異常検知やスペクトルクラスタリングと同根です。正常がコヒーレントな低次元構造を作り、異常がそれを壊す、という仮定に立っています。固有値スペクトルと整合度を可視化すると、仕組みが一目でわかります。

WASMの固有値スペクトルと主部分空間整合

左図の固有値スペクトルを見ると、最初の数個だけが突出して大きく、あとは急速に小さくなっています。少数の大きな固有値が正常の支配的構造を担うことの裏付けです。右図では、異常点(赤)が主部分空間への整合 $\|e_t\|$ で正常点(青)より低い側に分布しているのが読み取れます。スコア $s_t = 1 – \|e_t\|/\max$ が大きくなる仕組みです。

スペクトル法は「系列全体の大局構造」から外れ値を見ますが、もっと局所的に「近傍だけ」を見て異常を測る方法もあります。それが2つ目のアダプタ、LOFです。

異常スコアアダプタ② — LOFと類似度ベースのスコア

LOFスコア(局所外れ値因子)

LOFは「ある点の局所密度が、近傍の点たちの局所密度に比べてどれだけ低いか」で外れ値を測る古典手法です。THEMISでは、WASMをまず距離行列に変換します。

$$ \begin{equation} D_{ij} = \max(S) – S_{ij} \end{equation} $$

類似度が高いほど距離が小さくなる、という素直な変換です。この距離のもとで、各点 $t$ の局所到達可能密度 $\mathrm{LRD}_k(t)$ を計算し、

$$ \begin{equation} \mathrm{LRD}_k(t) = \left( \frac{1}{|N_k(t)|} \sum_{j \in N_k(t)} \max\{D_{tj},\, k\text{-dist}(j)\} \right)^{-1} \end{equation} $$

近傍 $N_k(t)$ の密度との比でLOFスコアを定めます。

$$ \begin{equation} \mathrm{LOF}_k(t) = \frac{1}{|N_k(t)|} \sum_{j \in N_k(t)} \frac{\mathrm{LRD}_k(j)}{\mathrm{LRD}_k(t)} \end{equation} $$

LOFが $1$ 前後なら近傍と同じくらいの密度(正常)、$1$ より大きいほど「周囲は密なのに自分だけ疎」=異常です。LOFは大域的な密度の仮定が崩れる、複雑で高次元な埋め込み空間でこそ威力を発揮します。スペクトル法が大局を見るのに対し、LOFは局所を見る——両者は補完的です。

平均類似・トリム平均という単純な基準

THEMISはさらに単純なアダプタも用意しています。平均類似スコアは、各点 $t$ と他の全点の類似度の平均を取り、

$$ \begin{equation} \mu_t = \frac{1}{B \cdot L – 1} \sum_{j \neq t} S_{tj}, \qquad s_t = 1 – \mu_t \end{equation} $$

「系列全体との結びつきが弱い点」を異常とします。トリム平均(Trimmed Top-k Similarity Mean)は、各点の類似度から最小・最大のごく一部を捨て、残った上位 $k$ 個を平均するロバスト版です $s_t = 1 – \mathrm{tt}$。極端な類似値に引きずられにくく、単純ながら複雑なアダプタと比較する強いベースラインになります。

スコアの正規化

4つのアダプタはスケールが揃っていないため、THEMISはどの出力も min-max正規化 で $[0,1]$ に揃えます。

$$ \begin{equation} s_t \leftarrow \frac{s_t – \min_j s_j}{\max_j s_j – \min_j s_j + \varepsilon} \end{equation} $$

$\varepsilon$($=10^{-9}$ 程度)はゼロ割を防ぐ微小定数です。この共通の正規化により、どのアダプタを使っても次のしきい値処理(SPOT)を同じ手順で適用でき、アダプタ間の比較も公平になります。

複数のアダプタからスコアが出たら、最後に「どこからを異常と呼ぶか」のしきい値を決める必要があります。THEMISはここでも学習に頼らず、統計的な方法を使います。

SPOTによる適応しきい値とゼロショット手順

異常スコアを出しても、「スコアがいくつを超えたら異常か」を決めなければ二値の判定になりません。固定のしきい値では、データセットが変わるたびに調整が必要になり、ゼロショットの利点が損なわれます。

THEMISは SPOT (Streaming Peaks-Over-Threshold, Siffer et al., 2017) を採用します。これは極値理論(Extreme Value Theory)にもとづき、スコアの裾(大きい側)を一般化パレート分布(GPD)でモデル化して、統計的に妥当なしきい値 $\delta$ を自動で決める方法です。具体的には、まず高分位の初期しきい値 $t$(例: スコアの上位数%)を置き、それを超える「超過量 $s_t – t$」だけを集めてGPD $G_{\xi,\beta}$ を当てはめます。GPDの形状パラメータ $\xi$・尺度パラメータ $\beta$ が決まれば、目標リスク確率 $q$(誤検出をどれだけ許すか)から $\delta$ を逆算できます。スコアが $\delta$ を超えた時刻を異常と判定します。

SPOT 極値理論による適応しきい値 GPDで裾をモデル化

左図のように、スコア分布の高分位 $t$ より右の「裾」だけを切り出し、右図のGPDで当てはめて、目標リスクに対応するしきい値 $\delta$ を求めます。裾の形だけ見るので、スコア全体の分布がデータセットごとに違っても適応的に効くのがポイントです。論文では、しきい値の当てはめはバリデーション分割上で行います。SPOTはOmniAnomaly(Su et al., 2019)やDADA(Shentu et al., 2025)など先行のSOTA手法でも使われており、ラベルなし・教師なしというTHEMISの性格と相性が良いのです。

ここまでをまとめると、THEMISのゼロショット手順は次の通りです。

  1. テスト系列を長さ $L=512$ の窓に切る
  2. 凍結したChronosエンコーダで埋め込み列を得る(学習なし)
  3. バッチごとに絶対コサイン類似のWASM $S$ を作る
  4. アダプタ(スペクトル/LOF/平均類似)で各時刻のスコア $s_t$ を計算
  5. SPOTでしきい値 $\delta$ を自動決定し、$s_t > \delta$ を異常とする

どの段階にも勾配降下による学習がありません。Chronosは予測のために事前学習されただけで、異常検知のための重み更新はゼロ。これが「ゼロショット異常検知」の中身です。手順を頭に入れたところで、実際にどれだけの性能が出るのかを論文の実験で見ていきましょう。

サーベイ① — ベンチマークと評価指標

THEMISは、時系列異常検知で定番の3つのベンチマークで評価されました。Chronosは単変量(univariate)の予測モデルなので、多変量ベンチマークの単一チャネル部分集合を使います。

データセット 内容 チャネル選択 ラベル付きテスト長 異常率
MSL NASA火星探査機のセンサ・アクチュエータ Shentu et al. 2025 の手法に準拠(第1連続チャネル) 73,729 10.5%
SMAP NASA衛星(土壌水分観測)のテレメトリ 同上(第1単変量チャネル) 427,617 12.8%
SWaT* 実水処理プラントのサイバー物理システム 最初の利用可能チャネル(SWaT* と表記) 449,919 12.1%

ベースラインのSWaTは多変量入力で評価されますが、THEMISはChronosが単変量モデルである都合上、第1チャネルのみを使う設定(SWaT*)で評価しています(論文Table 3)。なお基盤モデルは chronos-t5-base を凍結利用しています。

重要な前提として、Chronosの事前学習コーパス(約55データセット)には、これら評価ベンチマークは一切含まれていません。だからこそ「未知のドメインへのゼロショット汎化」を正当に検証できます。

評価指標 — point-adjustを避けてaffiliation F1

評価指標の選び方は、時系列異常検知では地雷原です。広く使われてきた point-adjust (PA) には、深刻な水増し問題があります。

評価規約 point-adjustとaffiliation F1

point-adjustは「異常区間の中で1点でも当てれば、区間全体を正解扱い」にします。図のように、長い異常区間の中の1点を偶然踏むだけで満点がもらえてしまう。このため、ランダムなスコアでも高いF1が出ることが知られています(この落とし穴は時系列異常検知のサーベイ記事でも詳しく扱っています)。

THEMISは、この水増しを避けるため affiliation F1 (Huet et al., KDD2022) を主指標に採用します。これは予測区間と真の異常区間の時間的な近さ(距離)で適合率と再現率を測る指標で、point-adjustより誠実な評価になります。論文の全結果はaffiliation F1で揃えられています。評価規約を確認したところで、肝心の検出性能を見ましょう。

サーベイ② — 検出性能(MSLでSOTA)

論文のメイン結果(Table 1, affiliation F1基準, 単位%)から主要な手法を抜粋します。太字が各列の最良値です。

手法 MSL F1 SMAP F1 SWaT* F1
OCSVM 66.87 51.58 72.11
LOF(生値) 59.00 60.72 68.65
IForest 68.65 51.51 69.30
AutoEncoder 70.72 50.52 70.45
OmniAnomaly 67.61 68.70 71.41
Anomaly Transformer 66.49 71.65 69.39
DCdetector 70.56 68.99 69.03
D3R 77.02 74.09 74.41
GPT4TS 77.23 74.67 70.11
DADA(拡散ベース・前SOTA) 78.48 75.42 74.60
THEMIS(本手法) 78.78 73.21 71.59

THEMISの検出性能 affiliation F1比較 MSLでSOTA

(論文Table 1を参考に作図。本論文はarXivのperpetual non-exclusiveライセンスのため表の直接転載はせず、数値を書き起こして自作棒グラフにしています。)

注目すべきは、THEMISがMSLで78.78%を達成し、専用に訓練された深層モデル群(全19ベースライン)を上回ってSOTAになっている点です。拡散ベースの前SOTAであるDADA(78.48%)すら超えています。SMAPでも73.21%と上位グループに食い込み、SWaT* でも競争力ある水準です。THEMISのMSLの内訳は適合率70.51% / 再現率89.25%で、適合率の高さ(誤検出の少なさ)が効いています。

ここで思い出してほしいのは、THEMISだけが異常検知の学習をしていないことです。Anomaly TransformerもDCdetectorもDADAも、各データセットで専用に訓練されています。それらと互角以上に戦えるということは、「Chronosの埋め込みには、専用学習に匹敵する『正常らしさ』の知識がすでに宿っている」ことを示しています。

なお、生値空間に直接かけたLOF(表の「LOF」行)はMSLで59.00%と低く、THEMISの78.78%と大きな差があります。同じLOFでも、生値ではなく基盤モデルの埋め込みにかけることで大きく改善する——これがTHEMISの主張の核心であり、後ほどPythonで再現します。

どのアダプタが効くのか

THEMISは複数のアダプタを比較しています(Table 2より, MSL F1)。

アダプタ MSL F1 SMAP F1 SWaT* F1
平均類似(mean) 76.56 70.20 70.09
トリム平均(trimmed-mean) 77.18 69.87 69.79
LOF 72.20 73.52 59.44
スペクトル(THEMIS) 78.78 73.21 71.59

THEMISアダプタ別アブレーション スペクトル残差が最良

(論文Table 2を参考に作図。数値を書き起こして自作棒グラフにしています。)

スペクトル分解がMSL/SWaT* で最良、SMAPでもLOFに僅差の上位でした。論文は、スペクトル法が「埋め込みの類似構造の大局的な不規則性を捉える能力」に優れ、複雑な設定で微妙な逸脱を見逃しにくい、と分析しています。興味深いのは、SMAPではLOF(73.52%)がスペクトル(73.21%)をわずかに上回る点で、大局構造を見るスペクトルと局所密度を見るLOFが補完的であることを裏づけます。単純な平均類似でも76%台と悪くないのも面白いところで、「埋め込み空間での外れ値検出」という枠組み自体の頑健さを物語っています。

性能の高さに加えて、THEMISにはもう一つ実務上の大きな利点があります。ハイパーパラメータへの頑健性です。

サーベイ③ — ハイパーパラメータ頑健性と解釈性

異常検知手法の多くは、しきい値や窓長、潜在次元などの調整に膨大な手間がかかります。ラベルがない現場では、この調整自体が困難です。THEMISの実務的な強みは、主要ハイパーパラメータである固有ベクトル数 $k$ に対して非常に頑健なことです。

論文のFig.3および付録Table 4では、$k \in \{2, 5, 10, 15, 20\}$ と大きく動かしてもF1がほとんど劣化しないことが示されています。実際の数値は次の通りです。

$k$ MSL F1 SMAP F1 SWaT* F1
2 78.3 72.4 67.4
5 77.3 73.2 71.6
10 77.8 70.1 67.8
15 78.8 68.2 69.4
20 76.4 68.6 68.9

固有ベクトル数kに対するF1の頑健性

(論文Table 4の実値をもとに作図。)

変動幅はMSLで約2.4ポイント、SMAPで約5.0ポイント、SWaT で約4.2ポイントに収まります。これは「正常の支配的構造が少数の固有値に集中している」ため、$k$ を多少増減しても主部分空間の中身が大きく変わらないからです。調整に悩まなくてよい*——ラベルが乏しい実運用では、これは性能数値そのものと同じくらい価値があります。

さらにTHEMISは解釈性をデフォルトで備えます。判定の根拠が、WASMという「目に見える行列」とその固有構造にあるためです。異常スコアが高い点について、WASMの該当行が暗い(=系列の他部分との類似が薄い)ことを直接確認できます。ブラックボックスの中で何が起きたかわからない深層モデルと違い、なぜ異常としたかを行列で説明できるのです。

論文の限界も正直に押さえておきます。Chronosが単変量モデルであるため、THEMISは現状多変量時系列をそのまま扱えず、チャネルを個別に処理します。論文も今後の課題として「多変量への拡張」「他の基盤モデル(Totoなど)の利用」「より大きなバッチサイズでの埋め込み生成」を挙げています。

ここまで論文の主張を見てきました。では、その中核である「埋め込み空間にすると異常が浮き上がる」は本当か。手を動かして確かめましょう。

Pythonでの機構実証

ここからはPythonで、THEMISの骨格を再現します。繰り返しになりますが、これはChronos本体のSOTA再現ではありません。基盤モデルのダウンロードと巨大行列の計算を避けるため、各時刻まわりの小窓を8次元の統計特徴ベクトルに写す「簡易な凍結エンコーダの代理」を使います。確かめたいのは次の3点です。

  1. 生値空間より埋め込み空間の方が異常を捉えやすいか
  2. WASM → スペクトル分解という流れが本当に異常を浮き上がらせるか
  3. スペクトル法が固有ベクトル数 $k$ に頑健

合成データの生成

季節性・トレンドを持つ正常系列に、点・文脈・固着・周波数の4タイプの異常を埋め込みます。これは時系列異常の代表的なバリエーションです。

import numpy as np
from sklearn.neighbors import LocalOutlierFactor
from sklearn.metrics import roc_auc_score, average_precision_score, precision_recall_curve

RNG = np.random.default_rng(7)
def gen_series(T=4000):
    t = np.arange(T)
    x = (np.sin(2*np.pi*t/120)            # 主季節
         + 0.5*np.sin(2*np.pi*t/37+0.7)   # 副季節
         + 0.0005*t                        # ゆるいトレンド
         + 0.08*RNG.standard_normal(T))
    lab = np.zeros(T, int)
    for c0 in [430,1180,2550,3380]:        # 点異常(スパイク)
        x[c0] += RNG.choice([-1,1])*1.8; lab[c0] = 1
    for s0 in [800,2000]:                  # 文脈異常(振幅が崩れる)
        ln=40; x[s0:s0+ln] *= 1.9; lab[s0:s0+ln] = 1
    for s0 in [1600,3000]:                 # 集合異常(固着)
        ln=50; x[s0:s0+ln] = x[s0]; lab[s0:s0+ln] = 1
    s0=2750; ln=45                          # 周波数異常(高周波混入)
    x[s0:s0+ln] += 0.9*np.sin(2*np.pi*np.arange(ln)/4); lab[s0:s0+ln] = 1
    return x.astype(np.float64), lab

x, lab = gen_series(); T = len(x)

4タイプの異常を混ぜることで、「単一の異常タイプにだけ効く手法」ではなく、汎用の検出力を試せます。生成した系列を可視化します。

import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(12,3.4))
ax.plot(x, color="#0f172a", lw=0.7)
in_a = False
for i, v in enumerate(lab):
    if v and not in_a: s0=i; in_a=True
    if (not v or i==T-1) and in_a: ax.axvspan(s0,i,color="red",alpha=0.18); in_a=False
ax.set_xlabel("時刻"); ax.set_ylabel("値"); plt.show()

合成時系列と真の異常区間

赤帯が真の異常区間です。点スパイク、振幅の崩れ、平坦化(固着)、高周波混入と、見た目も性質も異なる異常が混在しています。これらを一律に検出できるかが問われます。

簡易な「凍結エンコーダ」代理

各時刻まわりの小窓($w=24$)を、平均・標準偏差・低周波/高周波エネルギー・傾き・自己相関などの8次元統計特徴に写します。これがChronosエンコーダの役割を担う代理です。重みの学習はなく、固定の決定的な写像である点が「凍結」の精神を反映しています。

def embed(x, w=24):
    T = len(x); P = np.zeros((T, 8)); half = w//2
    xp = np.pad(x, (half, half), mode="reflect")
    for i in range(T):
        seg = xp[i:i+w]; m = seg.mean(); s = seg.std()+1e-9
        z = (seg-m)/s
        sp = np.abs(np.fft.rfft(z)); lo = sp[1:4].sum(); hi = sp[4:].sum()
        slope = np.polyfit(np.arange(w), seg, 1)[0]
        if z[:-1].std()>1e-8 and z[1:].std()>1e-8:
            ac1 = np.corrcoef(z[:-1], z[1:])[0,1]
        else:
            ac1 = 0.0                       # 固着区間など分散ゼロでは相関を0に
        P[i] = [m, s, lo, hi, slope, ac1, z.max()-z.min(), np.mean(z**3)]
    P = (P - P.mean(0)) / (P.std(0)+1e-9)   # 列ごと標準化
    return P

Z = embed(x)
Zn = Z / (np.linalg.norm(Z, axis=1, keepdims=True)+1e-9)   # L2正規化(cosine用)

低周波/高周波エネルギーや自己相関を入れることで、「振幅の崩れ」「高周波混入」といった文脈異常も埋め込みに反映されます。次に、この埋め込みからWASMを作ります。

WASM(自己類似行列)とスペクトルスコア

計算量を抑えるため4点ごとにサブサンプルし、絶対コサイン類似のWASMを作ります。論文の式(1)〜(4)をそのまま実装します。

STR = 4
idx = np.arange(0, T, STR)
G = Zn[idx]                # (N, 8) 埋め込み
S = np.abs(G @ G.T)        # WASM = |cosine類似|
N = S.shape[0]
y = lab[idx]

def spectral_score(S, k=5):
    w, Q = np.linalg.eigh(S)   # 昇順の固有値・固有ベクトル
    E = Q[:, -k:]              # 上位k固有ベクトル(主部分空間)
    en = np.linalg.norm(E, axis=1)
    return 1 - en / (en.max()+1e-12)   # 整合が低い点ほど高スコア

def lof_score(M, k=20):
    lof = LocalOutlierFactor(n_neighbors=k); lof.fit(M)
    return -lof.negative_outlier_factor_

def mean_sim_score(S):
    n = S.shape[0]; mu = (S.sum(1) - np.diag(S)) / (n-1)
    return 1 - mu

s_spec = spectral_score(S, k=5)
s_lof  = lof_score(G, k=20)        # 埋め込み空間のLOF
s_mean = mean_sim_score(S)

spectral_scoreは固有分解して上位 $k$ 固有ベクトルの主部分空間を取り、各点の整合度から異常スコアを計算します。論文の式(4)そのものです。次に、これを「生値空間でのLOF」と比較します。

生値空間 vs 埋め込み空間

THEMISの核心主張——「埋め込みにすると異常が浮き上がる」——を、同じLOFを生値の窓と埋め込みにかけて比べます。

def raw_windows(x, w=24):
    T = len(x); half = w//2; xp = np.pad(x, (half, half), mode="reflect")
    return np.stack([xp[i:i+w] for i in range(T)])

RW = raw_windows(x)[idx]
s_raw_lof = lof_score(RW, k=20)   # 生値窓に直接LOF

def metr(y, s): return roc_auc_score(y, s), average_precision_score(y, s)
for name, s in [("生値LOF", s_raw_lof), ("埋め込みLOF", s_lof),
                ("平均類似", s_mean), ("スペクトル", s_spec)]:
    a, p = metr(y, s)
    print(f"{name:8s} ROC-AUC={a:.3f}  PR-AUC={p:.3f}")

実行すると次の結果が得られます(seed固定)。

手法 ROC-AUC PR-AUC
生値LOF 0.672 0.310
埋め込みLOF 0.878 0.274
埋め込み平均類似 0.787 0.472
埋め込みスペクトル 0.757 0.427

埋め込み空間の3手法はいずれも生値LOF(ROC-AUC 0.672)を上回りました。特に埋め込みLOFはROC-AUC 0.878まで跳ね上がります。同じLOFアルゴリズムでも、入力を生値から埋め込みに変えるだけで大きく改善する——論文がMSLで「生値LOF 59.00 → THEMIS 78.78」と報告した現象が、簡易な代理でも再現できました。棒グラフで一覧します。

import matplotlib.pyplot as plt
names = ["生値空間\nLOF","埋め込み\nLOF","埋め込み\n平均類似","埋め込み\nスペクトル"]
aucs = [0.672, 0.878, 0.787, 0.757]; aps = [0.310, 0.274, 0.472, 0.427]
xx = np.arange(4); wd = 0.36
fig, ax = plt.subplots(figsize=(9,4.4))
cols = ["#94a3b8","#3b82f6","#0fb9c9","#10b981"]
ax.bar(xx-wd/2, aucs, wd, label="ROC-AUC", color=cols)
ax.bar(xx+wd/2, aps, wd, label="PR-AUC", color=cols, alpha=0.55, hatch="//")
ax.set_xticks(xx); ax.set_xticklabels(names); ax.legend(); plt.show()

生値LOFと埋め込み各手法のROC/PR比較

埋め込み空間の3手法(青・水色・緑)が、生値空間(灰)を明確に上回っています。なお埋め込みLOFはROC-AUCが最高ですが、PR-AUCでは平均類似が最高で、アダプタごとに得意が違うことも見て取れます。論文がスペクトルを推す一方で平均類似も健闘していたのと整合する構図です。

スペクトルスコアの時系列と頑健性

スペクトルスコアを時系列として可視化し、真の異常帯と重ねます。

def upsample(s):
    full = np.zeros(T)
    for j, i in enumerate(idx): full[i:i+STR] = s[j]
    return full[:T]

sc = upsample(s_spec)
fig, ax = plt.subplots(figsize=(12,3.6))
ax.plot(sc, color="#6366f1", lw=0.8, label="スペクトル残差スコア")
in_a = False
for i, v in enumerate(lab):
    if v and not in_a: s0=i; in_a=True
    if (not v or i==T-1) and in_a: ax.axvspan(s0,i,color="red",alpha=0.18); in_a=False
ax.legend(); plt.show()

スペクトル異常スコアの時系列

赤帯(真の異常)の多くでスコアが立ち上がっています。点スパイク・文脈異常・周波数異常で明瞭に反応し、簡易代理でも複数タイプの異常を一律に捉えられることがわかります。最後に、固有ベクトル数 $k$ への頑健性を確認します。

ks = [1,2,3,5,8,10]; f1s = []
for k in ks:
    s = spectral_score(S, k=k)
    p, r, _ = precision_recall_curve(y, s); f = 2*p*r/(p+r+1e-12)
    f1s.append(np.nanmax(f))
print(dict(zip(ks, [round(f,3) for f in f1s])))

固有ベクトル数kに対する頑健性

$k$ を $1$ から $10$ まで動かしても、最良F1は $0.43$〜$0.51$ の範囲に収まり、大きくは変動しません。スペクトル法が固有ベクトル数 $k$ に頑健だという論文の主張(768次元での結果)が、8次元の代理でも同じ傾向で現れました。少数の大固有値に正常構造が集中しているため、$k$ の選び方に神経質にならなくてよいのです。最後に、正常と異常のスコア分布を確認します。

fig, ax = plt.subplots(figsize=(8,4.2))
ax.hist(s_spec[y==0], bins=30, color="#3b82f6", alpha=0.6, density=True, label="正常")
ax.hist(s_spec[y==1], bins=20, color="#ef4444", alpha=0.6, density=True, label="異常")
ax.set_xlabel("スペクトル異常スコア"); ax.set_ylabel("密度"); ax.legend(); plt.show()

異常スコアの分布 正常vs異常

異常(赤)は高スコア側に裾を引き、正常(青)の塊とおおむね分離しています。完全な分離ではありませんが、SPOTのような裾の分布を使う適応しきい値が、なぜ妥当に機能するかが見て取れます。

これらの実験を通じて、THEMISの主張の核——「事前学習表現を凍結したまま、埋め込み空間で外れ値を見れば、学習なしで異常が捉えられる」——が、簡易な代理でも確かに成り立つことを確認できました。

まとめ

本記事では、THEMIS(Yadav et al., 2025)を理論から実装、論文サーベイまで通して解説しました。

  • 核心: 凍結した時系列基盤モデル(Chronos)のエンコーダ埋め込みを取り出し、自己類似行列(WASM)に外れ値検出をかけてゼロショットで異常を検知する。異常検知のための学習は一切なし
  • WASM: 各埋め込みの絶対コサイン類似 $S[i,j]=|\cos(z_i,z_j)|$ を並べた行列。正の相関も負の相関も「関係が強い」と扱う
  • アダプタ: スペクトル残差($s_t=1-\|e_t\|/\max$)・LOF・平均類似。スペクトルが最良で、差し替え可能なモジュラー設計
  • しきい値: SPOT(極値理論)で適応的に決定。学習に頼らない
  • 実験: affiliation F1基準で、MSLでSOTA(78.78%)を達成し専用学習モデルを上回る。SMAP/SWaT* でも競争力あり。固有ベクトル数 $k$ に頑健で解釈性も高い
  • 機構実証: 合成データで、同じLOFでも生値より埋め込み空間の方が大きく改善することを再現(生値0.672 → 埋め込み0.878)

THEMISが示したのは、「時系列でも、画像や言語のように事前学習表現を凍結利用できる」という方向性です。基盤モデルが進化し、外れ値検出が洗練されれば、両者を独立に組み合わせてさらに伸ばせる——この拡張性が最大の魅力です。

次のステップとして、以下の記事も参考にしてください。

時系列基盤モデルの全体像
THEMISが土台にするChronosをはじめ、時系列の事前学習モデルを体系的に解説。
時系列異常検知の深掘りサーベイ
手法分類・最新潮流・point-adjustなど評価の落とし穴まで。THEMISの位置づけが俯瞰できます。
USADによる多変量時系列の異常検知
専用に学習する従来型の代表格。ゼロショットのTHEMISと対比すると違いが鮮明になります。

参考文献

  • Yadav Mahesh Lorik, Kaushik Sarveswaran, Nagaraj Sundaramahalingam, Aravindakumar Venugopalan. “THEMIS: Unlocking Pretrained Knowledge with Foundation Model Embeddings for Anomaly Detection in Time Series.” arXiv:2510.03911v1 [cs.LG], 2025 (Comcast India Engineering Center).
  • A. F. Ansari et al. “Chronos: Learning the Language of Time Series.” NeurIPS 2024 / arXiv:2403.07815.
  • M. M. Breunig, H.-P. Kriegel, R. T. Ng, J. Sander. “LOF: Identifying Density-Based Local Outliers.” ACM SIGMOD, 2000.
  • A. Siffer, P.-A. Fouque, A. Termier, C. Largouet. “Anomaly Detection in Streams with Extreme Value Theory.” KDD, 2017.
  • A. Huet, J. M. Navarro, D. Rossi. “Local Evaluation of Time Series Anomaly Detection Algorithms.” KDD, 2022.