일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- deep learning
- SQLD
- marchine learning
- Optimization
- cs231n
- mask r-cnn
- assignment1
- Machine Learning
- 딥러닝
- Transformer
- RNN
- assignment2
- Python
- Generative Models
- Alexnet
- 밑바닥부터 시작하는 딥러닝2
- DFS
- Regularization
- dropout
- Algorithm
- 밑바닥부터 시작하는 딥러닝
- CPP
- CNN
- computer vision
- Adam
- BFS
- do it! 알고리즘 코딩테스트: c++편
- Multi-Head Attention
- C++
- Baekjoon
- Today
- Total
newhaneul
[Stanford Univ: CS231n] Lecture 12. Visualizing and Understanding 본문
[Stanford Univ: CS231n] Lecture 12. Visualizing and Understanding
뉴하늘 2025. 5. 23. 14:51
본 포스팅은 Stanford University School of Engineering의 CS231n: Convolutional Neural Networks for Visual Recognition을 수강하고 공부한 내용을 정리하기 위한 포스팅입니다.
https://youtu.be/6wcs6szJWMY?si=-hAh2USbS1jd68zR
https://github.com/cs231n/cs231n.github.io
GitHub - cs231n/cs231n.github.io: Public facing notes page
Public facing notes page. Contribute to cs231n/cs231n.github.io development by creating an account on GitHub.
github.com
1. First Layer: Visualize Filters
CNN의 First Layer의 필터들은 원본 이미지의 low-level features을 포착하며, 네트워크가 어떻게 입력 데이터를 처리하는지에 대한 정보를 제공한다.
Conv 필터는 sliding window로 이미지를 돌고, 이미지의 일부 영역과 내적을 수행한다. 이렇게 필터의 가중치와 내적한 결과가 First Layer의 출력이기 때문에 단순히 시각화시키는 것 만으로도 이 필터가 이미지에서 무엇을 찾고 있는지 알아낼 수 있는 것이다.
왜냐하면 내적 값을 최대화 시키는 방법은 동일한 값 두 개를 내적하는 것이기 때문에, 필터 값을 가장 활성화시키는 입력은 입력 값과 필터의 가중치 값이 동일한 경우이다.
CNN을 어떤 모델/데이터로 학습하건 간에 대게 First Layer의 Kernel은 edge, color gradient, texture 등 전부 다 기본적인 시각 특징들로 생겨져 있다.

2. Visualize the filters/kernels
두 번째 Layer 이상부터는 Conv & ReLU를 거쳐야 한다. 그렇기 때문에 이 필터들은 직접적으로 이미지 형태로 시각화시킬 수 없다는 문제점이 있다.
그래도 시각화를 진행해보면, Layer 2는 16개의 Channel을 보유하고 있으므로 16개의 7 x 7 Grayscale images로 나눠서 표현할 수 있다. 이렇게 표현한 Grayscale images가 바로 Layer 2의 각 필터들의 가중치이다.
현재 Layer 2는 Layer 1의 출력과 연결되어 있는 상태이다. 따라서 지금 시각화한 내용(Layer 2 weights)은 "Layer 2의 결과를 최대화시키는 Layer 1의 출력 패턴이 무엇인지"이다.

3. Last Layer: Nearest Neighbors
Last Layer는 classifier 직전의 layer로, 많은 이미지로부터 얻은 4096-dim Feature vector이다. 이제 이 Feature vector를 입력으로 최종 Class scores를 출력하게 된다.

Lecture 2에서는 Original Image의 pixel 공간에서 Nearest Neighbors를 계산하였다. 이번에는 CNN으로부터 얻은 4096-dim Feature vector에서 계산을 진행한다.
Feature vector에서의 Nearest Neighbors의 결과를 보면 서로 pixel 값의 차이가 큰 경우도 있다. 이는 서로 pixel 값의 차이는 커도 Feature space 내에서는 유사한 특성을 지닌다는 것을 알 수 있다. 이는 네트워크가 학습을 통해서 이미지의 semantic content한 특징들을 잘 포착해 낸 결과이다.

