딥러닝 모델 A가 왜 그런 판단을 내렸는지 설명하기 위해, 대리 모델 B(머신러닝모델)를 만들어 설명하는 경우가 있다. 이것이 바로 대리분석기법(Surrogate Analysis) 이다.
Surrogate Analysis 는 모델 B를 학습할 때 데이터셋 전체를 사용하는 경우인 Global Surrogate Analysis와 데이터 하나 하나에 대해 학습하고 들여다 보는 Local Analysis 가 있다. 이미지 분류 모델에 적용하기에는, Local Surrogate Anlysis 가 더 적합하다.
Local Surrogate Analysis 기법 중 하나인 LIME (Local Interpretable Model-anostic Explanations)은 이미지 데이터 하나에 대한 블랙박스 해석 결과를 볼 수 있다. 이미지의 어느 영역을 (어느 픽셀을) 보고 예측을 했는지 알 수 있다.
앞전에 만들었던 Mnist 분류 모델에 대해서 적용해 보자.
(Mnist 데이터셋을 불러와 모델 생성 까지의 과정은 생략했습니다.)

오답으로 분류된 항목들의 인덱스를 추려보니, 총 148개의 오답이 있었다. 이중에서 인덱스 320번을 한번 살펴 보자.

정답은 9이나, 모델은 8이라고 예측했다. 과연 얼마나 비슷할까?

인덱스 320번의 그림을 보면, 사람의 눈으로 보기엔 9이긴 하다. 근데 9자의 끝 꼬리 부분이 오른쪽으로 살짝 말려 있긴 하다. 이것 때문에 8이라고 모델이 예측했던 걸까?

lime 을 위한 라이브러리를 가져온후, segmenter를 정의했다. 첫번째 파라미터인 slic은 이미지를 균등하게 조각낸다. n_segments는 이미지 분할 조각 갯수, compactness 는 유사한 파트끼리 합치는 함수이며 숫자가 클수록 합쳐지는 비율이 높다. sigma는 분할한 이미지를 부드럽게 깎아주는 정도를 말하며 0은 스무딩이 없고 1이 최대로 있는 것이다.

classifier_fn = model.predict -> 예측한 label의 확률값을 계산하고
top_labels = 2 -> 확률 중 2순위까지에 대해 보겠다는 의미이며
num_samples = 10 -> 샘플링하는 공간의 크기이며
위에서 정의한 segmenter를 segmentation으로 사용한다는 의미이다.
이제 그림으로 표현해보면,


ax1은 explainer 가 가장 높은 확률로 분류한 라벨에 도움이 되는 이미지 영역만을 표시
ax2는 ax1에서 positive_only = False 로 바꿔 돌린 결과물이다. 분홍색 영역이 모델일 8이라고 예측할 때 근거로 삼은 부분이다.
ax3은 explainer가 유용하게 사용한 이미지 조각만을 출력한다.
ax4는 ax3의 positive_only=False로 바꿨을 때이다. 유/무의미한 부분 모두 출력한다.