[Boostcamp AI Tech] [U-stage] 7주차 Day 1 학습 기록

bluegun·2021년 9월 13일
0

AI Tech 2기 활동

목록 보기
29/87

학습 내용

CNN Visualization

  • CNN은 blackbox system이다 : 학습을 통해 사람이 표현하기 힘든 복잡한 구조를 가진다.

  • CNN Visualization을 통해 CNN에 대한 다양한 정보를 알 수 있다.

    • 어떤 식으로 동작하는지
    • 어떤 식으로 개선하면 좋을지
  • ZFnet : CNN visualization을 통해, CNN의 feature 추출 방식을 알 수 있었다.

    • 저층에선 Low-level feature(간단한 선)을 추출
    • 고층에선 High-level feature(복잡한 얼굴 등)을 추출
  • 일반적으로 Visualization은 첫 번째 layer에 대해 수행한다.

    • 고차원으로 갈수록 channel 수가 높아 사람이 직관적으로 알아볼 수 있는 형태가 아니다.
    • 저층의 filter가 합성되어 더 추상적인 특징을 나타내는 filter가 되므로, 단독으로 판단하기 힘들다.
  • 일반적으로 Visualization은 Model의 feature extraction 과정을 분석하거나, Data를 분석한다.


Analysis of model behavior

  • Nearest neighbor(NN) in a feature space

    • High level에서 나온 feature를 분석하는 방법
    • DB 내에 예제 데이터셋을 미리 저장해두고, query image(High level에서 나온 feature)를 넣었을 때 나온 유사한 이미지들을 보고 모델이 이미지를 제대로 이해하는지 확인
    • 구체적으로, 여러 예제 이미지를 모델에 넣어 나온 feature를 DB에 저장하고, query image를 모델에 넣어 나온 feature를 DB의 이미지와 비교한다.
  • 차원 축소(Dimensionality reduction)

    • 고차원의 정보를 저차원으로 축소시켜, 사람이 이해할 수 있는 형태로 만든다.
    • t-SNE
  • Layer activation

    • Mid layer에서 High layer 사이의 hidden unit 분석
    • Mid-high 사이의 feature : 전체적이진 않은, 약간의 국소적인 특징(눈, 코, 입, 얼굴, ...)
    • 사람 얼굴이 어딨는지, 난간이 있는지 어땠는지 등 적당한 크기의 feature 분석(channel이 어떤 feature를 찾는 지 확인)
  • Activating patches

    • between mid-high
    • Hidden node들의 patch를 그려, 각각 어떤 feature를 찾는 지 확인
  • Class visualization

    • 예제 데이터 없이 model의 class 별 최종 score를 보고 학습 상태를 분석
    • gradient ascent를 통해 CNN model f와 이미지 I에 대해, f(I)를 최대화
    • dummy image를 넣어 각 class별 score를 구하고, back propagation을 통해 score를 maximize하는 방향으로 image를 update하고, 이 과정을 다시 update된 image로 반복한다.
    • 여러 번 반복하여 나온 여러 image를 통해 각 class가 어떤 feature를 주로 보는 지 확인 가능하다.