4. Last Layer: Dimensionality Reduction
Last Layer에서 어떤 일이 벌어지는지를 시각화하고자 할 때 차원 축소의 관점으로 볼 수도 있다. 이는 모델이 학습한 feature space의 구조와 클래스 간 분리도를 이해하는 데 유용한 방법이다.
PCA(Principle Component Analysis)로 진행할 수 있지만 t-SNE(t-distributed stochastic neighbor embeddings) 알고리즘이 더 효과적이다.
아래는 MNIST dataset을 t-SNE dimensionality reduction를 통해 시각화한 모습이다. 여기에서는 t-SNE가 MNIST의 28x28-dim 데이터를 입력으로 받고(raw pixels), FC7의 feature vectors(4096-dim)을 2-dim으로 압축한다. 그리고 압축된 2-dim 을 이용해서 MNIST dataset을 시각화해보면 자연스럽게 군집화된 모습을 볼 수 있다.

이런 식의 시각화 기법을 ImageNet을 분류하려고 학습시킨 네트워크의 Last Layer에도 적용해볼 수 있다. 엄청나게 많은 이미지들을 네트워크에 통과시키고 각 이미지에 대해서 4096-dim feature vector들을 모은다. 그리고 이렇게 모은 feature vector들에 t-SNE를 적용하여 4096-dim에서 2-dim으로 압축한다.
그리고 이 2-dim 특징 공간의 각 grid에 압축된 2-dim feature들을 시각화시킨다. 한번 살펴보면 좌하단의 초록초록한 군집을 볼 수 있다. 이를 통해 학습시킨 특징 공간에는 일종의 불연속적인 의미론적 개념(semantic notion)이 존재하며 t-SNE을 통한 dimensionality reduction의 특징 공간을 살펴보며 그 공간을 이해해볼 수 있다.

5. Visualizing Activations
First Layer와 Last Layer 뿐만 아니라 Middle Layer로부터도 해석 가능한 정보를 얻을 수 있다. 신경망의 중간 Layer의 가중치가 아니라 출력값인 (activation map)을 시각화 해보면 일부 해석할 수 있는 것들을 볼 수 있다.
아래의 128 x 13 x 13-dim tensor는 128개의 13x13 2-dim gird로 볼 수 있다. 따라서 이 13 x 13 x 1 feature map을 gray scale image로 시각해보면, conv layer가 입력에서 어떤 특징을 찾고 있는지를 짐작해볼 수 있다.
이 예시의 입력 이미지의 중간 특징들 대부분은 nosie해서 볼만한 게 없지만 초록색으로 표시된 feature map을 보면, 사람의 얼굴에 활성화되고 있음을 알 수 있다.

6. Maximally Activating Patches
Maximally Activating Patches는 CNN의 특정 필터가 가장 강하게 반응하는 입력 이미지의 국소 영역(patch)을 찾아내는 시각화 기법이다.
Conv layer의 뉴런은 전체 이미지를 보지 않고 이미지의 일부만을 보고있다. 따라서 뉴런의 활성을 최대화시키는 패치의 특징으로부터 해당 뉴런이 무엇을 찾고있는지 짐작해 볼 수 있다.

7. Occlusion Experiments
Occlusion Experiments는 입력 이미지의 일부 영역을 의도적으로 가려가며 신경망의 출력 변화를 관찰한다. 이 실험을 통해 모델이 입력의 어느 부분을 중요한 정보로 인식하는지를 시각적으로 분석할 수 있다.
1. 원본 이미지를 준비한다.
2. 일정 크기의 occlusion patch(예: 회색 사각형)를 이동시키며 이미지 일부를 가린다.
3. 가린 이미지를 모델에 넣고 클래스 확률 또는 logit 점수를 기록한다. (가린 부분은 데이터셋의 평균 값으로 채운다)
4. occlusion patch 위치별로 예측 점수의 변화를 heatmap으로 시각화한다.
이 실험의 아이디어는, 만약 이미지의 일부를 가렸는데 네트워크의 score 변화가 크게 발생한다면 가려진 바로 그 부분이 분류를 결정짓는데 중요한 부분이었다는 사실을 짐작할 수 있다는 것이다.
밑의 실험 결과를 보면 앞쪽의 go-kart 영역을 가렸을 때 go-kart Classification에 대한 확률이 아주 많이 감소함을 볼 수 있다. 이때 빨간색 지역은 확률 값이 낮고, 노란색 지역은 확률 값이 높음을 의미한다.

