본문 바로가기

수업 정리(개인용)/cs231n

CS231n Lecture 12 : Visualizing and Understanding

CNN 내부에서 무슨 일이 일어나고 있는가? Explainability는 ML에서 중요한 주제 중 하나이다. 단순히 AI를 믿고 안믿고를 떠나서, 모델을 잘 이해해야 개선하는 것도 가능할 것이다. 이번 장에서는 CNN 내부의 시각화와 이해에 대해 다룬다.

Explainability와 interpretability의 의미 차이에 대해 조사를 해봤는데, article마다 다르게 정의하고 있으므로 정확한 차이를 알 수는 없었다. 다만 딥러닝 내부의 블랙박스를 다루는 도메인은 explainable ML이라고 부르는 것 같다.

 

사실 CNN의 첫 번째 feature map을 시각화 하는 것은 쉬운데, 가령 input이 rgb 이미지라서 depth가 3이라면 각 filter의 depth도 3이므로 그냥 띄우면 된다.

 

AlexNet, ResNet, DenseNet의 first layer feature map

띄워보면 위와 같은데, 색 반전, edge같은 low level feature를 찾고 있다. 이런 low level feature들은 일반적이므로 세 개의 모델에서 비슷한 형상이 나타난다. 필터를 그대로 출력했을 뿐인데, 왜 필터가 찾고 있다는 표현을 쓰는걸까?

 

3 x 3 x 64 filter가 3 x 3 x 64의 image patch를 만난 경우를 생각해보자. 여기서는 element-wise로 곱이 이루어지고 그다음 sum된다. 이것은 그냥 flatten 한 다음에 내적 하는 것과 같다. Norm constraint을 가정하고 생각해보면(의문 : 이렇게 설명하는데, 실제로는 이미지마다 norm이 다 다르지 않은가?), 내적은 |a||b| cos theta 이므로 theta가 0에 가까울 수록 그 값이 커진다. 그 값이 커진다는건 activation이 더 된다는 말이다. 즉, filter는 자기 자신을 만났을 때 가장 활성화 된다(=filter는 자기 자신을 찾고 있다). 그래서 그 filter를 그리면 그 filter가 찾고 있는 이미지(=자기 자신)을 볼 수 있다.

 

그런데, 첫 feature map은 depth가 3이니까 그냥 그리면 되지만 그 이후에 depth가 늘어나는 애들은 어떻게 시각화할까? 그렇게 단순한 문제는 아니다.

 

가령 depth가 64라면 depth 1짜리 grey scaled 이미지 64개라고 생각해서 위처럼 띄울 수는 있지만, 우리에게 많은 걸 말해주진 않는다.

 

그래도 이런 경우를 보면, 얼굴을 찾고 있는 것 처럼 보인다.

 

CNN(AlexNet이었던 걸로 기억한다)의 마지막 4096 dimension짜리 feature vector를 가지고 nearest neighbor를 한 것이다. 꽤 잘 군집화 되어 있는 것을 볼 수 있다. CNN은 결국 classifier가 잘 할 수 있게끔 해주는 feature extractor임을 assignment1을 하면서 느꼈을 것이다. 결국 우리는 분리하기 어려운 데이터들을 좌표계를 왜곡하고 구부리고 해서 예쁘게 만들어 준 후 softmax에게 주는 것이므로, 이런 결과는 이해가 간다.

 

PCA로 차원 축소해서 feature를 띄워보면 이렇게 예쁘게 나눠져 있다.

 

어떤 layer에서 어떤 filter를 고른 후, 그 filter가 거쳐간 무수히 많은 patch들 중에 activation 값이 제일 높았던 patch를 띄워보면, 위와 같다. 첫 번째 행을 보면, 필터가 어떤 검은 원형의 형상을 찾고 있음을 알 수 있다.

 

이미지를 한 부분씩 가리면서, 어느 부분을 가려야 accuracy가 가장 많이 떨어지는지를 확인하기 위해 heatmap으로 그린다. 색이 진할 수록 accuracy에 영향을 많이 주는 부분이다. 

 

Dog라는 score에 대해 gradient가 큰(그 score에 영향을 많이 미친) 픽셀들을 표시한다.

 

