cs231n 12강

이준학·2024년 7월 16일

cs231n

목록 보기
10/13

1. 11강 복습

  지난 강의에서는 Computer Vision에서 다루는 다양한 주제들에 대해 알아봤다. object가 아니라 pixel 단위로 classification을 진행하는 Semantic Segmentation과 하나의 object를 찾고, 그 주변에 박스를 치는 classification+ Localization이 있었다. 또, 분류해야 하는 물체 수가 정해져 있지 않은 Object detection과 Semantic Segmentation+object detection의 효과를 내는 Instance Segmentation을 배웠다. 이번 강의에서는 CNN 안에서 어떤 일이 일어나고 있는지에 대한 연구를 살펴본다. 각 layer에서 feature들이 무엇을 배우려고 하는지 알아보는 것이다. 네트워크 구조만 봐서는 이해가 어렵기 때문에 직관적인 visualization을 통해 이해해 보자.

2. 왜 Visualization 분야가 발전하게 되었을까?

  시간이 지날수록 등장하는 모델의 성능은 점점 좋아지고, 실제로 문제들을 해결하는데 도움이 된다. 결과는 잘 나오지만, 우리는 네트워크 내부에서의 상황을 직관적으로 파악하기 어려운 상황이다. 이 때문에 딥러닝은 결과는 좋지만, 내부 사정을 알 수 없다는 이유로 신뢰를 받지 못했다. Visualization은 이러한 의심을 해결하기 위해 발전되어 온 분야이다. 따라서 네트워크 안에서 어떤 일이 벌어지는지 직관적으로 보여주기 위해 Visualization이라는 분야가 발전하게 된 것이다.

3. Visualizing Filters

  먼저 우리는 CNN에서 layer의 Filter를 살펴본다.

1) First Layer visualization

   AlexNet의 경우, 첫번째 ConvNet layer에서 64개의 filter를 쓰고, 각 filter 별로 3개의 채널이 있다. 채널이 3개이기 때문에 RGB image로 출력이 가능하다. 위의 사진이 그런 식으로 64개의 필터를 출력한 것이다. 대체적으로 필터들은 oriented edge를 찾는 것처럼 보인다. AlexNet 뿐만 아니라 다른 architecture에서도 첫 번째 layer는 이렇게 oriented edge를 찾는 경향을 보인다.

2) Intermediate Layer Visualization


  그렇다면 중간 단계의 layer에서의 filter들은 어떨까? 계속해서 AlexNet으로 예시를 든다. AlexNet의 두 번째 ConvNet layer에는 16개의 채널이 있고, 필터 개수는 20개이다. 첫 번째 layer와는 다르게, 채널 수가 20개이기 때문에 RGB로 출력하기 어렵다. 그렇기 때문에 채널 별로 출력해볼 수 있다. 위의 사진도 그렇게 20개의 필터에 대해서 출력한 것이다. 여기서 중요한 것은 첫 번째 layer와는 다르게 출력한 결과가 어떤 의미있는 내용을 찾기 힘들다는 것이다.

3) Last Layer Visualization

   이제 마지막 layer를 살펴보자. 여기서 말하는 마지막 layer는 score vector가 들어있는 layer 바로 직전의 4096D vector가 나오는 layer이다. 즉, classify 하기 직전의 layer라는 뜻이다.

FC7 layer= last layer

   마지막 layer의 경우 method의 종류를 나눌 필요가 있다. 크게 activation method와 Gradient method로 나눈다.

4. Activation Methods

1) Nearest Neighbor

   이전 강의에서 우리는 pixel space에서의 Nearest Neighbor 알고리즘을 통해 classification을 진행했었다. 예를 들어 흰 강아지 클래스의 경우, Nearest Neighbor 알고리즘이 정확히 흰 강아지를 뱉어내진 않더라도, 픽셀에 대해서 봤을 때는 output이 얼추 흰색의 뭉치를 띄고 있는 모습을 볼 수 있었다.
  이러한 접근 방법을 last layer에 대해서도 적용해볼 수 있다. 단, 우리가 이미 알고 있는 pixel space에 대한 NN이 아니라 feature space에 대한 NN 알고리즘을 이용한다. pixel space와 다르게 feature space NN이 조금 더 semantic content를 더 담고 있는 것을 확인해 볼 수 있다. 예를 들어, 코끼리 사진들 중에 test image와 반대로 서 있는 코끼리들도 나온다. feature space에서의 L2 Distance를 사용해 비교적 정확한 classification이 가능하다.

