본문 바로가기

문돌이 존버/데이터 분석

(Explainable AI) LIME 개념 이해하기

반응형

LIME이란?

Local surrogate model(한국어로 굳이 번역하자면 "국소 대체 모델")은 블랙박스 머신러닝 모델의 개별 예측을 설명하는 데 쓰이는 해석 가능한(interpretable) 모델입니다. 여기서 잠깐! surrogate model의 개념에 대해 간단하게 살펴보고 가보죠.

Surrogate Model

Surrogate 분석이란, 본래 기능을 흉내내는 대체재를 만들어 프로토타입이 동작하는지 판단하는 분석 방법입니다. XAI에서도 원본 AI 모델이 너무 복잡하여, 연산적인 제약으로 분석이 불가할 때 유사한 기능을 흉내내는 AI 모델 여러 개를 만들어 분석하는 것을 말합니다.

<출처: XAI 설명 가능한 인공지능, 인공지능을 해부하다>

본래 분석해야 하는 모델을 $f$라고 할 때, 이를 흉내내는 모델 $g$를 만드는 것이 surrogate 분석의 목표입니다. 이때 모델 $g$의 학습 방식은 $f$와 같을 수도, 다를 수도 있습니다. 

모델 $g$를 결정하는 핵심 조건은 아래와 같습니다.

1. 모델 $f$보다 학습하기 쉽다.
2. 설명 가능하다.
3. 모델 $f$를 유사하게 흉내낼 수 있다.

모델 $g$의 학습 과정은 아래와 같습니다.

1. 학습 데이터 전부를 사용한다.
2. 데이터 label 별로 혹은 데이터 일부만 사용한다.

원본 모델을 흉내낸 모델 $g$는 정확도가 당연히 떨어질 것이지만 그럼에도 모델 $f$를 설명하고 대변할 수 있다는 장점이 있습니다. 학습 데이터(일부 혹은 전체)를 사용해 surrogate 모델을 구축하는 것을 global surrogate analysis라 하고, 학습 데이터 하나하나를 해석하는 과정을 local surrogate analysis라고 합니다.

LIME(Local Interpretable Model-agnostic[각주:1] Explanations)[각주:2]은 local surrogate model을 구체적으로 구현한 방법입니다. Surrogate 모델은 기저에 있는 블랙박스 모델의 예측을 "근사"하도록 학습됩니다. 다만, global(전역적) surrogate model을 학습하기보단 개별 예측을 설명하기 위해 local surrogate model을 학습하는 데 집중합니다.

LIME을 대하는 자세는 이전에 봐왔던 예측 혹은 분류 모델의 성능을 높이는 것과는 달라야 합니다. 원본 데이터셋은 잊어버리고 왜 모델이 특정한 결과값을 반환했는지 살펴보는 것입니다. LIME은 입력 데이터의 변형을 가했을 때 모델 예측에 어떠한 변화가 일어나는지 테스트합니다. Perturbed(교란된) 샘플과 이에 대응하는 블랙박스 모델의 예측값들로 이루어진 새로운 데이터셋을 생성합니다. 이러한 기반 위에서 관심있는 관측치(인스턴스)에 대한 샘플링된 관측치의 근접성(proximity)에 의해 가중치가 부여된 해석 가능한 모델을 학습합니다.

해석 가능한 모델 예시: Lasso, Decision Tree 등

이때 학습된 모델은 "국소적"으로 모델의 예측을 잘 근사해야 하지만, 전역적으로 근사가 잘 될 필요는 없습니다. 이런 종류의 정확도는 local fidelity(국소적 정확도)라고도 불립니다.

해석 능력(interpretability constraint)을 갖춰야 하는 Local surrogate model의 수식은 다음과 같습니다.

$explanation(x) = argmin_{g\in G} L(f, g, \pi_x) + \Omega(g)$

<수식 1>

