IRM(不変リスク最小化) — スプリアス相関を捨て、因果的に頑健な予測を学ぶ

「牛は草原に、ラクダは砂漠にいる」——この相関で動物を分類するモデルを作ると、草原に立つラクダの写真を見せた途端に間違えます。モデルは動物の形(本質)ではなく、背景の色(たまたまの相関)で判断していたのです。こうした スプリアス相関(spurious correlation, 見せかけの相関) に頼った予測は、訓練データでは高精度でも、環境が変わると一気に崩れます。

ドメイン汎化の記事では、この問題を評価の側(LODOCV)から見ました。本記事で扱う IRM(Invariant Risk Minimization, 不変リスク最小化) は、学習の側から正面突破を図る手法です。その思想は強烈に明快です——「すべての環境で同時に最適になる予測器だけを信じよ」。スプリアス相関は環境ごとに強さや向きが変わるので、複数環境で同時に最適にはなれません。逆に、環境によらず成り立つ因果的な関係だけが、すべての環境で同時に最適でいられる。だから「全環境で同時最適」を要求すれば、自然とスプリアスが排除され、因果的に頑健な予測器が残る——これがIRMの賭けです。

本記事では、スプリアス相関がなぜ危険か、IRMの不変性の原理と目的関数、そして実務上の脆さまでを解説し、Pythonで「ERMがスプリアスに頼って破綻する様子」と「不変予測器が頑健な様子」を実測します。なお問題意識は転移可能性と負の転移とも通じます。

IRMの概念

図がIRMの狙いです。複数の環境すべてで同時に最適になる「不変な予測器」を探し、それによって未知環境でも崩れないようにする——この「全環境で同時最適」をどう定式化し、どう実装するかが本記事のテーマです。

因果特徴とスプリアス特徴

IRMを理解する鍵は、特徴を2種類に分けて考えることです。

因果特徴とスプリアス特徴

  • 因果特徴:出力 $y$ を生み出す本質的な原因。動物分類なら「動物の形」。どの環境でも $y$ との関係が変わらない(不変)。
  • スプリアス特徴:$y$ とたまたま相関しているだけの特徴。動物分類なら「背景」。環境ごとに $y$ との関係が変わる(可変)。

問題は、訓練データの中では両者の区別がつかないことです。どちらも $y$ とよく相関しているので、訓練誤差だけを見ると両方が「使える特徴」に見えてしまいます。

環境でスプリアス相関が変わる

図は、因果特徴 $x_1$ とスプリアス特徴 $x_2$ の関係を3つの環境で描いたものです。環境1・2(訓練)ではスプリアス $x_2$ が $y$ と正の相関を持ちますが、その強さが違います。そしてテスト環境では相関が逆転します。因果特徴 $x_1$ と $y$ の関係はどの環境でも不変ですが、スプリアスの関係は環境次第——この違いをモデルに見抜かせたいのです。

ERMがスプリアスに頼る理由

通常の学習である 経験リスク最小化(ERM) は、訓練データ全体の誤差を最小化するだけです。だから、訓練で予測に役立つ特徴なら因果かスプリアスかを問わず何でも使います。

ERMの罠

スプリアス特徴がたまたま強く $y$ と相関していれば、ERMはそれに大きな重みを与えます。訓練環境ではそれで高精度です。しかしテスト環境でスプリアスの相関が逆転すると、その重みがそっくり裏目に出て、精度が大崩壊します。ERMは「訓練で効くものは何でも使う」がゆえに、環境依存の罠にまっすぐ嵌まるのです。後の実験で、この崩壊を実際に目撃します。

不変性の原理

ではIRMはどうスプリアスを排除するのか。核心は、特徴表現 $\Phi$ の上で、最適な分類器がすべての環境で共通になることを要求する点です。

不変性の条件

数式で書くと、表現 $\Phi$ の上に乗せる分類器 $w$ について、

$$ \begin{equation} w^\star \in \arg\min_w R_e(w \circ \Phi) \quad \text{が、すべての環境 } e \in \mathcal{E} \text{ で同時に成り立つ} \end{equation} $$

ような $\Phi$ を探します。$R_e$ は環境 $e$ での誤差(リスク)です。ある表現が「全環境で同じ $w^\star$ が最適」なら、その表現はスプリアスを含んでいません。なぜなら、スプリアスを含むと、環境ごとにスプリアスの相関が違うため最適な $w$ も環境ごとに変わってしまい、「共通の $w^\star$」が存在しなくなるからです。「どの環境でも同じ答えが最適」という条件が、因果特徴だけを選び出すフィルタとして働くわけです。

IRMv1の目的関数

しかし「すべての環境で同時に最適」という条件は、そのままでは二重の最適化($\Phi$ を選びつつ各環境で $w$ を最適化)になり、扱いが厄介です。そこで実用版の IRMv1 では、これを微分可能なペナルティに置き換えます。

IRMペナルティ

