본문 바로가기

딥러닝

16. GAN - 생성모델

GAN : 지폐위조범 vs 경찰 (출처 : 카카오리포트)

1. GAN

 

 GAN은 Generative Adversarial Nets의 줄임말 입니다. 딥러닝에 대해서 관심이 있으시거나 공부를 하신분이라면 GAN이란 이름을 많이 들어보셨을 겁니다. GAN 2014년에 발표된 이후로 엄청난 인기를 끌어서 지금까지도 끊임없이 연구되고 관련 논문이 나오고 있습니다. 그 이유는 생성모델로써 엄청난 가능성을 보여주었기 때문이라고 생각합니다. 물론 생성 모델로써만 사용되는 것은 아닙니다. 

 

 기존 머신러닝은 보통 예측, 분류 등의 task를 주로 수행합니다. 예측과 분류에서는 대단한 성능을 보여주고 있지만 생성 모델에서는 그렇지 못했습니다. 하지만 GAN이 등장하고 나서 부터는, 이제 생성모델에서도 인간을 뛰어넘는 성능을 보여주지 않을까라는 기대심을 갖게 된 것이죠.

 

2. GAN 이란?

 

 생성 모델을 만드는 원리가 몇가지 있겠습니다만, GAN은 생성하고자 하는 데이터의 분포를 예측하는 과정을 통해 작동합니다. 예를 들어 '개'를 그리는 GAN 모델이 있다고 한다면, 개의 분포를 예측하고, 그 분포 내에서 sampling 과정을 통해 sample을 생성해 내는 것입니다.

 

 이하의 GAN은 가장 처음에 발표된 Vanila GAN을 기준으로 설명하겠습니다. Vanila GAN은 Generative model과 Discriminator 모델로 구성됩니다. 편의상 G모델 D모델로 부르겠습니다. G모델은 Noise로 부터 Sample을 생성하고, D모델은 G모델에서 생성한 sample은 가짜로, 실제 sample을 진짜로 구별하는 task를 수행합니다. 그래서 GAN의 loss는 지금 말한 3가지 loss가 기본이 됩니다.

 

 G모델의 loss는 G모델이 생성한 sample을 D모델이 가짜라고 구별했을 때, (= D모델을 속이지 못했을때)

 D모델의 loss는 G모델이 생성한 sample을 가짜라고 구별 하지 못했을때, 실제 sample을 진짜로 판별 하지 못했을 때 loss를 줍니다.

 

 G모델이 생성하는 sample은, D모델이 진짜인지 가짜인지 구별하기도 힘들고, 실제 data와 유사한 sample을 만들게 됩니다. 이와 같은 방식을 adversarial learning 이라고 부릅니다. 

 

 맨 처음 발표된 GAN 논문에서는 GAN이 어떻게 작동하는지 이론을 제시하고, 그 이론이 정말 맞는지를 정리해서 발표했습니다. 이런 이론이 쉽지 않고, 연구하는 입장이 아니라면 궁금해하지 않을 수도.... 있으니 자주보는 수식이나 사진을 봐보도록 하겠습니다.

 

GAN Loss

 위의 수식은 GAN의 loss를 한줄로 적은 것 입니다. 알고보면 간단한 수식이라 쉽게 눈이 들어올 수도 있지만, 저처럼 수식이 눈에 잘 안들어오는 분들도 계실 겁니다.

 

 수식의 오른쪽의 첫번째 항을 보면, 실제 data에서 sampling 한 x를 함수 D에 input으로 넣은 값입니다. D 모델은 진짜라고 판별할시 1, 아닐시 0을 출력합니다. log 1은 0이고, log x값이 0에 가까울수록 음의 무한대로 수렴하게 됩니다. 수식의 왼쪽을 보면 D 입장에서 V의 최대값을 내도록 학습합니다. 따라서 D모델은 실제 data의 sample이 들어오면 1을 출력하도록 학습합니다. 

 

 수식의 오른쪽의 두번째 항은 G모델에서 나온 값을 이용해서 계산합니다. 아까와는 반대로 G모델에서 생성된 sample을 D모델이 '진짜'로 판별하면 log(1-1)이 될 것이고, '가짜'로 판별하면 log(1-0)이 되겠죠. 다시 수식의 왼쪽을 보면 G모델은 V가 최소가 되도록 학습합니다. 즉 G모델은, G모델이 생성해낸 샘플을 D모델이 '진짜'로 판별 하도록 학습합니다. 반면 D모델은 V가 최대가 되어야 하니까 G모델이 생성해낸 샘플을 D모델이 '가짜'로 판별하도록 학습하죠.

 

 실제로 코드를 짜서 학습을 진행할때는 G모델의 loss와 D모델의 loss를 각각 따로 계산합니다. 위의 사진은 편의상 한줄로 예쁘게 정리해낸 것입니다. 

 

 

3. GAN의 발전

 

 글의 맨앞에서도 말씀드렸지만, GAN은 그 발전 속도가 엄청났습니다. cGAN, CycleGAN, Wasserstein GAN 등등 GAN 하나만 공부하기도 엄청난 시간이 듭니다. 

 

 그 중에서도 GAN의 초반 발전은 역시 conditioning을 주거나, G모델, D모델의 layer 구성을 바꾸는 것부터 시작했습니다. CGAN은 Conditional GAN의 약자로 다음과 같은 구조입니다.

 G모델과 D모델의 input에 각각 추가정보 (보통 label)를 줘서 학습하는 거죠. 이러면 원하는 label에 맞게 sample을 생성해낼 수 있습니다. 

 

 그 다음으로는 2016년에 발표된 DCGAN 입니다. GAN의 loss나 구성을 보시면 알겠지만 사실 훈련이 저어엉말 어려운 model 입니다. 보통은 잘 안됩니다. Loss가 잘 떨어지지 않고 훈련이 불안정하여 G모델과 D모델을 간단하게 구성했었습니다. DCGAN 연구자들은 GAN이 훈련도 잘 안되고 성능도 만족스럽지 못하다! 하면서 다음과 같은 모델 구조를 제시합니다.

 

 

  위와 같이 G모델을 구성하였는데, 굉장히 좋은 결과가 나오죠. 

 

 

4. GAN의 구현

 

 GAN은 제 경험상 많은 사람들이 쉽게 구현에 도전하지 않는 것 같습니다. 딥러닝 프레임워크의 발달로 DNN, CNN 등은 간단한 API 한줄로 구현할 수 있습니다. Loss를 계산하고, layer의 파라메터 업데이트도 아주 간단히 구성할 수 있습니다. 반면 GAN을 구현한다? 일단 논문 부터가 이해하기 쉽지 않습니다. G모델이 Noise로 부터 학습을 한다는데 무슨소리인가? 학습을 G모델, D모델 2 step을 반복해야 한다?

 그래도 사실 GAN은 공개된 정보가 많기 때문에 시도해볼 수 있긴 합니다. 그래서 다음포스팅에 GAN 구현 관련 글을 작성하도록 하겠습니다!

 

 

'딥러닝' 카테고리의 다른 글

17. GAN - 예제코드  (0) 2019.12.05
15. AutoEncoder 예제코드  (0) 2019.11.26
14. AutoEncoder  (0) 2019.11.23
13. RNN (순환 신경망)  (0) 2019.11.20
12. Learning Curve (학습 곡선)  (2) 2019.11.19