EECS 498-007

[EECS 498-007] Lecture 14. Visualizing and Understanding

y_unique 2024. 2. 18. 03:21
728x90

나른한 금요일 오후 

에 시작하는 14강!

오늘 환승연ㅇㅐ 나오는 날이잔아! 

행복한 마음으로 공부하구

오티 리허설두 하구 

코딩 테스트두 보구 

집가서 쉬어야징 (환연보면서)


요번 포스팅은 신경망 내부를 들여다보고 데이터가 train한 것이 무엇인지 시각화하여 살펴보는 내용에 관한 글이다. 

지금까지 우리는 다양한 유형의 데이터를 처리하기 위해 신경망 모델을 구축하는 방법을 배웠다. CNN, RNN 이나 Transformer를 사용하여 처리를 할 수 있다. 

 

하지만! 우리가 시각 인식 작업을 위해 신경망을 훈련시킨 후 이 신경망이 무엇을 학습했는 지 어떻게 알 수 있을까? 에 대한 의문을 가질 수 있다. 우리가 신경망 내부를 엿볼 수 있다면, 서로 다른 특성이나 레이어가 어떤 것을 찾고 있는지 알게되면! 왜 실패하는지 또는 왜 작동하는지, 그리고 왜 작동하지 않는 지에 대한 직관을 얻을 수 있을 것이다. 

 

이러한 직관을 얻기위한 기술 중 하나를 살펴보자! 

그것은 바로 신경망의 첫번째 레이어에서의 필터를 시각화하는 것이다. 

선형분류기로 돌아가 생각해보면 우리는 각 클래스에 대한 템플릿 집합을 학습하는 개념을 가지고 있었다. 선형 분류기에서 우리의 class score는 해당 클래스에 대해 학습한 템플릿과 input image 간의 내적으로 간주되었다. 

 

더하여 CNN으로 일반화되면서 이와 같은 템플릿 개념은 그대로 이어져 왔는데, 따라서 CNN에서도 네트워크의 맨 처음 레이어에서 이러한 필터 집합을 학습하였다. 이러한 필터 집합을 input image 주위에서 이동하면서 각 지점에서 우리가 학습한 필터와 input image의 RGB 픽셀 간의 내적을 취했다. 

 

여기서 RGB이미지로 시각화를 하는 것이다. 필터와 이미지 간의 내적을 취할 때, 필터를 이미지로 시각화하면 해당 필터와 일치하는 이미지는 강한 응답을 제공할 것이다. 이러한 필터를 시각화함으로써 첫번째 레이어가 무엇을 찾고 있는지에 대한 어떤 감각을 얻을 수 있다. 

 

위 사진은 3개의 layer로 이루어진 CNN을 CIFAR-10 분류를 튀해 여러 다른 아키텍처로 미리 훈련시킨 후 첫번째 레이어의 가중치를 시각화 한 것이다. 아키텍처들이 다 다르지만 첫번째 레이어에서 학습하는 필터들은 매우 유사한 경향이 있는 것을 알 수 있다. 이는 필터들이 일종의 방향성 가장자리를 찾도록 train되었다는 것을 알려준다. 

 

이번엔 두번째, 세번째 레이어도 보여주고 있는데, 

두번째 레이어의 Input은 첫번째 레이어의 ReLU 출력이 되고, 16개의 channels과 20개의 필터가 있다. 이 20개의 필터는 각각 16개의 입력 채널 전체에 걸쳐 있는데, 16개 채널의 input image를 모두 시각화 할 수는 없으니 필터들이 어떤 일이 일어나고 있는지에 대한 핵심적인 감각을 얻기 위해 각각 확장된 7x7의 이미지를 작은 흑백 이미지로 시각화 하였다. 

따라서 고차원의 필터에서도 약간의 공간적 구조가 있음을 알 수 있고 가장자리를 찾고 있는 경향성을 띄는 것으로 보인다. 

 

하지만 실제 그들이 무엇을 찾고 있는지에 대한 강력한 직관을 얻기엔 힘들다. 따라서 다른 기술들을 사용해야 하는데 

 

Last Layer

중간 레이어들을 건너뛰고 마지막 fully connected layer에서 일어나는 것을 이해하려고 하는 것이다. 

AlexNet을 생각해보면 마지막에 4096차원의 벡터를 선형변환을 통해 class score로 변환하였다. 그럼 train된 AlexNet이 하는 일을 생각하는 한 가지 방법은 input image를 4096차원을 벡터로 변한한 뒤 그 벡터 위에 선형분류기를 적용하는 것이다.

 

Last Layer : Nearest Neighbors 

여기서 흥미로운 접근 방법은 4096차원 벡터 위에 최근접 이웃을 적용하는 것이다. 이를 통해 분류기가 학습한 피처 공간에서 어떤 이미지가 서로 가까운지에 대한 감각을 얻을 수 있다. 

 