アイデアは巧妙です。分類器をダミーのスカラー $w=1.0$ に固定し、「もし $w$ を動かせるとしたら、各環境で損失を下げる方向(勾配)はどちらか」を測ります。$w=1$ がすでに最適なら、その勾配はゼロのはず。そして全環境で $w=1$ が最適(=勾配がそろってゼロ/一致)なら、その表現は不変です。逆にスプリアスを含むと、環境ごとに「もっと下げられる方向」が食い違い、勾配が環境間でばらつきます。図の通り、因果のみの予測器は環境間で勾配が一致しますが、スプリアス依存の予測器は環境ごとに勾配がずれます。この「勾配の環境間の不一致」をペナルティとして罰するのです。

IRMv1の目的関数

これをまとめた目的関数が次です。

$$ \begin{equation} \min_{\Phi}\ \sum_{e \in \mathcal{E}} R_e(\Phi)\ +\ \lambda \sum_{e \in \mathcal{E}} \big\|\nabla_{w|w=1} R_e(w \cdot \Phi)\big\|^2 \end{equation} $$

第1項は各環境での誤差(小さくしたい)、第2項が不変ペナルティ(各環境で「ダミー分類器の勾配」を小さく=そろえたい)です。$\lambda$ がペナルティの強さを決めます。$\lambda=0$ なら単なるERM(全環境プール)、$\lambda$ を大きくするほど「不変性」を強く要求します。誤差を下げつつ、全環境で勾配をそろえる——この2つを両立する表現が、因果的に頑健な予測器になる、という設計です。

Pythonで確かめる

因果特徴 $x_1$(どの環境でも $y$ と同じ関係)と、スプリアス特徴 $x_2$(環境ごとに相関の強さ・符号が変わる)を持つデータを作ります。訓練環境ではスプリアスが正に相関、テスト環境では逆相関にして、スプリアス依存が裏切られる状況を作ります。

import numpy as np, torch, torch.nn as nn
from sklearn.linear_model import LogisticRegression
bce = nn.BCEWithLogitsLoss()

