호기심 많은 분석가

[BoostCamp] Week7_Day30. CNN Visualization 본문

Coding/BoostCamp

[BoostCamp] Week7_Day30. CNN Visualization

DA Hun 2021. 9. 27. 22:44
 

부스트캠프

개발자의 지속 가능한 성장을 위한 학습 커뮤니티

boostcamp.connect.or.kr

📙개인학습

1. Visualizing CNN

1-1. What is CNN visualization?

CNN is a black box

  • 우리가 배운 CNN 기반의 NN는 단순히 학습 가능한 convolution과 non-linear activation function들의 연산기이다. → 인간의 성능을 뛰어넘기도 함
  • 그런데 가끔 성능이 안나올 때가 있다. 기계가 이러면 뜯어서 확인해볼 텐데 CNN은 워낙 복잡한 구조로 얽혀있어서 그것이 어려움(Black box라 불리는 이유) → 시각화를 통해서 확인하고자 함

  • 시각화를 하는 이유
    1. What is inside CNNs (black box)?
    2. Why do they perform so well?
    3. How would they be improved

Visualization tools as debugging tools

  • 낮은 계층에는 방향선이 있는 선이나 원을 찾는 영상처리 필터 역할
  • 높은 계층으로 갈수록 high level, 의미가 있는 feature를 학습함
    • 시각화를 통해 관찰하면서 tuning한 덕에 ImageNet Challenge에서 우승을 차지함

1-2. Vanilla example: filter visualization

  • Low level : color edge detector, block detector, 각도 detector
    • 뒤쪽 layer에서는 더 높은 차원이기 때문에 해석하기가 어려움

1-3. How to visualize neural network

  • 모델 자체의 특성을 분석하는 방법과 모델이 어떤 결론을 내었을 때 어째서 그런 결론을 내었는지 분석하는 방법론으로 구별함

2. Analysis of model behaviors

2-1. Embedding feature analysis 1

  • Nearest neighbors (NN) in a feature space - Example
    • 미리 DB에 저장되어 있던 데이터와 입력된 query(질의) 데이터를 거리에 따라 정렬함
      • 왼쪽 input(query data) - 오른쪽 output(DB에 저장된 데이터)
  • 돌멩이들이 고차원의 feature vector를 표현하는 것이다

  • 미리 학습된 NN을 준비해서 마지막 FC layer에서 특징을 추출
    • 이미지를 넣어주면 특징을 추출, 고차원 어딘가에 위치
    • DB 데이터의 특징을 모두 미리 저장
    • 그 다음 질의 영상을 넣으면 그 특징과 거리가 가까운 data를 return