모델 $g$는 관측치 x에 대한 설명 가능한 모델로 손실 함수 $L$(e.g. MSE)를 최소화합니다. 이때 모델 복잡도 $\Omega(g)$(e.g. 더 적은 변수 개수)를 낮게 유지하면서 설명 모델의 예측이 얼마나 원본 모델 $f$(e.g. xgboost model)의 예측과 가까운지를 바탕으로 손실을 측정합니다. $\Omega(g)$는 선형 회귀 모델에서 사용했던 regularization(Lasso, Ridge, Elastic net 등)이라고 생각하면 됩니다. 많이 규제하면 변수를 0으로, 즉 변수 개수를 줄이는 것이고, 덜 규제하면 변수를 최대한 활용하겠다는 뜻이죠.

손실 함수 $L$의 수식은 아래와 같습니다.

$L(f, g, \pi_x) = \sum_{z, z' \in Z} \pi_x (z) (f(z) - g(z'))^2$

<수식 2>

G는 가능한 설명의 집합인데, 쉽게 예를 들면 모든 선형 휘귀 모델들이 될 수 있습니다. 근접성 측도(measure) $\pi_x$는 우리가 설명을 위해 고려하는 관측치 x 주위의 이웃(=범위)이 얼마나 큰지를 정의합니다. 가까울수록 더 큰 가중치를 부여하게 되겠죠.

<출처: DeepFindr 유튜브>

실제로는 LIME은 손실 부분만 최적화를 진행하고, 사용자가 복잡도를 결정해야 합니다(선형 회귀 모델의 경우 사용할 변수의 최대 개수를 선택). Local surrogate model을 학습하기 위한 단계는 아래와 같습니다.

1. 블랙박스 모델의 예측에 대해 설명이 필요한 관측치를 선택한다.
2. 데이터셋을 perturb하고 이 새로운 샘플들에 대한 블랙박스 모델의 예측을 얻는다.
3. 관심있는 관측치와의 근접도에 따라 새로운 샘플에 가중치를 부여한다.
4. 가중치가 적용된 해석 가능한 모델을 변형된 데이터셋에 대해 학습시킨다.
5. local model을 해석하면서 예측을 설명한다.

데이터 변형은 어떻게 얻을 수 있을까요? 구체적인 방법은 데이터 타입, 즉 텍스트, 이미지, 테이블 데이터(tabular data)에 따라 다릅니다. 텍스트나 이미지의 경우, 단일 단어나 슈퍼픽셀(super-pixel)들을 마스킹하는 방법을 사용할 수 있습니다.

테이블 데이터의 경우, 각 특성에 대해 개별적으로 perturb하여 새로운 샘플을 만들어냅니다. 이때 perturbation은 해당 특성의 평균과 분산을 파라미터로 가지는 정규분포에서 생성된 노이즈를 해당 특성에 추가하는 것입니다.

LIME for Tabular Data

LIME 샘플링은 관심있는 관측치 주변에서 이루어지는 것이 아니라 학습 데이터의 중심에서 수행됩니다. 샘플링 과정에서는 관심있는 데이터 포인트에 대한 정보가 전혀 사용되지 않습니다. 관심있는 데이터 포인트의 "이웃" 개념이 도입된 것은 커널 함수를 사용하여 샘플링된 데이터 포인트들과 관심있는 데이터 포인트 사이의 거리에 따라 가중치를 다르게 준 이후입니다.

A) 변수 x1, x2를 학습한 랜덤포레스트 -> 어두운 색(1) / 밝은 색(0, 뒤집어진 V 모양)
B) 노란색 점: 설명하고자 하는 관심있는 관측치
    검은색 점: 학습 데이터에서 해당 변수의 평균과 분산을 파라미터로 가지는 정규분포에서 추출된 데이터
C) 관심있는 관측치 주변의 포인트들에 높은 가중치 부여
D) 그리드의 색상과 부호(+, -)는 가중된 샘플 형태를 국소적으로 학습한 모델의 분류 결과를 표시
    흰색 선은 로컬 모델의 분류 결과가 변경되는 결정 경계(decision boundary), 즉 P(Class=1)=0.5가 되는 지점을 표시

