본문 바로가기
데이터 과학 관련 스터디/cs231n

cs231n 12강 visualizing & Understanding 요약

by inhovation97 2020. 12. 26.

가장 먼저 CNN안에서 어떤 일들이 일어나고 있는지를 시각화해보는 것에 대해 공부합니다.

 

먼저 First Layer의 filter들을 시각화합니다.

AlexNet을 보면 어떤 패턴들이 명확히 보입니다.

이미지 내의 edge같은 특징들을 뽑아내기 위함입니다.

 

이제 이 필터들이 layer가 깊어지면서, 합성곱이 이뤄지고 점점 더 복잡해집니다.

나중에 깊은 layer의 필터들을 보면 직관적으로는 이해할 수 없는 필터들이 되죠.

 

이렇게 layer가 깊어질수록 이해하기 힘든 필터들이 나오고 필터도 많아지죠.

는 정형 데이터를 딥러닝할 때의 블랙박스의 문제가 CNN에서 이렇게 이어진다고 이해했습니다.

 

필터를 거치면서 하나하나의 feature map들이 이미지 내에서 각각 어떤 부분의 전문가가 된다고 한 적이 있었죠? 그런 부분들은 이렇게 가중치들이 내적되면서 층이 깊어질수록 우리가 이렇게 직관적으로는 이해할 수 없는 필터들이 생기는 것이죠.

 

last layer를 봅시다.

우리는 FC layer에서 4096차원으로 데이터를 flatten해주었습니다.

그 특징 vetor들의 시각화는 Nerest Neighbor로 이루어집니다.

NN은 2강에 배웠었죠? 

특징 벡터들을 Nerest Neighbor로 돌리면, 위처럼 유사한 이미지들이 카테고리됩니다.

학습이 잘 됐나 확인해보는 것이죠.

 

이제는 이 4096 특징 벡터를 어떤 기법으로 2차원으로 축소시켜서 시각화 해봅니다.

 

t-SNE와 PCA로 2차원으로 군집화를 실시합니다.

군집화했다기 보다는 군집들이 표현됐다고 해야하나요?

t-sne가 좀 더 강력하다고 합니다.

 

이번에는 feature map을 시각화한 것입니다.

아까 layer가 깊어질수록 직관적인 해석이 어렵다고 했는데, feature map은 각각이 어떤 이미지 내에서 세부적인 부분에 대한 전문가라고 했었죠??

 

저기 초록색 박스는 아마 얼굴에 대한 전문가인가 봅니다.

이렇게 feature map은 직관적을 이해할 수 있는 것들이 일부 볼 수 있다고 합니다.

 

또 하나의 시각화 아이디어는 어떤 부분이 이미지 내에서 중요한 역할을 하는지 알기위함입니다.

Maximally Activating Patches입니다.

ConV 5 layer에서 17번째 channel에서 일부분을 가져와 시각화 했는데,

첫 행을 보면 동그라미에 집중해서 layer가 깊어질수록 계속해서 그 부분에 더욱 집중하죠.

아마 layer가 깊어질수록 그 부분에서는 더욱 전문가가 될겁니다.

 

한 채널에서 모든 뉴런은 필터를 거쳐서 같은 가중치를 갖기때문입니다. 

 

또 하나는 Occlusion Experiments입니다.

얘는 말 그대로 실험하는 건데 아이디어가 재밌습니다.

이미지의 일부분을 가린 후 분류가 잘되는지 보는 것입니다.

 

만약 어떤 중요한 부분을 가렸다면, 최종 결과가 안좋겠죠?

이미지 내에서 어떤 부분이 중요한지를 알 수 있습니다.

 

Saliency Maps도 아이디어가 비슷합니다.

슬라이드 처럼 이미지를 Saliency Map으로 표현하면 객체의 형상이 나옵니다.

 

이걸로 Segmentation을 시도해볼 생각이 듭니다.

성능은 썩 좋지 않다고 하네요.

 

이건 피쳐맵의 intermediate neuron을 골라서 이미지 픽셀에 관련된 뉴런의 기울기를 구합니다!

Relu함수를 거쳐온 gradient중에서도 positive gradient만 살려서 gradient 값을 이용하면 좀 더 어느 부분에 집중 하는지 알려는 방법입니다.

negative 부분은 relu함수에서 전부 0이므로 양수를 이용하는 겁니다.

 

gradient가 양수인 뉴런들은 아마 그 이미지를 분류하는 데에 있어서 굉장히 중요한 역할을 가질 것이기 때문에 이 부분을 집중해 보는 것이죠.

 