두번째 행에 있는 코끼리 이미지를 살펴보면 해당 코끼리의 최근접 이웃 이미지도 코끼리이다. 하지만 그 코끼리들의 픽셀은 다 다를 수가 있는데, query image인 코끼리는 왼쪽에 있는데 검색된 이미지들은 다 오른쪽에 있는 것을 알 수 있다. 또한 코끼리의 색상과 배경 색상도 다른 것도 알 수 있다.  

이는 4096차원 벡터가 이미지의 저수준 픽셀 내용을 많이 무시하고 있는 것을 의미하며 코끼리에 대한 정보를 인코딩하고 있어서 코끼리 이미지를 검색하면 매우 다른 코끼리들을 얻을 수 있는 것이다. 

 

또한 이 공간에 무슨 일이 일어나고 있는지 확인하는 또 다른 방법은 

Last Layer : Dimensianality Reduction 

4096차원을 우리가 파헤치기에는 상당히 높은 차원이다. 이를 우리가 이해할 수 있는 2차원 또는 3차원으로 줄이기 위해 차원축소 알고리즘을 적용하는 것인데, 저번 강의들에서 언급했던 알고리즘 중 간단한 것은 PCA 이다. 

  • PCA (주성분 분석)
    • 고차원 feature space의 구조를 최대한 보존하면서도 선형으로 이를 2차원으로 투영하는 것이 목표인 차원 축소 알고리즘 

위 사진에서 보여주는 것이 CNN 분류기를 훈련시켜 0부터 9까지의 10가지 MNIST 숫자를 인식하는 시각화를 보여주고 있다.

test 세트의 모든 이미지를 분류기에 통과시켜 이러한 2차원으로 투영된 벡터를 얻은 다음, t-SNE 차원 축소 알고리즘을 적용하여 고차원 임베딩 공간에서 이러한 벡터를 2차원으로 변환한 것이다. 위 다이어그램의 각 포인트가 실제로 작은 숫자이며 사진으론 잘 보이지 않지만 확대해보면 각 포인트가 2차원 공간에서의 해당 위치에 이미지 자체를 작은 숫자로 표현하고 있다. 

 

여기서 놀라운 점은 10개의 숫자로 이루어진 분류를 수행했는데, 이 feature space도 10개의 영역으로 군집화 되었다는 것이다.  

즉 네트워크가 학습한 피처 공간이 어떻게든 클래스의 식별 정보를 인코딩하고 있다. 

 

  • T-SNE (t-distributed Stochastic Neighbor embeddings) 
    • 고차원 공간에서 일련의 벡터를 입력으로 받아 이 벡터들의 2차원 투영을 계산하는 비선형 차원 축소 알고리즘
    • 원래의 고차원 공간에서 존재하는 구조를 최대한 유지하려고 노력 
    • 고차원 data 시각화 하는데에 인기가 많은 알고리즘 
    • 거리 정보를 확률적으로 나타냄
      • P : 본래 차원(고차원)에서의 상대적 거리를 이용해 xj가 xi의 이웃으로 선택될 확률 
      • q : 축소된 차원에서 상대적 거리를 이용해 yj가 yi의 이웃으로 선택될 확률

SNE 수식

 

SNE의 목적은 p와 q의 분포 차이를 최소화하여 원래 차원에서와 축소된 차원에서의 이웃으로 뽑힐 확률을 같게 만드는 것. 


📌 여기서 궁금했던 점! 

그럼 두 확률 분포의 유사도는 어떻게 측정해?

  • KL Divergence

  • 두 확률 분포가 얼마나 다른지를 측정하는 방법으로, 보통 P는 사후, Q는 사전 분포를 의미한다. 
  • KLD는 값이 낮을 수록 두 분포가 유사하다 라고 해석한다. 
    • entropy가 값이 낮을수록 랜덤성이 낮다고 해석하는 것과 비슷하다 라고 접근하기! 
  • 그럼 KLD를 최소화 하려면 likelihood를 최대화 하는 것과 같은 의미를 가진다. 

 


📌 두번째 궁금했던 점! 

그렇다면 PCA와 t-SNE의 차이점은 무엇일까?

 

PCA로는 멀리 있는 점도 모두 같게 표현되어 버린다는 단점이 있었다. 

PCA vs t-SNE

하지만 t-SNE의 아이디어는 데이터 포인트 사이의 거리를 가장 잘 보존하는 포현을 찾아보자는 것이었다. 

t-SNE는 PCA의 단점을 보완한 발전된 알고리즘이라 볼 수 있음! 

 

하지만 t-SNE에도 단점이 있는데

  • 성능 측면에서 데이터의 개수가 n개라면 n의 제곱만큼 늘어남. 
  • 매번 돌릴때마다 다른 시각화 결과 → 초기 기준점에 따라 달라짐 
  • 오로지 2, 3차원만 축소 가능, 4차원 지원 x

PCA vs t-SNE

  PCA t-SNE
