머신러닝/Vision

Generative Adversarial Networks (GANs)

망나 2019. 2. 27. 21:31

본 포스팅은 Medium의 Joseph Rocca에 의해 작성된 "Understanding Generative Adversarial Networks (GANs)"를 공부하며 한글로 재작성하였습니다. 전문 번역가가 아니고 제가 이해한대로 작성하였기 때문에 문맥상 이상한 부분은 원문을 읽으시면 도움이 될 것 같습니다.

 

Deep Learning을 공부하는 분들 중 GAN에 대해서 모르는 분이 없을거라 생각합니다. 2014년도 Ian Goodfellow에 의해서 소개된 이후 최근까지 정말 많은 연구가 진행되고 관심을 받았던 모델입니다. 이미 공부를 했었고 구현도 해봤지만 최근 다시금 기본이 중요하다는 생각이 들고 있어 차근차근 기본을 다지기 위해 오늘 포스팅을 하게 됬습니다.

 

 

Introduction

 

Yann LeCun님께서 "the most interesting idea in the last 10 years in Machine Learning"이라고 GAN에 대해서 언급을 하셨다고 하는데, 대체 Generative Adversarial Networks가 무엇인지에 대해서 알아보겠습니다. GANs은 생성모델의 일종으로서 새로운 데이터를 생성할 수 있습니다. GANs을 통해 생성한 대표적인 예제를 통해서 직접 그 능력을 보도록 하겠습니다.

 

위 사진은 MNIST와 TFD 데이터를 학습시킨 GANs 모델로 생성한 데이터의 모습입니다. 가장 오른쪽에 노란 테두리의 데이터가 실제 데이터이며 나머지는 모두 GANs에 의해 생성된 일명 가짜 데이터입니다. (source: "Generative Adversarial Nets" paper)

 

이제 본격적으로 GANs에 대해서 깊게 파고들어 보겠습니다.


Generating random variables

 

먼저, 랜덤 변수를 생성하는 과정(process of generating random variables)에 대해서 알아보도록 하겠습니다. 기존에 존재하는 방법들에 대해서 알아보겠습니다. 특히, 균등 랜덤 변수(uniform random variables)로 부터 복잡한 랜덤 변수(complex random variables)를 생성할 수 있는 inverse transform method에 대해서 알아보도록 하겠습니다.

 

Uniform random variables can be pseudo-randomly generated

컴퓨터는 기본적으로 결정론적으로 동작하기 때문에(fundamentally deterministic) 이론상 정말로 무작위로 숫자를 생성하는 것은 불가능 합니다. 하지만, 최대한 무작위에 가까운 속성을 지닌 연속적인 숫자를 생성하는 알고리즘을 정의하는 것은 가능합니다. 특히, 컴퓨터는 0과 1사이의 대략적으로 균등한 무작위 분포를 가지는 난수를 생성하는 것이 가능합니다.

 

Random variables expressed as the result of an operation or a process

더욱 복잡한 난수를 생성하는 다양한 방법들이 있습니다. 예를 들면, inverse transform method, rejection sampling, Metropolis-Hasting algorithm 등. 

 

Rejection sampling은 simple distribution으로부터 특정 조건에 따라서 sampled value를 accept or reject하는 방법으로 난수를 표현합니다. 따라서 난수를 효과적으로 생성하는 것은 조건에 영향을 받습니다.

 

Metripolis-Hasting altorithm는 Markov Chain (MC)에서 아이디어를 얻은 방법입니다. MC를 통해서 얻는 안정된 고정 분포 값으로 부터 우리의 랜덤 분포 값을 얻을 수 있습니다.

 

The inverse transform method

inverse transform method는 우리가 생성 가능한 uniform random variable을 적용하여 complex random variable을 결과로 얻는 함수를 나타낸 것 입니다. 일차원의 예를 들어보겠습니다. X를 우리가 얻고자하는 complex random variable라고 하고, U를 [0, 1] 범위의 uniform random variable이라고 가정합시다. random variable은 Cumulative Distribution Function (CFD)로부터 정의된 것 입니다. CDF는 일차원에서 [0, 1] 사이의 random variable을 정의하는 함수 입니다.

 

