본문 바로가기
CVLab/cs231n (2016)

cs231n - lecture09(CNN의 시각화 및 이해)

by kkkkk1023 2024. 10. 6.

[CNN의 시각화]

 

 

 

Visualize patches that maximally activate neurons

: 어떤 뉴런이 어떤 특징을 학습했는지?를 시각화

 

 

 

위 이미지를 보면 빨간색 뉴런은 사람을 위주로 학습을 했고, 파란색 뉴런은 점을 기준으로 학습을 했고, 초록색은 빨간색을 기준으로 학습을 했다는 것을 시각적으로 알 수 있다.

 


Visualizing Filters and Kernels 

: 어떤 필터가 이미지의 어떤 특징을 추출하는지?를 시각화

 

첫번 째 Conv Layer를 시각화 한것이다. Conv2, Conv3부터는 이미지에 대한 것이 아니라 이전 Layer에 대한 값이기 때문에 해석에 용이하지 않다.

 

 

Visualizing Representation Space 

CNN이 이미지의 특징을 숫자로 표현한 후, 이 숫자들이 어떻게 서로 관련되어 있는지를 시각화

 

 

 

t-SNE

 

 

고차원 데이터를 2D나 3D로 줄여서 비슷한 것들은 가깝게, 다른 것들은 멀리 떨어지게 시각적으로 보여주는 방법이다. 

 

 

 

실제 ImageNat에 있는 1000개의 클래스를 t-SNE으로 해보면 위의 사진과 같이 비슷한 이미지들끼리 묶이는 것을 볼 수 있다.

 

 

 

Occlusion Experiments

: 이미지에서 특정 부분이 가려질 때 CNN이 어떻게 반응하는지 분석

 

 

 

임의로 특정한 부분을 가려 CNN이 이미지를 분석할 때 어떤 영향을 끼치는지 확인해보는 실험이었다.

 

위 사진에서 왼쪽은 입력 이미지이고 오른쪽은 어떤 부분을 가렸을 때 CNN의 이미지 분석능력에 영향을 끼치는지를 시각화한 것이다.

파란색 부분을 가릴수록 이미지 분류 성능이 저하되었다는 결과를 알 수 있다.

 

마지막 아프간 하운드(강아지)를 분류할 때 사람의 얼굴을 가렸을 때 빨간색이 나오는 것을 알 수 있다. 즉, 사람의 얼굴을 가리면 사람이라는 방해요소를 제외하고 분류를 할 수 있기 때문에 성능이 향상되었다고 할 수 있다.

 


 

https://youtu.be/AgkfIQ4IGaM?feature=shared

 

 

 

사람의 얼굴만 보이다가 흰 종이가 나오자마자 활성화되는 뉴런이 바뀌는 것을 알 수 있다. 해당 뉴런은 밝은 곳에서 어두운 곳 가는 엣지를 포착하는데에 활성화되는 뉴런이라는 것을 알 수 있다. 

 

이렇게 CNN에 특정한 입력이 들어왔을 때, 뉴런들이 어떻게 활성화(반응)하는지를 시각적으로 보여줄 수 있다.

 

아래의 내용을 시각화하는 방식에 대해서 다룬다.

 

 

[Visualizing Activations]

: 뉴런들이 어떻게 반응하는지를 시각화하는 방식

 

 

 

Deconvolution - Based approach

: CNN 내부 뉴런이 활성화될 때 어떤 입력 이미지 부분이 그 뉴런에 영향을 미쳤는지 시각화

 

 

 

 

특정 레이어의 특정 뉴런의 기울기(gradient)를 구하는 방법?

 

STEP 01) Forward Pass 진행

이미지를 CNN에 넣어 Foward Pass를 진행한다. 이때, 모든 뉴런들이 어떻게 활성화 되는지 계산한다.

 

STEP 02) 관심 뉴런 선택

관심 있는 특정 레이어의 특정 뉴런을 보고자 할 때, 이 뉴런을 제외한 나머지 뉴런은 무시한다.

 

 

 

STEP 03) Gradient 설정

이 특정 뉴런에 대해 Gradient는 1로 설명하고, 나머지는 0으로 설정한다.

 

 

STEP 04) Backpropagation 진행

이 상태에서 Backpropagation을 진행하면, 해당 뉴런이 입력 이미지에 대해 얼마나 큰 영향을 미치는지 알 수 있다.

 

 