선형 vs 비선형 선형! 
주성분 데이터에서 가장 큰 분산을 가진 방향으로 정의되며, 차원을 줄이면서 최대한 많은 분산을 보존하려고 함. 
비선형! 
이웃 관계를 유지하면서 데이터 포인트 간의 유사성을 고려
차원 축소 결과 해석 결과는 각 차원의 선형 조합으로 표현.
원래 feature space에서 가지는 의미를 해석하기 쉬움
결과는 데이터의 군집 구조를 나타냄.
각 차원의 명시적 의미는 사라짐.
계산 복잡성  선형 변화를 사용하여 효율적, 빠름 비선형 변환을 수행하여 복잡, 특히 대규모 데이터 셋에서 계산 비용이 증가
사용 선형 관계가 중요한 경우  고차원 데이터의 시각화 
군집간 거리가 중요한 경우

 


 

 

이러한 방식으로 ImageNet에도 유사한 알고리즘을 적용할 수 있는데, 

먼저 AlexNet을 ImageNet에서 훈련시켜 test set의 각 이미지에 대해 4096차원 벡터를 추출하였다. 그런 다음 차원 축소 알고리즘을 적용하여 4096에서 2차원으로 가능한 많은 구조를 유지하면서 차원을 낮추었다. 

 

2차원 공간의 해당하는 지점에 시각화를 하였는데, 흥미로운 점은 이미지를 확대하면 공간의 서로 다른 영역이 다양한 의미있는 카테고리와 연관이 있다는 것이다.

예를 들면, 왼쪽 하단 구석을 확대해보면 서로 다른 종류의 꽃들이 나타다나가 서서히 다양한 종류의 강아지로 전환된다. 또한 오른쪽 상단 모서리에는 파란색과 흰색이 혼합된 것처럼 보이며, 그 안에는 다양한 보트나 하늘 이미지가 있다고 한다. 

 

이렇게 마지막 layer vector를 추출하여 다양한 연산을 적용하는 아이디어는 특징 공간을 이해하는데 도움이 된다! 

 

이러한 것의 또 다른 기술은 중간 합성곱 활성화를 시각화 화는 것인데,

 

우리가 기억해야 할 것은 CNN을 통과할 때마다 각 레이어에서 어떤 activation volum을 계산하는 것이다. 

위 사진은 AlexNet의 다섯 번째 합성곱 레이어에서 128개의 필터가 있음을 의미하며, 이로부터 13x13 그리드가 생성된다. 이제 우리는 activation volum을 각 13x13 슬라이스를 이미지로 시각화하고, 이를 회색조 이미지로 나타낸다. 

 

여기서 거의 0에 가깝거나 ReLU함수를 통과하게 되면 대부분의 값이 0이 될 것이다. 하지만 특징맵이 0이 아닌 경우에는 원래 입력 이미지가 들어오면 CNN 필터들이 입력 이미지의 어떤 특징에 반응하는지 이해할 수 있다. 

 

위 사진을 보면 128개의 활성 결과들을 볼 수 있는데, 녹색부분을 들여다 보자. 

왼쪽의 원본 이미지와 아래 시각화한 부분을 보면 13x13 그리드의 역역들에서 필터가 입력 이미지의 사람 얼굴 부분을 따라 활성된 것을 볼 수 있다. 이는 정확하다고 할 순 없지만 사람의 얼굴 혹은 피부톤에 반응했다고 해석할 수 있다. 

 

그렇다면 왜 거의 대부분이 검은색일까?

  • 그것은 ReLU의 비선형성 때문일 것이다. ReLU는 음수 값이 나오는 경우 0이 되고, 양수만 남게 된다. 그렇다보니 많은 값들이 0이 되는 것이다. 0이 아닌 부분이 훨씬 더 중요하겠지! 
  • 또는 시각화의 특성상 표현 방식의 차이! 신경망이 0부터 무한대까지의 임의의 실수를 출력하기에 이를 0~255로 압축하여 시각화 할 때 값의 스케일링 방법이 이미지의 전반적인 밝기에 영향을 미칠 수 있다. 

위 아이디어에 기반해 우리는 또 다른 것을 생각할 수 있다. 

Maximally Activating Patches

이전 슬라이드에서 우리는 녹색 부분이 사람 얼굴에 반응하였다는 것을 전제로 하였다. 이를 확실하게 확인해보기 위해!

레이어와 필터를 선택하고, 전체 train, test set을 돌려보고, test set이미지의 패치 중에서 우리가 선택한 필터에 가장 크게 반응하는 패치들을 찾아내 기록한다. 

이들은 신경망에서 선택된 뉴런을 최대로 활성화 하는 test set 이미지들의 패치들이기도 하여 최대 활성 패치를 시각화 함으로써 뉴런들이 무엇을 찾는 지 이해할 수 있게되는 것이다. 

 