8. Saliency Maps
딥러닝 모델 f(x)는 입력 이미지 x ∈ R(C×H×W)를 받아 출력 점수 y = f(x) ∈ R(K, 클래스 수 K)를 생성한다. 이때 특정 클래스 c에 대한 예측 점수 y_c가 입력 x의 어떤 부분 혹은 중간 레이어의 activation에 의해 영향을 받았는지를 알고 싶을 때 Sailency Map을 사용한다.
Saliency Map은 입력 이미지의 각 픽셀들에 대해서, 예측한 class score의 gradient를 계산하는 방법이다.

즉, 입력의 각 픽셀을 약간 변화시켰을 때 예측 score가 얼마나 변하는지를 보는 방식이다.
이 방법을 통해 "개" 이미지의 Saliency map을 만들어보면 "개"의 윤곽이 나타남을 알 수 있다. 이는 네트워크가 이미지에서 어떤 픽셀들을 찾고 있는지를 짐작할 수 있다.

입력 이미지에서 전경(foreground)을 배경(background)과 분리해주는 GrabCut 알고리즘과 Saliency Map을 잘 조합하면 이미지 내에서 객체를 Segmentation 할 수 있다.

9. Intermediate features via (guided) backprop
Intermediate Features via (Guided) Backpropagation은 CNN의 중간 레이어의 출력(중간 feature map)이 모델의 최종 예측에 어떤 기여를 하는지를 시각적으로 분석하는 기법이다.
Guided Backprop은 기본 Saliency Map보다 더 선명하고 집중된 시각화를 제공하기 위해 고안된 기법으로, forward와 backward 모두에서 음수를 제거한다. 수식으로 표현하면 아래와 같다.

즉, gradient가 음수이거나 해당 뉴런의 forward 값이 음수이면 gradient를 차단한다. 이로 인해 예측 클래스에 실제로 긍정적인 영향을 준 뉴런만 강조되며, 불필요하거나 혼란스러운 음의 영향은 제거된다. 따라서 결과는 일반 Backprop보다 더 희소하고, 선명하며, 양의 영향만 반영된 시각화가 된다.
이 Guided Backprop을 Intermediate Feature map z에 적용하면, 중간 layer가 출력에 기여한 방식을 분석해낼 수 있다.

즉, 중간 convolutional layer에서의 guided gradient map은 그 레이어가 어떤 패턴, 모양, 개체 부분을 encode했는지를 명확하게 드러낸다.
이렇게 guided backprop은 중간 레이어가 무엇을 찾고 있는지를 이해하기 위한 영상을 합성하는데 유용하다. 하지만 guided backprop이나 saliency maps을 계산하는 방법들은 고정된 입력 이미지에 대한 연산을 수행할 뿐이다.
다시 말하면 guided backprop이나 saliency maps은 정해진 하나의 이미지 x를 입력으로 받으며, 연산 결과는 해당 이미지 하나에 특화된 gradient 시각화이다. 그렇기 때문에 일반화된 개념이나 클래스 전체의 대표적인 패턴을 찾는 데에는 한계가 있다.

