Lecture 12 | Visualizing and Understanding

2022. 3. 20. 16:40

Lecture 12 | Visualizing and Understanding

Overview

지금까지는 CNN 아키텍처를 어떻게 설계할 것인가를 배웠다면 오늘은 CNN내부는 어떻게 생겼는 지를 알아볼것이다.

즉, Conv-net은 어떻게 동작할까?, CNN이 도대체 어떤 종류의 것들을 찾고 있는 걸까?

목차

  • Activations: Nearest neighbors, Dimensionality reduction, Maximal patches, Occlusion
  • Gradients: Saliency maps, Class visualization, Fooling images, feature inversion
  • Fun: DeepDream, Style transfer

Visualize filters

우리는 단순히 각각의 레이어에서 사용되는 filter들을 시각화하는 것만으로도 CNN이 어떤 종류의 특징들을 찾고 있는지 힌트를 얻을 수 있다.

First-layer

  • 첫 번째 출력은 이미지와 직접 내적을 하기 때문에 이 필터를 단순히 시각화 시키는 것만으로도 이필터가 무엇을 찾고 있는지 알아낼 수 있다.
  • 가장 많이 보이는 것은 엣지 성분이며 다양한 각도와 위치에서의 보색도 보인다.

Middle-layer

문제점

  • 중간 레이어의 필터들을 이미지와 직접 연결되어 있지 않기 때문에 직접 살펴보는 것만으로는 이해할 만한 정보를 얻기 힘들다.

따라서 우리가 시각화 한것은 두번째 레이어의 결과를 최대화시키는 첫 번째 레이어의 출력 패턴이 무엇인지이다.

Last-layer

Nearest Neighbors

거리가 가까운 이미지들을 시각화 해보는 방법

  • 왼쪽에 보이는 pixel space에서는 pixel의 값으로 nearest neighbor를 하기 때문에 pixel값이 비슷하면 같은 group을 형성하지만 feature spase에서는 pixel값의 영향이 적고 이미지의 feature에 따라 group을 형성하여 분류성능이 더 좋다.

Dimensionality Reduction

차원축소 방법을 이용한 시각화

  • 위 그림은 CNN의 FC-layer를 t-sne로 MNIST를 시각화 한 이미지이다.
  • 여기서 각 군집은 숫자를 의미한다.

Activations

이렇게 중간단계를 시각화 할 수 있는 다른 방법으로 는 Activation map을 시각화해보는 방법이 있다.

  • 이미지에서 대부분 noise이지만 왼쪽의 큰 feature map은 얼굴에 활성화되는 것을 볼 수 있다.

Maximally Activatimg Patches

어떤 이미지가 들어와야 각 뉴런들의 활성화가 최대가 되는지 시각화하는 방법

과정

  • 보고 싶은 layer와 그 layer의 channel를 고른다.
  • 많은 이미지들을 CNN으로 학습한 후 고른 layer의 channel의 활성화 정도를 비교한다.

Occulsion Experiments

입력의 어떤 부분이 분류를 결정짓는 근거가 되는지 확인하는 방법

 

과정

  • 이미지의 일부를 가린 후 가린 부분을 데이터셋의 평균값으로 채운다.
  • 가려진 이미지를 네트워크에 통과시키고 네트워크가 이미지를 예측한 확률을 기록한다.
  • 이 occluded patch를 전체 이미지에 대해 slide하면서 같은 과정을 반복한다.

설명

  • 오른 쪽의 히트맵은 이미지를 가린 patch 위치에 따른 네트워크의 예측확률의 변화를 의미한다.
  • 이 실험에 아이디어는 만약 이미지의 일부를 가렸는데 네트워크의 score변화가 크게 발생한다면 가려진 부분이 분류를 결정짓는데 아주 중요한 부분이 있다는 사실을 짐작할 수 있다.

Gradients

Saliency maps

입력 이미지의 각 픽셀들에 대해서 예측한 class score의 gradients를 계산하는 방법

Untitled

 

Saliency maps: Segmentation without supervision

  • saliency map과 grabcut을 잘 조정하면 이미지 내에서 객체를 segmentation 할 수 있다. 하지만 결과는 그렇게 좋지않다.

Intermediate features via backprop

이번에는 class score가 아닌 중간 뉴런중 하나를 선택하여 입력이미지의 어떤 부분이 내가 선택한 중간 뉴런의 값에 영향을 주느지를 찾는 방법

  • 이미지의 각 픽셀에 대한 class score의 gradient를 계산하는 것이 아니라 입력 이미지의 각 픽셀에 대한 네트워크 중간 뉴런의 gradient를 계산한다. 이를 통해 어떤 픽셀이 해당 뉴런에 영향을 주는지 알 수 있다.
  • 이 방법은 backprop시 ReLU를 통과할 때 조금의 변형을 주어 더 깨끗한 이미지를 만든다.(ReLU의 gradient의 부호가 양수면 그대로 통과시키고 부호가 음수이면 backprop하지 않는 방법)