예를들면 맨 위에 있는 행은 강아지의 코처럼 생긴 것들이 모여있으므로 강아지 코를 찾는 뉴런, 4~6번째 행은 모두 영어 단어나 텍스트 패치로, 이 텍스트들은 전면과 후면이 다른 색상과 방향을 가지고 있다. 즉, 선택된 필터가 서로 다른 색상과 방향을 가진 텍스트를 찾는 것을 알 수 있다.  또한 사람 얼굴이 모아진 행을 자세히 보면, 다른 피부색상, 다른 위치에 있는 것을 볼 수 있다. 이는 깊은 곳에 있는 한 뉴런 혹은 한 필터가 사람의 얼굴! 만을 식별하는 것처럼 학습한 것으로 생각할 수 있다.

 

패치를 최대한 활성화 한다는 이 아이디어에서 우리는 또 다른 것을 생각해 볼 수 있다.

신경망이 무엇을 계산하는지 이해하기 위해 입력 이미지의 어떤 픽셀들이 분류 문제에 중요한 것인가! 를 생각해보는 것이다. 

코끼리 이미지가 학습된 신경망에서 올바르게 코끼리로 분류되었다고 가정해보자. 그렇다면 이제 우리가 알고자 하는 것은 입력 이미지의 어떤 픽셀들이 신경망이 코끼리로 분류하는 것으로 결정했는가! 이다. 

 

그래서 코끼리 이미지를 준비하여 이미지의 일부 픽셀을 회색 사각형이나 균일한 색상으로 변경한 뒤, 이 마스킹된 이미지를 다시 신경망을 통과 시켜 어떤 것으로 분류되는 지에 대한 업데이트된 score를 계산한다. 이 마스킹을 다른 위치로 이동시키며 위 과정을 반복한다. 

 

각 지점에서 코끼리의 확률을 계산해내고 가장 중요한 픽셀이 무엇인지 알려주는 saliency map으로 만들 수 있다.

코끼리 부분에다가 마스킹을 한 경우 코끼리로 예측할 확률이 떨어지는 것을 볼 수 있으며, 이는 신경망이 이미지의 올바른 부분을 보면서 분류를 한다고 이해할 수 있다. 

따라서 이러한 방식은 우리가 신경망이 어떻게 동작하는지 이해하고자 할 때, 입력이미지를 단순히 변형시키고, 입력 이미지의 어떤 부분이 중요한지를 알아낼 수 있었다. 신경망의 어떤 부분이 물체인지 배경인지 알 필요가 없는 것이다. 

 

하지만! 마스킹으로 saliency map을 구하는 것은 가능한 모든 위치에다가 마스크를 놓고 돌려야 한다는 큰 계산 비용을 갖고있다. 

다른 방법을 생각해보자! 

 

Saliency via Backprop 

역전파를 통해 saliency map을 구하는 것이다. 강아지를 입력 이미지로 하여 신경망을 돌려 강아지일 확률을 계산한다. 

다음 backpropagation을 하는 동안 강아지일 score와 입력 픽셀들 사이의 gradient를 계산할 수 있는데, 이는 입력 이미지의 모든 픽셀들이 조금씩 변할 때 신경망의 맨 끝에서 강아지 score에 얼마나 영향을 끼치는 지 알려준다. 

위의 유령같은 이미지는 gradient 이미지를 시각화 한 것으로 각 픽셀은 강아지 score에 대한 픽셀들의 gradient가 되겠다. 

 

분류 스코어에 영향을 주는 픽셀들은 주로 강아지 안에 있는 것을 알 수 있다. 이는 강아지 밖에 픽셀들이 변하더라도 분류 스코어에는 크게 영향을 끼치지 않음을 의미한다. 

 

강아지 뿐만 아니라 다른 여러 이미지에도 적용시킬 수 있는데, 

네트워크가 다양한 이미지를 분류할 때 이미지의 어떤 픽실이 중요한 지 이해하는데 중요한 역할을 한다. 하지만 위의 사진처럼 실제로는 .. 이렇게 예쁘고 좋게 나오진 않는다구 합니다. 

 

salienct map을 잘 동작시키기 위한 방법을 살펴보자. 

이미지에 있는 물체를 세분화하고 정확한 윤곽을 추출하는 것이다. 이를 신경망에넣고 학습을 시킨 뒤, 입력 이미지로부터 메뚜기 이미지 부분 픽셀들을 구하는 것이다. 이때 salienct map을 활용하여 영상처리 기술을 적용하여 이미지 분류로 학습된 신경망을 객체 카테고리에 해당하는 입력 이미지의 부분으로 분할하는 용도로 사용한다. 

 

일반적인 경우에는 잘 작동하지 않을 수 있지만, 각 픽셀에 대한 gradient 정보를 계산하는 방법이 매우 유용하다는 것은 알 수 있다. 

 

이번에는 중간 레이어의 중간 뉴런 값에 대한 gradient 정보를 사용하여 이 뉴런이 무엇을 찾고있는지! 를 이해해보자.

