Integrated Gradients와 Anchors로 XAI 설명을 설계하는 법

Integrated Gradients와 Anchors의 설명 방식, 검증 지표, 운영 파라미터를 비교해 모델 해석 가능성을 설계하는 방법을 정리한다.

2026-08-14 · 최초 발행 2024-04-29

기여도와 규칙은 서로 다른 방식으로 예측을 설명한다

모델의 예측 근거를 확인할 때는 숫자로 표현되는 특징 기여도와 사람이 읽을 수 있는 판단 규칙이 모두 필요할 수 있다. Integrated Gradients(IG)는 입력과 기준점(baseline) 사이에서 출력 기울기를 적분해 각 특징의 기여도를 추정한다. 미분 가능한 모델에 적합한 white-box 지역 설명 기법이다.

Anchors는 특정 예측이 유지되는 조건을 if-then 규칙으로 찾는다. 후보 조건을 샘플링해 정밀도(precision)와 커버리지(coverage)를 추정하므로, 모델 내부를 직접 볼 수 없는 경우에도 적용할 수 있다. 두 기법 모두 개별 예측 주변을 설명하지만, IG는 연속 공간의 정량적 기여도를 다루고 Anchors는 이산 규칙으로 정성·정량 정보를 함께 제시한다.

IG는 baseline에서 입력까지의 경로를 따라 계산한다

IG는 baseline x′에서 입력 x까지의 선형 보간 경로를 m 단계로 나눈다. 각 지점에서 ∂f/∂x를 계산하고, 평균 기울기에 (x − x′)를 곱해 특징별 기여도를 얻는다. m이 커질수록 근사는 정밀해질 수 있지만 계산 비용도 함께 증가한다.

결과는 baseline 선택에 민감하다. 영벡터, 평균, 블러 이미지처럼 어떤 기준을 둘지에 따라 해석이 달라질 수 있다. 다중 baseline 평균, 스무딩, 상대적 중요도 정규화는 이 민감도를 완화하는 방법이다.

IG 결과는 삭제·주입 테스트(perturbation), 단조성·감도, 무작위화 테스트로 점검할 수 있다. 중요한 특징을 제거하거나 주입했을 때 모델 출력이 설명 결과와 일관되게 움직이는지 확인하는 방식이다.

Anchors는 예측을 고정하는 조건을 찾는다

Anchors는 특징 분할 또는 카테고리로 만든 후보 조건 집합을 확장하면서 규칙을 탐색한다. 샘플링을 통해 각 규칙이 예측을 유지하는 정밀도와 해당 규칙이 적용되는 범위를 나타내는 커버리지를 추정한다.

목표 정밀도 θ를 두고, 예를 들어 θ=0.95를 충족한 규칙을 확정할 수 있다. 이 방식은 “소득>X, 연체=0”처럼 감사와 검토에 쓸 수 있는 형태의 설명을 제공한다.

대신 이산화(discretization) 품질과 샘플링 예산의 영향이 크다. 특징 엔지니어링, 시드 고정, 타임아웃과 예산 설정을 함께 관리해야 같은 조건에서 결과를 재현하기 쉽다. 평가는 정밀도, 커버리지, 규칙 길이(복잡도)를 함께 보며 해석성과 일관성의 균형을 판단한다.

항목 Integrated Gradients Anchors
성능 m배 백-프로퍼게이션 비용 발생 샘플링 수에 비례한 추론 비용
확장성 대규모 연속 피처에 유리 고차원·연속형은 이산화 비용 증가
일관성 모델·baseline·스텝에 좌우 샘플링 시드·예산·분할 규칙에 좌우
안정성 스무딩·다중 baseline로 개선 정밀도 목표·커버리지 제어로 개선
운영 편의 미분 가능 모델 필요 모델 불가지론, 범용 적용 용이

설명 결과가 만들어지는 경로

