호기심 많은 분석가
[BoostCamp] Week7_Day30. CNN Visualization 본문
부스트캠프
개발자의 지속 가능한 성장을 위한 학습 커뮤니티
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라 불리는 이유) → 시각화를 통해서 확인하고자 함
- 시각화를 하는 이유
- What is inside CNNs (black box)?
- Why do they perform so well?
- 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에 저장된 데이터)
- 미리 DB에 저장되어 있던 데이터와 입력된 query(질의) 데이터를 거리에 따라 정렬함
- 돌멩이들이 고차원의 feature vector를 표현하는 것이다
- 미리 학습된 NN을 준비해서 마지막 FC layer에서 특징을 추출
- 이미지를 넣어주면 특징을 추출, 고차원 어딘가에 위치
- DB 데이터의 특징을 모두 미리 저장
- 그 다음 질의 영상을 넣으면 그 특징과 거리가 가까운 data를 return
2-2. Embedding feature analysis 2
- 우리가 익숙한 세상은 3차원이다. 그래서 고차원 분포들은 확인하기가 힘들다 → 저차원(3, 4차원)으로 차원 축소해서 시각화하자
- t-SNE (t-distributed stochastiv neighbor embedding
- MNIST 데이터에 사용한 것
- 3, 5, 8은 조금 맞닿아있다. 겹치는 부분은 헷갈릴 수 있음 → 비슷한 특징을 보인다는 뜻
- 실제로도 3과 5와 8은 비슷하게 생겼음
- Layer activation - Behaviors of mid - to high-level hidden units
- AlexNet 138번째 채널의 activation을 적당한 값으로 thresh holding을 하고 mask를 만들어서 영상에 overlay를 하니까 얼굴이 바뀌는 영상을 얻을 수 있었음
- 얼굴을 찾는 hidden node였다는 것
- AlexNet 138번째 채널의 activation을 적당한 값으로 thresh holding을 하고 mask를 만들어서 영상에 overlay를 하니까 얼굴이 바뀌는 영상을 얻을 수 있었음
- Maximally activating patches - Example
- hidden node에서 한 채널을 가져왔을 떄 가장 큰 값을 가지고 있는 위치 근방의 patch를 뜯음
Maximally activating patches - Patch acquisition
- Pick a channel in a certain layer
- Feed a chunk of images and record each activation map(of the chosen channel)
- 이미지를 넣고 각각의 activation map을 저장함
- 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을 추가하게 된다!
- 시행 방법 순서
- Get a prediction score (of the target class) of a dummy image (blank or random initial)
임의의 영상으로 분석하고자하는 CNN에 입력해준다 → 관심 class score를 추출 - Backpropagate the gradient maximizing the target class score w.r.t the input image
역전파를 통해 입력이 어떻게 변해야 target class score가 높아지는지를 찾는다. (gradient를 더해주는 것, loss를 측정할 때 score값에 -를 붙여서 내려가는 방향으로 만들고 gradient를 측정해주면 이전에 사용하던 gradient descent 방식이랑 동일함) - 그리고 그 방향으로 input image를 update 해줌(빈 이미지에서 아래의 사진처럼 update)
- 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
- A tensor y is a computed result, so it contains the grad_fn attribute
- 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
'Coding > BoostCamp' 카테고리의 다른 글
[BoostCamp] Week7_Day32. Conditional Generative Model (0) | 2021.09.28 |
---|---|
[BoostCamp] Week7_Day31. Instance/Panoptic Segmentation (0) | 2021.09.27 |
[BoostCamp] Week6_Day29. 새로운 멘토님 (0) | 2021.09.21 |
[BoostCamp] Week6_Day28. 팀원 찾기 (0) | 2021.09.21 |
[BoostCamp] Week6_Day27. Image Classification (0) | 2021.09.19 |