Grad-CAM: Gradient-weighted Class Activation Mapping

Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization (Paper)

1. 문제점 

딥러닝은 매우 뛰어난 분류기이지만, 실제 기업에서 사용하기 위해서는 큰 문제점이 있는데, 가장 대표적인 문제가 왜? 그런 결과가 나왔는지 설명하기가 어렵다는 것이다. 이러한 딥러닝의 Black Box 적인 특성 때문에 뛰어난 분류 성능에도 불구하고 현업에서는 사용하기가 어려웠던 것이 사실이다. 때문에 요즘에는 XAI (Explainable Aritificial Intelligence) 에 대한 연구가 매우 활발하며, 신경망 설계시 Attention Layer 를 삽입하여 해당 Layer 를 해석하는 방법이나, Convolunal Filter 를 Target Lable 로 역으로 Gradient 하여 설명하는 방법등이 연구 되고 있다.  본 Posting 에서는 Grad-Cam 을 알아보고자 한다.

Grad-Cam 이라고 불리는 연구에서는 CNN 의 Filter 에 저장된 정보에 주목하였다. CNN 필터에는 마지막 Fully-Connected Layer 에서는 사라지는 중요한 정보들을 많이 가지고 있다. 특히나 Deep 한 CNN 구조에서 마지막 Filter 는 설명하고자 하는 대상의 특정 Feature 를 설명할 수 있는 정보들을 내포하고 있다.
위에서 보는 것처럼 Grad-Cam 의 목적은 CNN 을 통해 특정 결과를 예측 했을때, 왜 그런 결과를 예측하였는지를 역으로 설명하고자 함에 있다. 위에 그림에서 보면 Cat 으로 예측 하였을때 영향을 주었던 요소가 우리가 눈으로 인지하기에 고양이 부분이다라고 설명을 하고 있다.

2. 접근방법

위의 그림은 Grad-Cam 이 동장하는 개념을 도식화한 것으로 대략적으로 어떤 순서로 동작하는지 하나씩 설명해보고자 한다.

(1) Feed Forward
– Pretrained 된 CNN 모델에 Test 하고자 하는 이미지를 Feed Forward
– 어떤 Class 의 확률이 가장 높은지 추출할 수 있다
(2) Filter 간 가중치 식별
– FC 레이어에서 가장 확률이 높은 라벨의 Vector 를 추출
– CNN 의 마지막 레이어의 전체 필터를 추출
– 각 필터들이 FC 레이어의 결과를 주는데 얼마나 영향을 주었는지 가중치 계산
(3) Relu 적용
– CNN 의 마지막 레이어에 위에서 구한 가중치를 적용
– 복수 필터를 평균하여 하나의 필터를 만들어 줌
– 우리가 원하는 것은 Positive 뿐임으로 Relu 를 적용
(4) Resize  및 적용
– 필터 사이즈는 이미지보다 적기 때문에 이미지에 적용을 위해
사이즈를 조정하여 이미지 사이즈와 동일하게 변환
– 원본 이미지와 곱연산을 통해 Cam 영상을 적용

3. 상세 설명 

(1) Feed Forward 및 Filter 간 가중치 식별

y 는 Feed Forward 의 결과인 예측 클래스, A 는 CNN Filter 로 i,j 는 필터의 X,Y 사이즈이고 k 는 필터의 수가 되겠다. a의 의미는 y라는 결과를 나오도록 각 필터가 영향을 주는 정도를 말한다. (k 가 필터 수, 필터별 가중치)

위에서 수식 한줄로 이야기한 내용을 Tensorflow 코드로 표시해 보면 아래와 같이 될 것이다. grads 변수가 위의 식에서 Gradients via backprop 에 해당하는 내용이 되는 것이고weights 변수가 Filter 단위로 global average pooling 을 취한 결과라고 해석가능하며, output 은 뒤에서 실제 cnn filter 와 곱연산을 수행하기 위해 도출한 변수이다.