또한 그 gradient를 사용하여 어떤 입력 이미지의 어떤 픽셀이 이 중간 뉴런의 값을 크게 변화시킬 수 있는 지도 확인해보자! 

여기서 어떤 layer, 어떤 필터를 선정한 뒤 train이미지나 test 이미지를 신경망에 넣어 돌리면서 역전파를 해보는 것이다. 그런 다음 input 이미지의 어느 픽셀이 최종 클래스 스코어가 아닌 어느 중간 뉴런 값이 영향을 주었느냐! 를 살펴보아야 한다. 

따라서 최종 스코어까지 역전파하는 것이 아닌 중간 레이어까지 역전파가 진행되며, 여기서 salency map은 train 후의 것을 사용해야 한다.

 

일반적인 역전파 방법으로는 중간 특징에 대한 결과가 좋지 않게 나오는 것을 확인할 수 있다. 

따라서 guided backpropagation이란 방법을 사용하였는데, 

 

guided backpropagation

: 역전파 과정에서 ReLU 활성화 함수를 사용할 때, 음수 값들이 제거되기 때문에 정보 손실이 발생하는 문제를 개선하기 위한 방법 

동작 과정은 

  1. 기본적인 역전파를 수행 후 각 뉴런의 gradient 계산
  2. ReLU 활성화 함수를 지나는 부분에서 음수 값은 0으로 변하지 않도록 보존 
  3. 계산된 gradient를 사용하여 입력 이미지에 대한 Gradient 맵을 얻는다. 

즉 모델의 특정 부분이 활성화되는데 어떤 입력 특성이 기여하는지를 더 명확하게 시각화 할 수 있도록 도와준다. 


📌 세번째 .. 궁금한 점!

deconvnet 이 뭘까?

convolution의 반대과정이다. conv는 f*g=h 와 같이 주어진 filter와 g -> feature map(input) 을 통해 h를 얻는 과정이다. 

그렇다면 deconv는 주어진 f와 h를 통해 식을 만족하는 g를 구하는 연산이다. 

CNN에서 deconv를 진행하여 feature map을 역추척하면 특정 필터가 처음의 input image에서 담당하는 부분을 시각적으로 알 수 있을 것이다.  


위 과정에서 일반적인 ReLU를 통한 역전파 과정을 거친 후. guided backpropagation에서는 추가적인 단계로 역전파 중에 음수의 upstream gradient를 마스킹하는 작업을 수행한다. 즉, Input activation 값이 0에 해당하는 경우와 음수 upstream gradient를 모두 제거하게 된다. 

 

이러한 방식을 적용하면

뉴런 값에 변화를 주는 이미지 픽셀들을 잡아낼 수 있게 된다. 왼쪽 그림이 최대 활성 패치들이면, 우측에 있는 것들이 guided backpropagation을 적용하여 이 패치의 어떤 픽셀들이 뉴런에 영향을 끼쳤는지 찾아낸 결과라고 볼 수 있다. 

맨 첫 행에 보면 강아지의 코들이 큰 영향을 준다고 볼 수 있다. (귀엽당...)

 

더 깊은 신경망 레이어에 최대 활성 패치들을 구해 또 적용시켜보면 비슷한 결과가 나오는 것을 알 수 있다. 사람 얼굴의 픽셀 위주로 보는 것을 알 수 있다. 

지금까지는 gradient 정보를 사용하여 테스트 셋 이미지의 픽셀을 선택해 뉴런 값이나 클래스 점수에 영향을 미치는 것에 중점을 두었다. 

이제는 더 나아가 테스트 셋 이미지로 제한되지 않고 모든 가능한 이미지 중에서 어떤 이미지가 하나의 뉴런 값을 최대로 활성화시킬지에 대해 궁금해보자! (?)

 

Gradient Ascent

실제로 하나의 뉴런 값을 최대화하는 합성 이미지를 생성하려면 이미지 자체의 픽셀에 대한 gradient 강도를 사용할 수 있다. 

  • i : 선택한 신경망 내 뉴런을 최대로 활성화하는 합성 이미지
  • f(i) : 이미지가 주어질 때의 특정 뉴런의 값
  • R(i) : 생성한 이미지가 자연스럽게 하기 위한 규제 값 

여기서는 가중치를 훈련시키는 대신 훈련된 네트워크가 중간 특성 중 하나를 최대로 활성화시킬 이미지를 훈련하려고 한다. 

이때 gradient ascent 알고리즘을 사용할 수 있으며 gradient 정보를 사용하여 한 번에 한 비트씩 이미지를 변경하는 것이다. 

gradient asent를 통해 이미지를 생성하기 위해 

  1. 초기 이미지를 0또는 무작위 noise로 초기화하기 
  2. 해당 이미지를 네트워크에 돌린 뒤 선택한 뉴런의 값을 추출하기 
  3. 역전파를 통하여 뉴런 값이 변경되는 픽셀을 찾기 
  4. 위 과정을 반복하여 선택한 뉴런 값이 높아지도록 하는 합성 이미지를 생성하기