STEP 05) Guided Backpropagation 진행

추가적으로, 위와 같은 애매한 이미지를 Guided Backpropagation을 진행한다. Guided Backpropagation을 하면 긍정적인 영향만 반영하게 된다. 

 

 

 

즉, 특정 뉴런이 이미지의 어느 부분에 집중하고 있는지를 알아내는 과정이다.

 

 

 


 

 

Optimization - Based approach

: 원하는 뉴런의 활성화를 극대화하는 방향으로 이미지를 반복적으로 수정하여, 그 뉴런이 어떤 특징을 학습했는지 시각화

 

 

 

 

STEP 01) 초기 이미지 설정

모든 값이 0인 빈 이미지(검은 이미지)를 준비한다.

 

 

STEP 02) Forward Pass 수행

이 빈 이미지를 CNN에 넣고 Forward Pass를 실행하여 네트워크의 출력 값을 계산한다.

 

 

STEP 03) 관심 있는 클래스 선택

CNN의 출력 중에서 최적화 할 특정 클래스의 스코어를 선택한다.

 

 

STEP 04) Gradient 설정

선택한 클래스의 스코어에 대한 gradient(기울기)를 1로 설정하고, 다른 클래스들의 gradient는 0으로 설정한다.

 

 

STEP 05) 역전파(Backpropagation) 수행

CNN의 가중치(weight)는 고정한 채, 이미지를 최적화할 대상으로 설정한다.

그리고 역전파를 수행하여 이미지를 조금씩 수정한다.

 

 

STEP 06) 이미지 업데이트

역전파 후, 수정된 이미지를 다시 Forward Pass에 넣는다..

 

 

STEP 07) 반복

이 과정을 여러 번 반복하여, 특정 클래스의 스코어를 최대화하는 이미지를 만들어낸다.

 

 

이 방식은 CNN의 가중치를 고정하고, 이미지를 최적화하여 특정 클래스에 대해 반응하는 이미지를 생성하는 방식

 

 

 

Find images that maximize some class score

: Optimization-Based approach 방식 중 하나로,  CNN에서 특정 클래스의 스코어를 최대화할 수 있는 이미지를 찾는 과정이다.

 

 

 

간단한 방식

  1. 이미지를 CNN에 넣고 Forward Pass를 수행한다.
  2. 출력된 클래스 중, 거위 클래스의 스코어를 선택한다.
  3. 역전파(Backpropagation)를 진행하여 이미지 자체를 수정하면서, 거위 클래스의 스코어를 최대화하는 방향으로 이미지를 업데이트한다.
  4. 이 과정을 여러 번 반복하면, CNN이 거위로 인식하는 최적의 이미지가 만들어진다.

 

 

 

Visualize the Data gradient

: Optimization-Based approach 방식 중 하나로,  입력 이미지에 대해 기울기(gradient)를 계산하여, 이미지의 각 픽셀이 CNN에 얼마나 중요한지를 시각적으로 표현하는 방법이다.

 

 

 

간단한 방식

 

  1. 이미지를 CNN에 넣고 Forward Pass를 수행합니다.
  2. 해당 이미지에 대해 역전파를 진행하여, 입력 이미지의 각 픽셀에 대한 기울기를 계산합니다.
  3. 기울기 값을 바탕으로 이미지의 각 픽셀이 CNN이 해당 클래스를 인식하는 데 얼마나 중요한지를 시각적으로 표현합니다.

 

 

 

이러한 방식을 이용해서 segmentation을 한 사례도 있다. 

 

 


 

 

지금까지 본 방식들은 마지막 Layer에서 특정 클래스의 스코어에 대해서 Gradient를 1로 설정하고 나머지는 0으로 만들어, 해당 클래스를 시각화하는 방식이다. 하지만 이 방식을 마지막 Layer에서하는 것이 아니라 중간 특정 Layer의 뉴런에 대해서도 똑같이 적용할 수 있다. 

 

 

 

 

즉, 위의 사진처럼(2번) 특정 Layer에서 우리가 관심 있는 뉴런의 활성화 값을 1로 설정하고, 나머지 뉴런들의 값을 0으로 만들어 비활성화 시킨 후 역전파를 진행한다. 

 

이렇게 하면 해당 뉴런이 반응을 잘하는 이미지를 얻을 수 있고, CNN의 중간 과정에서 특정 뉴런이 어떤 특징을 학습할 수 있는지 시각화 할 수 있다. 

 

 

 

 