어떤 layer에서 하나의 filter의 하나의 점을 고르고, 그 점에 대한 gradient를 pixel별로 계산한다. 결국은 그 점을 만든 건 하나의 patch일 것이고, 그 patch에서도 영향을 많이 끼친 픽셀이 있을 것이다. 그걸 보자는 것이다. Guided라는 말은 backprop시에 양수 gradient만 흘려줬다는 얘긴데, 이래야 더 예쁘게 나온다고 한다. 직관적으로 봤을 때는 부호를 떠나서 영향을 끼친 그 절대값 총량을 더 신경쓴다는 얘기 같은데, 더 궁금하면 나중에 따로 찾아보자.

 

위에서 본 maximally activating patches랑 비슷한 개념 같은데, 여기서는 그 patch 안에서 픽셀 별 영향력도 볼 수 있다.

 

지금까지의 방법은 다 이미지 하나를 forward하고, 그 하나의 이미지 안에서 저 score에 어느 patch/pixel이 영향을 줬냐 이런 식이었는데, 여기서는 아예 0으로 초기화한 이미지에 gradient ascent를 적용해서 복원한다는 개념이다. L2 regularization이 붙은건, score도 maximize 하면서 사람이 보기에도 자연스럽게 복원하라고 모델에게 지시하는 것이다. 왜냐하면 보통 우리가 보는 이미지는 몇 몇 픽셀만 엄청 값이 큰게 아니고 균등하지 않은가? 몇 픽셀이 값이 너무 크면 L2 loss가 벌을 줄 것이다.

 

그렇게 해서 복원하면 이런 느낌이다. Multi modality를 위해서는 초기 이미지 I를 랜덤으로 설정해도 좋을 것이다. Neural Style Transfer에서 image reconstruction 하는 것과 아이디어가 많이 겹쳐 보인다.

 

더 잘 되려면, 이미지에 가우시안 블러를 넣고, 값이 작은 픽셀을 0으로 clip하고, gradient도 작으면 0으로 clip 한다.

 

Class score 대신에 그 전의 fcn의 latent vector를 optimize하면 이렇게 좋은 결과가 나온다. 그런데 gradient는 scalar에 대해 구해야 하지 않은가? 자세히 설명하지는 않으므로 넘어가자.

 

위에서 gradient ascent 할 때 L2 reg를 넣어줬는데, 그러면서 class를 maximize함과 동시에 사람이 보기에 그럴듯하게 만들라는 의미라고 했다. 그 말은, 코알라 score를 높이는 것과 사람이 봤을 때 코알라 같게 하는 것은 다르다는 말이다. 위를 보면 우리가 보기에는 배인데 모델은 아이팟이라고 인식하고, 그 차이도 매우 적다. 이러한 adversarial attack은 게스트가 설명해 줄 거라고 하는데, 게스트가 무려 GAN 아버지 Ian Goodfellow이다.

 

어떤 이미지 I가 있고, 특정 layer의 neuron activation을 극대화 하는 방향으로 I를 학습하면, 멋진 그림이 나온다.

 

Feature inversion은 style transfer에서 content reconstruction이라고 부르는 그 방법을 의미한다. 여기서는 regularization term이 들어가 있는데, 인접한 픽셀 끼리 값이 너무 다르면 벌을 준다. Smoothing 효과가 있다.

 

깊게 들어갈 수록 low level feature가 탈락되면서 완벽하게 reconstruction이 안되고 있다.

 

Style transfer에서 쓰일 gram matrix에 관한 설명인데, 논문에서는 각 feature map들을 flatten 한 뒤에 서로의 correlation을 구한다고 써있었다. 결국 계산하는 식은 같으므로 같은 얘기일텐데, 여기서의 설명은 다시 한번 볼필요가 있을 것 같다.

 

Content를 복원했던 것처럼 gram matrix의 차이를 최소화하는 방식으로 style도 복원해서 style transfer를 할 수 있는데, 문제는 모든 pair에 대해 다시 학습을 해야 한다는 것이다. 여기서는 그 점을 개선했다. 이런 아이디어이다.

우리는 style을 뽑아낼 수 있고(pretrained VGG), Freedforward Net이라는 Encoder-Decoder 구조의 image translation model을 학습을 시킬 것이다. 이 모델이 최소화 하려는건 input 이미지와 style 이미지의 gram matrix의 차이이다. 물론 content를 너무 잃어버리면 안되므로 원래의 content와의 loss도 들어간다.

 

여러 style에 transfer 해주는 방법도 발견되었다. 여기서는 깊게 공부하지는 않으려 한다.

 

CNN의 블랙박스를 이해하기 위해 다양한 방법을 살펴보다가, 재미있는 예제들도 살펴보았다.