2) Dimensionality Reduction

MNIST에서 차원 축소 결과, 각 숫자들이 하나의 cluster를 이룬다.

  차원을 축소하는 방법은 크게 두 가지 소개된다. 간단한 알고리즘인 PCA(Principle Component Analysis)와 조금 더 복잡한 알고리즘인 t-SNE(t-Stochastic Neighbor Embedding)가 있다. 위의 예시는 t-SNE로 한 것인데, 28x28 이미지를 2d로 차원 축소하여 나타낸 것이다. t-SNE는 다음 기회에 블로그에 정리 해보려고 한다.
참고로, PCA는 아래 글에 정리해뒀다.
https://velog.io/@danlee0113/PCAPrincipal-Component-Analysis

   우리가 4096D vector를 굳이 2D로 바꾸는 이유는 사진으로 출력하고 싶어서이다. 차원 축소를 하고 나면, 원래 pixel들의 위치를 참고해 픽셀들을 재배치하여 grid를 만든다. 이렇게 해서 효과적으로 visualization을 해볼 수 있다.
  지금까지의 내용을 정리해보자. filter를 visualization 했을 때 첫 번째와 마지막 layer에서는 의미 있는 결과를 얻을 수 있었다. 그러나 intermediate layer에서는 의미 없는 결과만 나왔다. 그렇다면 filter가 아닌 feature map visualization을 해본다면 의미 있는 결과가 나오지 않을까? 하는 의문이 든다.

Feature map VS Filter

   내가 헷갈렸던 개념이다. feature map은 input에 filter를 먹여서 나온 결과물이다. 반면 filter는 weight들을 담아놓은 작은 matrix이다. Feature map은 activation map과 같은 뜻으로 사용된다.

3) Maximally Activiating Patches

   intermediate feature map들을 최대화 하는 patch를 찾는 방법이다. 먼저, layer와 channel을 하나씩 고른다. 그리고 많은 이미지들을 네트워크에 태운다. 이때, 우리가 고른 layer의 채널 feature들은 기록해 놓는다. 그리고 어떤 부분이 activation을 최대화하는지 찾아서 출력한다. 어떤 부분이 maximized activation을 만드는지를 알면, 그 뉴런이 어떤 것을 배우고 싶어하는지에 대한 이해를 할 수 있을 것이다.

   위의 사진은 maximally activating patches를 출력한 것이다. 그 중에 윗 부분은 초반 layer에서 뽑은 것이고, 밑의 부분은 뒤의 layer에서 뽑은 것이다. 먼저 윗 부분부터 보자. 첫 줄에 보면, 이 feature는 동그란 것이 들어왔을 때 activation이 최대화 되는 것을 알 수 있다. 즉, 동그란 것들을 배우려고 하는 뉴런인 것이다. 다른 줄에서도 마찬가지로 특정 모양이나 색깔을 배우려고 하는 경향성을 볼 수 있다.
  여기서 주목해야 할 것은 초반 layer부분과 뒤의 layer부분이 무엇을 배우려고 하는지이다. 윗 부분은 초반 layer이기 때문에 receptive field가 크지 않을 것이다. 그렇기 때문에 작은 구조물들만 배우려고 한다. 그러나 뒤의 layer로 갈수록 receptive layer는 커지므로, 뒤의 layer에서는 조금 터 큰 구조물들을 배우려고 하는 경향이 있다.

4) Occlusion

   Occlusion의 개념도 상당히 재미있다. 목적은 여전히 사진에서 의미 있는 부분이 어디인지를 알아내고 싶은 것이다. 이 방법은 원래 사진의 일부를 가려(masking) 그 부분이 정답 클래스로 분류하는데 얼마나 영향을 주는지 실험해보는 것이다. 예시를 들어 살펴보자.

   위의 사진처럼 코끼리 사진에 masking을 통해 일부를 가린다. 만약 가리지 않았다면 classification score는 코끼리 클래스가 가장 높을 것이고, 그래서 정답 값이 코끼리가 되었을 것이다. 이제 사진의 일부를 가리고 CNN을 태웠을 때, classification score가 어떻게 바뀌는지 봄으로써 어떤 부분이 중요한 부분인지를 알아내보자. 만약 mask를 씌운 사진의 classification score가 original 사진과 차이가 많이 난다면, 그때 가린 부분이 classification에 큰 영향이 있고, 중요한 부분이라고 볼 수 있는 것이다. 이렇게 mask를 이미지의 모든 영역에 다 씌워 heat map을 만들어 볼 수 있다.