실제로 해보면 이렇게 생각보다 더 깔끔하고 괜찮은 결과가 나온다고 합니다.

이를 시각화한 것을 아까 패치와 비교해보면 더욱 자세하게 이 패치에서도 어느 부분의 뉴런이 더 중요하게 작용했는 지를 알 수 있는 것이죠. 

좀 더 디테일하게 해소할 수 있는 것입니다.

 

가령 6번째 행의 글자 같은 것에 집중한 패치들을 intermediate feature via backprop 시각화와 비교하면,

 

어떤 문구에 집중했다(패치) -> 뉴런들이 가로, 세로의 line, edge 같은 것에 많이 집중했다(intermediate feature via backprop)

 

이렇게 디테일한 해석이 가능해집니다.

 

조금 더 심화로 들어가 봅시다.

우리는 input image에서 학습되어 고정된 함수를 통해 나온 뉴런, 픽셀의 일부를 살펴본 것입니다.

이번에는 그런 의존성에 벗어나서 직접 이미지를 합성시켜 버리는 겁니다.

 

descent와는 반대개념으로 생각하면 되는데 

gradient descent는 loss를 최소화하는 방향으로 네트웍을 학습시키는 방식이라면,

gradient ascent는 이미 학습이 된 네트웍의 가중치들을 전부 고정시켜 놓고 score가 최대가 되는 방향으로 백지를 넣어서 Synthetic 이미지를 만들어내는 것이죠.

 

Regularization function을 추가하는데
이미지는 f(I)에서 특정 뉴런의 값을 최대화시키는 방향으로 update 되는데, 이게 너무 특정 뉴런들에만 오버피팅 되는 것을 방지하기 위해 추가해준다고 합니다.

생성된 synthetic image를 좀 더 자연스럽게 만들기 위함이죠.

 

우선 어떻게 위 함수로 이미지를 만드는 지 봅시다.

 

  • 이미지 픽셀을 전부 0값으로 초기화하여 백지를 만듭니다.

  • Forward를 통해 이미 가중치를 고정시킨 네트웍에 집어넣어 현재 스코어를 계산합니다.

  • Image pixel의 뉴런 값들의 gradient를 backprop으로 구합니다.

  • 이미지를 특정 뉴런들의 최대화를 위해 픽셀 단위로 update를 진행한다.

 

score의 최댓값을 가진 이미지가 되도록 계속해서 반복해주는 과정입니다.

 

위 슬라이드가 이제 각 카테고리별 score를 max로 생성된 synthetic image들입니다.

 

Q : 왜 이미지들이 전부 rainbow color로 뽑혔나요?

A : color까지 뽑아내는 것은 어렵다. 왜냐하면 실제 NN은 이미지가 0~255의 스케일에서 제한된 optimization을 하지만, gradient ascent 방식은 제한없는 optimizaiton 과정을 거친다.

색깔에 대해서는 신경 쓸 필요가 없다.

---------------------------------------------------------------------------------------------------------------------여기까지 NN을 시각화 해보기 위한 시도들을 보았습니다.

먼저 layer에서 쓰인 filter를 시각화 했고, flatten한 4096 차원의 벡터를 Nerest Neighbor로 시각화하고 차원 축소로 군집화까지 했습니다.

feature map도 시각화했습니다.

가중치와 뉴런 값을 이용해서 이미지의 중요한 부분이 어딘지 시각화해봤고,

마지막으로 백지를 넣어서 score의 최댓값으로 synthetic image를 만들어내어 어떻게 학습됐는지도 확인했습니다.

 

이번에는 이전 슬라이드에서 synthetic image를 생성했던 것과는 조금 다른 구글에서 선보였던 시각화 DeepDream을 소개합니다.

 

위에서 synthetic image를 만들 때의 목적은 중요했던 양수의 기울기를 가진 특정 뉴런들을 maximize했었다면, 이번에는 그냥 중간의 layer에서의 모든 뉴런 값들을 확대시키려는 것이죠.

 

  • forward 과정에서 선택했던 layer의 activation 값들을 계산한다.
  • 그 activation 값들을 gradinet 값들로 set한다.
  • backward를 통해 그대로 학습시킨다.
  • 반복하여 이미지를 뽑아낸다.

저도 이게 이해하기 힘들었었는데 아까 synthetic image생성했던 방식과의 큰 차이는

전자는 to maximize a specific neuron

후자는 try to amplify the neuron activations 입니다.

이 차이를 알면 시각화를 봤을 때 좀 더 이해하기 쉬워집니다.

 

이건 중간의 어떤 layer를 선택해서 모든 뉴런 값들을 확대시킨 채로 계속 학습시켜서 이미지를 뽑아낸 것입니다.

 