def make_env(n, spur, rng):
    y = rng.integers(0, 2, n)*2 - 1
    x1 = y*1.0 + rng.normal(0, 0.5, n)      # 因果(どの環境でも不変)
    x2 = y*spur + rng.normal(0, 0.5, n)     # スプリアス(環境で変わる)
    return np.stack([x1, x2], 1).astype(np.float32), ((y+1)//2).astype(np.float32)

rng = np.random.default_rng(0)
e1 = make_env(1000, 2.0, rng)               # 訓練環境1:スプリアス強い正相関
e2 = make_env(1000, 1.0, rng)               # 訓練環境2:弱い正相関
Xte, yte = make_env(4000, -2.0, rng)        # テスト環境:逆相関(罠)

def acc(w, X, y):
    return float(((X @ w > 0).astype(int) == y).mean())

まずERM(2環境をプールしてロジスティック回帰)を学習し、テスト環境での精度を見ます。

Xall = np.vstack([e1[0], e2[0]]); yall = np.concatenate([e1[1], e2[1]])
clf = LogisticRegression().fit(Xall, yall); w_erm = clf.coef_[0]
print(f"ERM 重み = [因果 {w_erm[0]:.2f}, スプリアス {w_erm[1]:.2f}]")
print(f"  訓練env1 {acc(w_erm,*e1):.3f} / env2 {acc(w_erm,*e2):.3f} → テスト {acc(w_erm,Xte,yte):.3f}")
ERM 重み = [因果 3.48, スプリアス 3.64]
  訓練env1 1.000 / env2 0.998 → テスト 0.065

ERMはスプリアス特徴にも因果と同等の大きな重み(3.64)を与えています。その結果、訓練環境ではほぼ完璧(1.000 / 0.998)なのに、スプリアスが逆転するテスト環境では精度0.065と壊滅しました。0.5(ランダム)すら大きく下回るのは、スプリアスを信じて逆向きに確信を持って間違えているからです。これがスプリアス依存の怖さです。

ERMと不変予測器の重み

次に、IRMが目指す不変予測器(因果特徴だけを使う)の性能を見ます。

clf_c = LogisticRegression().fit(Xall[:, [0]], yall)        # 因果 x1 のみで学習
w_inv = np.array([clf_c.coef_[0][0], 0.0])                  # スプリアスの重みは0
print(f"不変予測器(因果のみ) → テスト {acc(w_inv, Xte, yte):.3f}")
不変予測器(因果のみ) → テスト 0.975

IRMの結果

劇的な差です。スプリアスを捨てて因果特徴だけに頼る不変予測器は、テスト環境でも 0.975 を維持します。ERMの0.065と比べれば一目瞭然——スプリアスを使わないことこそが、未知環境での頑健さの源泉なのです。IRMの目標は、この「因果のみ」の予測器を、因果かスプリアスかを教えられないまま、複数環境のデータだけから自動で見つけ出すことにあります。

最後に、IRMがどうやってそれを見分けるのか、ペナルティの核を確かめます。ダミースケール $s=1$ における勾配を、各環境で計算します。

def grad_at_s1(w):
    out = []
    for X, y in [e1, e2]:
        Xt = torch.tensor(X); yt = torch.tensor(y); ww = torch.tensor(w, dtype=torch.float32)
        s = torch.ones(1, requires_grad=True)
        l = bce((Xt @ ww) * s, yt)
        g = torch.autograd.grad(l, [s])[0]
        out.append(round(float(g), 3))
    return out

print("因果のみ      w=[1,0]:", grad_at_s1([1.0, 0.0]))
print("スプリアス依存 w=[1,1]:", grad_at_s1([1.0, 1.0]))
因果のみ      w=[1,0]: [-0.236, -0.231]
スプリアス依存 w=[1,1]: [-0.144, -0.22]

因果のみの予測器は、2つの環境で勾配が −0.236 と −0.231 とほぼ一致します(環境によらず「同じ方向が最適」=不変)。一方スプリアスを使う予測器は −0.144 と −0.22 とばらつきます(環境ごとに「最適な方向」が違う=不変でない)。IRMはこの環境間の勾配の食い違いをペナルティとして罰することで、スプリアスを含む表現を避け、因果的に不変な表現へ誘導するのです。原理が数値で確認できました。

なぜ「不変性」が因果につながるのか

IRMの「不変性」という言葉は、実は因果推論の深い考え方に根ざしています。少しだけその背景に触れておきましょう。

因果推論には 「不変性原理(invariance principle)」 という考えがあります。それは、「真の因果メカニズム(原因 $\to$ 結果の仕組み)は、外的な介入や環境の変化があっても変わらない」というものです。たとえば「気温が上がるとアイスが売れる」という因果関係は、店を変えても季節を変えても成り立ちます。一方「アイスの売上と水難事故が相関する」のは、両者の共通原因(夏)を介したスプリアスな関係で、環境(季節を固定する等)を変えれば消えます。

ここから、因果を見抜く操作的な定義が得られます——複数の環境(=自然に起きた介入)にまたがって、$y$ との関係が不変な特徴こそが因果的な特徴である。IRMはこの発想を機械学習に持ち込んだものです。「全環境で最適な予測器が共通」という条件は、「環境という介入のもとで予測関係が不変」という因果の条件を、最適化可能な形に翻訳したものに他なりません。

この見方に立つと、ドメイン汎化の問題は「相関の中から因果を拾い出す問題」として捉え直せます。スプリアス相関は介入(環境変化)で壊れる脆い相関、因果関係は介入に耐える頑健な相関。IRMが未知環境に強いのは、それが本質的に「介入に耐える関係」を選んでいるからです。単なる正則化テクニックではなく、因果と相関を分離する原理としての側面を持つ点が、IRMが理論的に注目され続ける理由です。

実務上の脆さ

IRMは理論的に美しい一方、実装は見た目ほど簡単ではありません。研究でも「IRMv1は期待通りに動かないことがある」と繰り返し報告されています。

IRMの注意点

  • スケールでペナルティを回避できる:予測器の重みを大きくして予測を飽和させると、勾配ペナルティが見かけ上ゼロに近づき、スプリアスを使ったままペナルティを「だませる」ことがあります。実際、本記事の準備でも素朴にIRMv1を最適化すると、重みが膨らんでスプリアスを排除しきれませんでした(だから本記事では原理の確認に留めています)。
  • 環境数が少ないと特定できない:不変性を見抜くには、スプリアスの相関が「十分に違う」環境が複数必要です。環境が2つだけ、しかも似ていると、因果とスプリアスを区別できません。
  • λ調整とアニーリングに敏感:ペナルティを最初から強くすると学習が壊れ、弱いとERMと変わりません。$\lambda$ のスケジューリングが結果を大きく左右します。

これらの弱点を補う後継手法として、環境間でリスクの分散を罰する V-REx(Risk Extrapolation) や、群ごとの最悪リスクを最小化する GroupDRO などが提案されています。IRMは「不変性で頑健性を得る」という強力な視点を確立した一方、その実装は今も活発な研究対象なのです。

まとめ

IRM(不変リスク最小化)を、理論から実装まで解説しました。

  • スプリアス相関(環境ごとに変わる見せかけの相関)に頼った予測は、環境が変わると破綻する。ERMは訓練で効く特徴を何でも使うため、この罠に嵌まりやすい。
  • IRMは「すべての環境で同時に最適な予測器」を探すことで、環境によらず成り立つ因果特徴だけを選び、スプリアスを排除する。
  • IRMv1は、ダミー分類器の勾配が全環境でそろうことをペナルティとして要求する微分可能な定式化。
  • 実測では、ERMがテスト環境(逆相関)で0.065に崩壊する一方、因果のみの不変予測器は0.975を維持。勾配ペナルティの診断でも、因果予測器は環境間で勾配が一致、スプリアス依存は不一致だった。
  • ただしIRMv1はスケールでの回避・環境数不足・λ感度といった脆さを持ち、V-RExやGroupDROなどの後継が研究されている。

次のステップとして、本シリーズで扱ったDANN(特徴整合による頑健化)との比較や、因果推論の視点(do演算・介入)へ進むと、「頑健な予測とは何か」の理解がさらに深まります。