heat map의 색이 진할수록 그 부분을 masking 했을 때 정답 classification score가 낮은 것이다.

   결과를 보면, 코끼리 부분 주위에서 색이 진해진 것을 볼 수 있다. 이 뜻은 코끼리 부분에 mask 처리를 했을 때 classification score가 많이 떨어졌음을 의미하고, 분류에 중요한 영역이라는 것이다.

5. Gradient Methods

   방식만 바뀌었지, 계속 이미지의 어떤 부분이 classification에 중요한 부분인지에 대한 논의를 하는 중이다.

1) Sailency Maps

   Sailency map은 class score의 gradient를 pixel에 대해서 구한다. 이때 first order approximation를 이용해 pixel value에 대한 gradient를 구한다고 한다.

   정확한 작동 원리를 알려주진 않았지만, sailency map을 적용시키면 위의 사진과 같이 강아지에 해당하는 부분을 찾을 수 있다. 이렇게 결과가 나온다면, label이 없는 semantic segmentation을 할 때도 이 방법을 사용할 수 있다만, 실제로 해본 결과 결과가 좋진 않았다고 한다.

2) Intermediate Features via Guided Backprop

   이 방법은 이전과 같이 intermediate neuron을 하나 고른 후, pixel value에 대해 gradient를 계산하고 ReLU의 backprop할 때 positive value만 backprop을 진행한다. 이렇게 하면 더 깨끗한 이미지가 나온다고 한다.

   위의 사진에서 보듯이, forward pass 때 ReLU는 음수는 0으로, 양수는 그대로 출력한다. backprop시에도 음수였던 자리는 gradient를 0으로 만든다. deconvnet은 원래 자리의 부호가 아니라 gradient값의 부호가 음수이면 0으로 바꿔주는 방식이다. deconvnet과 backprop이 합쳐진 것이 우리가 배우려는 guided backprop이다.

3) Gradient Ascent

   이것은 우리가 이전에 배웠던 Gradient descent의 반대되는 개념이라고 생각하면 된다. GD 시에는 classification 성능을 높이기 위해 filter 내의 weight 값들을 바꿨다. 그러나 GA의 경우, weight 값들을 고정하고 이미지의 pixel 값들을 바꾸어 해당 뉴런을 최대화하도록 한다. 즉, GA는 뉴런이 activate 되기 위한 general input을 찾는 것이 목표인 셈이다.

   이전의 방법과 차이를 아는 것이 중요할 것 같다. 어쨌든 우리가 원하는 것은 뉴런들을 maximize하는 pixel 값들인데, 이 pixel들이 natural image 처럼 보이게 하고 싶은 것이다. 이를 위해 일종의 regularizer를 도입해 픽셀들이 뉴런에 과적합 되는 것을 막아준다. 기본적인 방법은 아래의 사진과 같다.

   일단 어떤 이미지의 픽셀들을 다 0으로 초기화하고 난 후, forward pass 후 이 픽셀들에 대해 backprop을 진행한다. 그리고 업데이트를 하는 것이다. 여기서 regularizer는 다양한 것을 쓸 수 있는데, 간단한 건 L2 Norm이다.

   그러면 아래와 같은 사진들이 출력된다. 각 object별로 그 형태가 보인다. 색깔은 그다지 의미가 없다고 한다. 또 다른 regularizer로, L2 Norm을 이용하면서 optimization도 같이 해주는 방법이 있다. 기존의 L2에 Gaussian blur (가우시안 필터라고도 얘기하는데, 이미지의 노이즈를 줄이는 기법 중 하나이다.) 처리를 해주고, 값이 작은 픽셀들과 gradient가 작은 픽셀들은 0으로 clipping 해줘서 더 깨끗한 이미지가 나올 수 있게 해준다.

   캡쳐한 사진이라 차이가 보일진 모르겠지만, 더 선명한 이미지를 얻었다. 이러한 접근은 intermediate feature에 대해서도 적용할 수 있다고 한다.

   여기서도 layer가 깊어질 수록 receptive field가 커져서 더 큰 구조들을 찾는 것을 볼 수 있다. 이 방법을 이용하면 classification에서 multi-modality로의 확장이 가능하다.

   이 사진들은 다 grocery store 로 분류된다. 윗 줄은 과일 혹은 채소를 가까이서 찍은 사진이고, 밑의 줄은 grocery store에 관련된 사람이나 간판의 사진이다. 이들을 다 포함하는 general image들을 만들어 multi modality를 가져가자는 이야기이다.

   이렇게 사진들에 여러 가지 케이스들을 다 담고 있는 듯하게 출력된다. 뒤쪽 layer로 갈수록 이 사진들도 더욱 선명해진다.

