-
captum으로 내가 만든 pyTorch 모델 결과 분석하기 (XAI)Paper Reviews 2023. 3. 21. 10:39
가끔 내가 만든 모델이 왜 이런 output을 냈는지 궁금할 때가 있습니다. 딥 모델을 서비스에 적용한 경우라면 가끔 이상한 모델 결과에 대해 무엇 때문에 이런 결과가 나왔는지 설명을 듣고 싶은 지경에 이르를 수도 있습니다. 🤷 또는 이 모델을 더 발전시키고 개선하기 위해 결과를 분석해 볼 필요도 있죠.
입력한 feature 각각이 모델의 출력값에 기여한 기여도 attribution을 계산해보면 입력의 어떤 부분이 출력값을 결정하는데 중요한 역할을 했는지 설명해볼 수 있는데, 이러한 알고리즘을 attribution algorithm이라고 부릅니다.
요즘은 XAI(eXplainable AI) 기법들이 많이 연구되고 있어, 그 중 가장 설득력 있다고 여겨지는 방법 하나를 소개해드리려고 합니다. 바로 captum에서 제공하는 Integrated Gradient (ICML, 2017)라는 방법인데요, attribution algorithm이 지켜야할 원칙들을 몇가지 제공하면서 다른 알고리즘들의 약점을 지적하고, 이러한 원칙을 지키는 방법론이 Integrated Gradient 라고 설득력 있게 주장합니다.
또 다른 Integrated Gradient의 장점은 몇 번의 그래디언트 계산만 포함하기 때문에 속도가 빠르며, 이를 잘 구현해 둔 captum 라이브러리를 이용해 빠르게 자신의 모델에 적용해볼 수 있다는 점입니다.
위는 Visual QA (VQA)가 가능한 멀티모달 모델을 분석한 것인데요, 고양이의 눈 색을 묻는 질문에 0.62의 확률로 blue라고 답했습니다. 아마 0.62라는 확률은 단어들의 logit들을 softmax 레이어를 통과시켜서 얻은 것인데, "blue" 토큰의 logit 값은 11.455입니다. 이 logit 값을 계산하는데 텍스트 토큰들이 총 10.81만큼, 이미지 feature가 0.64만큼 기여했음을 알 수 있습니다.
이렇게 Integrated Gradient를 활용하면 네트워크 출력값 \( F(x)\)을 만드는데 각각의 feature들이 얼마만큼 기여했는지를 정량적으로 파악할 수 있습니다. 여기서 \( x'\)은 모델 출력값 \( F(x')\)을 거의 0으로 만드는 baseline인데, baseline에 대해서는 아래에서 자세하게 설명하겠습니다.
위 word importances 그래프를 통해 질문 텍스트에서는 "color", "eye"라는 토큰이 매우 중요했음을 알 수 있고, 아래 이미지에서 진한 색으로 표현된 부분이 "blue"라는 정답을 만드는데 기여도가 높은 픽셀을 의미합니다.
BERT 와 같은 transformer로 이루어져 있는 모델은 attention matrix를 이용해 분석하려는 시도가 인기를 얻은 적이 있습니다. 그러나 attention layer의 개수가 너무 많기도 하고, [CLS], [SEP] 같은 delimeter 토큰에 강한 attention score를 부여하는 레이어도 있어 해석이 쉽지는 않았습니다.
또, Integrated Gradient 에서 지적한 대로 transformer 모델에는 attention layer외에도 다른 레이어들이 존재하기 때문에 attention만을 이용한 해석 결과는 불완전할 수 있습니다.
그럼 아래에서는 Integrated Gradient에 대해 조금 더 자세히 알아보겠습니다. 시간이 없으신 분들은 captum tutorial을 살펴보고 바로 모델 해석을 시작해보셔도 좋습니다!
Baseline의 필요성과 지정하는 방법 ⭐⭐⭐
Integrated Gradient 에서 다루는 것은, 위 예시에서 설명한 것과 같이 각각의 입력 값이 모델의 예측값에 얼마만큼 기여하는지를 나타내는 attribution을 계산하는 문제입니다. 이 attribution은 다른 방법론들과 비슷하게 baseline을 지정합니다. 저자들은 입력값 특성이 부재할 때와 존재할 때 결과값들을 비교하기 위해 부재를 의미하는 baseline이 필요하다는 점을 짚고 있습니다.
실제 구현을 시작하시게 된다면 baseline을 어떻게 지정해야하는지 고민을 하시게 될 수도 있는데요, 좋은 baseline이란 모델 출력값이 0 근처로 나타나면서도, 아무 특성이 없는 값입니다. 괜히 어려운 baseline을 지정하게 되면 입력값 특성이 부재할 때 어떤 일이 일어나는지 관측하기 어려울 수 있습니다.
❗You Should Know
Obect recognition 과제를 분석하신다면 black image가 object의 부재를 표현하기에 제일 좋을 것 같습니다. text 관련 network를 분석하신다면 zero input embedding이 좋은 baseline이 될 수 있답니다. embedding matrix를 학습하다보면 중요하지 않은 토큰 임베딩의 norm은 거의 0이 됩니다. 이는 (중요하지 않은 토큰 == zero embedding) 임을 내포합니다.Attribution method가 지켜야 할 원칙 두 가지
(1) sensitivity
만약 baseline과 input이 하나의 차원에서만 다른 값을 가지고, 이 때문에 모델의 예측값이 다르다면 그 feature는 0이 아닌 기여도 (attribution) 을 가져야 할 것입니다.
$$ \text{if } x \neq x' \text{and } F(x) \neq F(x'), \text{then } A_{F}(x, x') \neq 0 $$
당연한 이야기 같지만 input 값 근처의 gradient를 이용한 기존 attirbution method는 이를 항상 만족시키지 않습니다. ReLU 함수처럼 마침 기울기가 0인 구간에서 gradient를 측정할 수도 있기 때문입니다.
gradient를 이용한 분석은 sensitivity를 만족시키지 않기 때문에 관련이 없는 feature에 주목하기도 합니다. 더 다양한 사례는 Integrated Gradient 에서 찾아볼 수 있습니다.
(2) implementation Invariance
attribution method들이 만족시켜야 할 두 번째 원칙은 implementation invariance 입니다.
DeepLift 와 LPR과 같은 알고리즘들은 첫 번째 원칙인 sensitivity는 지킬 수 있었는데, 이는 기본적으로 이 알고리즘들이 attribution을 계산할 때 gradient 대신 "discrete gradient"를 사용하고 있기 때문입니다. discrete gradient는 pyTorch, Tensorflow 같은 라이브러리에서 제공하는 chain rule을 이용한 back-propagation 방법을 활용해 빠르게 구할 수 있습니다.
만약 \( f \) \( g \)가 input, output이라고 할 때 내부적으로 \( h \)를 이용해서 모델이 구현되어 있다면 \( g(x) = h(f(x)) \) DeepLift 와 LPR과 같은 알고리즘들은 "discrete gradient"를 다음과 같이 계산할 것입니다.
$$ \dfrac{g(x) - g(x')}{ f(x) - f(x') }$$
하지만 chain rule은 보통 discrete gradient에 대해 성립하지 않기 때문에
h를 달리 선택할 수 있는 여지가 있는 경우 다른 attribution 값이 계산될 수 있습니다.
Integrated Gradients이란
저자들은 위에 제시한 두 가지 원칙들을 모두 만족시키는 방법을 제시하고 있습니다.
$$ \int_{x'}^{x} \dfrac{dF}{dx} dx = F(x) - F(x') $$
미적분학에서 배웠던 위 공식이 기억나시나요? \(F\) 함수의 일계도함수(first derivative)를 \(x' \)에서 \(x \)까지 적분하면 \(F(x) \) 와 \(F(x') \)의 차이가 됩니다. 이는 \(x' \)에서 \(x \)까지 값이 변화하는 동안 모델 \(F\)의 출력값의 변화를 만들어 낸 것으로 해석할 수 있는데, \(x \)의 attribution은
$$ \int_{x'}^{x} \dfrac{dF}{dx} dx $$
으로 표현됩니다. 수식적으로는 baseline으로부터의 input까지 직선으로 이었을 때 그 직선 위 모든 점에서 gradient, 즉 기울기를 누적하여 더하겠다는 뜻입니다.
이 공식을 1차원에서 다차원으로 확장한 것이 caculus for path integral입니다.
$$ \int_{C} \nabla F(\tau) d \tau = F(x) - F(x') $$
(calculus for path integral theorem에 따라) 각 차원에서 계산한 IngetratedGrads로 계산된 기여도의 합은 baseline \( x'\) 과 input \(x \) 에서의 모델 출력값의 차이와 같습니다. IntegratedGrads는 각 차원이 이 차이를 만들어 내는데 얼마만큼씩 기여했는지를 수학적으로 표현한 것입니다.
IntegratedGrads는 path를 baseline과 input 사이를 잇는 직선 \( C=x' + \alpha \cdot(x-x') \) ( \( 0 \leq \alpha \leq 1 \) ) 으로 했을 때의 특별한 케이스에 대해 적용한 수식입니다. 물론 직선 외에 다른 곡선을 선택해도 괜찮지만, 직선으로 선택하는 것이 linearity나 symmetry-preserving 등 바람직한 성질을 가지기 때문에 직선으로 선택하였다고 합니다.
위 수식을 이용해 \(x' \)에서 \(x \) 사이의 직선을 따라 적분을 계산하면 최종적으로 Integrated Gradient를 구하는 수식은 위와 같아집니다.
응용 사례
당뇨망막병증 예측
위는 당뇨망막병증 여부를 결정하는 네트워크에 대해 integrated gradient를 사용하여 기여도를 측정한 사례입니다. 기본 gray scale 원본 이미지에 attribution 값을 겹쳐 표현하였는데, positive attribution은 RGB 중 Green channel에 표기하고, negative attribution은 Red channel에 입력하였습니다.
오른쪽 그림을 자세히 보면 망막 상처부위 주위 픽셀이 초록색, 상처 안쪽은 빨간색으로 표시된 것을 볼 수 있습니다. 이는 네트워크가 망막 상처 그 자체보다는 그 가장자리에 집중하여 정보를 얻었다는 것을 보여줍니다.
Question Classification
자연어 질문에 답하는 과제의 sub task는 질문이 어떤 타입(numeric, string, datetime, yesno)의 대답을 원하는지를 label로 해서 질문을 분류하는 Question Classification을 포함할 수 있습니다.
위 그림은 Question Classification 태스크를 수행하는 네트워크를 integrated gradient로 분석한 결과를 나타내는데, 붉은 색을 띄는 토큰이 positive attribution을 가지는 토큰이고 푸른 색을 띌 수록 negative attribution을 가지는 토큰임을 의미합니다. 숫자로 대답해야 하는 질문에 대해서 분류할 때 "how many", "difference", "total number"같은 단어들에 집중했음을 알 수 있습니다.
Neural Machine Translation
마지막으로 text를 이용한 과제에서 integrated gradient 알고리즘을 사용해 attention score 분석과 비슷한 결과를 내는 사례입니다. 이렇게 하기 위해서 각 출력 토큰의 확률 값에 대해 각 입력 토큰의 기여도를 측정하여 매트릭스로 표현했다고 합니다.
위 매트릭스를 통해 "good morning ladies and gentlemen" 이라는 영어 문장을 "Guten Morgen Damen and Herren"이라는 독어 문장으로 번역할 때 영어 단어가 번역된 독어 단어에 얼마나 기여하는를 파악 할 수 있습니다.
Conclusion
위 응용 예시에서와 같이 integrated gradient는 이미지, 텍스트, 멀티모달 등 다양한 입력을 처리하는 네트워크를 대상으로 입력 기여도를 측정하기 위해 사용할 수 있는 방법입니다. 위에서 나열된 수식 길이 만큼이나 강한 이론적 정당성도 확보하였을 뿐 아니라 구현도 간단하고 attribution을 얻을 때 몇 번의 gradient operator 호출만 하면 되기 때문에 빠른 알고리즘으로 분류됩니다.
다만, SHAP 류의 attribution algorithm처럼 피처 간의 상호작용은 integrated gradient만으로는 알아 낼 수 없어 저자는 이는 향후 연구과제로 남긴다고 합니다.
저는 feature간 상호작용을 분석할 필요가 없다면 integrated gradient가 안정적이고 빠르며 성능이 좋은 최상의 알고리즘으로 생각하고 있으며 이를 저의 모델에 적용해보려고 합니다. 좋은 결과가 나오면 captum 라이브러리를 활용한 코드도 공유해보도록 하겠습니다. 여러분도 각자의 모델을 설명하고 싶으실 때 이 알고리즘을 활용해 보시기를 추천드립니다!
'Paper Reviews' 카테고리의 다른 글
상용화된 LLM에서 얻은 피드백 활용 방법 (0) 2023.10.31 LLAMA2를 무해한 모델로 만들기 위한 노력 (0) 2023.08.24 LEVER: Learning to Verify Language-to-Code Generation with Execution 논문 리뷰 (0) 2023.08.16 TaskMatrix.AI (0) 2023.08.16 네이버와 Meta AI의 Multimodal Shopping Model 비교 분석 (0) 2023.01.25