2-2. Embedding feature analysis 2

  • 우리가 익숙한 세상은 3차원이다. 그래서 고차원 분포들은 확인하기가 힘들다 → 저차원(3, 4차원)으로 차원 축소해서 시각화하자
  1. t-SNE (t-distributed stochastiv neighbor embedding
    • MNIST 데이터에 사용한 것
    • 3, 5, 8은 조금 맞닿아있다. 겹치는 부분은 헷갈릴 수 있음 → 비슷한 특징을 보인다는 뜻
      • 실제로도 3과 5와 8은 비슷하게 생겼음

  1. Layer activation - Behaviors of mid - to high-level hidden units
    • AlexNet 138번째 채널의 activation을 적당한 값으로 thresh holding을 하고 mask를 만들어서 영상에 overlay를 하니까 얼굴이 바뀌는 영상을 얻을 수 있었음
      • 얼굴을 찾는 hidden node였다는 것
  2. Maximally activating patches - Example
    • hidden node에서 한 채널을 가져왔을 떄 가장 큰 값을 가지고 있는 위치 근방의 patch를 뜯음

Maximally activating patches - Patch acquisition

  1. Pick a channel in a certain layer
  2. Feed a chunk of images and record each activation map(of the chosen channel)
    • 이미지를 넣고 각각의 activation map을 저장함
  3. Crop image patches around maximum activation values
    • activation map의 가장 큰 값을 고르고 그것의 receptiva field를 계산하여 patch를 뜯어옴

2-3. Embedding feature analysis 3

  • Class visualization - Gradient asc

지금까지는 activation을 분석하기 위해 데이터를 사용했지만, 이제부터는 예제 데이터를 사용하지 않고, 네트워크가 내재하고 있는 이미지를 분석하는 방법. 각 클래스를 판별할 때 이 네트워크는 어떤 모습을 상상하고 있는지 볼 수 있다.

  • 이 방법은 간단한 연산으로는 구현 불가능, 최적화를(Gradient Descent) 통해서 합성 영상을 찾아나감
    • 학습할 때 Backpropagation 알고리즘을 통해서 Gradient Descent로 목적함수인 loss들을 최소화하는 과정을 거침
  • 비슷하게 로스를 최적화시켜주는 과정을 거치는데 2개의 로스가 있음
    • I = 영상 입력, f = CNN 모델, argmaxf(I):는 CNN model f를 지나서 출력된 하나의 score
    • score를 높이는 영상 애들만 사용하게 되면, 더이상 영상이 아닌 애들도 찾을 수 있음. 그래서 우리가 이해할 수 있는 간단한 loss인 regularization term을 추가하게 된다!
  • 시행 방법 순서
  1. Get a prediction score (of the target class) of a dummy image (blank or random initial)
    임의의 영상으로 분석하고자하는 CNN에 입력해준다 → 관심 class score를 추출
  2. Backpropagate the gradient maximizing the target class score w.r.t the input image
    역전파를 통해 입력이 어떻게 변해야 target class score가 높아지는지를 찾는다. (gradient를 더해주는 것, loss를 측정할 때 score값에 -를 붙여서 내려가는 방향으로 만들고 gradient를 측정해주면 이전에 사용하던 gradient descent 방식이랑 동일함)
  3. 그리고 그 방향으로 input image를 update 해줌(빈 이미지에서 아래의 사진처럼 update)
  4. 23번을 반복한다

  • 초기값을 어떻게 설정하든 문제가 없으나 설정값에 따라 update되는 것이기 때문에 결과가 조금씩 달라질 수 있음

3. Model decision explanation

모델이 특정 입력을 보았을 때 이것을 어떤 각도로 바라보고 있는지

3-1. Saliency test1

영상이 주어졌을 때 이것이 제대로 판정되기 위한 각 영역의 중요도를 추출하는 방법

  • Occlusion map
    • A와 B라는 큰 Patch로 가려주었을 때 Elephant라고 대답을 할 확률
    • 이 Patch를 모든 곳에다가 적용을 한 후 그 heatmap을 만들면 그 중요도가 확인 가능하다
    • 개인적으로 굉장히 재밌는 개념이라고 생각이 든다

  • via Backpropagation - Example
    • 특정 이미지를 classification 해보고 어떤 부분이 그 클래스라고 판단하는 데 결정적인 영향을 미쳤는지를 heatmap으로 표현
    • 관심 분포의 영역이 밝은 색으로 표현되는 것을 확인 가능
  • 구현 순서
    • 입력 영상을 넣어주고 하나의 클래스 스코어를 얻는다
    • 역전파를 입력 도메인까지 해주고 얻은 gradient를 절댓값을 취해서 크기를 구해줌
      • 그레디언트의 크기 자체가 스코어를 의미하므로
    • 그 크기를 시각화해줌 (반복하여 누적한 후 사용할 수도 있음)

3-2. Backpropagation-based saliency

일반적으로 CNN에서는 ReLU를 사용하는데, Forward pass에서 음수가 나온 부분을 0으로 바꿔준다. 이 위치들을 기억해뒀다가, backpropagation이 올 때 같은 위치면서 음수가 되는 부분을 0으로 바꿔줌, 무조건 음수라고 0으로 만들진 않음

  • 자일러는 그냥 backward 연산 시에 음수인 파트들을 0으로 바꿔줌

  • 이것을 forward 때도 backward 때도 사용하면 효과가 더 좋음
    • 수학적인 의미보다는 결과론적으로 좋았다.
  • 왜 이렇게 하는가? 이렇게 고양이를 꽤 잘 특정해내더라!

3-3. Class activation mapping

CAM, 유명하고 가장 많이 사용되는 Visualization 알고리즘

  • 어떤 부분을 참고해서 어떤 결과가 나왔는지 부드러운 히트맵으로 표현해줌
  • NN의 일부를 개조해서 만듦 → Global average pooling을 해준 뒤 FC layer를 1개만 통과시킴
  • 그 후 그 개조된 network에 CAM을 훈련시킴

  • 구현 수식
    • 하나의 class Score는 마지막 FC layer의 class에 대한 weight와 Feature로 linear combination
    • 이것은 각각의 pixel에 각 채널마다 평균을 취한 것
    • 그 수식이 linear 함으로 교환법 칠을 사용하면 마지막 수식이 도출됨
    • CAM은 Global average pooling을 취하기 전이므로 공간에 대한 정보가 남아있다.
      • 그것을 영상처럼 visualization 해주면 위와 같이 결과가 나온다.
    • 하지만 구조를 수정해야 하고 재학습해야 한다는 단점이 있음

3-4. Grad-CAM

위에 언급한 단점을 해결한 알고리즘, 성능도 꽤 나온다

  • 꼭 영상 인식 Task에 국한될 필요도 없다. Backbone이 CNN이기만 하면 됨
  • 캠의 weighted sum을 해주는 weight를 어떻게 구해주느냐가 핵심


(06-2강) AutoGrad

  • Saliency test again

1. Get a class score of the target source image

2. Backpropagate the gradient of the class score w.r.t input domain

  • 그러면 gradient를 어떻게 구할 것인가?
  • Autograd
    • Automatic gradient calculating API
    • Automatic differentiation is a building block of every DL library (forward & backward passes)
    • 딥러닝 라이브러리들의 고유한 기능, 행렬 연산하는 라이브러리인데 기존 것들과 뭐가 다르냐? Autograd가 존재
    • 아래와 같이 계산하면서 기억을 해둬서 backpropagation 때도 연산이 용이하게 해 줌
  • Tutorial
  • y.backward를 진행해주면 왜 x.grad가 왜 1이 아닌 300, 0.3이 나오는 걸까
    • loss에 대해 y를 미분해주면 y에 대한 x 미분도 곱해져서 3이 나옴 → 그것에 tensor를 곱해서 300, 0.3이 나오게 되는 것

  • backward를 여러 번 취해줄 경우 오류가 발생한다. 왜?
    • backward의 경우 중간 기록을 계속 남기면 메모리를 많이 잡아먹기 때문에 그것을 없애줌
    • 우리는 중간 결과도 필요하므로 retain_graph=True를 설정하여주면 에러가 발생하지 않고 gradient가 중첩되어 쌓이는 것을 확인할 수 있음, 그래서 우리는 zero_grad를 해주곤 함

  • Tutorial (grad_fn)
    • A tensor y is a computed result, so it contains the grad_fn attribute
      • Referencing Function (class) that is called to construct
  • Tutorial (hook: register_forward_hook)
    • 중간에 있는 function을 call 하기 위한 함수
    • remove, 더 이상 hook을 사용하지 않을 경우 remove를 통해 지워줄 수도 있음

🌱 피어세션

Q1) Gradient Ascent에서 중간 layer의 값을 업데이트하는지?

layer의 가중치를 업데이트를 하지 않고 input 이미지의 값만 업데이트한다.

 

Q2) regularization term의 의미?

픽셀 값이 0~255 나 0~1 값을 넘어가지 못하도록 clapping 하는 역할을 한다.

 

Q3) occlusion 방법으로 heatmap을 그렸을 때 heatmap의 크기가 마스크의 크기에 따라 달라지나?

slide window 방식으로 누적합을 구하는 방식이라 마스크의 크기에 따라 heatmap의 크기가 달라지지 않을 것이다.

 

 

[AI Tech]Daily Report

Naver AI Tech BoostCamp 2기 캠퍼 허정훈 2021.08.03 - 2021.12.27 https://bit.ly/3zvJnSh

data-hun.notion.site