Integrated GradientsAnchors아니오입력 x, 모델 f설명 방법 선택전처리/정규화baseline x' 설정경로 분할 m 스텝 스텝에서 ∂f/∂x 계산평균 기울기 × (x - x')로 기여도산출특징 중요도 벡터특징 이산화/분할후보 규칙 생성샘플링으로 정밀도 추정정밀도 θ?앵커 규칙 확정시각화·검증

IG에서는 baseline의 차원이 맞지 않거나 비미분 연산이 들어가면 그래디언트 NaN이 발생할 수 있다. 입력 정규화, requires_grad 설정, mixed precision 비활성화 검토가 필요하다.

Anchors에서는 이산화 실패, 샘플링 타임아웃, 희귀 카테고리 편향을 점검한다. 분할 전략을 미리 검증하고 최소 샘플 수를 보장하며 시드를 고정하는 방식으로 대응할 수 있다.

영상·표·텍스트에서의 사용 방식

컴퓨터 비전에서는 분류 모델에 IG를 적용해 픽셀 또는 패치 단위의 기여도 맵을 만들고, 스푸리어스 코릴레이션을 찾을 수 있다. 의료영상에서는 ROI 정당화에도 활용된다.

탭울러 신용평가에서는 Anchors로 “소득>X, 연체=0” 규칙을 확보해 심사 기준의 감사 추적성을 높이고, 규제 준수 보고서의 첨부자료로 사용할 수 있다.

텍스트 분류에서는 IG로 토큰 임베딩 기여도를 추정하고 Anchors-Text로 키워드 앵커를 생성한다. 금칙어와 편향 단서를 찾는 데 연결할 수 있다.

비용과 설명 범위를 함께 관리한다

IG의 계산 비용은 기존 추론 대비 약 m배(스텝 수 m) 증가한다. 배치·레이어 공유 최적화로 20~40% 비용 절감이 가능하다.

Anchors는 θ=0.95 설정 시 평균 규칙 길이 24로 운영 가독성을 확보할 수 있으며, 커버리지는 데이터 분포에 따라 1560% 범위다. 두 기법을 사용하면 감사 가능성과 설명 책임성을 높이고 모델 리스크를 낮추는 데 도움이 된다. 설명 결과는 데이터와 피처 엔지니어링의 피드백 루프가 되어 스푸리어스 신호 제거에도 연결된다.

Python으로 확인하는 IG와 Anchors

전제조건은 Python 3.10+, numpy 1.26+, scikit-learn 1.3+, torch 2.2+, alibi 0.9+다.

설치:

pip install numpy scikit-learn torch alibi

Integrated Gradients(PyTorch, 탭울러 Iris)

# env: Python 3.10, torch 2.2
import torch
import torch.nn as nn
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import numpy as np

torch.manual_seed(42)
np.random.seed(42)

# 1) 데이터
X, y = load_iris(return_X_y=True)
scaler = StandardScaler().fit(X)
X = scaler.transform(X).astype(np.float32)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y, random_state=42)

# 2) 모델
class MLP(nn.Module):
    def __init__(self):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(4, 16), nn.ReLU(),
            nn.Linear(16, 3)
        )
    def forward(self, x): return self.net(x)

model = MLP()
opt = torch.optim.Adam(model.parameters(), lr=1e-2)
crit = nn.CrossEntropyLoss()

Xt = torch.tensor(X_train)
yt = torch.tensor(y_train)

# 3) 간단 학습
model.train()
for epoch in range(300):
    opt.zero_grad(set_to_none=True)
    out = model(Xt)
    loss = crit(out, yt)
    loss.backward()
    opt.step()

model.eval()

# 4) IG 함수
@torch.no_grad()
def _linspace(baseline, x, steps):
    alphas = torch.linspace(0, 1, steps+1).view(-1, *([1]*(x.dim())))
    return baseline + alphas * (x - baseline)