위와 같은 과정을 독립적으로 실행하면 원하는 이미지가 아닌 adversarial example이 생성될 것이다. 따라서 정규화 항을 선택하는 것이 중요하며 생성된 이미지가 자연스럽게 보이도록 강제하는 것이 중요한 것이다. 

그 방법 중 매우 간단한 것은 L2 norm을 사용하는 것이다. 하나의 레이블에 대한 class score를 최대화하고 L2 norm을 적용한다. 

이를 적용하면 다음과 같은 이미지가 생성되는데, 

이를 통해 우리는 신경망이 특정 클래스를 인식할 때 어떤 특징을 사용하는지에 대한 통찰(?)을 얻을 수 있다. 

 

하지만 우리는 바보같은 정규화를 사용했다. 위와 같은 이미지는 전반적으로 자연스럽지않으며 일부 초기 형태가 생성되지만 현실적으로 보이지는 않는다. 더 나은 정규화를 적용해보면 

이미지를 부드럽게 만들기 위해 픽셀값에 blur 및 cliping을 적용하는 것이다. 

그렇다면 더 정교하고 사실적인 이미지로 보이는 이미지들을 생성할 수 있게 된다. 

 

더 좋은 visualization 위해 prior을 추가하면 아래와 같이 매우 현실적인 이미지를 만들 수 있다고 한다. 

 

이러한 정규화가 전혀 없으면 어떻게 될까?

정규화가 전혀 없는 상황에서는 adversarial examples가 발생할 수 있다. 한 클래서의 이미지를 시작으로 gradient ascent를 사용하여 다른 클래스로 이미지를 조금만 변겅함으로써 이미지의 픽셀을 미세하게 조작해 다른 클래스로 확신있게 분류되도록 할 수 있다. 

여기서는 코끼리의 이미지를 취해 조금 수정하여 코알라로 자신있게 분류되도록 만들었거나, 스쿠너 이미지를 가져와 이를 아이팟으로 자신있게 분류 되도록 만든 예시를 볼 수 있다. 

 

gradient ascent와 이미지를 사용하여 네트워크가 무슨 일이 일어나고 있는 지 이해하는데 또 다른 아이디어가 있다. 

Feature Inversion 

바로 특징추출이라는 개념이다. 여기서는 주어진 이미지에 대해 네트워크의 특징 표현을 추출한 다음, 해당 특징을 가진 새로운 이미지를 생성하는 gradient ascent를 사용할 수 있게된다. 이렇게 함으로써 신경망에 의해 계산된 특징 표현을 반전시키려고 한다. 

 

이는 VGG네트워크의 다양한 레이어에서 특징 반전 또는 재구성을 수행한 결과를 보여준다. 첫번째 열인 'relu2_2'에서는 이미지 y의 특징을 추출하고, 그와 동일한 특징을 갖는 이미지를 합성했다. 따라서 원본 이미지의 특징 표현과 거의 동일한 것으로 나타나는데, 더 깊은 레이어로 이동할수록 합성된 이미지는 세부 정보를 잃어가며 해당 레이어에서의 추상적인 특징을 더 잘 나타내고 있다. 

이 과정에서 신경망의 다양한 레이어에서 어떤 정보가 유지되거나 버려지는지에 대한 통찰을 얻을 수 있는 것이다. 

 

이러한 기법들을 사용해 재미있는 실험들을 해왔는데, 

그 중 하나는 몇 년 전 구글에서 시작된 딥드림이라는 프로젝트이다. 이 아이디어는 기존 이미지를 가져와서 원래 이미지에 있는 특징들을 강조하는 것이다. 

  1. 원본 입력 이미지를 가져와서 해당 이미지를 CNN에 통과시키고 
  2. 네트워크의 특정 레이어에서 특징을 추출한 다음, 해당 레어의 gradient를 활성화 값 자체로 설정한다
  3. 역전파를 수행하여 이미지를 업데이트하여 
  4. 신경망이 인식한 특징을 강조하고 더욱 활성화하도록 이미지를 변경한다. 

위를 코드화 한 것은 다음과 같다. 

 

이를 반복하여 네트워크에 의해 검출된 이미지의 features를 증폭시키는데, 해당 layer에 어떤 특징들이 있든지 그 특징들을 gradient로 설정하면 이는 네트워크가 이미지에서 뽑아낸 특징들을 더욱 증폭시키는 역할을 하게된다. 

또한 해당 layer에서 나온 특징들의 L2 norm을 최대화 시킨 것으로 보인다. 

 