Gradient Ascent

해당뉴런을 활성화시킬 수 있는 어떤 일반적인 이미지를 찾는방법

  • 네트워크의 가중치들을 전부 고정시킨후 gradient ascent를 통해 뉴런 혹은 class score를 최대화시키는 이미지의 픽셀들을 만들어 낸다.
  • 이방법에는 regularization term이 필요하다.

Regularization term

  • 생성된 이미지가 특정 네트워크의 특성에 완전히 과적합 되는것을 방지한다.
  • 이미지가 특정 뉴런의 값을 최대화시키는 방향으로 생성되게 한다.
  • 이미지가 자연스러워 보이도록 한다.

Gradient Ascent 과정

  • 초기 이미지를 zeros, uniform, noise등으로 초기화 시킨다.
  • 이미지를 네트워크에 통과시키고 관심있는 뉴런의 스코어를 계산한다.
  • 이미지의 각 픽셀에 대한 해당 뉴런 스코어의 gradient를 계산하여 backprop을 수행한다.
  • Gradient ascent를 이용하여 이미지 픽셀 자체를 update한다.

Gradient Ascent 결과

  • 최적화 과정에서 이미지에 주기적으로 가우시안 블러를 적용
  • 주기적으로 값이 작은 픽셀들은 모두 0으로 만든다.
  • gradient가 작은 값들도 모두 0으로 만든다.

설명

  • 일종의 proejcted gradient descent라고 볼 수 있다. 생성된 이미지를 더 좋은 특성을 가진 이미지 집합으로 주기적으로 매핑시키는 방법이다.
  • 이 과정은 최종 스코어에만 적용하는게 아니라 중간 뉴런에도 적용해 볼 수 있다.

Adding multi-faceted visualization

  • 위 아래 이미지 둘 다 식료품점이라고 라벨링 되어있다. 하지만 위 아래 이미지는 확연히 다르다. 따라서 이미지를 생성할 때 이런식으로 multimodality를 명시하게 되면 좋은 결과를 얻을 수 있다.

Fooling Images / Adversarial Examples

앞서 설명한 것처럼 gradient를 이용해서 이미지를 합성하는 방법은 아주 강력하고 이를 이용해서 네트워크를 속이는 이미지를 만들 수 있다.

과정

  • 임의의 이미지와 class를 선택한다.
  • 선택한 class에 최대score를 가지도록 이미지를 수정한다.
  • 이 과정을 반복한다.

결과

Fun

  • 목적: 재미있는 이미지를 만드는 것, 부가저으로 모델이 이미지의 어떤 특징들을 찾고 있는지 짐작

DeepDream

이미지에 gradient를 업데이트하는 방식

과정

  • 입력 이미지를 CNN의 중간 레이어를 어느정도 통과시킨다.
  • 그 후 backprop에서 해당 레이어의 gradient를 activation값으로 설정한다.
  • backprop하여 이미지를 업데이트한다.
  • 이 과정을 반복한다.

설명

  • 전체 동작은 네트워크에 의해 검출된 해당 이미지의 특징들을 증촉시키는 것으로 해석할 수있다.
  • 해당 레이어의 어떤 특징들이 있던지 그 특징들을 gradient로 설정하면 이는 네트워크가 이미지에서 이미 뽑라낸 특징들을 더욱 증폭시키는 하는 것이다. 이는 해당 레이어에서 나온 특징들의 L2 norm을 최대화시키는 것으로 볼 수 있다.

Deepdream tricks

  • gradient를 게산하기 앞서 이미지를 조금씩 움직인다. 원본 이미지를 통과시키는 것보다 2픽셀정도 이동시킨다. 이는 regularizer역할을 하여 자연스럽고 부드러운 이미지를 만든다.
  • 픽셀값을 한 번 클리핑 해준다. 이는 일종의 projected gradient decent인데 실제 이미지가 존재할 수 있는 공간으로 매핑시키는 방법이다.

Deepdream 결과

Feature Inversion

네트워크의 다양한 레이어에서 이미지의 어떤 요소들이 포착하고 있는지를 짐작할 수 있다.

과정

  • 이미지르 통과시킨후 activation map을 저장해둔다.
  • 그리고 이 activation map만을 가지고 이미지를 재구성한다.

설명

  • 해당 레이어의 특정 레이어로부터 이미지를 재구성해보면 이미지의 어떤 정보가 feature vector에서 포함되는지 짐작할 수 있다.
  • regularizer를 추가한 gradient ascent를 이용하고 score를 최대화하는 것 대신 feature vector간의 거리를 최소화 시키는 방법을 이용한다.
  • 이때 Total variation regularizer는 상하좌우 인접한 픽셀간의 차이에 대한 패널티르 부여한다.