def integrated_gradients(model, x, target, baseline=None, steps=50):
    model.eval()
    if baseline is None:
        baseline = torch.zeros_like(x)
    assert baseline.shape == x.shape
    scaled = _linspace(baseline, x, steps)
    grads = []
    for s in scaled:
        s = s.clone().detach().requires_grad_(True)
        y = model(s.unsqueeze(0))[0, target]
        model.zero_grad(set_to_none=True)
        y.backward()
        grads.append(s.grad.clone().detach())
    grads = torch.stack(grads, dim=0)
    avg_grad = grads.mean(dim=0)  # 단순 평균(사다리꼴은 더 정확)
    attributions = (x - baseline) * avg_grad
    return attributions

# 5) 샘플에 적용
x0 = torch.tensor(X_test[0])
target = int(torch.argmax(model(x0.unsqueeze(0)), dim=1))
attr = integrated_gradients(model, x0, target, steps=64)

print("예측 클래스:", target)
print("IG 기여도:", attr.numpy())

baseline은 0, 평균, 중립값 등 도메인에 맞게 선택한다. 수치 안정성을 높이려면 사다리꼴 적분과 스무딩(SmoothGrad)을 병행할 수 있다.

Anchors(Tabular, scikit-learn + Alibi)

# env: Python 3.10, scikit-learn 1.3, alibi 0.9
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from alibi.explainers import AnchorTabular

np.random.seed(42)

# 1) 데이터
X, y = load_iris(return_X_y=True)
feature_names = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
categorical_names = {}  # 모두 연속형

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y, random_state=42)

# 2) 모델
clf = RandomForestClassifier(n_estimators=200, random_state=42).fit(X_train, y_train)
predict_fn = lambda x: clf.predict(x)

# 3) Anchors
explainer = AnchorTabular(predict_fn, feature_names, categorical_names)
# 연속형은 분위수 기반 이산화 필요
explainer.fit(X_train, disc_perc=(25, 50, 75))

x0 = X_test[0]
exp = explainer.explain(x0, threshold=0.95, tau=0.15, batch_size=1000)

print("예측 클래스:", predict_fn(x0.reshape(1, -1))[0])
print("앵커 규칙:", ' AND '.join(exp.anchor))
print("정밀도(precision):", exp.precision)
print("커버리지(coverage):", exp.coverage)

정밀도 임계값 θ와 탐색 파라미터 tau, batch_size, max_anchor_size는 정확도·복잡도·비용의 균형을 정하는 값이다. disc_perc 같은 이산화 전략과 특징 명세는 규칙을 사람이 이해할 수 있는지에 직접 영향을 준다.

운영 환경에서 검증을 반복하는 방법

IG는 입력 정규화와 baseline 설정 뒤 스텝 m을 정한다. 권장 범위는 32~128이며, 레이어·배치 공유로 최적화할 수 있다. 적분 근사로 가중 중요도를 구한 뒤 삭제 테스트로 검증한다.

Anchors는 특징을 이산화하고 범주를 정리한 다음 예측 함수를 래핑한다. 정밀도 목표 θ와 예산을 설정해 규칙을 탐색·샘플링하고, 규칙 길이와 커버리지를 확인하면서 KPI인 정밀도·커버리지·복잡도를 기록한다.

운영 단계에서는 랜덤 시드 고정과 버전·파라미터 아카이브로 재현성을 유지한다. 민감 속성은 분리해 검증하고 교차군 규칙을 비교한다. IG에는 캐싱과 배치 처리를, Anchors에는 샘플링 병렬화를 적용할 수 있다.

IG의 수치적 기여도와 Anchors의 규칙 기반 근거를 함께 사용하면 하나의 설명 방식만으로는 놓치기 쉬운 부분을 교차 검증할 수 있다. baseline과 이산화 방식, 스텝과 샘플링 예산, 정밀도와 커버리지 목표를 명시한 뒤 자동 검증 파이프라인에 포함하는 방식이 적합하다.

설명 가능한 AIIntegrated GradientsAnchors모델 해석XAI