첫번째 사진은 초기 layer의 feature를 증폭시킨 것으로 구름의 edges가 나타난 것을 볼 수 있고, 점점 higher layer로 갈 수록 많은 features들이 나타나는 것을 볼 수 있다. 마지막은 multi-scale 과정을 오래 돌린 결과로 작은 이미지로 딥드림을 수행하고 점점 이미지 크기를 늘리고 있다. 

 

Texture Synthesis

컴퓨터 그래픽스에서 고전적인 개념 중 하나로 텍스처 합성이라는 것이다. 

어떤 작은 이미지 패치를 입력으로 사용하여 어떤 정규적인 텍스처를 제공하고, 그 입력 이미지의 로컬 텍스처와 일치하는 큰 출력 이미지를 생성하고자 한다. 

 

Texture Synthesis : Nearest Neighbor

이 방법은 신경망 대신에 scan line을 따라 한 픽셀씩 이미지를 생성하는 방식이다. 

  • 현재 생성해야 할 픽셀 주변의 이미 생성된 픽셀들을 살피고
  • 입력 패치에서 가장 가까운 픽셀을 개산해 입력 패치로부터 한 픽셀을 복사해서 넣는다. 

Texture Synthesis with Neural Networks : Gram Matirx 

입력 이미지의 정확한 픽셀과 일치시키기보다는 입력 이미지의 전체적인 공간 구조와 일치하게 하려고 하는 것이다. 이때 우리는 그램 행렬을 사용하게 된다. 

위 그림에서처럼 HxW의 한 점에 있는 C차원의 feature vector는 해당 지점에 존재하는 이미지의 특징을 담고 있는데, 

  1. 우선 feature map에서 서로 다른 두개의 feature vector(red, blue)를 뽑고
  2. 이 둘의 외적을 계산해 C x C 행렬을 만든다. 
  3. 이 행렬은 이미지 내 서로 다른 두 지점에 있는 특징들간의 co-occurrence를 담고 있다. 
    1. 즉 C x C 행렬의 (i, j)번째 요소의 값이 크면 두 입력 벡터의 i, j 번째 요소가 모두 크다는 의미! 
  4. 이를 통해 서로 다른  공간에서 동시에 활성화 되는 특징이 무엇인이 포착한다. 

위 과정을 H x W 그리드에서 전부 수행하고 결과에 대한 평균을 계산하면 C x C gram matrix를 얻을 수 있다. 

그리고 이 결과를 입력 이미지의 텍스쳐를 설명하는 텍스쳐 기술자로 사용할 수 있을 것이다.

 

→ 그램 행렬은 이미지의 각 지점에 해당하는 값들을 평균화시켰기 때문에 공간 정보를 모두 날린다! 대신 특징들간의 공분산만을 포착함!  

 

이제 이렇게 만든 텍스쳐 기술자를 활용해 이제 이미지를 생성할 차례이다. 

  1. 먼저 이미지넷 또는 다른 데이터 셋에서 CNN을 pretrain 시킨다. 
  2. 목표 텍스쳐 이미지를 가져와 새 이미지를 합성한다. 

3. 그 이미지를 신경망을 통해 실행하여 각 layer에서 gram 행렬을 계산한다. 

4. 그런 다음 이미지를 처음부터 초기화한다. 

5. 동일한 신경망을 통해 생성된 이미지의 각 레이어에서 gram행렬을 다시 계산한다. 

6. 다음 loss를 계산하는데, 우리의 손실함수는 우리가 합성하고 있는 이미지의 원래 텍스처 이미지와 생성된 이미지의 gram 행렬 간의 유클리드 거리의 합 (L2 distance)으로 계산한다. 

 

 

7. 그런 다음 이미지의 gradient를 얻기 위해 backprop을 진행한다. 

8. 그 이미지에 대해 gradient step 을 밟아 나갈 수 있다. 

9. 이를 반복하여 이미지를 생성하고, 최종적으로는 원래 입력 이미지와 동일한 gram 행렬을 가진 이미지를 생성할 것을 기대한다.

이것은 실제로 꽤 잘 작동하며 gram 행렬과 일치시켜 공간구조가 매우 다르게 보이는 새로운 이미지를 합성할 수 있다.

 

Nueral Texture Synthesis : Nural style Transfer! Feature + Gram Reconstruction 

이는 두 가지 이미지의 특징을 결합하여 새로운 이미지를 생성하는 것인데, 하나는 content image, 다른 하나는 style image이다. 

 

content iamge의 특징을 일치시키면서도 style image의 gram 행렬과도 일치시키려고 하는 것이다.

우리는 상대적으로 높은 레이어의 특징을 역전시키려고 하면 전반적인 공간 구조는 유지되지만 모든 텍스처 정보나 색상 정보는 무시되었고, gram 행렬과 일치를 수행하면 공간구조는 모두 버리지만 텍스처 및 색상 정보는 보존되는 것을 알았다. 