Feature Inversion 결과

  • low-level의 layer에서는 이미지의 정보를 엄청 날려저리지 않는 것을 볼 수 있다.
  • high-lever의 layer에서는 이미지의 공간적인 구조는 잘 유지되는 것을 볼 수있지만 디테일(픽셀, 색, 텍스처)가 많이 죽은 것을 볼 수 있다.

Texture Synthesis

Texture Synthesis: Nearest Neighbor

  • 입력 패치에서 가장 가까운 픽셀을 계산하여 입력 패치로 부터 한 픽셀을 복사해 넣는 방식
  • 복잡한 텍스처에서는 잘 작동하지 않는다.

Neural Texture Synthesis: Gram matrix

과정

  • 네트워크의 특정 레이어에서 feature map을 가져온다. 이때 feature map은 HxW 공간정보르 가지고 있고 HxW의 한 점에 있는 C차원 feature vector는 해당 지점에 존재하는 이미지의 특징을 담고 있다.
  • 이 feature map을 가지고 입력 이미지의 descriptor를 계산한다.
    • 이때 descriptor는 다음과 같다.
    • feature map에서 서로 다른 두 개의 특징을 뽑아낸다.
    • 각 feature col vector는 c차원 벡터이며 이 두 벡터를 외적을 계산해서 CxC행렬을 만든다.
    • 이때 CxC행렬은 이미지 내 서로 다른 두 지점에 있는 특징들 간의 co-occurence(동시발생)를 담고 있다. 또한 CxC행렬의 (i, j)번째 요소의 값이 크다는 것은 두 입력 벡터의 i번째, j번째 요소가 모두 크다는 의미이다.
    • 이를 통해 서로 다른 공간에서 동시에 활성화되는 특징이 무엇인지 2차 모멘트를 통해 어느정도 포착해 낼수 있다.
  • 이 과정을 HxW 그리드에서 전부 수행해주고 결과에 대한 평균을 게산해 CxC Gram Matrix를 얻는다.
  • 이 결과를 입력 이미지의 텍스처를 기술하는 텍스처 기술자로 사용한다.

설명

  • Gram Matrix는 이미지의 각 지점에 해당하는 값들을 모두 평균화하기 때문에 공간정보를 모두 날려 버렸다. 그러나 공간정보를 다날려버린 대신에 특징들 간의 co-occurence를 포착해낸다.

Neural Texture Synthesis: 이미지 생성

과정

  • pretrain된 model을 다운로드 받는다.
  • 이미지를 model에 통과시키고 다양한 layer에서 gram matrix를 계산한다.
  • 그리고 생성해야할 이미지를 랜덤으로 초기화하시키고 gradient ascent와 유사한 과정을 거친다.
  • 원본 이미지와 생성된 이미지의 gram matrix간의 차이를 L2 norm을 이용해 Loss를 계산한다.
  • 그리고 loss를 backprop을 통해 생성된 이미지의 픽셀의 gradient를 계산한다.
  • 이 후 geadient ascent를 통해 이미지의 픽셀을 조금씩 업데이트 한다.

Neural Texture Synthesis: 결과

  • low-level layer에서는 색상을 잘 유지하지만 공간적인 구조는 잘 유지하지 못 한다.
  • 레이어가 깊어질수록 이미지의 더 큼지막한 패턴들을 잘 구성한다.

Neural Style Transfer

  • Neural style transfer는 texture synthesis와 feature reconstruction을 합친 방법이다.

  • 최종 이미지는 content image의 feature reconstruction loss도 최소화하고 style image의 gram matrix loss도 최소화하는 방식으로 최적화하며 생성해 낸다.

  • 네트워크에 content / style 이미지를 네트워크에 통과시키고 gram matrix와 feature map을 계산한다. 이때 최종 출력 이미지를 랜덤노이즈로 초기화 시킨다.

Neural Style Transfer: 결과

Neural Style Transfer: 하이퍼파라미터

하이퍼파라미터를 조정할 수 있다.

  • style / content loss간의 가중치를 조절하면 어떤것에 집중해서 만들것인지를 조절할 수 있다.
  • gram matrix를 계산하기 앞서 style image를 resize해서 넣어준다면 style image로부터 재구성된 특징들의 스케일을 마음대로 조절할 수 있다.

Neural Style Transfer: Problem

  • Style transfer는 매우 느리다는 문제가 있다.

Neural Style Transfer: Solution

  • Style image를 고정시킨다.
  • 이 방법은 합성하고자 하는 이미지의 최적화를 전부 수행하는것이 아니라 content image를 입력으로 받아서 결과를 출력 할 수 있느 단일 네트워크를 학습시키는 방법이다.
  • 네트워크의 학습 시에는 content / style loss를 동시에 학습시키고 네트워크의 가중치를 업데이트한다.

Syllabus

Youtube

BELATED ARTICLES

more