4) Fooling Images

Fooling Images는 코끼리 사진을 가지고 코알라 class의 score를 최대화하는 method를 의미한다. 코알라가 아닌데 코알라로 분류되기 때문에 네트워크를 바보로 만든 것 같은 느낌이 든다. 그래서 Fooling 이라는 단어가 붙은 것 같다.

   위의 사진을 보면 두 코끼리 사이에 차이는 많이 없는데, 분류는 다르게 된다. 어떻게 이게 되는지는 다른 강의에서 다룬다고 한다. 굉장히 신기하긴 한 것 같다.

5) Feature Inversion

   이 방법은 이미지의 특정 CNN feature를 고른 후, feature들을 다 기록해놓은 후, 이 feature와 비슷하고, 자연스러워 보이는 이미지를 reconstruct하는 것을 목표로 한다.

   위의 사진에서 보면 새로 생성한 feature vector와 기존의 feature vector간의 거리를 최소화한다. 물론 여기서도 Regularizer를 적용한다. VGG-16에 적용한 것을 살펴보자.

   위의 사진에서 y는 original image를 뜻한다. 초반 layer에서는 원본과 거의 비슷하게 결과가 나타나는 것을 볼 수 있다. 그러나 더 많은 layer를 거칠수록 detail한 정보는 사라지고, semantic 한 부분들이 남게 된다. 이것은 우리가 고른 feature에 얼마만큼의 정보가 들어있는지 가늠하게 해준다.

6. For Fun (?)

   여기서부터는 그냥 재미를 위한 것..? 이라고 해야 되나... 뭐 강의에서는 For fun이라고 했으니 그런 셈인 것 같다.

1) DeepDream

   DeepDream은 특정 layer의 feature들을 증폭하는 방법이다. 무슨 의미가 있나 싶지만 재미있는 패턴들이 나와 신기했던 방법이다. 일단 CNN에서 하나의 layer를 고른 후, 이 layer에서 forward pass를 진행하며 activation을 계산한다. 그리고 이 layer의 gradient를 activation으로 세팅한다. 이렇게 세팅한 후 backprop을 진행하고 이미지를 업데이트 한다. 여기서 gradient를 activation으로 하는 것이 앞서 말한 증폭의 효과를 주는 것이다. 실전에서 코딩을 할 때는 jittering, L1 normalize gradients, pixel clipping등의 테크닉을 사용하기도 한다.

   이 하늘 사진을 deepdream 한다고 생각해보자. 이 경우, ImageNet 데이터 셋을 이용해 훈련시킨 네트워크를 이용했다.

   그 결과, training시에 만났던 다양한 object들이 amplify 되어 결과 값에 나타나는 것을 볼 수 있다. 어떤 layer를 고르냐에 결과 값은 달라진다. layer 별로 배우는 feature들이 다를 것이고, 그렇기 때문에 amplify를 해도 다르게 나오는 것이다.

2) Style Transfer

   이 방법에 대해 본격적으로 이야기하기 전에 Texture Synthesis라는 고전적인 알고리즘을 먼저 살펴보자. 이 알고리즘은 특정 사진을 주었을 때, 그 사진과 texture는 비슷하고 크기는 더 큰 사진을 출력하는 방법을 다룬다.