아까 만든 synthetic image는 a specific neuron에 집중해서 한 카테고리의 학습 능력을 시각화로 보여줬었습니다. (아령이 기억 나시죠?)

이번에는 별의별 그림들이 막 합성된 특이한 그림들이 보입니다.

neuron activations에 집중했기 때문입니다.

특히 개의 형상이 가장 많이 보이는데, 강연자가 말하기를 학습한 이미지넷의 1000개 카테고리중 200개가 dog였기 때문에 개가 많이 보였다고 합니다.

솔직히 왜 백지가 아닌 구름 이미지를 이용하는지 까지는 저도 잘 모르겠습니다... 궁금하네요

 

이번에는 좀 더 낮은 층에서의 시각화를 봅시다.

이번에는 그냥 line이나 edge만 보입니다.

layer는 깊으면 깊을수록 좀 더 학습에 있어서 완성도가 높아집니다.

초기 layer에서는 당연히 일전에도 말했듯 line이나 edge 정도를 파악하는 수준밖에 안되기 때문에 이런 시각화가 뽑힌 것이죠.

신기합니다 ㅋㅋ

 

이건 멀티 스케일 프로세싱으로 오랫동안 학습 시켜서 얻은 crazy image입니다.

이미지 넷이 아니라 MIT에서 다른 데이터 셋으로 학습한 다른 모델입니다.

엄청납니다 ㅋㅋ

 

feature map들로 이미지의 특징들을 통해 이미지를 재구성합니다.

이제껏 우리는 원본 이미지에서 어떻게 Feature를 뽑아내는가에 관심을 가졌었는데, 이것은 Feature에서 원본이미지들을 다시 생성해 보는 것이죠.

그래서 inversion이라는 타이틀이 붙은 것 같습니다.

 

따라서 네트웍 각각의 layer에서 어떤 식으로 이미지가 포착되는지 어떤 식으로 요소가 포착되는지 파악하려는 것이 목적입니다.

 

이미지는 화이트 노이즈로부터 시작한다고합니다.

원리의 핵심은 새로 생성된 feature map의 vector들과 원래 image의 feature vector들 간의 distance값을 최소로 하는 것입니다.

여기서 gradient ascent를 이용하는데 원래는 score를 maximize 했었지만, 여기서는 인접한 feature vector들의 distance값을 최소화하는 방향으로 gradient ascent를 실행한다고 합니다.

 

regularizaiton이 쓰였는데, 이는 상하좌우 인접한 피쳐들의 패널티를 부여하는 역할을 합니다.

생성된 이미지에서 매끄러움을 주는 것이죠.

 

layer가 깊어질수록 정확한 픽셀, color, texture와 같은 정확히 따라가기 어려운 낮은 수준의 정보들은 버리고 전체적인 구조와 같은 좀 더 의미있는 정보들을 남기는 것일 수 있습니다.

 

강의에서도 의미있는 정보들을 남기는 것일 수 있다고 가능성으로 발언을 합니다.

계속해서 이렇게 NN에 관한 black box 현상을 파헤치려는 것이 흥미롭습니다.

 

이번에는 texture synthesis를 봅니다.

texture synthesis는 텍스쳐의 input 패치를 얻고싶은 아이디어였습니다.

슬라이드처럼 저렇게 작은 texture를 오른쪽 처럼 큰 걸 얻고싶었죠.

 

고전적인 방식으로는 Nearest Neighbor가 있었습니다.

픽셀을 line으로 훑어가면서 이미 생성된 주변의 neighbor 픽셀들을 계산해서 그 자리에 입력 텍스쳐 패치에서 한 픽셀을 복사하는 방식이었습니다.

굉장히 단순한 알고리즘입니다.

 

이게 단순한 texture에서는 잘 먹히지만 원하는 텍스쳐가 조금만 복잡해지면 작동이 잘 안됐다고 합니다.

그래서 뉴럴넷으로 이것을 시도해본 것이죠.

 

복잡한 texture같은 경우 단순히 복사하는 것만으로는 어림없겠죠?

 

그렇게하기 위해서는 Gram Matix를 알아야합니다.

  • input data를 뉴럴넷에 입력합니다.
  • 몇몇 layer에서 feature map을 가져옵니다.
  • 이 feature map에서 슬라이드 처럼 서로 다른 특정 픽셀의 특징 벡터를 feature map의 차원으로 추출합니다.
  • 그렇게 뽑아낸 특정 feature 벡터를 서로 외적해서 슬라이드 맨 오른쪽 그림처럼 새로운 matrix를 만듭니다.
  • 이런 과정을 모든 H*W 차원에 대해서 수행해 그 결과들을 평균 내면, C*C 크기의 gram matrix가 완성됩니다.

