Gradient Ascent

2020. 3. 15. 15:54Artificial Intelligence

*본 포스팅은 Stanford CS231n 강의를 참조하였음을 미리 밝힙니다.
*캡쳐된 일부 강의 자료들은 CS231n에서 제공하는 PPT 슬라이드를 참조하였습니다.

현대 딥러닝의 아쉬운 점 중 하나는 딥러닝의 학습 과정을 딥러닝 코드를 작성한 사람조차 알기가 어렵다는 점입니다.

모델 학습이 성공했다면 왜 성공했는지, 실패했다면 왜 실패했는지를 해석하기가 어려운데, 그 이유는 기본적으로 딥러닝 모델은 많은 데이터를 한꺼번에 처리하며, 여러 겹의 레이어를 학습시키는 과정에서 적어도 수만 가지의 파라미터를 다루어야 하기 때문입니다.

 

따라서 VIsualize(시각화)를 통해 각각의 레이어에서 무슨 일이 일어나고 있는지, 더 나아가서 학습 전반적이 과정에서 무슨 일이 일어나고 있는지를 연구하려는 여러 시도들이 있고, 이러한 시도들은 비단 딥러닝 뿐 아니라 Data Science등의 여러 컴퓨터 과학 분야에서 다루고 있습니다.

 

이번 포스팅에서는 앞서 언급한 이 여러 시도들 중 하나인 Gradient Ascent에 대해서 다루어보려고 합니다.

(Deep Learning Visualization에 대해서는 이어지는 여러 포스팅들에서 차례로 다루려고 합니다.)

 

 

Definition

 

Gradient Ascent는 말 그대로 해당 모델에서 Loss가 최대가 되는 Parameter를 찾는 방법입니다.

Gradient Descent가 Loss가 최소가 되는 Parameter를 찾는 방법인 것으로 보았을 때 이 둘을 서로 상반되는 개념으로 보아도 무리가 없는 것처럼 보입니다. 그러나 Visualizing CNN Filter를 위해 사용되는 개념과는 조금 차이가 있으니 유의해야 합니다. (Backprop 과정에서 Gradient Ascent를 사용한다는 의미가 아닙니다)

 

단순하게 Gradient Descent와 반대되는 개념처럼 보이는 Gradient Ascent가 Deep Learning Visualization에서 중요한 역할을 차지하는 이유는, 이 방법을 통해 중요한 Feature들을 확대하여(부각하여) 보여줄 수 있기 때문입니다.

Gradient Ascent를 통해 뉴런을 최대로 활성화 시키는 합성 이미지를 만들어낼 수 있고, 이것이 해당 레이어에서 일어나는 일을 시각화 하는데에 단서를 제공하게 됩니다. (Generate a synthetic image that maximally activates a neuron - cs231n)

 

cs231n lecture 11 Gradient Ascent를 통해 추출한 layer의 Feature

 

정리하자면, Input Image에 Gradient Ascent를 적용함으로써, 특정한 필터의 response를 극대화 할 수 있고, 이를 통해 특정 필터에서 무슨 일이 일어나고 있는지를 시각화 할 수 있다는 것이 기본 아이디어 입니다.

 

 

cs231n lecture 11 각 레이어에서 일어나고 있는 특징들을 Gradient Ascent로 추출

Gradient Ascent를 통해 Model Feature들을 시각화하는 과정은 다음과 같습니다.(cs231n Lecture 11 참고)

 

1. initialize image to zeros

 

- 처음 이미지를 zero값으로 초기화 해줍니다. (특정 이미지를 분류하는 문제가 아니라, 레이어의 Feature들을 시각화하는 것이 목적이기 때문에 처음에 이미지를 input으로 넣는 것 보다 zero값을 넣어주는 것이 효과적입니다.

이 zero초기화 된 이미지는 나중에 Gradient Ascent를 통해 점차 특정 필터가 나타내는 이미지 값으로 바뀌게 됩니다.

 

Repeat: 

- 기대하는 결과가 나올때까지 반복시켜줍니다.

 

2. Forward image to compute current scores

 

- 이미지 값을 forward pass 시켜줍니다. forward pass 과정을 지나면서 Loss가 계산되고 이 값을 Backprop시켜서 input image를 업데이트해줍니다. 

 

3. Backprop to get gradient of neuron value with respect to image pixels

 

- 헷갈려서는 안되는 부분 중의 하나는 Backprop를 진행하는 과정에는 "Gradient Descent"방법을 사용한다는 것입니다. Gradient Ascent에 대한 내용이므로 Backprop을 사용하는 데에 대해 헷갈릴 수 있으나, Gradient Ascent는 input image의 값을 업데이트 하는 방법입니다.

 

4. Make a small update to the image

 

- 3번의 과정을 통해 나온 Gradient를 input image에 더해줍니다. 이때 Gradient Ascent를 사용하여, 특정 필터의 값을 최대화하는 image값 (local optima)를 찾을 때까지 업데이트를 해 주면 됩니다. 

 

추상적인 감이 있으므로(혹은 설명이 명확하지 못해서) 간단한 예제를 통해 Gradient Ascent가 어떻게 레이어에서 일어나는 일을 시각화하여 보여줄 수 있는지 살펴보도록 하겠습니다.

 

 

Example.

 

- Class Model Visualization

task : Generate Image which will best represent a category

목표는 해당 카테고리를 가장 잘 반영하는 이미지를 생성해 내는 것입니다. 예를 들어, '고양이'라는 카테고리가 주어지면, 기존의 딥러닝 모델과는 반대로, 해당 카테고리를 가장 잘 반영하는 고양이 이미지를 생성해 내는 것입니다.

이를 수행하는 과제를 Class Model Visualization 이라고 합니다. 

 

해당 과제를 해결하기 위해서는 해당 카테고리 점수 (c가 카테고리, S는 score)를 최대로 만드는 input Image 를 찾아내면 됩니다. 즉 해당 수식에서 I값을 구하면 됩니다. $$ argmax_I S_C{(I)} $$

 

I를 구하기 위해서

우선 zero이미지에서 backprop을 통해 gradient를 계산하고, 해당 score, 즉 고양이 카테고리에 대한 점수를 최대로 만드는 local optimal을 찾을 때까지 Gradient Ascent 방법을 사용하는 것입니다. 

 

주의하실 것은 네트워크의 Parameter를 업데이트 하는 것이 아니라, score을 최대화 할 수 있도록 Image의 값을 업데이트 한다는 것입니다. (we're optimizing the image, keeping the weights fixed)

 

Code

 

코드는 CS231n강의의 Assignment3을 바탕으로 작성되었으며, 제 Github Repository에 Gradient Ascent를 이용하여 Class Model Visualization을 구현한 자세한 코드가 작성되어 있습니다. 아래 링크를 통해 자세한 코드를 확인해 주세요.

https://github.com/sckimynwa/ComputerVision_CS231/tree/master/assignment3

불러오는 중입니다...

 

 

반응형

'Artificial Intelligence' 카테고리의 다른 글

Generative Adversarial Network(GAN)  (0) 2020.03.20
Image Style Transfer Using Convolutional Neural Networks  (0) 2020.03.17
Saliency Map  (3) 2020.03.15
Anomaly Detection  (0) 2019.02.21
Learning Curves  (0) 2019.02.20