Saliency Maps
顕著性マップは、各ピクセルがモデルの予測にどの程度影響したかを示すヒートマップです。勾配、CAM、摂動を使った手法、その限界、用途を紹介します。
顕著性マップとは、入力画像の各ピクセルがニューラルネットワークの出力、通常は予測された1つのクラスのスコアにどれだけ影響したかを示すヒートマップです。コンピュータービジョンにおける説明可能なAI(XAI)の最も一般的なツールの1つです。物体上を明るく示すマップは予測を裏付けますが、透かし、背景、画像の境界を明るく示すマップはショートカットを明らかにします。顕著性マップは出力を入力ピクセルに結び付ける点で、ネットワーク内部の特徴マップや、レイヤーがどこから情報を集めるかを示すビジョントランスフォーマーのアテンション重みとは異なります。知覚研究では、シーン内で人間の目が引き付けられる場所を示す関連概念にもこの用語を使います。Itti-Kochモデルは、視覚的注意をこのようにモデル化しています。
勾配顕著性の仕組み#
Simonyan、Vedaldi、Zissermanによる勾配顕著性マップ(2013年)では、バックプロパゲーションを用いて、モデルの重みではなく、1つのクラススコアに対する入力画像の勾配を計算します。ピクセルにおける勾配の大きさは、その箇所をわずかに変化させたときにスコアがどれほど変わるかを示します。3つのカラーチャンネルの絶対値の最大値を取ると、ピクセルごとに1つの値が得られます。ImageNet分類器の場合、PyTorchでフォワードパスとバックワードパスを1回ずつ実行すればよいため、計算コストは低く抑えられます。
import urllib.request
from PIL import Image
from torchvision.models import ResNet50_Weights, resnet50
from torchvision.utils import save_image
# Load an ImageNet classifier and track gradients on the input pixels
weights = ResNet50_Weights.DEFAULT
model = resnet50(weights=weights).eval()
image = Image.open(urllib.request.urlopen("https://ultralytics.com/images/bus.jpg"))
x = weights.transforms()(image).unsqueeze(0).requires_grad_()
# Backpropagate the top class score to the pixels
scores = model(x)
top = scores.argmax().item()
scores[0, top].backward()
# Saliency: largest absolute gradient across the color channels, scaled for display
saliency = x.grad.abs().amax(dim=1)
save_image((saliency / saliency.quantile(0.99)).clamp(max=1), "saliency.png")
print(f"Explained class: {weights.meta['categories'][top]}")Explained class: minibusを出力し、分類器が認識した中央クロップの、粒状感のある224 × 224のマップを保存します。生の勾配はピクセルごとにばらつきますが、後続の手法では平均化するか特徴マップ上で処理することでノイズを低減します。
顕著性手法#
- SmoothGrad: ノイズを加えた画像の複製を多数作り、それぞれの勾配マップを平均すると、斑点状のノイズの多くを取り除けます。
- 統合勾配: 黒い画像などのベースラインから入力までの経路に沿って勾配を累積すると、ピクセルスコアの合計が2つのクラススコアの差と一致します。
- Grad-CAM: 最後の畳み込みレイヤーの特徴マップを平均勾配で重み付けしてからアップサンプリングすると、粗いながらもクラス固有の領域が得られます。LayerCAM(2021年)では各位置を個別に重み付けするため、より前段の高解像度レイヤーからも有用なマップを得られます。
- オクルージョンなどの摂動手法: 画像のパッチを隠してスコアの低下量を測定します。勾配は不要ですが、パッチごとにフォワードパスが1回必要です。
Ultralytics YOLOは物体検出などのタスクでLayerCAMマップを計算します。予測モードでvisualize=Trueを使用すると、検出ヘッドに入力される特徴マップの各位置を、信頼度の高い各予測のクラススコアに対する正の勾配で重み付けし、画像ごとに統合ヒートマップを1つ保存します。
from ultralytics import YOLO
# YOLO26の検出根拠を示すLayerCAMヒートマップを保存します
model = YOLO("yolo26n.pt")
results = model("https://ultralytics.com/images/bus.jpg", visualize=True)実行時の保存ディレクトリにbus_cam.jpgを書き込みます。NMSで重複が除去される前に、信頼度しきい値を超えるYOLO26の生の予測から、スコアが最も高い最大16件を説明します。また、classes=[0]を追加すると、人だけのマップが出力されます。
顕著性マップの限界#
顕著性マップが示すのは出力が影響を受けやすい領域であり、モデルがどのように推論するかではありません。後者はメカニスティック解釈可能性の目標です。Adebayoらが2018年に行った健全性チェックでは、誘導付きバックプロパゲーションなどの一般的な手法の一部が、モデルの重みをランダム化した後もほぼ同じマップを生成することが示されました。そのため、これらのマップが反映しているのは学習済みモデルよりも画像のエッジです。また、予測を変えない小さな入力摂動で、マップが大きく変化することもあります。
実際のアプリケーション#
- ショートカットの発見: ヒートマップから、PASCAL VOCデータセットで学習した分類器が、多くの馬の写真に付いていた著作権表示を手掛かりの一部として馬を認識していたことが明らかになりました。この「クレバー・ハンス」的な振る舞いは、精度からは分かりませんでした。
- 医用画像: 胸部X線分類器の開発者は、根拠がスキャナーの文字や胸腔ドレーンなどの治療器具ではなく、肺にあることを確認します。気胸分類器がそうした要素に依存することが示されているためです。
- 画像クロップ: Twitterは、人間の注意を予測する顕著性モデルが視聴者の最初の注目先と予測した位置を中心に、画像プレビューをクロップしていました。同社の研究者による2021年の監査では、クロップが一部の人々を他の人々より体系的に優遇していたことが分かりました。










