Overview
CNN을 이해하기 위한 다양한 레벨에서의 시각화 방법을 살펴본다.
- Activation map: Nearest neighbors, Dimensionality resuction, maximal patches, occlusion
- Gradient: Saliency maps, class visualization, fooling images, feature inversion
- Fun application: DeepDream, Style transfer
Visualize Filters/kernels
CNN은 입력에 대해 어떻게 동작할까?
First Layer: Visualize Filters
First layer는 입력과 바로 닿아있기 때문에, fist layer의 filter를 시각화하면 이 필터가 이미지에서 무엇을 찾는지 확인할 수 있다.
AlexNet의 첫 번째 Conv Layer에는 많은 filter가 존재한다.
- Conv filter: 이미지를 sliding 하면서 픽셀 값과 weight의 내적을 수행하여 출력
필터를 시각화한 결과를 통해 필터가 보색(opposing color), oriented edge를 찾는 것을 볼 수 있다.
Intermediate Layer
중간 Conv layer의 filter도 시각화 가능하다. 하지만 입력 이미지와 직접 연결되어 있지 않기 때문에 중간 필터를 시각화해도 해석하기 어렵다.
Last Layer: Nearest Neighbors
마지막 layer를 시각화하기 위해 nearest neighbors 방법을 사용한다.
- 여러 이미지로 네트워크(CNN)를 돌린다
- 각 이미지에서 나온 4096-dim feature vector를 모두 저장한다.
- 네트워크에서 계산된 feature vector space에서 L2 Nearest neighbor를 수행한다. (거리가 가까운 이미지 시각화)
시각화 결과를 보면 feature space에서 NN을 수행했기 때문에, 픽셀 값의 차이가 커도 유사한 semantic feature를 보일수 있음을 확인할 수 있다.
Last Layer: Dimensionality Reduction
Dimensionality reduction은 고차원 feature vector의 차원을 압축해서 feature space를 직접 시각화하는 방법이다.
예를 들어, AlexNet의 경우 FC7 feature vector를 차원 축소 알고리즘을 사용해 4096-dim에서 2-dim으로 축소한다.
- 알고리즘: Principle Component Analysis (PCA), t-SNE
강의 중 이해가 어려웠던 내용) There's sort of discontinuous semantic notion in this feature space which we can explore by looking through this t-SNE dimensionality reduction version of the features. |
Intermediate Layer Visualizing
앞에서 소개된 방법처럼 중간 layer의 가중치를 시각화하는 것은 해석하기 어렵다. 따라서 중간 layer의 동작을 이해하기 위한 별도의 시각화 방법이 필요하다.
Visualizing Activations
가중치 대신 Activation map을 시각화하면 일부 해석이 가능하다.
- 입력 이미지를 네트워크에 통과시키면서 중간 layer의 feature map을 시각화한다.
이를 통해 각 layer가 입력의 어떤 feature를 찾고 있는지 짐작할 수 있다.
*activation map 각 layer는 3차원 chunk를 반환한다. (width x height x depth) 이 3차원 chunk가 activation volume이고 이를 하나씩 slicing 한 것이 activation map이다. |
Maximally Activating Patches
- 특정 neuron에서 activation이 가장 큰 patch를 시각화
- 특정 layer와 channel을 선택한다
- 네트워크에 여러 이미지를 통과시켜 해당 layer에서 각 이미지의 feature(activation map)를 기록한다
- 최대 activation에 해당하는 이미지 패치를 시각화
activation이 최대 = 해당 filter에 대해 높게 반응한다. = 이미지 처리에 있어 중요하게 감지하는 부분
*Convolution layer이기 때문에 receptive field로 이미지의 일부만 본다. 따라서 특정 layer의 활성을 최대화하는 이미지의 일부(patch)가 시각화된다.
Occlusion Experiments
- 입력 이미지의 어떤 부분이 classification을 결정짓는 근거가 되는지 찾는 방법
이미지의 일부를 가렸을 때 네트워크의 score 변화가 크게 발생한다면, 가려진 해당 부분이 classification decision에 중요한 부분이라는 아이디어를 사용한다.
- 입력 이미지의 일부 영역을 mask로 가리고 mean 픽셀 값으로 대체한다
- 해당 처리한 이미지를 네트워크에 통과시키고, 네트워크의 예측 확률을 기록한다 (heatmap)
- 입력 이미지 전체를 돌아가면서 위 과정을 반복 수행한다
heatmap에서 확률이 많이 감소하는 영역은 분류에 큰 영향을 주는 패치이다. (ex. 카트)
Saliency Maps
- 이미지 내에서 classification에 중요한 pixel의 위치를 확인하는 시각화 방법
이미지의 픽셀 값에 변화를 주면서 예측한 class score가 얼마나 바뀌는지를 시각화한다.
즉, class score의 pixelwise gradient를 시각화한다.
- pre-trained model에 이미지를 넣고 output을 저장한다 (output = input image의 loss vector)
- loss vecot를 Gradient Descent를 이용해 Input image에 pixelwise gradient를 계산한다
2번의 결과에 절댓값을 취하고, 3개의 필터값 (RGB) 중의 최댓값을 취한 뒤에 이를 map으로 변환한다
Saliency Maps: Segmentation without supervision
Saliency map을 사용하면 segmentation label 없이 semantic segmentation을 수행할 수도 있다.
but, 잘 동작하지는 않는다.
Intermediate features via (guided) backprop
- 어떤 픽셀이 해당 intermediate neuron에 영향을 주는지 확인하는 시각화 방법
- 네트워크에서 single intermediate neuron을 선택한다.
- 입력 이미지의 픽셀에 따른 neuron value의 gradient를 계산한다
추가로, 입력 이미지의 각 픽셀에 대한 중간 뉴런의 gradient를 계산해 saliency map을 생성해볼 수 있다.
일반적인 backprop 대신 guided backprop를 사용하면 더 선명하게 시각화가 가능하다.
- Guided backprop: 전체 gradient가 아닌 positive gradient만 역전파
Saliency map과 (guided) backpropagtion 방법은 고정된 입력 이미지 또는 입력 패치가 뉴런에 어떤 영향을 미치는지 시각화하는 것으로 입력 이미지에 의존적이다.
이런 의존성을 제거하여 neuron을 활성화시키는 general한 이미지 타입을 시각화하는 방법을 살펴본다.
Visualizing CNN feaures
Gradient Ascent
- gradient ascent를 이용해 뉴런을 최대로 활성화 시키는 이미지를 합성하는 방법
*Gradient Ascent 란? Loss가 최대가 되는 parameter를 찾는 방법 Loss가 최소가 되는 parameter를 찾는 gradient descent와 상반되는 개념으로 이해 (참고: https://yeoulcoding.tistory.com/77) |
여기서 gradient ascent의 Loss에 해당하는 것은 neuron의 score이다.
Conv 네트워크의 가중치를 고정시켜서 진행한다.
- 초기 이미지의 픽셀을 0으로 초기화
- Forward pass: 이미지를 네트워크에 통과시켜 선택한 neuorn의 score 계산
- Backprop: 이미지의 각 픽셀 값에 대한 neuron score의 gradient를 계산
- Gardient Ascent: 이미지의 픽셀 값을 업데이트
특정 neuron의 값(score)을 최대화하는 이미지를 얻을때까지 gradient ascent를 이용해서 업데이트하는 과정을 반복한다.
두 가지 특성을 띄도록 이미지를 합성한다.
- Neuron value: 특정 뉴런 값을 최대화시키는 방향
- Natural image regularizer: 합성된 이미지가 특정 neuron에 과적합되는 것을 방지, 자연스러운 이미지를 생성하도록 함
Regularizer
단순히 L2 norm을 regularizer로 사용할 수 있지만, better regularizer를 사용하면 훨씬 깔끔한 이미지를 얻을 수 있다.
- better regularizer
L2 norm을 사용하면서 주기적으로 최적화를 수행한다. 생성된 이미지를 더 좋은 feature를 가진 이미지 집합으로 주기적으로 최적화한다.
- 이미지에 가우시안 블러 적용
- 작은 픽셀 값을 0으로 설정
- 낮은 graident를 0으로 설정 (*일종의 projected gradient descent)
합성한 이미지를 통해 중간 neuron의 activation을 최대화하는 image patch를 얻을 수 있다.
Gradient Ascent: Fooling Images
Gradient ascent를 이용해서 네트워크를 속이는 이미지를 만들 수 있다.
- 임의 이미지 선택
- 임의 클래스 선택
- Gradient ascent: 네트워크가 선택된 이미지를 선택된 클래스로 예측하도록 이미지 픽셀을 업데이트
- 네트워크가 속을 때까지 3번을 반복한다
결과를 보면 큰 차이가 없다는 것을 확인할 수 있다.
Q) 픽셀값의 차이가 거의 없는데 어떻게 다른 class로 분류하는지? |
Gradient Ascent: DeepDream
Garadient Ascent를 활용해서 신기한(?) 이미지를 만들 수 있다.
- Rather than synthesizing an image to maximize a specifit neuron, instead try to implify the neuron activations at some layer in the network (네트워크에서 감지되는 feature를 증폭하는 알고리즘)
DeepDream 알고리즘은 layer의 활성화 값을 역전파하면서 이미지를 수정하여, Neural network로 하여금 특정 패턴(feature)을 과잉 학습하게 한다.
(참고: https://www.tensorflow.org/tutorials/generative/deepdream?hl=ko)
- Forward: 입력 이미지를 CNN의 중간 layer까지 통과시킨다.
- 선택된 layer의 activation value를 계산한다. (=gradient로 사용)
- Backprop: 해당 layer의 activaton 값이 최대가 되도록 이미지를 업데이트
Style Transfer
Feature Inversion
주어진 이미지를 CNN에 넣어 얻은 feature vector와 생성한 이미지의 feature 사이 차이를 줄이는 방향으로 이미지를 재구성하는 방법
featrue를 통해 이미지를 합성하기 때문에 Feature reconstruction과 유사하다.
Texture Synthesis
- 샘플 텍스쳐와 동일한 텍스쳐로 더 큰 이미지를 생성하는 알고리즘
- 고전적인 방법: Nearest neighbor: scanline을 따라 한 픽셀씩 생성. 주변의 이미 생성된 픽셀들을 보고 input patch에서 nearest neighbor 픽셀을 복사해 넣는 방법 (only simple texture)
Neural Texture Synthesis
복잡한 texture에 사용하기 위해서 Texture synthesis에 신경망을 도입한 방법으로 Gram matrix를 사용한다.
Gram Matrix
- 이미지를 Neural Network에 통과시킨다
- 특정 layer에서 feature map을 가져온다 (CxHxW tensor = HxW grid C-dim vector)
- feature map에서 서로 다른 두 픽셀 point에서 feature column(C-dim vector)을 가져온다.
- 두 feature vector를 외적해 CxC 행렬을 얻는다
- 위 과정을 HxW grid의 모든 point에서 수행하여 평균을 계산 -> CxC Gram matrix
CxC matrix는 이미지 내 서로 다른 두 지점에 있는 feature 간의 co-occurrence를 담고 있다.
ex) CxC matrix의 (i, j) 값이 크다 = 두 입력의 벡터 i번째, j번째 요소가 동시에 나타난다.
이 CxC matrix를 average 하면 spatial information은 사라지고 co-occurrence만 담고 있는 gram matrix를 얻을 수 있다. 이렇게 구한 Gram matrix를 이미지의 texture를 묘사하는 texture descriptor로 사용한다.
Neural Texture Synthesis Algorithm
- GM 1: pretrained CNN에 이미지를 forward pass -> 각 layer에서 Gram matrix 계산
- 생성된 이미지에 random noise를 적용한다
- GM 2: 생성된 이미지를 CNN에 forward pass -> 각 layer에서 Gram matrix 계산
- Compute Loss: 두 Gram matrix 사이 loss를 계산한다
- Backprop: loss를 줄이는 방향으로 gradient를 얻고 이미지 업데이트한다 (반복)
이러한 과정을 통해 입력 texture와 유사한 큰 이미지를 만들어낼 수 있다.
Neural Style Transfer
- Texture synthesis(Gram reconstruction) + Feature Inversiion(feature reconsturction)
Style transfer는 content image의 featurere reconstruction loss를 최소화함과 동시에 style image의 gram matrix loss도 최소화하도록 출력 이미지를 생성한다.
- 네트워크에 content, style image를 통과시켜 Gram matrix와 feature map을 계산
- 최종 출력 이미지를 random noise로 초기화한다.
- forward/backward를 반복하면서 두 loss를 최소화하는 gradient를 이용해 출력 이미지를 업데이트
- 다양한 하이퍼파라미터
다른 style image를 선택하거나 두 loss의 weight 등을 조정해서 다양한 하이퍼파라미터를 조정해서 원하는 출력을 얻을 수 있다.
ex) loss weight를 조정: 최종 출력이 content image에 더 fit 할지, style image애 fit할지 조정 가능
Style transfer의 단점
- forward/backward pass를 여러 번 반복해야 하기 때문에 매우 느리다.
Fast Style Transfer
- style transfer를 수행하는 별도의 feedforward network를 학습해 속도를 높인다.
- feedforward network를 각 style image에 대해 학습시킨다
- 학습시킨 feedforward network의 style loss와 content image의 loss를 사용해 전체 네트워크를 학습시킨다.
Fast Style Transfer는 한번 학습하는데 오랜 시간이 필요하지만, 한번 학습시키면 이미지를 네트워크에 한번 forward pass 하면 결과를 얻을 숭 있다.
Reference
'CS > CS231N (2017)' 카테고리의 다른 글
[cs231n] lec14 - Reinforcement Learning (0) | 2021.09.16 |
---|---|
[cs231n] Lec13 - Generative models (0) | 2021.08.30 |