$$CDF_{X}(x) = \mathbb{P}(X \leq x)   \in [0, 1]$$

 

uniform random variable U의 경우 아래와 같이 표현할 수 있습니다.

 

$$CDF_{U}(u) = \mathbb{P}(U \leq u) = u      \forall_{u}\in [0, 1]$$

 

여기서 CDF_X는 invertible하고 그 역은 다음과 같습니다.

 

$$CDF_{X}^{-1}$$

 

$$Y = CDF_{X}^{-1}(U)$$

 

$$CDF_{Y}(y) = \mathbb{P}(Y \leq y) = \mathbb{P}(CDF_{X}^{-1}(U) \leq y) = \mathbb{P}(U \leq CDF_{X}(y)) = CDF_{X}(y)$$

 

위에 식에서 나타나듯이, Y와 X는 같은 CDF를 갖고 동일한 random variable을 정의합니다. 따라서, Y를 정의함으로써(uniform random variable 함수로) 우리는 목표로 삼은 분포의 random variable을 정의할 수 있습니다. 개념적으로, "transform function"의 목적은 초기 확률 분포를 재구성 하는 것 입니다.

 

Inverse transform method의 예. In blue: the uniform distribution over [0, 1]. In orange: the standard Gaussian distribution. In grey: the mapping from the uniform to the Gaussian distribution

 


Generative models

 

we try to generate very complex random variables...

만약 n by n pixels 크기 흑백 강아지 이미지를 생성한다고 할 때, N(=n x n) 차원의 vector로 데이터를 나타낼 수 있습니다. 하지만, 우리가 가진 vector를 square shape으로 되돌렸을 때 강아지를 나타낸다고는 할 수 없습니다. 따라서 우리는 N 차원의 벡터 공간에서의 특정 확률 분포가 강아지 모습을 나타낸다고 할 수 있습니다.

 

완전히 새로운 강아지 이미지를 생성하는 문제는 다시 말해서 N 차원의 vector 공간에서 "dog probability distribution"을 따르는 새로운 vector를 생성하는 문제로 볼 수 있습니다. 다시 말해, 우리는 특정 확률 분포(생성을 원하는)와 관련된 무작위 변수를 생성하는 문제를 풀어야 한다고 할 수 있습니다.

 

여기서 우리는 중요한 2가지를 생각할 수 있습니다. 첫번째는, very large space에서의 very complex distribution인 "dog probability distribution"(예로 강아지를 들었을 뿐이고 무엇이든 우리가 생성하길 원하는 것에 대한 확률 분포를 뜻 합니다.). 두번째로, 우리가 underlying distribution(강아지처럼 생긴 실제 이미지를 통해서 얻을 수 있는)의 존재를 안다고 하더라도 우리는 이 분포를 명시적(explicitly)으로 표현하는 방법을 알지 못 합니다. 앞의 문제들 때문에 특정 분포의 random variables를 생성하는 것이 어렵습니다. 이제 두 문제를 어떻게 해결하는지 알아보도록 하겠습니다.

 

...so let's use transform method with a neural network as function

새로운 강아지 이미지를 생성할 때 첫번째 문제는 N차원의 vector space에서의 "dog probability distribution"이 very complex하고 어떻게 직접 complex random variables를 생성할지 모른다는 것이다. 하지만, 우린 N차원의 uncorrelated uniform random variables을 생성하고, transform method를 사용할 수 있다. 우리는 간단한 N차원 확률 변수를 통해서 N차원의 확률 변수를 결과로 주는 아주 복잡한 함수를 표현할 필요가 있습니다. (제가 작성하고도 무슨 말을 하는 건지 이해가 힘드네요..).

 

transform function은 명시적으로 표현되기 어렵기 때문에 우리는 데이터를 보고 배워야 합니다.

 