# Conv layer tensor [?,7,7,512] 
conv_layer = vgg.layers[layer_name] 
# [1000]-D tensor with target class index set to 1 and rest as 0 
one_hot = tf.sparse_to_dense(predicted_class, [nb_classes], 1.0) 
signal = tf.mul(vgg.layers['fc3'], one_hot) 
loss = tf.reduce_mean(signal) 
 
 
grads = tf.gradients(loss, conv_layer)[0] 
# Normalizing the gradients 
norm_grads = tf.div(grads, tf.sqrt(tf.reduce_mean(tf.square(grads))) + tf.constant(1e-5)) 
 
 
output, grads_val = sess.run([conv_layer, norm_grads], feed_dict={vgg.imgs: x}) 
output = output[0]           # [7,7,512] 
grads_val = grads_val[0]	 # [7,7,512] 
 
 
weights = np.mean(grads_val, axis = (0, 1)) 			# [512] 
cam = np.ones(output.shape[0 : 2], dtype = np.float32)	# [7,7] 

(2) Feed Forward 및 Filter 간 가중치 식별

a (필터별 가중치) 와 A(마지막 Layer 의 필터 값)을 곱하여 필터별로 판단결과에 영향을 주는 가중치를 반영하고, ReLU Activation 펑션을 적용하여 양수 값만 의미있게 판단할 수 있도록 한다. (그렇지 않을 경우 결과에 안좋은 영향을 준다고 함)

cam = np.ones(output.shape[0 : 2], dtype = np.float32)	# [7,7] 
 
 
# Taking a weighted average 
for i, w in enumerate(weights): 
	cam += w * output[:, :, i] 
 
 
# Passing through ReLU 
cam = np.maximum(cam, 0) 
cam = cam / np.max(cam) 
cam = resize(cam, (224,224)) 

코드로 보면 weights 변수가 필터별 가중치 보유, output 은 마지막 레이어의 필터들이며, 식에서 보는 것처럼 가중치를 곱해서 SUM 을 하여 주면, Grad-Cam Vector 가 된다.

단계별로 설명한 두개의 식을 합하면 위와 같은 형태로 정리가 될 수 있으며,  아래와 같이 정리 할 수 도 있다.

아래의 식은 살짝 응용하여 장난을 치는 것인데, 필터별 가중치를 음수를 취하여 주면, Counter Factor 를 구할 수도 있다고 한다.

4. 텍스트 분석에 응용 (MCCharCNN)

(1) 다른 분야에 대한 응용

Grad-Cam 방법론은 마지막 Layer 의 필터들이 예측한 결과에 어떠한 영향을 주는지 가중치를 적용하여 추론 결과를 설명하겠다라는 개념으로, 위에서 설명한 이미지 분류이외에도 이미지 설명, 시각 질의 응답 및 텍스트 분석등 다른 분야에 CNN Filter 를 사용하였을 때에도 적용이 가능한 범용성을 가지고 있다.

(2) CharCNN

이제는 조금 낡은 방법 일지는 모르겠지만, Yoon Kim 의 Multi Channel Char CNN 에 Grad-Cam 을 적용할 수도 있을 것이라고 판단되어 테스트를 해보았다.

테스트를 진행하여 보니, Grads를 구하는 것 까지는 크게 다를 바가 없었는데, 조금 적용이 다른 부분은 Multi Channel Filter 이기 때문에 마지막 Layer 에서 Filter 들의 사이즈가 다 다르다는 점, 그리고 이미지는 Grad-Cam 을 구해서 ReScale 을 하면 끝나는 부분인데, 최종적으로 구한 Grad-Cam Vector 를 가지고 어떻게 해석을 할 것인지 두 가지가 고민스러운 부분이었다.

첫 번째 문제는 Word Representation 사이즈로 모든 Filter 를 Average 처리하였으며,

두 번째 문제는 Grad-Cam Vector 와 각 단어의 Word Representation Vector 를 비교하여 그 유사도를 처리하는 방법으로 진행을 하였다.

그 테스트 결과는 아래와 같은데, 해석을 해보면 ‘줄’ 과 ‘짜증’ 이 라는 단어가 이 문장은 분류하는데 결정적인 영향을 주었다라고 해석이 가능하겠다..

이런식으로 응용을 하는게 가장 효과적인지는 조금더 분석을 해볼 필요가 있겠다.

Leave a Reply

Your email address will not be published. Required fields are marked *