LIME / SHAP / PI / Grad-CAM / Attention ── AIの「なぜ?」を説明する技術
Local Interpretable Model-agnostic Explanations
「局所的に・わかりやすく・どんなモデルでも使える」説明手法。
例:「この患者を"糖尿病"と予測した理由を知りたい」
元のデータの特徴量を少しずつ変えた「近所のデータ」を大量に生成。
例:血糖値を少し変えたり、BMIを少し変えたり。
複雑なモデルが各データに対してどう予測するかを観察する。
→ 「血糖値が高いとき予測が大きく変わる」「BMIはあまり影響しない」
→ 各特徴量の影響度がわかる!
→ 「この患者は、血糖値とHbA1cが高いことが主な理由で"糖尿病"と判定された」とわかる
SHapley Additive exPlanations
ゲーム理論のシャープレイ値を使って、各特徴量の貢献度を厳密に計算する手法。
例:「この家の価格を"5000万円"と予測した理由を知りたい」
「駅徒歩がある時とない時」「面積がある時とない時」…の全組み合わせを調べる。
各特徴量が「ある時とない時で予測がどれだけ変わるか」を計算。
全組み合わせの結果を平均して、各特徴量の公平な貢献度を決定する。
全データの平均予測 = 3500万円 → この家は 5000万円(+1500万円高い)
→ 合計 +1500万円 → 平均3500万 + 1500万 = 5000万円
全てのSHAP値の合計が、予測値と平均値の差にぴったり一致する!
近所を探索して近似する
周辺データをランダムに生成して、その付近で線形モデルを当てはめる。
✅ 計算が速い
❌ 毎回結果が少し変わる(ランダム性)
❌ 理論的な裏付けがやや弱い
全組み合わせから公平に計算
全ての特徴量の組み合わせで貢献度を計算する。
✅ 理論的に厳密(ゲーム理論に基づく)
✅ 結果が一意(毎回同じ結果)
❌ 計算コストが高い(組み合わせ爆発)
特徴量をシャッフルして重要度を測る
LIME・SHAPは「この1件の予測」を説明する局所的手法だった。
PIはモデル全体で「どの特徴量が重要か」を調べる大域的手法。
例:精度 = 90%
例:「血糖値」列のデータをバラバラに並び替える。
→ 血糖値と結果の関係性が壊れる。
例:精度 = 65%(25%低下)→ 血糖値は超重要!
精度低下が大きい順に並べれば、特徴量の重要度ランキングが完成。
→ 「このモデルにとって血糖値とHbA1cが全体的に最も重要な特徴量」とわかる
CNN が「画像のどこを見て判断したか」をヒートマップで可視化
⚠️ CAMの制約:Global Average Pooling(GAP)を持つCNNでしか使えない。
GAPがないモデルでは構造を変更して再学習が必要。
入力画像 → CNN → 「猫: 95%」
「猫」のスコアが最終畳み込み層の各特徴マップにどれだけ依存しているかを勾配で計算。
→ CAMでは「全結合層の重み」を使ったが、Grad-CAMでは「勾配」を使う。
勾配が大きい特徴マップ=「猫」判定に重要な特徴マップ → 重みが大きくなる。
結果をReLUに通して正の部分だけ残す → ヒートマップ完成。
猫の顔周辺が赤い
→ 「顔を見て猫と判断した」
GAPの重みを使う
✅ シンプル
❌ GAPが必須
❌ 構造変更+再学習が必要
勾配を使う
✅ どんなCNNでもOK
✅ 再学習不要
✅ CAMの上位互換
Transformer が「どこに注目したか」を見る
「I love cats」→「私は猫が好きです」の翻訳で、各出力単語がどの入力に注目したか
色が濃い = 注目度が高い。モデルが正しく対応関係を学習していることがわかる!
| LIME | SHAP | PI | Grad-CAM | Attention | |
|---|---|---|---|---|---|
| 年 | 2016 | 2017 | 2010 | 2017 | — |
| 説明 範囲 |
局所的 1件ずつ |
局所的 1件ずつ |
大域的 モデル全体 |
局所的 1画像ずつ |
局所的 1入力ずつ |
| モデル 依存 |
非依存 ✅ | 非依存 ✅ | 非依存 ✅ | CNN専用 | Transformer 専用 |
| やり方 | 周辺データで 線形近似 |
シャープレイ値 全組み合わせ |
特徴量を シャッフル |
勾配で ヒートマップ |
Attention weightを可視化 |
| 出力 | 特徴量ごとの 貢献度 |
特徴量ごとの SHAP値 |
特徴量の 重要度ランク |
画像の ヒートマップ |
注目度の 行列 |
| 計算 コスト |
中程度 | 高い | 低い | 低い | ほぼゼロ |