1.1 What is CNN visualization?
neural net은 학습 및 추론 과정을 정확히 알 수 없는 black box
시각화한다는 것은 debugging을 하는 것과 같음
ZFNet example
1.2 Vanilla example: filter visualization
AlexNet의 첫 layer -> 사람이 해석하기에는 조금 어려움
1.3 How to visualize neural network
2.1 Embedding feature analysis
high level feature를 분석
Neareast Neighbors(NN) in a feature space
파란색 박스를 보면 물체의 자세와 위치가 다른데도 같은 class로 묶은 것을 볼 수 있음. 이는 잘 학습이 된 것
<NN 동작방식>
미리 학습된 모델 준비
FC layer 직전의 마지막 conv layer의 출력인 high level feature vector 사용
입력을 넣었을 때 그 feature vector 를 high dimensional feature space에 위치시킬 수 있음
DB에 존재하는 모든 영상의 feature를 space에 위치시킴
test하고자 하는 영상을 넣어 feauture space상에서 가까이에 있는 이웃들을 뽑아 해당 vextor들의 특징 분석
단점
feature vector space가 너무 고차원이면 사람이 이해하기 힘듬
Dimensionality reduction
고차원의 space를 저차원으로 만듬
t-distributed sochastic neighbor embedding (t-SNE)
class간 예측을 시각화하여 어떤 class를 잘못해석하는지, class 간 분포 등을 확인할 수 있음
2.2 Activation investigation
middle level feature , high level feature 확인
Layer activation
layer 의 activation을 분석하여 model의특징 분석
Alexnet의 conv5의 138번 채널의 activation에 적당한 threshold를 주어 마스크로 만든 후 영상에 오버레이한 사진.
여러 예제에서 이 채널은 공통적으로 얼굴을 찾는다든지, 계단을 찾는다든지 하는 특징을 찾을 수 있음
특정 특징을 찾는 채널이 쌓아져서 detection을 하는 것이구나 라는 해석
Maximally activating patches
midle level feature 시각화, 패치를 뜯어서 layer activation 관찰
각 hiden node의 activation 에서 가장 큰 값을 갖는 부분을 패치로 뜯음
<과정>
특정 layer에서 하나의 channel 선택
(논문에서는 conv5의 14번째 channel 선택)
예제 데이터들을 backbone에 넣어 activation value 기록
해당 activation map에서 가장 큰 값을 가지는 부분이 원본 이미지에서 어느 receptive field인지 계산하고 그 부분을 crop
Class Visualization
예제 데이터를 사용하지 않고 네트워크가 기억하고 있는 특징이 무엇인지 확인하는 방법
새를 학습시킬 때는 배경에 나뭇가지가 있는 그림을 넣었구나, 개를 학습시킬 때는 어린아이가 함께 있는 사진을 넣었구나 라는 해석 가능
<방법 : Gradient ascent>
class activation을 최대화 하는 대칭적인 이미지를 생성하는 함수
앞 항 : CNN = F(input) 의 class prediction을 최대로 만듬
뒷 항 : input image의 L2 redularization을 통해 새로 만들어지는 이미지의 각 픽셀 값이 너무 커지지 않도록 함
<과정>
초기 이미지의 값을 어떻게 설정하느냐에 따라 결과로 나오는 image가 달라짐
모델이 입력을 어떤 각도로 바라보고 해석하는지 알아보는 방법
3.1 Saliency test
영상의 label을 판별하는데 중요한 부분을 찾는 방법
Occlusion map
영상의 일부분에 patch를 붙인 상태에서 정답으로 판단하는 확률
Back Propagation
Class Visualization 의 gradient acent방법과 유사하지만 차이는 입력으로 noise를 넣는게 아닌 실제 데이터를 넣어 사용되는 데이터가 어떻게 해석되는지를 본다. 즉, Saliency test의 Bacj Propagation은 data에 dependent하다
3.2 Backpropagate features
Forward pass
ReLU 로 음수인 부분은 0으로 masking
Saliency map
forward 時 0으로 마스킹되었던 부분을 back propagation 때 다시 0으로 만듬
Deconvolution
forward에 관계없이 backward 時 음수인 부분을 0으로 masking. 즉 backward에서 gradient에 ReLU를 취함
Guided Backpropagation
2와 3을 and
왜?
두 마스크를 합한것이 forward를 할 때도 결과에 긍정적 영향을 미친 양수를 참조하고 , backward를 할 때도 gradient를 통해서 더 강화하는 방향으로 움직이는 gradient참조하면서 더욱 효과적인 방법이 됨
3.3 Class activation mapping(CAM)
: Score of class c
: channel
: GAP feature
: Feature of map before
: global average pooling
class score는 fc layer의 가중치와 GAP feature인 F를 곱한 것이다. F를 함수로 표현하면 , 즉 채널별로 GAP을 취해주는 것이고, 전체 수식이 곱하기와 더하기로만 이루어져 있으므로 순서를 바꾸면 마지막항 처럼 만든다.
마지막 수식을 보면, CAM은 GAP을 거치기 전이기 때문에 공간에 대한 정보를 가지고 있다.
따라서 CAM을 시각화하면 어떤 부분을 참조했는지 눈으로 볼 수 있다.
AlexNet, GoogleNet은 이미 GAP있음
Saliency map에서의 backpropagation과 비슷 .
여기서는 우리가 관심이 있는 activation map까지만 역전파를 수행하여 weight 를 구하고 채널 별로 activation map A와 가중합하여 더해준다.
Grad-CAM은 영상뿐아니라 다양한 모델 구조에서 활용가능하며 , Guided backprop과 합쳐 클래스 별로 rough한 특징 + 날카로운 특징까지 함께 보여줄 수 있다.
SCOUTER
왜 해당 클래스라고 판단했는지 뿐만 아니라 왜 다른 클래스가 아니라고 판단했는지 정보까지 시각화 가능
GAN dissection
생성모델도 hidden node가 어떤 부분을 생성하는지 찾아서 해당 위치에 door를 담당하는 부분에 masking을 하여 출력 결과를 user가 컨트롤 할 수 있음
Further Question
(1) 왜 filter visualization에서 주로 첫번째 convolutional layer를 목표로할까요?
뒤로 가면 filter의 channel이 커져 시각화가 사실상 불가능
(2) Occlusion map에서 heatmap이 의미하는 바가 무엇인가요?
patch의 위치를 바꾸어가며 영상의 모든 부분의 prediction score를 계산한 결과
(3) Grad-CAM에서 linear combination의 결과를 ReLU layer를 거치는 이유가 무엇인가요?
class 예측에 큰 영향을 미치는 부분만 골라내기 위해 음수는 0으로 만드는 과정을 거침
pytorch Autograd
computational graph를 통해 back propagation 시 편미분을 편리하게 계산할 수 있도록 gradinet를 자동으로 계산해주는 api
y.backward(gradient, retain_graph = True)
grad_fn
x, y,z,w computational graph를 만들어준다음 각각을 출력해보면 y,z,w 가 가지고 있는 값과 grad_fn 값이 같이 나옴
이때 각 인자가 어떤 연산으로 연결되어 있고, 각 연산에 맞는 back propagation을 class 생성자로 등록. 그 생성자가 바로 grad_fn
hook : register_forward_hook
hooking : function call시 전달되는 인자를 낚아채는 것
backward hook을 통해 역전파시 전달되는 기울기를 hook할 수 있음
이외에도 forward전에 하는 register_pre_hook, backward에 하는 register_backward_hook 이 있음
이때 hook은 argument를 변경할 수 없음. 하지만 새로운 gradient를 return하여 전달되는 grdient 값 변경 가능
Grad-CAM 구현 시 register_backward_hook 사용.
그렇다면 hook을 통해 activation map을 어떻게 가져올까?
1. hook_feat함수 정의
2. register hook
3. forward