결론적으로, CNN의 마지막 Layer 뿐만 아니라 중간 Layer에서도 동일하게 적용할 수 있으며, 이를 통해 모델이 학습하는 내부 과정을 더 깊이 이해할 수 있게 해준다.

 

 

 

 

Optimization-Based approach with Regularization

: 특정 클래스의 스코어를 최대화하면서도, 이미지가 지나치게 복잡하거나 비현실적인 형태가 되지 않도록 제어하는 방식

 

 

특정 클래스 C에 대해 이미지 I의 스코어를 최대화하는 이미지를 찾는 과정

 

이미지 I가 너무 극단적으로 변하지 않도록 제약을 걸기 위한 정규화 항

 

 

간단한 방식

 

  1. 이미지를 업데이트 한다. - 관심 있는 뉴런의 Gradient를 사용해서 이미지를 조금씩 수정한다.
  2. 정규화 항 대신에 이미지를 blur 처리하여 복잡도를 줄인다. 
  3. 작은 norm을 가진 픽셀들을 0으로 만든다. - sparsity(희소성)을 유도하여 이미지에서 불필요한 부분을 제거하는 방식

 


Quiz -  CNN의 코드를 가지고 원본 이미지를 재구성 할 수 있는가? 

특정 수식을 통해서 가능하다. 

 

 

하지만, CNN의 깊은 레이어로 갈수록 뉴런들이 원본 이미지의 세부 정보를 잃어가기 때문에 원본에 가까운 정보는 줄어들게 된다. 즉, 깊은 레이어일수록 이미지 고차원적이고 추상적인 특징으로만 인식하게 되므로, 복원된 이미지와 차이가 있을 수 있다


 

DeepDream

: CNN의 활성화 값을 증폭시키면서 이미지를 점점 더 왜곡하는 방식으로 새로운 특징을 학습한다.

 

* 활성화 값을 증폭한다: 뉴런이 입력 이미지에서 감지한 특정 특징에 대해서 더 강하게 반응하도록 만드는 것이다.

예를 들어, 이미지에서 희미하게 감지된 강이지 얼굴을 CNN이 인식했다고 가정할 때 DeepDream은 그 강아지 얼굴에 해당하는 뉴런의 활성화 값을 더 크게 만드는 것이다.

 

 

 

구글의 DeepDream은 뉴런의 Gradient를 활성화 값으로 설정한다. 즉, 이미지를 최적화할 때 특정 뉴런이 더 크게 반응하게 하기위해서 기울기를 이용헤서 이미지 자체를 조정하는 한다.

 

이렇게 하면 CNN에서 ReLU를 사용하기 때문에 부스팅 효과가 발생한다. 부스팅 효과는 뉴런이 감지한 작은 패턴을 반복적으로 증폭시켜 더 뚜렷하고 강하게 만드는 현상이다. 이로 인해 이미지에서 작은 특징들은 점점 더 크게 부각되고, 왜곡된 이미지가 만들어진다.

 

결과적으로 여러 개의 특징들이 합성된 이미지가 만들어진다. 아래의 사진을 보면 돼지와 달팽이가 합성되고, 낙타와 새가 합성되는 패턴을 볼 수 있다.

 

 

"결론적으로, DeepDream은 CNN의 각 레이어에서 감지만 패턴을 증폭시키고 합성하여, 이미지의 특성을 왜곡하면서 새로운 패턴을 만들어내는 방식이다."

 


 

Neural Style Transfer

: Content 이미지를 Style 이미지를 통해 변경시키는 것

 

 

 

[Transfer STEP]

 

STEP 01 - Content 이미지의 활성화 값 저장(Content이미지의 특성을 분석해서 저장)

 

 

Content 이미지를 CNN에 넣고 각각의 Layer에서는 활성화 값을 저장한다.

활성화 값은 뉴런이 입력 이미지의 특징을 어떻게 인식하고 있는지를 나타낸 값이다. 각 Layer의 뉴런들은 이미지의 특정한 패턴에 반응하며, 이 반응 강도를 활성화 값이라는 것으로 표현한 것이다.

 

 

 

STEP 02 - Style 이미지의 활성화 통계 저장(Style 이미지의 각 뉴런들의 상관관계를 분석)

 

 

