전통적으로 CNN은 black box과정으로, CNN이 어떻게 학습되고 있는지, 왜 잘되는지, 무엇을 기준으로 CNN이 판단을 내리는지 알 수가 없어 어떻게 CNN을 발전시킬 수 있는지 알 수 없었다. 그러나 언제나 방법은 있는법. 이번에는 여러가지 CNN 시각화(CNN visualization) 방법에 대해 알아보려고 한다.
간단한 예시를 통해 시각화가 어떤 것인지부터 알아보자.
아래는 deconvolution을 통한 시각화의 일종이다
아래의 low level feature를 보면 점, 선과 같은 간단한 물체를 찾는 layer가 있음을 알 수 있고, high level feature에서는 좀 더 의미있는 물체를 찾는 layer가 있음을 볼 수 있다.
이를 이용한 것이 아래의 그림이다. Filter visualization을 보면 위의 low level feature들을 볼 수 있으며, 우측의 activation visualization은 활성함수를 지난 activation map으로 한 채널밖에 없어 흑백으로 보인다.
두번째 이상의 layer를 시각화하지 않는것은 layer들의 차원이 고차원이 되어서 시각화해도 사람이 알아볼 수 없기 때문이다.
그럼 몇가지 의도에 따라 시각화 방법을 설명해보도록 하겠다.
1. 모델 특성 분석
- high-level: embedding feature분석
embedding에서는 비슷한 물체들이 clustering 되어 있다.
이런 clustering을 단순히 이미지에서 pixel을 빼서 MAE를 통해 한다면 위의 4줄처럼 유사한 물체를 구할 수도 있지만, 아래의 파란색 박스처럼 다른 경우의 이미지가 clustering 될 수도 있다.
이를 해결하기 위한 것이 Nearest Neighbor 방식으로, 각 query 이미지들을 CNN으로 분석해서 고차원 공간에 투영시키면, 비슷한 종류의 물체들끼리 모이게 된다. 이렇게 충분히 모인 이미지들의 database가 구축되면, 이제 판별하고자 하는 이미지를 분석하여, 어느 물체의 집단과 가까이 있는지를 표현할 수 있는 것이다.
예를 들어 MNIST 데이터를 분석하면 아래와 같이 나타낼 수 있다. 실제로는 고차원으로 표현되지만 보기 쉽게 2차원으로 축소시킨 사진이다. 이렇게 차원을 축소시킨 것을 t-SNE라고 한다.
사진을 보면 몇몇 튀는 개체를 제외하곤 같은 class끼리 잘 뭉쳐있음을 볼 수 있다.
또한 분포를 통해 CNN이 3, 5, 8은 유사하다고 생각한 반면 0, 7은 크게 다르다고 생각했다는 등의 분석을 해볼 수 있다.
- mid/high level
a. Activation Investigation
Layer의 activation(활성함수와는 다름)을 분석해서 모델을 분석하는 방법이다. 각 node가 어떤 물체를 찾는지를 보고 node의 역할을 보는 것이다. 아래의 사진처럼 나타내면 각 node가 얼굴(head)와 계단(stair)를 찾는 node임을 알 수 있다.
b. Maximally activating Patches
위의 사진처럼 전체 사진에 thresholding을 통해 활성화된 부분만 highlight시키는 방법도 있지만, 아래 사진처럼 각 node가 어딜 보고 있는지를 patch를 뜯어내서 확인하는 방법도 있다. 맨 윗줄을보면 흰 배경에 검정색 원을 찾는 node임을 알 수 있고, 밑에서 두번째줄은 타이어/캔뚜껑 같은 뭔가 원형의 물체를 찾고 있는 node임을 알 수 있다.
이는 CNN에서 분석하고자 하는 특정 layer를 고른 후, 예제 data를 backbone network에 넣어서 해당 layer에서 출력되는 activation을 저장하고, 거기서 가장 높은 activation을 갖는 위치의 이전 layer의 receptive field를 확인하는 방법으로 아래와 같은 결과를 얻을 수 있다.
c. class visualization
위처럼 예제를 활용하지 않고도 gradient descent를 이용해 map을 얻어낼 수 있다. 먼저 CNN의 target을 정해놓고(예:bird, dog) input으로 아무 이지미나 넣어준다(단색 이미지도 상관 없음). 그리고 그 이미지로부터 얻은 score를 보고 역전파를 진행해주고, input이미지에 이 역전파값만큼 변화를 준다. 위의 과정을 반복하면아래와 같은 이미지가 만들어지게된다. 이를 통해 CNN이 bird나 dog를 찾을때 어떤 식으로 이미지를 보고 있는지 알 수 있다.
2. 모델이 특정 입력을 보는 시각
-saliency test : 입력값이 제대로 분석되기 위한 각 영역의 중요도를 추출하는 것이다.
1. Occlusion map
input의 각 부분을 가려서 판정의 결과가 얼마나 영향을 받는지 보는 것이다. 아래와 특정 크기의 noise를 이미지에 적용하고 모델을 통과시켰을 때 어느정도의 정확도를 보이는지를 확인하는 과정을 이미지 전체에 exhaustive하게 적용하고, 각 정확도를 오른쪽과 같이 heatmap으로 표현하면 이미지의 어떤 부분을 가렸을 때 학습이 가장 방해받았는지를 알 수 있다. 이를 통해 가장 방해받은 부분이 해당 input에서 중요한 부분임을 추론할 수 있다.
2. via backpropagation
역전파를 이용해 heatmap을 생성할 수도 있다. 먼저 특정 이미지를 넣어주고(아래 사진의 왼쪽) 해당 이미지의 class score를 얻는다. 그리고, input domain까지 역전파를 쭉 진행해준다. 그리고 이를 반복하여(반복하지 않아도 되긴 함) 얻어진 gradient magnitude map(아래 사진의 오른쪾)을 얻을 수 있다. 이렇게 얻어진 map을 보면 CNN이 어느 부분을 주로 보고 있는지 알 수 있다. 이는 크게 변화를 주어야 하는 영역이 CNN이 주의깊게 보고 있는 영역이기 때문이다.
- class activation mapping (CAM)
아래와 같이 특정 class를 판별할 때 어디가 최종 결정에 큰 영향을 주는 지 확인하고, bounding box까지 만드는 것이다. 이를 구현하기 위해서는 CNN에 약간의 개조를 해줘야 한다.
최종단에 있는 fully connected layer(이하 FC layer)를 제거하고 global average pooling(이하 GAP) layer를 추가해준다. 그리고 하나의 FC layer만 통과하게 해주도록 모델을 개조하고, 이 모델을 image classification task로 다시 학습시켜주면 위와 같은 이미지를 얻을 수 있다.
- grad-CAM
위와같은 결과를 모델의 변형이나 재학습 없이 얻는 방법이다.
이는 backbone이 CNN이기만 하면 적용할 수 있는 장점이 있다. Gradient 역전파를 이용한 Saliency map방법을 응용한 것으로, input까지 역전파를 하는 것이 아닌 우리가 관심을 가지는 activation map까지만 역전파를 한다. 그리고, 공간축으로 GAP를 적용해서 각 channel의 gradient 성분을 구하고, 이를 activation map에 결합하는 데 이용하는 것이다. 이 두 map을 선형결합하고, ReLU 활성함수를 적용해주면 위와같은 결과를 얻을 수 있다.
위의 예시는 image classification task에만 적용한 것이고, grad-CAM은 CNN구조면 다 적용할 수 있기 때문에 이 외에 image captioning, visual question answering과 같은 여러 task에 적용할 수 있다.
이를 응용한 Scouter라는 방식도 있는데, "어디를 보고 그 물체라고 판단했는가" 뿐이 아니라 "왜 다른 물체가 아니라고 판단했는가"에 대하나 map도 출력할 수 있다.
'AI 중급이론' 카테고리의 다른 글
Multi-Modal 학습이란 무엇일까? (0) | 2023.04.11 |
---|---|
Transformer에 대해 알아보자 (0) | 2023.03.27 |
댓글