공간 정보를 가지고 있는 H*W에서 뽑아낸 서로 다른 feature vector들을 외적한 것

즉, gram matrix의 성분들이 co-occurrence를 의미한다고 하며, 공분산과도 비슷한 역할을 한다고합니다.

아마 마지막에 벡터의 곱을 평균을 내기 때문인것 같습니다.

아예 co-variance matrix를 사용하면 좋지만, 연산량이 더 많기 때문에 gram matrix를 이용한다고 합니다.

 

특정 layer에서 뽑은 Neural Texture Synthesis는 레이어가 깊을수록 더 잘 표현됨을 알 수 있습니다.

 

이제 여기서 굉장한 아이디어가 나옵니다.

바로 Neural Texture Synthesis를 artwork에 적용하는 것이었습니다.

그렇게 Neural Style Transfer가 나오게됩니다.

 

슬라이드처럼 Texture Synthesis와 Feature Inversion을 합친 개념입니다.

 

입력 데이터도 2가지입니다.

style image는 gram matrix를 이용하여 texture를 뽑아냅니다.

Content image는 Feature Inversion을 이용하여 네트워크를 거쳐서 나온 Feature map들로 원본 이미지보다는 디테일이 약간 떨어진 image들을 생성해냈었죠. 그것을 이용합니다.

 

loss도 2가지입니다.

style image에서 나온 gram matrix loss와

content image에서 나온 feature reconstruction loss 이 두 개를 최소화하는 방향으로 new image를 만들어내는 것이죠.

이 두 loss를 합해서 최소화하게 됩니다.

 

그래서 output image가 학습이 다끝났을 때에는 아래 슬라이드처럼 content image에서 style image의 texture를 가진 image가 만들어지는 것이죠.

 

 

하이퍼 파라미터는 위에 google의 deep dream보다 많아서 훨씬 자유도가 있는데, output image는 loss를 어느쪽에 더 치중하느냐에 혹은 어떤 style image의 크기에 따라서 결과물이 위처럼 달라지기도 합니다.

 

하지만 Style Transfer는 Content Image와 style Image를 함께 넣어 학습을 진행하는 방식이다보니, Content Image가 바뀔 때마다 다시 학습을 시켜야 하므로 많은 연산을 필요합니다.

가장 큰 문제죠.

 

그래서 나온 알고리즘이 Fast Style Transfer입니다.

아이디어는 원하는 몇몇 style의 image를 학습시켜서 고정시켜놓고, input image를 content image만 넣어서 단일 네트웍을 학습시키는 것입니다.

content image를 feed forward로 train하는 동안에는 style과 content loss들을 똑같이 계산하는데, 이전과 똑같은 weight로 학습이 진행된다고 합니다.

속도만이 항상된 것이죠.

 

이런 segmentation network은 위에서 강의에서 배운것처럼 여러 층으로 transposed convoution을 이용해서 down, up sampling하여 학습시키는 것이죠 

유일한 차이점은 3가지의 채널 RGB image가 나온다는 것이라고 합니다.

 

또 다양한 층에서 Batch normalizaiton은 쓴다고 하는데, 당시 몇몇 논문에서는 instance normalization을 이용하는데 더 효과가 좋은 경향이 있다고합니다.

하지만 단점은 만약 새로운 style로 이미지를 바꾸고 싶다면 다시 오랜시간에 걸쳐서 네트웍을 다시 학습시켜야한다는 것이죠.

 

그런 단점때문에 구글에서는 test time에 다양한 style을 쓸 수 있도록 한 번만 학습하는 단일 네트웍을 개발했다고 합니다. 실시간으로요.

 

이렇게 실시간으로 단일 네트웍을 이용해 여러가지 스타일을 적용할 수 있게 되기까지 합니다.

네트웍을 이렇게 4가지 스타일로 학습시키면 원하는 만큼 조정해서 style을 섞을 수 있게 된거죠.

그렇게 요즘에는 실시간으로 이렇게 이미지의 texture를 바꿔주는 app들이 많이 생겨났다고합니다.

 

스터디가 오늘이 마지막이라 Lecture 12가 마지막이 될 것 같습니다.

 

*강의 자료

cs231n.stanford.edu/2017/syllabus.html

 

Syllabus | CS 231N

Lecture 8 Thursday April 27 Deep Learning Software Caffe, Torch, Theano, TensorFlow, Keras, PyTorch, etc [slides] [video]

cs231n.stanford.edu

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

댓글