물론, 데이터 포인트 주변의 의미있는 이웃을 정의하는 것은 어렵습니다. LIME은 지수 평활 커널(exponential smoothing kernel)을 사용하여 이웃을 정의하는데, 두 개의 데이터 관측치를 받아 근접성 측도를 리턴하는 함수입니다. 커널 너비는 이웃의 크기를 결정합니다(작은 커널 너비는 관측치가 로컬 모델에 영향을 미치기 위해 매우 근접해야 함을 의미하며, 큰 커널 너비는 멀리 있는 관측치도 모델에 영향을 미침을 의미).

LIME의 파이썬 코드를 살펴보면 정규화된 데이터에 지수 평활 커널을 사용한다는 것과 커널의 너비가 $0.75 \times \sqrt{the\ number\ of\ columns}$로 되어있습니다. 이 부분이 문제가 되는 이유는 최상의 커널이나 최적의 너비를 찾을 방법이 없다는 것입니다. 0.75라는 값이 어디서 나온 것인지 알 수 없습니다.

아래는 커널 너비에 따라 달라지는 선형 회귀 모델의 예측값을 보여줍니다.

LIME for Images

이미지 데이터에 대한 LIME은 테이블이나 텍스트 데이터와는 다르게 작동합니다. 하나 이상의 픽셀이 하나의 클래스에 기여하므로 단일 픽셀을 perturb하는 것은 적절하지 않습니다. 개별 픽셀을 바꿔도 모델의 예측에 별다른 영향을 미치지 않을 것입니다.

따라서 슈퍼픽셀 분할(segmentation) 및 마스킹 과정을 통해 이미지의 변형이 일어납니다. 슈퍼픽셀은 유사한 색상의 픽셀을 연결한 것으로 사용자가 제공한 색상(회색 등)으로 각 픽셀을 교체하여 끌 수 있습니다. 사용자는 또한 각 샘플 permutation(=변형)에서 슈퍼픽셀을 끌 확률을 정할 수 있습니다.

<출처: XAI 설명 가능한 인공지능, 인공지능을 해부하다>

이렇게 쪼개진 이미지를 노란색 실선으로 이해 단위를 구분하고, 아래처럼 나뉜 영역을 조합해 원본 모델이 대상을 가장 잘 분류할 수 있는 "대표 이미지"를 구성합니다.

<출처: XAI 설명 가능한 인공지능, 인공지능을 해부하다>

어떤 이미지가 입력값으로 주어질 때, 이미지 내 특정 관심 영역을 $x$라 하고, 초점 주변으로 관심 영역을 키워갈 때 기준 $x$로부터 동일한 정보를 가지고 있다고 간주합니다. 이 영역을 $\pi_x$라 하고 슈퍼픽셀이라 부르는 것입니다.

<출처: XAI 설명 가능한 인공지능, 인공지능을 해부하다>

<수식 1>을 참고하여 이미지 데이터에 적용해보도록 합시다. LIME 논문에선 해석 가능한 모델인 $g$를 아래처럼 단순한 선형 결합 모델로 구축했습니다.

$g=g(x')=w_1 \times x'_1 + w_2 \times x'_2 + ... + w_p \times x'_p$

<수식 3>

$w_i$: 슈퍼픽셀의 가중치(영향의 정도)
$x'_i$: 슈퍼픽셀 마스킹 정보(슈퍼픽셀을 포함시키냐, 포함시키지 않느냐)

슈퍼픽셀 최적의 조합은 <수식 2>에서 봤던 손실 함수가 최저가 되도록 하는 것입니다. 이는 슈퍼픽셀 $\pi_x$의 모든 조합에 대해 블랙박스 모델 $f$의 분류 결과와 $g$의 결과값 차이가 적은 조합을 찾는다는 이야기입니다.

<출처: XAI 설명 가능한 인공지능, 인공지능을 해부하다>

위 그림에선 슈퍼픽셀의 조합($\pi_1,\ \pi_3$)이 손실 함수 L을 최소화하고, 이에 따라 이미지 데이터를 보고 "사람"이라 판단할 확률이 가장 높습니다. 이때 학습된 모델 $g$의 회귀 계수, 즉 $w_1,\ w_3$를 통해 각 슈퍼픽셀이 얼마만큼의 중요도를 갖는지 간접적으로 알 수 있습니다.

이와 같은 방식으로 LIME은 복잡한 분류 모델인 $f$의 결정 경계를 찾아야 함을 알 수 있습니다.

LIME for Text

텍스트 데이터는 테이블, 이미지 데이터와 다른 방식으로 변형이 이루어집니다. 새로운 텍스트는 원래 텍스트에서 임의로 단어를 제거하여 만들어집니다. 데이터셋은 각 단어에 대해 이진 변수로 표현되는데, 단어가 변수에 포함되면 1, 제거되면 0의 값을 지닙니다.

예를 들어, 유튜브 댓글에 대해 스팸인지, 아닌지를 분류해 보도록 합시다. 각 댓글은 하나의 문서(=행)가 되고, 각 컬럼은 특정 단어가 몇 번 등장했는지를 나타냅니다.

먼저 각 댓글과 그에 따른 클래스(스팸:1, 정상: 0)는 아래 형태와 같을 것입니다.

  CONTENT CLASS
267 PSY is a good guy 0
173 For Christmas Song visit my channel! ;) 1