대부분의 경우에 위에서 말한 아주 복잡한 함수는 신경망 네트워크 모델링을 뜻 합니다. 신경말 모델 기반의 transform function은 간단한 N차원의 uniform random variable을 입력으로 받고, "dog probability distribution"을 따르는 다른 새로운 N차원의 random variable을 출력으로 주어야 합니다. 그리고 우리는 이 신경망 모델을 훈련(train)시켜야 하고, 다음 단락에서 생성 네트워크를 훈련시키는 두 가지 방법에 대해서 알아보도록 하겠습니다.

 
신경망 네트워크를 활용한 생성 모델의 모습

Generative Matching Networks

 

Training generative models

우리는 앞서 새로운 강아지 이미지를 생성하는 문제를 "강아지 이미지의 확률 분포"를 갖는 랜덤 벡터 값을 N 차원의 벡터 공간에 생성하는 문제로 재정의 할 수 있고 이를 위해서 뉴럴 네트워크를 변환 함수 모델로 사용할 수 있다는 것을 확인 했습니다.

 

이제 재대로된 변환 함수 모델을 표현하기 위해서 우리는 네트워크를 훈련(최적화)시켜야 할 필요가 있습니다. 이를 위해서 직접적, 간접적 2가지 훈련 방법을 사용할 수 있습니다. 먼저 직접적 훈련 방법은 실제 확률 분포값과 생성 확률 분포값을 직접 비교함으로써 둘의 차이(오류 값)을 backpropagating하는 방법입니다. 이 방법은 Generative Matching Networks (GMNs)로 알려져 있습니다. 다은으로 간접적 훈련 방법은 두 확률 분포 값을 직접 비교하지 않고, 최적화 과정에서 downstream을 통하여 생성 확률 분포를 실제 확률 분포에 가까워 지도록 하는 방법입니다. 이 방법은 Generative Adversarial Networks (GANs)라고 알려져 있습니다. 먼저! GMNs에 대해서 자세히 알아본 뒤에 GANs에 대해서 다루도록 하겠습니다.

 

Comparing two probability distributions based on samples

 

GMNs는 실제 확률 분포와 생성 확률 분포를 직접적으로 비교하는 방법입니다. 하지만, 우리는 "강아지 이미지의 확률 분포"를 어떻게 명시적으로 표현할지에 대해서 모르고 또한, 생성 확률 분포는 명시적으로 표현하기에는 너무 복잡합니다. 따라서, 두 확률 분포를 명시적으로 표현해서 비교하는 것은 사실상 불가능합니다. 하지만, 만약 확률 분포의 샘플을 이용해서 비교하는 방법이 있다면 우리는 그 방법을 이용해서 네트워크를 훈련시킬 수 있습니다. 우리는 이미 실제 확률 분포에 대한 샘플을 가지고 있으며 훈련 과정에서 우리가 생성한 확률 분포에서도 샘플을 얻을 수 있습니다.

 

비록, 이론적으로 두 분포의 샘플을 비교할 때 효과적으로 사용할 수 있는 거리가 많지만 우리는 특별히 Maximum Mean Discrepancy (MMD) 방법에 대해서 언급하도록 하겠습니다. MMD는 두 확률 분포의 샘플을 활용하여 둘 간의 거리를 계산(추청)할 수 있습니다. 본 포스트에서는 MMD에 대해서 더 이상 자세히 다루지는 않습니다.

 

Backpropagation of the distribution matching error

 

샘플을 활용하여 두 분포를 비교하는 방법을 알았으니, 이제 우리는 GMNs으로 생성 모델의 훈련 과정을 정의할 수 있습니다. 균일한 확률 분포를 갖는 확률 변수가 입력으로 주어졌을 때, 우리는 "강아지 이미지의 확률 분포"를 갖는 확률 분포를 출력으로 생성하기를 원합니다. 이를 위한 방법 GMNs은 아래의 단계를 반복함으로써 네트워크를 최적화 시킵니다.

 

  • 일정한 입력을 생성합니다.
  • 입력값들을 네트워크에 넣고, 생성된 출력값들을 모읍니다.
  • 실제 "강아지 이미지의 확률 분포"의 샘플과 생성된 출력의 샘플을 비교합니다. (예를 들어 실제 강아지 이미지 샘플과 생성된 출력의 샘플에 대해서 MMD 거리를 계산합니다)
  • Backpropagation으로 두 샘플의 거리 (ex. MMD)를 줄임으로써 gradient descent 1 스텝이 이루어 집니다.