10. Visualizing CNN features: Gradient Ascent
Gradient Ascent는 CNN의 내부 뉴런이 어떤 입력에 가장 크게 반응하는지를 생성적으로 알아내기 위해 사용하는 기법이다. 이는 입력을 점진적으로 수정하면서 특정 뉴런의 출력을 극대화하는 과정을 통해, 해당 뉴런이 인식하는 특징의 본질을 시각화하는 데 사용된다.
지금까지 Loss를 최소화시켜 네트워크를 학습시키기 위해 Gradient decent를 사용했다. 하지만 여기에서는 네트워크의 가중치들을 전부 고정시키고, Gradient ascent를 통해 중간 뉴런 혹은 class score f(I)를 최대화 시키는 이미지의 pixel들을 만들어낸다.
이 기법에는 생성된 이미지가 특정 네트워크의 특성에 과적합되는 것을 방지하기 위해 Regularization terms을 사용해야 한다. 결국 Gradient Ascent에 Regularization term을 추가함으로서 생성된 이미지가 두 가지 특성을 따르길 원한다.
1. 이미지가 특정 뉴런의 값을 최대화시키는 방향으로 생성되는 것
2. 그 이미지가 noise가 없는 일반적으로 볼 수 있는 이미지가 되는 것

Gradient Ascent를 위해서는 zeros, uniform, noise 등으로 초기화된 초기 이미지가 필요하다. 초기화를 하고나면 이미지를 네트워크에 통과시키고 관심있는 뉴런의 score를 계산한다. 그리고 이미지의 각 픽셀에 대한 해당 뉴런 score의 gradient를 얻기 위해 back prop을 수행한다. 그 후 gradient ascent를 진행하여 이미지를 조금씩 업데이트한다. 이 과정을 계속 반복하면 일반적인 이미지를 얻을 수 있다.


시각화의 다른 접근법들은 regularizer를 더욱 향상시키고 이미지를 더 잘 시각화시키는 방법에 관한 것이다. 최적화 과정에 이미지에 주기적으로 Gaussian blur를 적용하고, 주기적으로 값이 작은 pixel들은 모두 0으로 만든다. 또한 낮은 gradient의 pixel 값 중 일부는 0으로 설정된다. 이 방법을 이용하면 더 깔끔한 이미지를 생성할 수 있다.



11. Fooling Images / Adversarial Examples
입력에 아주 작고 의도적인 변화를 추가하여 image의 원래 class가 아닌 다른 class로 분류하도록 Fooling Image를 만들어볼 수 있다.

원래 Image와 Fooling Image를 비교하면 큰 차이가 없는 것을 볼 수 있다. 그 이유는 인간은 global semantics에 민감하지만, 모델은 low-level feature에 민감하기 때문이다.

12. DeepDream: Amplify existing features
DeepDream은 입력 이미지에서 이미 존재하는 특징(feature)을 증폭(amplify) 시켜, 인간이 직관적으로 이해할 수 있는 시각적 패턴을 만들어내는 기술이다. 이는 Google의 연구자들이 2015년에 발표한 기법으로, CNN의 내부 뉴런이 인식하는 패턴을 시각화하는 창조적이고 생성적인 방법이다.
DeepDream에서는 입력 이미지를 CNN의 중간 레이어를 어느정도 통과시킨다. 그리고 back prop을 할 때 해당 layer의 activation을 gradient로 설정한다. 그리고 back prop을 하여 이미지를 업데이트하고 이 과정을 반복한다.
해당 layer에 어떤 feature가 있던지 그 feature를 gradient로 설정하면 이는 네트워크가 이미지에서 이미 뽑아낸 feature들을 더욱 증폭시키는 역할을 한다.


높은 layer를 증폭시키면 object-like pattern이 image에서 과장되어 나타나게 된다.

반면에 낮은 layer를 증폭시키면 edge, texture 같은 low-level pattern이 image에 나타난다.


13. Feature Inversion
Feature Inversion은 CNN의 중간 레이어에서 얻은 feature representation(특징 벡터) 를 이용하여, 그 feature를 만들어낸 원래의 입력 이미지 x를 재구성(invert) 하려는 기법이다. 즉, 모델이 학습한 표현 공간(feature space)이 어떤 시각적 정보를 담고 있는지 해석하고자 할 때 사용된다.
방법은 어떤 이미지가 있고, 이 이미지를 네트워크에 통과시킨다. 그리고 네트워크를 통과시킨 특징(activation map)을 저장해둔다. 그리고 이제 이 특징(activation map)을 가지고 이미지를 재구성한다. 해당 layer의 특징 벡터로부터 이미지를 재구성해보면, 이미지의 어떤 정보가 특징 벡터에서 포착되는지를 짐작할 수 있을 것이다.
이 방법에서 또한 regularizer를 추가한 gradient ascent를 이용한다. 기존에 계산해 놓은 특징 벡터와, 새롭게 생성한 이미지로
계산한 특징벡터 간의 거리를 측정하고 이 거리가 최소가 되도록 입력 x를 조정한다.