173번의 문장에 대한 변형을 데이터프레임화 시키면 아래 형태와 같습니다. value값 1은 각 문서(=행)에 해당 단어(=컬럼)가 포함됨을, 0은 포함되지 않음을 의미합니다. 3번 문서의 경우 "Christmas Song visit my ;)" 가 되겠습니다.

  For Christmas Song visit my channel! ;) prob
2 1 0 1 1 0 0 1 0.09
3 0 1 1 1 1 0 1 0.09
4 1 0 0 1 1 1 1 0.99
5 1 0 1 1 1 1 1 0.09
6 0 1 1 1 0 0 1 0.99

prob 컬럼은 변형된 각 문장이 스팸으로 예측된 확률을 나타냅니다. 4번과 6번 문서의 prob은 0.99로 실제 스팸일 확률이 가장 높아보이네요.

아래 feature_weight 컬럼은 변형된 문서와 원본 문서 간의 근접도를 보여주며, 계산 방법은 간단합니다.

case label_prob feature feature_weight
1 0.1701170 good 0.000000
1 0.1701170 a 0.000000
1 0.1701170 is 0.000000
2 0.9939024 channel! 6.180747
2 0.9939024 For 0.000000
2 0.9939024 ;) 0.000000

$1 - ratio\ of\ removed\ words$

예를 들어, 변형된 문서에서 7개 단어 중 1개만 제거되었다면 $1 - 1/7 = 0.86$이 됩니다.

LIME 장점

1. LIME은 기반이 되는 머신러닝 모델을 바꾸더라도 동일하게 사용하여 설명할 수 있습니다.
2. LASSO나 얕은 의사결정나무를 사용할 때 결과에 대한 설명은 짧고 대비되는 결과를 잘 보여줄 수 있습니다.
   (이는 단점이기도 한데, 인과관계를 완전히 설명하기에 충분하지 않기 때문에 복잡한 시나리오에는 LIME을 사      용하지 않습니다.)
3. 테이블, 텍스트, 이미지 데이터에 모두 사용할 수 있는 방법입니다.

LIME 단점

1. 테이블 데이터에 LIME을 사용할 때 이웃 영역(neighborhood)을 올바르게 정의하는 것은 큰 문제지만, 아직까지 해결되지 않았습니다. 최적의 커널 너비는 휴리스틱하게 찾아야 합니다.
2. LIME은 샘플링(변수 간 상관관계는 무시한 채 정규분포로부터)을 통해 결정 경계를 확정짓기 때문에 코드를 실행할 때마다 다른 결과를 보일 수 있습니다. 이를 non-deterministic하다고 표현합니다.

다음 시간엔 실제 데이터와 코드를 가지고 LIME에 대해 좀 더 살펴보도록 하겠습니다.

참고
https://velog.io/@tobigs_xai/1%EC%A3%BC%EC%B0%A8-%EB%8C%80%EB%A6%AC%EB%B6%84%EC%84%9DLIME
https://christophm.github.io/interpretable-ml-book/lime.html#fn37
https://www.youtube.com/watch?v=d6j6bofhj2M
Local Surrogate Models(LIME) (rstudio-pubs-static.s3.amazonaws.com)
728x90
반응형