GMN은 간단한 랜덤 입력을 받아서 새로운 데이터를 생성하고, 생성된 데이터의 확률 분포와 실제 확률 분포를 바로 비교하여 이를 기반으로 얻은 오류를 backpropagate를 통해 네트워크를 훈련 시킵니다.


Generative Adversarial Networks

The "indirect" training method

"direct" 방법은 생성 네트워크 훈련 과정에서 실제 분포와 생성된 분포를 직접 비교하는 방법이였습니다. GAN의 아이디어는 이러한 직접적인 비교를 두 분포를 downstream task(뉴런을 통해 계산하는 과정을 뜻한다고 합니다)하는 형태로 간접적인 비교 방법으로 대체하는 것 입니다. 생성 네트워크는 이 과정을 통해서 생성 분포가 실제 분포에 점점 더 가까워지도록 훈련이 됩니다.

 

GAN에서의 downstream task는 실제 분포와 생성 분포의 샘플간의 discrimination task를 뜻합니다. 또는 discrimination이 가능한 실패하기를 바라면서 "non-discrimination" 작업이라고 할 수도 있습니다. 따라서 GAN의 구조에서, discriminator는 실제와 생성 데이터의 샘플을 받아서 가능한 둘을 분류하려 노력하고, generator는 가능한 discriminator를 속일 수 있는 데이터를 생성하도록 훈련됩니다. 그렇다면, 직접적, 간접적 방법이 이론적으로 동일한 최적의 생성 네트워크를 이끌어낼 수 있다는 간단한 예제를 살펴 보겠습니다.

 

The ideal case: perfect generator and discriminator

왜 discriminator를 속이도록 generator를 학습시키는 것이 generator를 target 분포에 맞도록 직접적으로 학습시키는 것과 동일한 결과를 얻을 수 있는지를 이해하기 위해서 간단한 1차원의 예제를 생각해 보겠습니다. 잠시동안 generator와 discriminator가 어떻게 서로 추상적으로 인식되고 표현되는지는 생각하지 않겠습니다 (다음 섹션에서 다루도록 하겠습니다). discriminator와 generator는 어떤 종류의 모델에 의해서도 제약받지 않는다는 의미에서 "완벽"하다고 여겨집니다. (어떠한 매개 변수화된 모델도 discriminator와 generator로 사용 가능하다는 의미인 것 같습니다.)

 

우리가 실제 데이터의 분포를 알고 있을 때, 1차원 가우시안에서 실제 데이터 분포와 같은 분포의 샘플을 생성할 수 있는 generator를 원합니다. 우리가 설명한 "direct" 훈련 방법은 매 반복마다 실제와 생성 분포의 차이(오류)를 측정해서 조정하는 과정을 거칩니다. 이렇게 반복되는 훈련 과정으로 우리는 최종적으로 실제 데이터 분포와 동일한 분포를 생성하는 generator를 얻을 수 있습니다.

 

"직접적" 훈련 방법에 대한 그림입니다. 파랑색으로 그려진 분포가 실제 데이터가 갖는 분포이고 오렌지색으로 그려진 분포가 generator가 생성한 생성 데이터 분포입니다. 훈련 과정의 매 반복마다, 우리는 두 분포를 비교하고 gradient descent 단계를 거쳐 네트워크의 가중치들을 조정합니다. 여기서의 비교는 평균 및 분상에 대해 수행됩니다. 

 

"indirect" 훈련 방법에서 우리는 discriminator를 함께 고려해야 합니다. 여기서 우리는 discriminator를 어떠한 주어진 점에서라도 클래스("true" or "generated")를 예측하는 정보를 기반으로 실제 분포와 생성 분포를 구분할 수 있다고 가정합니다. 두 분포가 멀리 떨어져 있으면, discriminator는 더욱 쉽고 높은 수준의 신뢰로 분류할 수 있습니다. 만약 우리가 discriminator를 속이고 싶다면, 우리는 실제 분포와 유사한 분포를 생성해야 합니다. 생성된 분포가 모든 데이터 포인트에서 실제 분포와 동일할 때, discriminator는 클래스를 분류하기 어려워 집니다. 

 