Model decision explanation

  • Saliency test

    • Occlusion map

      • Image에 Occlusion map을 넣어, 특정 부분을 가리고 image의 원래 class일 확률을 구한다. 이 확률이 score가 된다.
      • score가 높으면 중요하지 않은 부분, score가 낮으면 중요한 부분이다.
    • Backpropagation

      • 특정 이미지를 classification하고 난 후, backpropagation을 했을 때 gradient의 변화를 heatmap등으로 표현한다.
      • gradient가 많이 바뀌는 부분이 score에 영향을 많이 미치는 부분 -> gradient를 보통 square해서 표현한다.(부호를 없앰.)
      • input이 random image가 아닌, 현재 데이터를 넣어야 한다(Data에 dependent)
  • Backpropagation-based saliency

    • Rectified unit(backward pass)

      • ReLU activation을 사용하면, Forward pass 과정에서 음수인 weight는 전부 0으로 바뀐다.
      • 어느 위치가 0으로 바뀌는 지 저장해뒀다가, backpropagation 할 때 masking point들의 위치를 0으로 바꾼다(gradient가 양수인지 음수인지는 상관없다.)
      • 근데, deconvolution에서는, backward될 때 gradient의 양수, 음수를 따져 음수인 부분을 0으로 masking한다.(backward할 때 ReLU를 적용하는 느낌)
      • 수학적으로 의미가 있는 것은 아니다.
      • 이렇게 했더니 Backpropagation에 비해 Deconv나 guided backprop을 썼을 때 더 깔끔한 saliency map이 구해진다.
    • Guided backpropagation

      • 위에서 언급한 deconvolution 부분(backward 과정에서 음수인 부분을 0으로 치환)과 backpropagation을 합쳐, 해당하는 부분을 전부 0으로 바꾼다.
      • 효과적인 saliency map 생성
    • Class activation mapping(CAM)

      • 가장 많이 사용되는 visualization 방법
      • CNN을 통과해 나온 feature를 바로 fc layer에 통과시키지 않고, global average pooling을 진행한다.
      • 이 후 fc layer를 한 개만 통과시켜 classification을 하도록 한다.
      • 위의 구조를 갖는 architecture를 다시 학습한다.
      • 이 후 아래와 같은 수식을 통해 CAM을 구한다.
      • CAM을 visualizing 해보면, 어느 부분을 참조했는 지 heatmap 형태로 표현된다.
      • 다른 방법에 비해 압도적으로 좋은 성능, 유용, 다른 공간 정보를 주지 않아도 된다.
      • 마지막 layer가 fc layer로 이루어져야 한다는 단점이 있다.
      • 원래 fc layer가 없는 구조에 fc layer을 넣음으로서 성능이 바뀐다는 단점도 있다. 다만 googLeNet이나 ResNet 등에선 유용하게 사용 가능
    • Grad-CAM

      • 구조 변경 없이, 재학습 없이 학습된 network에서 CAM을 뽑을 수 있는 방법
      • Backbone이 CNN이기만 하면 사용 가능
      • softmax input (소프트맥스 인풋 : classification 되기 직전 상태인, CNN을 통과해 나온 최종 feature)에 대해 대상 conv layer의 각 weight에 대한 gradient를 구하고, 이들을 전부 global average pooling한다.
      • 모든 channel에 대해 pooling 결과와 해당 feature map(activation map)을 곱하고, ReLU를 취해준다.
    • Guided Grad-CAM

      • Grad-CAM의 대략적인 정보와 Guided backprop의 class의 sharp한 구조를 모두 활용해, 둘을 곱하여 구한다.
    • SCOUTER

      • 더 세부적인 구분점을 확인할 수 있는 최신 기술..?
      • image에 대해 왜 해당 class인지, 왜 해당 class가 아닌지를 visualizing해 보여준다.

Autograd

  • Saliency map을 구하기 위해 Input domain의 gradient를 구해야 한다

  • Autograd : forward, backward pass를 가능하게 만들어주는 API

  • y.backward(gradient)

    • y는 requires_grad=True여야 한다.
    • gradient : y의 backward 결과에 곱하는 값
    • 같은 backward를 두 번 호출하면 두번째 호출에 error
      • 중간 결과를 모두 저장하면 heavy하기에 default로 막아둠
      • 미분을 여러번 적용하고 싶을 땐, y.backward(..., retain_graph=True) 를 사용해 backward 여러 번 적용할 수 있고, 이는 graph를 accumulate하는 효과
  • grad_fn

    • grad_fn을 기반으로 각 연산의 backward가 어떤 식으로 진행되어야 하는지를 알 수 있다.
  • hook

    • hooking을 통해 forward, backward 중간 과정을 catch할 수 있다.
    • hook 함수를 prototype 형태에 맞게 선언하고, layer에 원하는 방식으로 register하면, 해당 방식(forward or backward)이 진행될 때 자동으로 호출된다.
    • 필요없어지면 remove를 통해 지운다.

0개의 댓글