- ϕ(x): CNN의 중간 레이어에서의 feature extractor
- ϕ_0: 복원하고자 하는 target feature
- R(x): 이미지 정규화 항 (ex. Total Variation: 상하좌우 인접 픽셀 간의 차이에 대한 패널티를 부여)
- λ: 정규화 가중치

아래 예시처럼 다양한 layer를 이용해서 합성한 이미지들을 통해서, 얼마나 많은 정보들이 저장되어 있는지를 짐작해 볼 수 있다.이를 통해 layer가 얕을수록 더 많은 정보를 포함하고 있고, 깊을수록 점점 image의 디테일한 정보를 포함하지 않는 것을 알 수 있다.

14. Texture Synthesis
Texture Synthesis는 주어진 텍스처 이미지의 스타일적, 통계적 특징을 유지하면서 새로운 이미지를 생성하는 문제이다. 초기에는 Nearest Neighbor 알고리즘을 사용해 신경망 대신에 scan line을 따라서 한 pixel씩 이미지를 생성하는 고전적인 방식이다.


하지만 복잡한 텍스처에서는 단순하게 입력 패치에서 복사하는 방식은 잘 동작하지 않는다.
따라서 2015년에 CNN을 활용해서 Texture Synthesis 문제를 푸려는 시도를 하게 된다. 이 방법은 Gram Matrix라는 개념을 이용한다.
1. 기준이 되는 Texture Image를 입력받고, 네트워크에 통과시킨다.

2. 네트워크의 중간 layer에서 feature map(C x H x W)을 추출한다.
(feature map H x W의 한 점에 있는 C차원 feature vector는 해당 지점에 존재하는 이미지의 특징을 담고 있다고 볼 수 있다.)

3. 서로 다른 두 개의 feature vector(C)를 뽑아낸 후 두 벡터의 외적(outer product)을 계산해서 C x C Matrix를 만든다.
(이 C x C Matrix은 이미지 내 서로 다른 두 지점에 있는 특징들 간의 co-occurrence를 담고 있다.)

- 여기서 i, j는 channel index, k는 공간적 위치(pixel)
4. 이 과정을 H x W grid에서 전부 수행해주고, 결과에 대한 평균을 계산하여 C x C Gram matrix를 얻는다.
(Gram matrix는 각 지점 값들을 모두 평균화 시켰기 때문에 공간 정보가 없어진 대신에 특징들 간의 co-occurrence만 포착해낸다.)
5. 무작위 이미지를 생성용 입력 x로 초기화한다.

6. 생성 이미지 x의 Gram Matrix를 계산한다.

7. Loss function을 계산한다. -> 생성 이미지가 기준 texture와 같은 Gram Matrix를 가지도록 유도

- w_l : 각 레이어별 중요도 가중치
- (선택) + λ⋅R(x): Total variation 등을 통한 부드러움 정규화
8. Gradient ascent로 image pixel을 조금씩 업데이트한다.
9. 반복되면 생성된 x는 texture image와 스타일이 유사하지만 내용은 다른 새로운 texture가 된다.



15. Neural Style Transfer Feature + Gram Reconstruction
Neural Style Transfer(NST)는 두 개의 이미지를 결합해 하나는 내용(content)을, 다른 하나는 스타일(style)을 따르는 새로운 이미지를 생성하는 기법을 말한다.
- Content Image: ex. 고양이 사진
- Style Image: ex. 피카소 그림
- Output Image: content 이미지의 구조는 유지하면서 style 이미지의 예술적 스타일을 적용한 이미지


- α, β는 content와 style의 trade-off를 조절하는 하이퍼파라미터다.
- 이 total loss를 최소화하도록 output 이미지를 최적화한다