Style 이미지를 CNN에 넣고, 각 Layer에서 Gram Matrix를 계산한다. Gram Matrix는 해당 레이어에서 뉴런들이 서로 어떻게 연관되어 있는지를 보여주는 pair wise statistics(두 뉴런 사이의 상호작용을 나타내는 통계)이다. 

 

 

 

STEP 03 - 이미지 최적화(Content 이미지의 내용과 Style 이미지의 스타일을 합친다)

 

 

Content 이미지의 내용과 Style 이미지의 스타일을 결합된 최종 이미지를 만든다. 

 

이를 위해서 최종 이미지가 Content 이미지의 활성화 값과 일치하도록 하고, Style 이미지의 Gram Matrix와도 일치하도록 최적화(Loss를 줄이는 과정)한다. 이 과정에서 Total Variation Regularization을 사용할 수 있으며, 이는 최종 이미지가 지나치게 복잡하거나 왜곡되지 않도록 제어하는 역할이다.

 


 

지금까지 우리는 이미지 수정을 통해서 CNN이 특정 클래스에 대해 높은 스코어를 출력할 수 있다는 방법을 봤다. 즉 CNN의 가중치가 귀가 뾰족하고 긴 특징을 고양이로 인식하는 경우 귀가 짧은 고양이의 이미지를 길게 변형해서 고양이 클래스에 대해 높은 스코어를 출력할 수 있는 것! 

 

이러한 방식을 이용해서 우리는 CNN을 확실하게 속일 수 있을까? 즉, 어떤 이미지든 조작을 통해 CNN이 잘못된 클래스로 인식할 수 있게 할 수 있을까? 

 

할 수 있다.

 

 

 

 

 

Adversarial Examples

: 신경망의 취약점을 이용해 CNN을 속이는 방법

 

특정한 클래스의 Gradient의 값을 1으로 만들고 역전파를 통해 모델을 수정해서 특정한 클래스의 특징이 조금만 나타나도 그 클래스로 분류시키는 과정을 통해 모델을 만든다.

 

그리고 사람 눈에는 잘 보이지 않는 아주 작은 변화를 이미지에 적용해서 해당 모델이 다른 클래스로 잘못 분류하도록 만드는 방식이다.

 

 

아래와 같이 특정 모델에 낙타 클래스의 Gradient의 값을 1으로 만들고 역전파를 통해 모델을 수정했을 때, 해당 모델에 낙타 노이즈가 아주 미세하게 낀 버스 이미지를 입력하면 버스로 분류하는 것이 아니라 낙타로 분류하게 되는 것이다.

 

 


 

1.  왜 신경망이 속을까?

신경망이 선형적 특성을 갖고 있기 때문이다. 선형적이라는 것은, 입력이 조금만 바뀌어도 그에 따른 변화가 크게 나타날 수 있다는 의미이다. 이런 선형적 특성 때문에, 작은 변화만 주어도 신경망은 이에 크게 반응하여 작못된 예측을 내릴 수 있다. 

이러한 증상은 모든 신경망에서 발생될 수 있다.

 


 

2. 예제

 

 

 

 

주어진 입력에 대해서 아래의 모델은 클래스 1에 대해서 0.05. 즉, 5%로 예측하고 있다. 

 

 

 

 

 

 

하지만 입력값이 양수라면 기존 가중치 + 0.5 / 음수라면 기존 가중치 - 0.5를 통해서 adversrial x를 만들어 입력값과 dot product를 하면 88%로 클래스 1을 예측하게된다. 

 

이렇게 작은 변형으로 모델을 속여 원래는 해당되지 않는 클래스를 높은 확률로 예측하게 만들 수 있다. 

이런 문제가 발생하는 원인이 선형적 특성 때문이다.

 


 

3. 고차원 데이터일 수록 쉽게 속일 수 있다.

고해상도 이미지와 같은 많은 픽셀로 구성된 이미지는 각 픽셀에 아주 작은 변화만 주어도 그 합이 커져서 모델이 잘못된 예측을 하게 만든다.

 

 

 

'CVLab > cs231n (2016)' 카테고리의 다른 글

2024.10.11 Q&A  (1) 2024.10.11
cs231n - lecture10(RNN)  (1) 2024.10.09
2024.10.04 Q&A  (0) 2024.10.04
cs231n - lecture08(Localization and Detection)  (1) 2024.10.03
cs231n - lecture07(CNN)  (0) 2024.10.01