CS231n 12강. Visualizing and Understanding
Stanfoard CS231n 2017 12강을 요약한 글입니다.
Question
- What’s really going on inside convolutional networks?
- How did they do the things that they do?
- What kinds of features are they looking for?
- What are all these other layers in the middle doing?
- What are the intermediate features looking for?
- How ConvNets are working?
- What types of things in the image they are looking for?
- ConvNet 안에있는 레이어에서 어떤 일이 일어나고 있을까?
- 블랙박스라고 불리는 딥러닝 모델을 사람이 조금 더 해석할 수 있도록 도와주는 시각화 방법들에 대해 배웁니다
First Layer : Visualize Filters
- Filter로 구성됩니다. AlexNet은 여러개의 Convolution Filter가 존재합니다
- Get slide input image -> inner product
- Weight of filter and the pixel of the image
- Weight of filter를 시각화
- oriented edges를 볼 수 있음(light bar and dark bar)
- 다양한 각도에서 다양한 모습, 반대 색상 등
- 강의 초반부에 말했듯, 사람의 뇌는 oriented edges를 찾음
Intermediate layer
- 생각보다 흥미롭지 않음. 해석하기 힘듬
- Input 이미지와 직접적으로 연결되어 있지 않음
- 그러나 두번째 레이어는 첫번째 레이어와 연결되어 있기 때문에 첫번째 이후의 Activation 패턴을 알 수 있음. 그러나 해석이 힘들기 때문에 다른 방법을 찾아야 합니다
Last Layer
- AlexNet의 경우 4096차원의 feature vector
- ConvNet의 마지막 layer는 어떤 일을 하고 있을까?
- 알아보기 위해 많은 이미지를 네트워크에 돌려보고 마지막 레이어를 시각화
- 단순히 생각하면 Nearest Neighbors를 떠올릴 수 있음
- 2강에서 배운 것처럼 test image와 pixel space에서 이웃인 것을 찾습니다(좌측)
- ConvNet는 Semantic content가 유사하게 나옵니다. feature space에서 이웃인 것을 찾습니다
- 코끼리의 좌측면이 Test image였는데 우측면이 이웃으로 나온 것은 pixel 관점에선 매우 다르지만 feature 관점에선 유사합니다!
- 차원 축소의 효과도 있습니다
- 4096 차원을 2 차원으로 압축
- PCA, t-SNE도 같은 효과
- t-SNE
- natural clustering
- karpathy의 CNN 코드 참고
- 김홍배님 Slideshare 참고
Visualizing Activation
- 중간 레이어를 가중치를 시각화하는 것은 해석하기 힘들었지만, Activation을 시각화하는 것은 어떤 경우 해석 가능합니다
- 데이터를 네트워크에 넣고 어떤 이미지에서 특정 뉴런이 최대 활성화를 가지는지 봅니다. 그러면 입력 이미지와 연결된 영역을 볼 수 있습니다
- 왼쪽 아래 사진은 사람의 얼굴 feature로 보임
- 요약
- Feature Map은 계층적인 응답을 보여줍니다. 예를 들어 눈 2개 + 혀 + 코 + 귀 => 개 얼굴
- 각각의 Feature Map은 강하게 그룹화합니다
- 높은 layer(layer 5)에서 변화가 큽니다
- 이미지 내에서 다양한 위치의 영상을 선택할 수 있습니다
Maximally Activating Patches
- Visualizing intermediate feature의 다른 방법
- Input image의 특정 patch를 시각화
- conv5는 \(128 \times 13 \times 13\), 17번 채널(총 128 중)을 선택
- 네트워크에 이미지를 많이 돌린 후, 선택된 채널의 value를 기록
- 그 후, 최대 activation에 해당하는 이미지 패치를 시각화합니다
Occlusion Experiments
- Occlusion : 폐쇄
- input 이미지의 어떤 부분이 classification에 영향을 많이 미치는지 찾아보는 방법
- cnn에 넣기 전에, 이미지의 일부를 마스크하고 마스크 위치에서 확률의 히트맵(heatmap of probability)를 그립니다
- 이 실험은 이미지의 특정 부분을 block하면 network score가 극단적으로 변할것이고, 그러면 특정 부분은 classification decision에 매우 중요할 것이라는 아이디어에서 나왔습니다
- 빨간 색은 low probability고 하얀색/노란색은 high probability입니다. go-kart 부분을 block out하면 go-kart class 확률은 꽤 내려갈 것입니다
- 이 작업의 목적은 성능을 향상시키는 것이 아니라 사람이 조금 더 잘 이해할 수 있도록 돕는 것입니다
Saliency Maps
- saliency : 중요한
- 이미지 픽셀에 대해 class score의 gradient를 계산하고, 절대값을 취하기 + RGB 채널을 최대로 취하는 방식(이미지를 흔든다고 표현했음)
- Input에서 어떤 이미지가 classification에 중요한지 파악하는 방법!(Occlusion Experiments처럼)
- Semantic Segmentation을 수행하기 위해 해당 작업을 하기도 함
- 이미지 내의 Object를 추출할 수 있어서 정말 좋음! 그러나 다루기 어렵고 효과를 보려면 엄청 많은 접근을 해야합니다. 따라서 이게 실용적인진 모르겠음
- 그러나 supervision과 함께 훈련된 것보다 훨씬 효과적일듯!
- fixed input image
- 위키피디아 참고
Intermediate Features via (guided) backprop
- 이해가 잘 안됨..
- DeConv를 이용해 뉴런의 Gradient를 시각화하는 과정에서 사용하는 Back Propagation의 일종
- 일반적인 Back Propagation과 달리 Positive influence만 반영해 관심있는 뉴런의 Gradient를 선명하게 시각화 가능
- 이미지의 어떤 부분이 최고로 영향을 미치는지 확인할 수 있는 방법
- fixed input image
- Grad-CAM: 대선주자 얼굴 위치 추적기 참고
Gradient Ascent
- 참고 자료 : Grad Cam을 이용한 딥러닝 모형 해석, 엄태웅님 글
- 일부 Input image에서 의존성을 제거합니다
- Gradient Ascent를 실행해 이미지를 합성
- Weight는 고정한 후, Input image의 픽셀을 변경
- “하늘”이라는 초기 이미지를 주고 “새”의 속성을 갖도록 gradient ascent로 점점 변형 => 딥드림, 딥러닝 아트의 원리
- Regularization Term
- 특정 뉴런의 값을 Maximize
- 그러나 자연스러운 이미지로 보이기
- gradient ascent를 이미지 자체의 픽셀에 적용
- Simple Regularizer : 생성된 이미지의 L2 norm을 penalize
- 이미지를 생성하기 시작
- 가우시안 블러 이미지를 추가하고, 작은 value를 가진 픽셀을 0으로 바꾸고, 작은 그라디언트를 가지는 픽셀을 0으로 바꿈
- 위 결과로 조금 더 나은 시각화를 보여주고 있습니다
- Pixel space 대신 FC6 latent space를 최적화
- 궁금하면 논문을 꼭 읽어볼 것
- 해당 강의에서 깊게 들어가진 않겠음
Fooling Images / Adversarial Examples
- 이미지를 속이는 것!
- 임의의 이미지를 선택한 후, 다른 이미지의 점수를 최대화
- 코끼리의 사진에 코알라의 점수를 최대화
- 네트워크는 코끼리 사진을 코알라로 분류합니다
- (1) Start from an arbitrary image
- (2) Pick an arbitrary class
- (3) Modify the image to maximize the class
- (4) Repeat until network is fooled
- 위와 같은 행동이 어떻게 가능한지는 이안 굿펠로우의 강의를 통해서 알아볼 예정입니다
DeepDream : Amplify existing features
- 참고 자료 : 텐서플로우를 이용해서 딥드림(DeepDream) 알고리즘 구현해보기
- amplify : 증폭시키다
- image와 layer를 선택한 후, 아래 작업을 반복
- Forward
- 선택된 레이어에서 Activation 값과 같은 Gradient를 설정
- Backward
- Update Image
- 한마디로 하면 Neural Networks의 Feature를 시각화하고 이를 Input 이미지와 결합해 환각적인 이미지를 만들어내는 알고리즘
- 하나의 뉴런이 아니라 레이어로 확장
- 코드에서 사용한 몇가지 트릭
- Jitter : 이미지를 두 픽셀씩 옮김
- L1 Normalize
- Clip pixel values
Feature Inversion
- 이미지에 대한 feature vector가 주어지면, 다음과 같은 이미지를 찾습니다
- 주어진 feature vector와 일치한 이미지
- 자연스러운 이미지
- relu2_2가 완벽히 재현되어 있는 것을 보면, 해당 레이어는 버리면 안된다는 뜻입니다
- relu5_3의 시각화는 이미지의 공간 구조는 유지한 채, 점점 색상 및 질감이 달라지고 있습니다
- 네트워크가 깊어지며 점점 Feature를 잃어버립니다
Texture Synthesis
- 어떤 texture의 샘플 patch가 주어졌을 때, 같은 texture의 더 큰 이미지를 생성할 수 있을까요?
- 컴퓨터 그래픽에서 오래된 문제
- 동일한 texture를 가지는 두 이미지가 있다면, 두 이미지의 spatial statistics는 같다는 가정에서 진행
- 현재 픽셀 주변의 이웃을 계산한 후, 입력 이미지에서 한 픽셀을 복사
- 고전적인 알고리즘도 많이 있다는 것을 알려주고 싶었음. 자세히 몰라도 됨
Neural Texture Synthesis
Neural Style Transfer
- [코드]
- 문제점 : many forward / backward가 필요해서 매우 느림
- 해결책 : 다른 neural network를 사용 => Fast Style Transfer
Fast Style Transfer
- [코드]
Summary
Reference
카일스쿨 유튜브 채널을 만들었습니다. 데이터 사이언스, 성장, 리더십, BigQuery 등을 이야기할 예정이니, 관심 있으시면 구독 부탁드립니다 :)
PM을 위한 데이터 리터러시 강의를 만들었습니다. 문제 정의, 지표, 실험 설계, 문화 만들기, 로그 설계, 회고 등을 담은 강의입니다
이 글이 도움이 되셨거나 다양한 의견이 있다면 댓글 부탁드립니다 :)