오늘은 XAI framework 중 하나인 SHAP에 대해 다뤄볼 것이다. SHAP는 LIME 이후에 나온 이론적 framework로, 여태까지 이 블로그에서 다루었던 LIME, LRP 뿐만 아니라, DeepLIFT, 그리고 다른 Shapeley-valued method들을 모두 통합하는 하나의 framework이다.
그래서 논문 이름도 "A Unified Approach to Interpreting Model Predictions"이다. 위의 방법론들을 통합하는 하나의 framework이기 때문이다. 대략적으로 어떤 느낌의 방법론이냐면, LIME에서도 그랬듯이 복잡한 문제를 local의 범위에서 linear function으로 간략화하여 다루는 방법론의 큰 틀을 제시했다고 보면 될 것 같다.
원본 논문: https://arxiv.org/abs/1705.07874
A Unified Approach to Interpreting Model Predictions
Understanding why a model makes a certain prediction can be as crucial as the prediction's accuracy in many applications. However, the highest accuracy for large modern datasets is often achieved by complex models that even experts struggle to interpret, s
arxiv.org
Let's DIVE IN
SHAP Values
우선 SHAP의 official github implementation에 가보면, 다음과 같은 사진을 볼 수 있다.
어떤 Model의 feature들에 Shapley value들을 assign 해주면서 explanation 하는 것인데, 빨간색 파란색 막대로 되어있는 저 부분의 숫자들의 Shapley value들이다. 당연히 output에 영향을 미치는 정도를 표현한 것이다.
What is an Explanation Model?
본 논문에서는, 어떤 예측에 대한 설명을 하나의 모델이라고 보고, 이를 토대로 하나의 통합적 모델인 "additive feature attribution methods" 이라는 class를 정의한다.
결국 original model의 approximation이 explanation model이고, 저자들은 이 논문에서 local method들에 집중한다.
논문을 같이 한 번 읽어보자.
additive feature attribution method는 예측 모델 ((f))의 결과를 설명하기 위해 더 단순한 설명 모델 ((g))를 사용한다. 이 방법에서는 입력값 ((x))를 기반으로 예측 ((f(x)))를 설명하기 위해, 입력값 ((x))를 단순화한 ((x'))로 변환한다. 이를 수식으로 표현하면 ((x' = h_{x}(x')))가 된다. 그러니까 ((x'))는 ((x))를 더 간단하게 만든 형태라고 생각하면 된다.
LIME에서는 ((x'))이 binary vector이다. 이전 LIME 게시물을 보면 알 수 있겠지만, 각 superpixel들이 on/off 되어있는 지에 따라서 1, 0의 값을 할당해주는 binary vector로 이미지를 더욱 간단하게 표현할 수 있다. e.g.) [1, 0, 1, 0, 0, 0]
설명 모델 ((g(z')))는 ((f(h_{x}(z'))))와 비슷한 결과를 내도록 설계한다. 여기서 ((z'))는 ((x'))와 비슷한 값이다. 중요한 점은 ((h_{x}(x') = x))라는 점이다. 즉, ((x'))는 ((x))를 단순화한 버전이지만, 다시 ((x))로 돌아갈 수 있다. 다만 ((x'))는 ((x))보다 정보가 적을 수 있다. 이건 현재 입력값 ((x))에 맞춰진 함수 ((h_{x}))가 만들어낸 결과라는 뜻이다.
쉽게 말해서, SHAP의 additive feature attribution method는 복잡한 모델 ((f))의 예측을 이해하기 쉽게 하기 위해, 입력값 ((x))를 더 단순한 ((x'))로 바꾸고, 이를 기반으로 설명 모델 ((g))를 만들어서 예측을 분석한다. SHAP은 이런 방식으로 각 특성이 예측에 얼마나 기여했는지를 공정하게 계산해서 보여준다!
저 수식이 바로 SHAP 모델에 가장 메인이 되는 수식이다.
SHAP에서 ((\phi_{i}))는 각 특성이 예측에 미치는 영향을 공정하게 계산한 값이다. 이는 게임 이론의 Shapley 값을 기반으로 하며, "특성 i가 예측에 얼마나 기여했는가?"를 수치로 나타낸다. 이 값은 특정 특성이 예측값을 얼마나 증가시키거나 감소시켰는지를 보여준다.
바로 이 ((\phi_{i})) 들이 Shapley Value들이고, 위에서 봤던 빨간색 파란색 막대의 점수들이었던 것이다. 이걸 Linear한 모델로 쌓아서 (다 더해서) 쉬운 설명 모델을 하나 만들어내는 것이다.
그러면 Shapley Value는 어떻게 구하나요?
자연스럽게 저 Shapley Value를 어떻게 구하는 지가 궁금할 것이다. 수식과 notation이 좀 복잡한데,
이렇게 구한다. 당연히 한 눈에 못 알아볼 것이다. 하나하나 뜯어보자.
우선 크게크게 설명하자면,
((\phi_{i})) : Shapley value
앞에 sum 부분 : feature i가 없는 모든 경우의 수 F
팩토리얼 부분 : 뒤의 term이 얼마나 자주 일어나는 지에 대한 빈도수 (조금 더 자세히 얘기하자면, "하나의 feature들의 특정한 순서배열" 이 나올 빈도수. S나 F가 지금 뭔지 몰라도 수식 자체를 보면 약간 조합처럼 생겼다)
뒤에 f - f 부분 : Marginal contribution of feature i
크게크게 설명하면 이렇다. 결국 feature i가 가능한 모든 경우의 수에 대해서 초래하는 변화를 평균낸 것이다(빈도수랑 곱해져있으니 expectation처럼 된다).
좀 더 자세한 설명)
일단, 어떤 feature i의 기여도를 계산하기 위한 marginal contribution을 feature ordering, 즉 순서를 매기는 것으로 구한다는 것부터 알아야 한다.
Marginal Contribution via Ordering이란?
SHAP에서 Shapley 값을 계산할 때 marginal contribution via ordering은 핵심적인 개념이다. 이는 게임 이론에서 유래한 Shapley 값 계산법을 모델 해석에 적용한 것으로, 각 특성이 예측에 미치는 기여도를 공정하게 계산하기 위해 모든 가능한 특성 추가 순서(ordering)를 고려한다. 여기서 marginal contribution은 특정 특성이 추가되었을 때 예측값이 얼마나 변하는지를 의미하고, ordering은 특성을 추가하는 순서를 의미한다.
1. Marginal Contribution의 정의
먼저, marginal contribution을 이해한다. SHAP 논문에서는 모델의 예측 함수를 ((f))라고 하고, 입력값을 ((x))라고 표기한다. 입력값 ((x))는 여러 특성으로 이루어져 있다. 예를 들어, ((x = (x_{1}, x_{2}, x_{3})))라면 3개의 특성을 가진다.
특정 특성 ((i))의 marginal contribution은 다음과 같이 정의한다.
- 특성 집합 ((S))가 주어졌을 때, ((S))에 포함된 특성만 사용해서 예측값 ((f(x_{S})))를 계산한다.
- 여기에 특성 ((i))를 추가한 집합 ((S \cup {i}))를 사용해서 예측값 ((f(x_{S \cup {i}})))를 계산한다.
- 두 예측값의 차이를 계산하면 특성 ((i))의 marginal contribution이 된다.
수식으로 표현하면 다음과 같다.
(( \Delta_{i}(S) = f(x_{S \cup {i}}) - f(x_{S}) ))
여기서:
- ((S \subseteq F \setminus {i}))는 특성 ((i))를 제외한 부분집합이다. ((F))는 전체 특성 집합이다.
- ((x_{S}))는 특성 집합 ((S))에 해당하는 입력값만 사용한 것이다. SHAP 논문에서는 ((x_{S}))를 계산하기 위해 특성 값을 단순화된 형태로 변환한다(예: 해당 특성이 없는 경우 평균값이나 기준값으로 대체).
- ((f(x_{S})))는 특성 집합 ((S))만 사용했을 때의 예측값이다.
- ((f(x_{S \cup {i}})))는 특성 ((i))를 추가했을 때의 예측값이다.
2. Ordering(순서)의 역할
Marginal contribution은 특성을 추가하는 순서에 따라 달라질 수 있다. 예를 들어, 특성 ((x_{1}))을 먼저 추가하고 ((x_{2}))를 나중에 추가하는 경우와, ((x_{2}))를 먼저 추가하고 ((x_{1}))을 나중에 추가하는 경우의 기여도가 다를 수 있다. 이는 특성 간의 상호작용(interaction) 때문에 발생한다.
Shapley 값은 이런 순서에 의한 편향을 없애기 위해 **모든 가능한 순서(ordering)**를 고려한다. 즉, 특성들을 추가하는 모든 순서를 하나씩 살펴보고, 각 순서에서 특정 특성의 marginal contribution을 계산한 뒤, 그 값을 평균 낸다.
SHAP 논문에서는 이를 다음과 같은 수식으로 표현한다.
(( \phi_{i}(f, x) = \sum_{S \subseteq F \setminus {i}} \frac{|S|!(|F|-|S|-1)!}{|F|!} [f(x_{S \cup {i}}) - f(x_{S})] ))
여기서:
- ((|S|!(|F|-|S|-1)! / |F|!))는 특정 순서가 나타날 확률을 나타내는 가중치이다.
- ((|F|))는 전체 특성의 개수이고, ((|S|))는 부분집합 ((S))의 크기이다.
- ((f(x_{S \cup {i}}) - f(x_{S})))는 marginal contribution이다.
이 수식은 모든 가능한 순서를 고려해서 marginal contribution을 가중 평균 낸 결과가 Shapley 값 ((\phi_{i}))라는 것을 보여준다.
3. Marginal Contribution via Ordering의 계산 과정
Marginal contribution via ordering을 계산하는 과정을 예시로 살펴본다. 특성이 3개 ((x_{1}, x_{2}, x_{3}))라고 하자. ((F = {1, 2, 3}))이고, ((x_{1}))의 Shapley 값 ((\phi_{1}))을 계산한다고 가정한다.
모든 가능한 순서는 다음과 같다.
- 순서 1: ((x_{1}) \rightarrow (x_{2}) \rightarrow (x_{3}))
- 순서 2: ((x_{2}) \rightarrow (x_{1}) \rightarrow (x_{3}))
- 순서 3: ((x_{2}) \rightarrow (x_{3}) \rightarrow (x_{1}))
- 순서 4: ((x_{3}) \rightarrow (x_{1}) \rightarrow (x_{2}))
- 순서 5: ((x_{3}) \rightarrow (x_{2}) \rightarrow (x_{1}))
- 순서 6: ((x_{1}) \rightarrow (x_{3}) \rightarrow (x_{2}))
각 순서에서 ((x_{1}))이 추가될 때의 marginal contribution을 계산한다.
- 순서 1에서는 ((S = \emptyset))일 때 ((x_{1})) 이 추가되므로, (f(x_{{1}})) - f(x_{\emptyset})) 를 계산한다.
- 순서 2에서는 ((S = {2}))일 때 ((x_{1})) 이 추가되므로, (f(x_{{1,2}})) - f(x_{{2}})) 를 계산한다.
- 순서 3에서는 ((S = {2,3}))일 때 ((x_{1})) 이 추가되므로, (f(x_{{1,2,3}})) - f(x_{{2,3}})) 를 계산한다.
- 나머지 순서도 비슷하게 계산한다.
이렇게 각 순서에서의 marginal contribution을 계산하고, 가중치 ((\frac{|S|!(|F|-|S|-1)!}{|F|!}))를 곱한 뒤 모두 더하면 ((\phi_{1}))이 된다.\
4. SHAP에서 Marginal Contribution via Ordering의 의미
SHAP에서는 marginal contribution via ordering을 사용해서 Shapley 값을 계산한다. 이는 각 특성이 예측에 미치는 기여도를 공정하게 분배하는 방법이다. SHAP 논문에서는 이를 additive feature attribution method로 통합하며, 다음과 같은 형태로 표현한다.
(( g(z') = \phi_{0} + \sum_{i=1}^{M} \phi_{i} z'_{i} ))
여기서 ((\phi_{i}))는 Shapley 값이고, ((z'{i}))는 단순화된 입력값이다. Marginal contribution via ordering은 ((\phi{i}))를 계산하는 과정에서 모든 순서를 고려함으로써, 특성 간의 상호작용을 공정하게 반영한다.
5. 왜 Ordering이 중요한가?
Ordering이 중요한 이유는 특성 간의 상호작용 때문이다. 예를 들어, ((x_{1}))과 ((x_{2}))가 함께 있을 때 예측값이 크게 증가한다면, ((x_{1}))을 먼저 추가하는 경우와 ((x_{2}))를 먼저 추가하는 경우의 기여도가 달라질 수 있다. Shapley 값은 모든 순서를 평균 내서 이런 상호작용 효과를 공정하게 분배한다.
Shapley value를 구하는 방법이 조금 복잡하긴 한데, 이러한 방법을 통해서 feature의 기여도를 산출하는 설명가능한 AI 방법이 있다는 것을 알 수 있다.
나머지 내용들도 조금 있다.
Additive feature attribution method가 오직 하나의 해를 갖게 하는 공리들
저자들은 우리의 Explanation model이 나오는 Additive feature attribution method가 오직 하나의 해 만을 갖기 위한 공리들을 제시한다.
다음과 같은 Property들을 만족할 때, 마지막의 Theorem 1, 우리가 shapley value들을 구할 때 쓰였던 저 식이 오직 하나의 해만을 가진다고 말할 수 있다.

Kernel SHAP (linear LIME + Shapley values)
Kernel SHAP는 linear LIME과 Shapley value들을 합친 것이다. LIME이 explanation model을 산출하는 방식을 다시 보면,
이런 식인데, 여기서
손실함수인 L,
단순화된 입력과 원본 입력 간의 거리 가중치인 파이,
정규화 term인 오메가
를 각각 무엇으로 설정해주느냐에 따라 explanation model이 달라지게 된다. 이게 달라지면, 여기서 계산된 값이 Shapley value와 일치하지 않을 수 있다는 문제점이 생긴다.
그래서 Kernel SHAP는 위의 3개의 term들을 특정한 값으로 지정함으로써 발생할 수 있는 mismatch를 해결한다.
그러면 그 특정한 값들은 무엇인가? 바로 다음과 같다.
이렇게 값들을 지정해주면 위에서 봤던 3개의 공리들과 consistent하게 되며, 해도 하나가 나오게끔 해줄 수 있다.
이 조건을 사용하면, 선형 모델 ((g(z') = \phi_{0} + \sum_{i=1}^{M} \phi_{i} z'{i})))의 계수 ((\phi{i}))가 Shapley 값과 일치한다.
Kernel SHAP은 이를 통해 효율적으로 Shapley 값을 계산하며, 장점으로는 Model-Agnostic 하며, 샘플링을 통해 계산 비용을 줄이면서도 정확한 결과를 제공한다. 이를 통해 모델의 예측을 공정하고 일관되게 설명할 수 있다.