Adversarial 방법을 보여주는 그림입니다. 파랑색 분포가 실제 데이터 분포이며 오렌지색 분포가 생성된 분포입니다. 오른쪽의 y축과 관련된 회색 그래프는 discriminator가 정답을 맞출 확률을 뜻합니다. 실제와 생성 분포가 가까울수록 discriminator는 틀릴 확률이 높습니다.

 

이 시점에서 "indirect" 방법이 정말로 좋은 아이디어인지 생각해볼 필요가 있습니다. 게다가, "direct" 방법보다 더 복잡하게 느껴지고 discriminator는 실제로 완벽하지 않습니다. 하지만 discriminator는 학습이 가능합니다.

 

The approximation: adversarial neural networks

이제 GANs 구조에 사용되는 generator(생성자)와 discriminator(판별자)의 형태에 대해서 자세히 알아보도록 하겠습니다. Generator는 뉴럴 네트워크로 이루어진 변환 함수 모델입니다. 입력값으로 무작위 변수를 취하고 일단 훈련이 되고나면 목표로하는 분포를 따르는 임의의 변수를 반환합니다. 이러한 과정이 복잡하기 때문에 우리는 discriminator라는 또 다른 뉴럴 네트워크를 사용합니다. Discriminator는 이름대로 판별 역할을 하는 모델입니다. Discriminator는 입력(강아지 이미지 예를 들면 N 차원의 벡터 값)을 받아서 이 입력값이 실제 데이터 값(실제 강아지 이미지)일 확률을 출력합니다.

 

일단, 두 모델에 대한 정의가 끝나면, 각 모델은 서로 반대의 목표를 가지고 동시에 훈련이 됩니다.

 

  • Generator(생성자)의 목표는 discriminator(판별자)를 속이도록, 마지막 분류 오류를 최대화 하도록 생성 뉴럴 네트워크를 훈련 시키는 것 입니다.
  • Discriminator(판별자)의 목표는 가짜 생성 데이터를 탐지하는 것으로, 마지막 분류 오류를 최소화 하도록 판별 뉴럴 네트워크를 훈련시키는 것 입니다.

따라서, 네트워크 훈련 과정의 매 순간, 생성 네트워크의 가중치는 분류 오류를 증가시키도록 업데이트되고, 판별 네트워크의 가중치는 분류 오류를 감소시키도록 업데이트가 됩니다.

 

Generative Adversarial Networks의 전체적인 과정입니다. Generator는 랜덤 변수를 입력으로 받아서 새로운 데이터를 생성합니다. Discriminator는 "true"와 "generated" 데이터를 받아서 그 둘을 판별하는 분류자를 만듭니다. Generator의 목표는 Discriminator를 속이는 것이고(실제 데이터와 가능한 비슷한 데이터를 생성함으로써 분류 오류를 증가시키는 것), Discriminator의 목표는 실제 데이터와 생성 데이터를 잘 구분하는 것 입니다.

 

이렇게 반대되는 목표를 가진 두 네트워크를 훈련시키기 때문에 이름을 "adversarial networks(적대적 네트워크)"라고 합니다. 두 네트워크는 서로를 이기기 위해 각각 나아지는 방향으로 훈련이 됩니다. 게임 이론의 관점으로 보면 우리는 이러한 환경을 2 플레이어의 minimax 게임이라고 할 수 있고, 평행 상태는 generator가 목표 대상 분포와 정확히 동일한 데이터를 생성하고 discriminator가 50%의 확률로 "실제"와 "생성"데이터를 구분하는 것 입니다.

 

 

### GANs의 수학적인 접근(수식)에 대해서는 추후 내용 추가하여 보완하도록 하겠습니다 ###

'머신러닝 > Vision' 카테고리의 다른 글

The Lottery Ticket Hypothesis  (4) 2019.06.24
ResNet 이해하기  (0) 2019.06.04
Batch Normalization?  (0) 2018.10.23
Recurrent Neural Networks ?  (0) 2018.09.30
Convolutional Neural Networks ? [2]  (0) 2018.09.06