이 두 아이디어를 결합하자는 것인데! 즉, content image의 특징을 보존하면서도 style image의 텍스처와 색상을 가져와 새로운 이미지를 생성하는 것이다.

 

  • Input 
    • content image : 네트워크에게 우리의 최종 이미지가 "어떻게 생겼으면 좋겠어!" 를 알려줌
    • style image : 최종 이미지의 "텍스처나 색이 어땠으면 좋겠어!"를 알려줌 

최종 이미지는 content image의 feature reconstruction (feature inversion) loss도 최소화하고, 

style image의 gram matrix loss도 최소화 하는 방식으로 이미지를 생성하는 것이다. 

 

방식은 다음과 같은데

  1. 네트워크에 두 이미지를 통과시키고 feature map과 gram matrix를 계산한다. 
  2. 최종 출력 이미지는 랜덤 노이즈로 초기화 시킨다. 
  3. forward, backward를 반복하여 계산해 gradient ascent를 이용해 이미지를 업데이트 한다. 

그 결과 시간이 지남에 따라 gradient ascent 과정에서 새로운 이미지를 생성하는 것을 보여준다. 

 

Neural Style Transfer는 딥드림에 비해 더 많은 정밀한 조정을 할 수 있다고 한다. 

얼마나 많은 특징을 재구성하고, gram 행렬을 재구성 할 지를 조절하는 것인데 이 균형을 어떻게 맞출지를 나타내는 스칼라 가중치를 사용하여 조절할 수 있다고 한다. → 어디에 더 집중해서 이미지를 생성할 지 보는 것! 

또한 이미지의 크기도 변경할 수 있다. 우리가 생성하는 이미지의 특징의 스케일도 조절할 수 있어 다양한 조절로 여러 스타일을 얻을 수 있다. 

 

 

또한 여러 style image를 가지고도 생성할 수 있는데, 실제로 두 가지 다른 작품에서 나온 다른 gram matrix를 동시에 맞추려 한다. 

여기에서 별이 빛나는 밤과 화면의 두가지 임의의 예술 조합으로 새로운 스타일 이미지를 생성할 수 있다. 

 

또한 많은 GPU와 메모리를 가지고 있다면 매우 고해상도 이미지에서 이 작업을 실행할 수 있다. 

 

하지만 문제점이 있는데! 

그것은! 매우 느리다는 것이다. 하나의 이미지를 생성하려면 여러 번의 gradient ascent를 수행해야 하며 많은 수의 역전파를 수행해야 한다. 

 

해결하자! 

 

Fast Neural Style Transfer

이 방식은 일단 먼저 style image를 하나로 고정한다. 그 다음 content image만을 받아 결과를 출력할 수 있는 단일 네트워크를 학습시키는 것이다. train은 좀 시간이 걸릴 수 있지만 끝나면 feed-forward Net만 떼어내어서 사용할 수 있어 이미지를 한 번의 forward pass로 빠르게 스타일화 해 줄 수 있는 것이다.

 

이런 빠른 신경만 기반 전송은 인스턴스 정규화를 사용하는 것이 결과를 고품질로 얻기 위해 매우 중요하다고 한다. 

 

하지만 단점은 하나의 네트워크만 훈련한다는 것이다. 즉 페이스북처럼 여러 스타일을 앱에서 사용하려면 많은 네트워크에 배포해야 한다. 

! 하지만 여러 스타일을 적용할 수 있는 하나의 신경망을 훈련하는 방법을 찾았는데, 

 

Conditionnal Instance normalization 

바로 조건부 인스턴스 정규화라고 하는 것이다. 

이것은 배치 정규화나 인스턴스 정규화와 비슷한데, 정규화 단계 이후에 적용하는 scale과 shift 매개변수를 학습하는 것을 떠올려보자. 

네트워크의 모든 CNN layer는 모든 스타일에 대해 동일한 가중치를 가질 것이지만 각 스타일에 대해 다른 sccle 및 shift를 학습할 것이다. 이렇게 한다면 단일 feed foward Net에서 다양한 스타일 변환 효과를 낼 수 있는 것이다! 

더하여 테스트시에 학습된 scale과 shift의 가중 조합을 사용하여 다양한 예술 스타일을 혼합할 수도 있다. 

 

드디어! 오늘의 썸머리.. 

우리는! 신경망 내부에 어떤 일이 일어나고 있는지를 이해하는 여러 방법을 살펴보았다.

Nearest Neighbors, 차원 축소, 최대 패치 및  saliency map과 같은 메커니즘을 사용해 신경망 내부를 이해해 보았다. 

또한 DeepDeram과 Style Transfer와 같은 재밌는 이미지를 생성하는데 사용할 수 있다는 것도 알아보았다! 

 


언제나 힘들었지만 

특!히! 힘들었던 이번 포스팅 

주말 하루 놀려면 이렇게 업보(?)를 청산해야한다니

끔찍하다 안 놀고 말게 .....

대문자 F였던 22년의 삶이 t로 변해가는 것 같애 

넘 각박해서 .... 

빨리 집가서 잘랭 

안눙