이 Texture Synthesis를 하는 방법이 하나만 있는 것은 아니다. 그 중에서도 Neural Network가 필요없는 방법, 필요 있는 방법 1개씩을 살펴보자.

i) Nearest Neighbor
  앞에서도 많이 나온 단어이다. Neural Network를 사용하지 않아도 결과값을 얻을 수 있는 고전적인 방법 중에 하나이다. 차례로 input image의 pixel을 복사해 output image를 만든다. 이 방법은 간단한 texture에서는 효과적이지만, 복잡한 texture에서는 어려움을 겪는다고 한다.

(ii) Gram Matrix

   Nearest Neighbor의 문제를 해결하기 위해 CNN을 사용한 방법이다. 일단 CNN에 input texture image를 넣는다. 그러면 CNN은 convolutional feature들을 만들어 뱉어내게 된다. 이 feature들은 HxW 형태의 grid가 C개 있는 구조이다. 이렇게 얻은 feature들 중 2개를 뽑아 C*C matrix를 만든다.(이 과정을 모든 feature에 대해 반복한다.) 이 matrix에서 우리는 feature간 co-occurance에 대한 정보를 얻을 수 있다. 좀 쉽게 풀어보자면 어떤 feature들이 만났을 때 activation이 극대화 되는지에 대한 정보를 얻는다는 뜻이다. 만약 위의 matrix의 (i,j) 번째 있는 원소 값이 크다면, 각 행에서 원소들의 값이 모두 컸다는 것을 의미한다.

   gram matrix는 위에서 feature별로 뽑은 모든 C*C matrix들을 평균 내서 얻는다. 평균을 했기 때문에 spacial information은 없어지게 된다. gram matrix는 계산하기 비교적 쉽다는 것에 장점이 있다. 구체적인 훈련과정을 알아보자.

  
일단 input image와 새로운 이미지를 하나 더 준비한다. 이때 새로운 이미지는 random으로 초기화한다. 2개의 image를 VGG-19에 태워서 각 layer별로 Gram matrix를 생성한다. 이후에 2개의 gram matrix들에 대해서 L2 Loss를 계산하고 backprop를 진행하고 gradient ascent를 한다. 이 과정을 반복하여 texture 이미지를 얻는 것이다. 이 개념은 미술 작품에도 적용이 가능하다. 이를 Neural Style Transfer이다. content image와 style image 2개를 합쳐 새로운 이미지를 만드는 기술이다.

  위의 사진을 보면 두 사진이 합쳐져서 신기한 이미지가 출력된 것을 볼 수 있다. 이 방법의 알고리즘은 아래의 사진과 같다. training시의 목적은 content image의 feature reconstruction loss와 style image의 gram reconstruction loss를 각각 최소화하는 것이다.

   구체적인 훈련 방식은 이렇다. 일단 output image를 random하게 초기화하고, content image와 style image 2개의 loss를 모두 최소화하는 방향으로 학습을 진행하면 된다. 이때 어떤 이미지에 더 초점을 맞춰서 학습을 진행할 지는 정할 수 있다. 또, style image는 여러 개 사용될 수 있다.

   위의 사진에서 왼쪽으로 갈수록 content loss에 더 집중한 것이고, 오른쪽으로 갈수록 style loss에 더 집중한 것이다. 그러나 이 방법의 문제는 훈련 시간이 너무 오래 걸린다는 것이다. 기본적으로 오래 걸리기도 하지만, 만약 여러 개의 style image를 사용한다고 하면, 위의 gram matrix끼리의 차이를 최소화하는 과정을 여러 번 거쳐야 하기 때문이다. 그래서 이 방법을 해결하기 위해 하나의 네트워크를 또 만든다. 이 네트워크는 각 style만 전담해서 학습한다.

   이 네트워크를 추가한 구조도는 위 사진과 같다. Feedforward Net이 새로 추가된 네트워크이다. 각 style을 이 네트워크를 통해 훈련시키면, 더 효율적으로 사용할 수 있다. 훈련을 시킬 때는 시간이 좀 걸리겠지만, 훈련이 끝난 후에는 그냥 forward pass만으로 이미지를 styling 할 수 있기 때문이다. 이와 같은 방법은 Fast Style Transfer라고 한다.

profile
AI/ Computer Vision

0개의 댓글