해석 가능한 모델과 사후 설명, SHAP·LIME의 원리를 COMPAS 실험으로 비교해 설명 불일치·불안정을 확인하고, LLM 생각 과정의 충실성, GDPR·CJEU C-203/22·AI Act 제86조·개인정보보호법의 설명 의무와 영업비밀 긴장을 정리
🎯 학습 목표
이 강을 마치면 'AI가 왜 그렇게 판단했는가'라는 질문에 현재 기술이 어디까지 답할 수 있는지 판단할 수 있습니다. 해석 가능한 모델과 사후 설명의 차이, 대표적인 사후 설명 기법인 SHAP과 LIME의 원리를 이해하고, 실제 실험으로 두 기법이 같은 결정을 서로 다르게 설명하거나 실행할 때마다 다른 답을 내는 모습을 확인합니다. 또 대규모 언어 모델이 보여 주는 '생각 과정'이 실제 판단 근거와 다를 수 있다는 최신 연구, 그리고 EU 개인정보보호법(GDPR)·EU AI Act·한국 개인정보보호법이 요구하는 설명의 수준과 영업비밀과의 긴장까지 정리합니다.
🔍 왜 설명이 필요하고, 무엇이 '설명'인가
이 섹션에서는 설명가능성이 왜 중요한지, 그리고 설명에도 여러 종류가 있다는 점을 살펴보겠습니다. 설명가능성(explainability)은 AI 시스템의 출력이 어떻게 나왔는지를 사람이 이해할 수 있는 형태로 제시할 수 있는 성질입니다. 비슷한 말인 투명성(transparency)은 범위가 더 넓어서, 어떤 데이터로 학습했는지, 어디에 쓰이는지, AI를 쓰고 있다는 사실 자체를 알리는지까지 포함합니다.
설명이 필요한 이유는 누가 묻느냐에 따라 다릅니다. 영향을 받는 사람은 대출이 거절되었을 때 이유를 알아야 이의를 제기하거나 다음에 무엇을 바꿀지 정할 수 있습니다. 개발자와 감사자는 모델이 엉뚱한 단서에 기대고 있지 않은지, 2강에서 본 대리 변수로 차별하고 있지 않은지 확인해야 합니다. 운영자는 AI의 추천을 받아들일지 판단해야 하고, 규제 기관과 법원은 결정 과정이 법에 맞는지 검토해야 합니다. 같은 '설명'이라는 말이지만, 대출 신청자에게 필요한 설명과 감사자에게 필요한 설명은 깊이와 형태가 완전히 다릅니다.
설명은 범위에 따라 두 가지로 나뉩니다. 전역 설명은 모델 전체가 대체로 어떤 특성을 중요하게 쓰는지 보여 주고, 국소 설명은 한 사람에 대한 한 번의 판정이 왜 그렇게 나왔는지 보여 줍니다. 또 방식에 따라 해석 가능한 모델과 사후 설명으로 나뉩니다. 해석 가능한 모델은 점수표, 짧은 결정 규칙, 변수가 적은 선형 모델처럼 구조 자체가 읽히는 모델입니다. 사후 설명은 신경망이나 대규모 앙상블처럼 내부가 복잡한 블랙박스 모델을 만든 뒤, 그 동작을 바깥에서 근사해 설명하는 방식입니다.
이 둘의 선택을 두고 중요한 논쟁이 있습니다. 듀크대학교의 신시아 루딘(Cynthia Rudin)은 2019년 「블랙박스 모델을 설명하려 하지 말고 고위험 결정에는 해석 가능한 모델을 쓰라」는 논문에서, 표 형태 데이터를 쓰는 많은 고위험 문제에서는 해석 가능한 모델도 블랙박스와 비슷한 정확도를 낼 수 있으며, 사후 설명은 원래 모델을 충실히 반영한다는 보장이 없다고 주장했습니다. 이 강의 실험이 그 주장의 일부를 직접 보여 줍니다.
🧮 SHAP과 LIME은 어떻게 작동하는가
이 섹션에서는 가장 널리 쓰이는 사후 설명 기법 두 가지의 원리를 살펴보겠습니다. 둘 다 '각 입력 특성이 이번 예측에 얼마나 기여했는가'를 숫자로 보여 주는 특성 기여도 방식입니다.
SHAP(SHapley Additive exPlanations)은 2017년 런드버그(Lundberg)와 리(Lee)가 제안한 방법으로, 게임 이론의 섀플리 값에 바탕을 둡니다. 섀플리 값은 여러 사람이 협력해 얻은 상금을 각자의 기여에 맞게 나누는 방법입니다. 한 사람이 빠졌을 때 상금이 얼마나 줄어드는지를 가능한 모든 협력 조합에서 따져 평균을 냅니다. SHAP은 특성들을 '선수'로, 모델의 예측을 '상금'으로 보고 같은 계산을 합니다. 그 결과 기준값(평균 예측) + 각 특성의 SHAP 값의 합 = 이 사람에 대한 예측이 정확히 성립합니다. 이 덧셈 성질 덕분에 설명이 깔끔하지만, 모든 조합을 따지는 계산이 무거워 모델 종류별로 근사 알고리즘을 씁니다. 트리 기반 모델에는 빠르고 정확한 전용 알고리즘이 있습니다.
LIME(Local Interpretable Model-agnostic Explanations)은 2016년 리베이루(Ribeiro) 등이 제안한 방법입니다. 설명하고 싶은 사람의 데이터 주변에 값을 조금씩 바꾼 가짜 표본을 수백, 수천 개 만들고, 블랙박스 모델이 그 표본들에 내놓는 예측을 모은 뒤, 그 주변에서만 통하는 단순한 선형 모델을 맞춥니다. 그 선형 모델의 계수가 설명이 됩니다. 어떤 모델에든 쓸 수 있다는 장점이 있지만, 가짜 표본을 무작위로 만들기 때문에 결과가 실행마다 달라질 수 있고, '주변'을 어떻게 정의하느냐에 따라 설명이 바뀝니다.
| 구분 | SHAP | LIME |
|---|---|---|
| 원리 | 섀플리 값(모든 특성 조합에서의 평균 기여) | 주변 가짜 표본에 맞춘 국소 선형 모델 |
| 강점 | 기여도의 합이 예측과 정확히 일치, 전역·국소 설명 모두 가능 | 모델 종류와 무관, 개념이 직관적 |
| 약점 | 계산 비용, 특성 간 상관이 클 때 해석 주의 | 무작위성으로 인한 불안정, 주변 정의에 민감 |
| 공통 한계 | '모델이 무엇에 반응하는가'를 보여 줄 뿐, 인과 관계나 그 판단이 옳은지는 알려 주지 않음 | |
💻 실전: 같은 판정, 다른 설명
이 섹션에서는 3강의 COMPAS 데이터로 재범 예측 모델을 만들고, 한 사람에 대한 판정을 SHAP과 LIME으로 설명해 보겠습니다. 인종은 입력에서 빼고 나이, 전과 횟수, 소년범 기록, 성별, 혐의 등급만 썼습니다. 모델은 그래디언트 부스팅 분류기이며, SHAP 0.52.0과 LIME 0.2.0.1로 실행했습니다.
import warnings; warnings.filterwarnings("ignore")
import numpy as np, pandas as pd, shap
from lime.lime_tabular import LimeTabularExplainer
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import train_test_split
df = pd.read_csv("compas.csv")
df = df[(df.days_b_screening_arrest.between(-30, 30)) & (df.is_recid != -1) & (df.c_charge_degree != "O")]
X = pd.DataFrame({
"나이": df.age, "전과 횟수": df.priors_count, "소년 중범죄": df.juv_fel_count,
"소년 경범죄": df.juv_misd_count, "남성": (df.sex == "Male").astype(int),
"중범죄 혐의": (df.c_charge_degree == "F").astype(int)})
y = df.two_year_recid
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=0)
model = GradientBoostingClassifier(random_state=0).fit(X_tr, y_tr)
print(f"테스트 정확도: {model.score(X_te, y_te):.3f}")
person = X_te.iloc[[7]]
print("설명 대상:", person.to_dict("records")[0], f"→ 재범 확률 {model.predict_proba(person)[0, 1]:.3f}")
# ① SHAP: 이 사람의 예측이 평균에서 얼마나, 어느 특성 때문에 벗어났는가(로그 오즈 단위)
explainer = shap.TreeExplainer(model)
sv = explainer.shap_values(person)[0]
print("SHAP:", {k: round(float(v), 3) for k, v in sorted(zip(X.columns, sv), key=lambda t: -abs(t[1]))})
# ② 전체 모델에서 특성 중요도(SHAP 절댓값 평균)
all_sv = explainer.shap_values(X_te)
print("전체 중요도:", {k: round(float(v), 3) for k, v in sorted(zip(X.columns, np.abs(all_sv).mean(0)), key=lambda t: -t[1])})
# ③ LIME: 난수 시드만 바꿔 같은 사람을 다섯 번 설명
for seed in range(5):
lime = LimeTabularExplainer(X_tr.values, feature_names=list(X.columns), class_names=["재범X", "재범"],
discretize_continuous=True, random_state=seed)
exp = lime.explain_instance(person.values[0], model.predict_proba, num_features=3, num_samples=500)
print(f"LIME 시드 {seed}:", [(f, round(w, 3)) for f, w in exp.as_list()])
# ④ SHAP 값의 합 = 이 사람의 예측(로그 오즈) − 평균 예측
base = float(np.ravel(explainer.expected_value)[0])
logit = float(model.decision_function(person)[0])
print(f"기준값 {base:.3f} + SHAP 합 {sv.sum():.3f} = {base + sv.sum():.3f} (모델 출력 {logit:.3f})")
테스트 정확도: 0.671
설명 대상: {'나이': 55, '전과 횟수': 4, '소년 중범죄': 0, '소년 경범죄': 0, '남성': 1, '중범죄 혐의': 1} → 재범 확률 0.337
SHAP: {'나이': -0.955, '전과 횟수': 0.411, '남성': 0.034, '중범죄 혐의': 0.022, '소년 중범죄': -0.0, '소년 경범죄': -0.0}
전체 중요도: {'전과 횟수': 0.684, '나이': 0.468, '남성': 0.103, '중범죄 혐의': 0.068, '소년 경범죄': 0.019, '소년 중범죄': 0.006}
LIME 시드 0: [('소년 경범죄 <= 0.00', -0.196), ('나이 > 42.00', -0.165), ('1.00 < 전과 횟수 <= 4.00', 0.058)]
LIME 시드 1: [('나이 > 42.00', -0.193), ('소년 경범죄 <= 0.00', -0.141), ('0.00 < 중범죄 혐의 <= 1.00', 0.055)]
LIME 시드 2: [('나이 > 42.00', -0.166), ('소년 경범죄 <= 0.00', -0.157), ('1.00 < 전과 횟수 <= 4.00', 0.083)]
LIME 시드 3: [('나이 > 42.00', -0.17), ('소년 경범죄 <= 0.00', -0.09), ('0.00 < 중범죄 혐의 <= 1.00', 0.034)]
LIME 시드 4: [('나이 > 42.00', -0.209), ('소년 경범죄 <= 0.00', -0.126), ('1.00 < 전과 횟수 <= 4.00', 0.054)]
기준값 -0.187 + SHAP 합 -0.489 = -0.676 (모델 출력 -0.676)
결과를 차례로 읽어 보겠습니다. 모델의 테스트 정확도는 0.671로, 3강에서 본 COMPAS 점수와 비슷한 수준입니다. 설명 대상은 55세 남성, 전과 4회, 중범죄 혐의이며, 모델이 매긴 재범 확률은 0.337입니다. SHAP은 '나이'가 예측을 크게 낮추고(−0.955) '전과 횟수'가 올렸으며(+0.411), 소년범 기록은 기여가 0이라고 설명합니다. 마지막 줄은 SHAP의 덧셈 성질을 보여 줍니다. 기준값 −0.187에 SHAP 값의 합 −0.489를 더한 −0.676이 모델의 실제 출력(로그 오즈)과 정확히 일치합니다. 전체 중요도에서는 전과 횟수와 나이가 압도적이었습니다.
LIME의 결과는 다릅니다. 다섯 번 모두 '소년 경범죄 ≤ 0'을 두세 번째로 중요한 이유로 꼽았고, 시드 0에서는 이것이 1위였습니다. SHAP이 기여 0이라고 한 바로 그 특성입니다. 세 번째 이유는 시드에 따라 '전과 횟수'와 '중범죄 혐의'가 번갈아 나왔고, 가중치도 실행마다 달랐습니다. 이 사람이 '왜 저위험인가'를 묻는다면, 어떤 도구를 쓰고 언제 실행했느냐에 따라 '나이가 많고 소년범 기록이 없어서'가 되기도 하고 '나이가 많고 혐의가 중범죄라서'가 되기도 합니다.
이런 현상은 이 실험만의 문제가 아닙니다. 2022년 크리슈나(Krishna) 등은 실무자 인터뷰와 실험을 통해 서로 다른 설명 기법이 같은 예측을 두고 자주 엇갈리며, 실무자들이 어느 설명을 믿어야 할지 원칙 없이 고르고 있다는 불일치 문제(disagreement problem)를 보고했습니다. 더 나아가 2020년 슬랙(Slack) 등은 겉으로는 공정해 보이는 설명을 내놓도록 모델을 조작해, 실제로는 인종 같은 민감 특성으로 판정하면서도 LIME과 SHAP의 설명에는 그것이 드러나지 않게 할 수 있음을 보였습니다. 설명 기법을 감사 도구로 쓸 때, 설명만 보고 '차별이 없다'고 결론 내려서는 안 되는 이유입니다. 3강처럼 집단별 결과 지표를 함께 봐야 합니다.
🤖 대규모 언어 모델의 설명은 믿을 수 있는가
이 섹션에서는 챗봇과 같은 대규모 언어 모델(LLM)의 설명 문제를 살펴보겠습니다. LLM은 이유를 물으면 그럴듯한 문장으로 설명해 주고, 최근의 추론 모델은 답하기 전에 단계별 '생각 과정(chain-of-thought)'을 보여 주기도 합니다. 이것이 모델의 실제 판단 근거일까요?
Anthropic의 정렬 연구팀은 2025년 「추론 모델은 생각하는 것을 항상 말하지는 않는다」는 연구에서 이를 시험했습니다. 문제에 정답의 힌트를 몰래 넣고, 모델이 힌트를 이용해 답을 바꾼 경우에 생각 과정에서 힌트를 썼다고 밝히는지를 측정했습니다. 여러 힌트 유형의 평균으로 Claude 3.7 Sonnet은 25%, DeepSeek R1은 39%의 경우에만 힌트 사용을 언급했습니다. 대부분의 경우 실제로 영향을 준 요인을 생각 과정에 드러내지 않은 것입니다. 연구진은 생각 과정을 감시하는 것이 유용하지만, 그것만으로 문제 행동을 모두 잡아낼 수는 없다고 결론지었습니다.
그렇다면 모델 안을 직접 들여다볼 수는 없을까요. 이를 연구하는 분야가 기계적 해석가능성(mechanistic interpretability)입니다. 신경망의 내부 활성값에서 사람이 이해할 수 있는 개념을 찾아내고, 입력에서 출력까지 어떤 내부 경로를 거치는지 추적합니다. Anthropic은 2025년 Claude 모델 내부에서 개념들이 어떤 경로로 이어져 답이 만들어지는지 추적한 연구를 공개하는 등, 이 분야는 빠르게 발전하고 있습니다. 다만 아직은 연구 단계의 도구이고, 대출 거절 이유를 고객에게 설명하는 실무 수단으로 쓰기에는 이릅니다. 11강에서 AI 안전과 함께 다시 다룹니다.
실무에서 주는 교훈은 분명합니다. LLM에게 '왜 그렇게 답했니?'라고 물어 얻은 답을 판단 근거의 기록으로 쓰면 안 됩니다. 그것은 그럴듯한 설명을 새로 생성한 것일 수 있습니다. 판단 근거를 남겨야 하는 업무라면 LLM이 참고한 문서와 규칙, 입력 데이터를 시스템이 따로 기록하게 설계해야 합니다. 검색 증강 생성(RAG)에서 출처를 인용하게 하는 방식이 그 예입니다.
⚖️ 법이 요구하는 설명과 영업비밀의 긴장
이 섹션에서는 법이 실제로 어떤 설명을 요구하는지 살펴보겠습니다. 유럽연합의 GDPR 제22조는 법적 효과나 그에 준하는 중대한 영향을 주는 결정을 오로지 자동화된 처리로만 받지 않을 권리를 정하고, 제13~15조는 그런 결정이 있을 때 '관련된 논리에 관한 의미 있는 정보'를 알려 주도록 합니다. 이 문구가 무엇을 뜻하는지를 두고 오랫동안 논쟁이 있었는데, 유럽연합 사법재판소(CJEU)가 두 판결로 기준을 세웠습니다.
2023년 12월 SCHUFA 판결(C-634/21)에서 법원은 신용평가 회사가 산출한 점수를 은행이 대출 결정에 결정적으로 쓴다면, 점수를 만드는 일 자체가 자동화된 결정에 해당할 수 있다고 보았습니다. 이어 2025년 2월 27일 Dun & Bradstreet Austria 판결(C-203/22)에서는 휴대전화 계약을 거절당한 고객의 사건을 다루며, 회사가 '실제로 적용된 절차와 원칙'을 당사자가 이해할 수 있게 설명해야 하고, 예컨대 개인 데이터가 달랐다면 결과가 어떻게 달라졌을지를 알려 주는 것이 적절할 수 있다고 판시했습니다. 복잡한 알고리즘 수식을 그대로 넘기는 것은 이해 가능한 설명이 아니라는 점도 분명히 했습니다.
이 판결은 영업비밀과의 긴장도 다뤘습니다. 회사는 신용평가 방식이 영업비밀이라 공개할 수 없다고 주장했지만, 법원은 영업비밀이라는 이유만으로 설명을 거부할 수 없고, 회사가 보호 대상이라고 보는 정보는 법원이나 감독기관에 제출해 당사자의 권리와 영업비밀 보호를 저울질하게 해야 한다고 판단했습니다. 투명성과 영업비밀 중 하나를 택하는 것이 아니라, 독립된 기관이 중간에서 균형을 잡는 구조입니다.
EU AI Act 제86조는 부속서 III의 고위험 AI 시스템 출력을 바탕으로 한 결정의 영향을 받는 사람에게, AI 시스템이 결정 과정에서 한 역할과 결정의 주요 요소에 대해 '명확하고 의미 있는 설명'을 받을 권리를 줍니다. 다만 2026년 개정으로 고위험 시스템 의무의 적용이 2027년 12월로 늦춰진 만큼, 실제 적용 시점은 개정 내용과 함께 확인해야 합니다(13·14강). 한국은 3강에서 본 개인정보보호법 제37조의2가 완전히 자동화된 결정에 대한 설명 요구권과 거부권을 정하고 있고, 개인정보보호위원회의 고시가 설명할 내용과 방법을 구체화하고 있습니다.
| 규범 | 대상 | 요구하는 설명 |
|---|---|---|
| GDPR 제22조·제15조, CJEU C-203/22 | 중대한 영향을 주는 완전 자동화 결정 | 실제 적용된 절차와 원칙을 이해 가능하게, 데이터가 달랐다면 결과가 어떻게 바뀌었을지 등. 영업비밀은 법원·감독기관이 저울질 |
| EU AI Act 제86조 | 부속서 III 고위험 AI 기반 결정 | AI의 역할과 결정의 주요 요소에 대한 명확하고 의미 있는 설명 |
| 한국 개인정보보호법 제37조의2 | 권리·의무에 영향을 주는 완전 자동화 결정 | 설명 요구권, 중대한 영향이면 거부권 |
실무에 적용하면 몇 가지 원칙이 나옵니다. 첫째, 설명할 수 있는 구조로 설계합니다. 고위험 결정에는 루딘의 주장처럼 해석 가능한 모델을 먼저 시도하고, 블랙박스가 꼭 필요하면 그 이유를 기록합니다. 둘째, 사후 설명은 보조 수단으로 씁니다. 여러 기법을 함께 쓰고, 실행을 반복해 안정성을 확인하고, 집단별 결과 지표와 교차 검증합니다. 셋째, 당사자용 설명은 행동 가능하게 만듭니다. CJEU가 예로 든 것처럼 '연체 기록이 없었다면 승인되었을 것'처럼 무엇이 달랐다면 결과가 바뀌었을지를 알려 주는 반사실적 설명이 특히 유용합니다. 넷째, 판단 근거를 기록합니다. 입력 데이터, 모델 버전, 점수, 사람의 최종 판단을 남겨야 나중에 설명 요구에 답할 수 있습니다.
📝 핵심 요약과 다음 강 예고
| 핵심 개념 | 정리 |
|---|---|
| 설명의 종류 | 전역/국소, 해석 가능한 모델/사후 설명 — 묻는 사람에 따라 필요한 설명이 다름 |
| SHAP·LIME | 섀플리 값(덧셈 성질: 기준값 −0.187 + 합 −0.489 = 출력 −0.676) / 국소 선형 근사(무작위성) |
| 실험 결과 | SHAP은 소년 경범죄 기여 0, LIME은 같은 특성을 상위 이유로 제시하고 시드마다 3위가 바뀜 → 불일치 문제 |
| 사후 설명의 함정 | 조작 가능(Fooling LIME and SHAP), 인과가 아님, 감사에는 집단별 지표 병행 |
| LLM의 설명 | 생각 과정이 실제 근거를 다 드러내지 않음(힌트 언급 25%·39%), 근거 기록은 시스템이 따로 |
| 법적 요구 | GDPR·CJEU C-203/22(절차와 원칙, 영업비밀은 기관이 저울질), AI Act 제86조, 개인정보보호법 제37조의2 |
설명을 요구할 권리는 결국 '내 데이터가 어떻게 쓰였는가'를 알 권리와 맞닿아 있습니다. 다음 5강 「프라이버시와 개인정보: 학습 데이터의 딜레마」에서는 AI가 학습 데이터 속 개인정보를 기억하고 다시 드러낼 수 있다는 기술적 사실, 학습 목적의 개인정보 이용에 대한 각국 감독기관의 판단, 그리고 차등 프라이버시 같은 보호 기술의 가능성과 한계를 살펴보겠습니다.
📚 참고 자료
- Rudin, Stop Explaining Black Box Machine Learning Models for High Stakes Decisions — arXiv / Nature Machine Intelligence(2019)
- Lundberg & Lee, A Unified Approach to Interpreting Model Predictions(SHAP) — arXiv(2017)
- Ribeiro et al., "Why Should I Trust You?"(LIME) — arXiv(2016)
- Krishna et al., The Disagreement Problem in Explainable Machine Learning — arXiv(2022)
- Slack et al., Fooling LIME and SHAP — arXiv(2019)
- Reasoning models don't always say what they think — Anthropic(2025)
- Tracing the thoughts of a large language model — Anthropic(2025)
- CJEU Press Release No 22/25, Case C-203/22 Dun & Bradstreet Austria — Court of Justice of the EU
- EU AI Act Article 86: Right to Explanation of Individual Decision-Making — artificialintelligenceact.eu
- SHAP 공식 문서
관련 주제
- 설명가능성
- SHAP
- LIME
- 사후 설명
- 불일치 문제
- 반사실적 설명
- GDPR 제22조
- 자동화된 결정
- 영업비밀
- chain-of-thought
- AI 기술
- AI 기술 강의
- AI 윤리·안전·글로벌 규제
- 무료강의
- 무료 온라인 강의
- NUGUNA
- 누구나
📚 시리즈 전체 공유
AI 윤리·안전·글로벌 규제
이 강의가 속한 시리즈는 총 5강, 모두 무료입니다. 처음부터 배우려는 동료에게 시리즈 전체를 알려 주세요.
댓글
불러오는 중...
