GAN (Generative Adversarial Network)

1. Introduction

GAN도 Auto Encoder와 마찬가지로, Encoder를 사용해서 latent vector를 찾아낸다. 이 둘 간의 차이점은, Auto Encoder같은 경우에는 Encoder를 통해 압축한 latent vector를, Decoder를 통해 “원본을 복원”하는 것이 주 목적이라면, GAN은 Encoder를 통해서 찾아낸 latent vector를 사용하여, “새로운 출력”을 만들어낸 다는 것이다.

예를 들면, Encoder의 input으로 다양한 장신구를 착용한 여성의 사진을 넣는다고 해보자. 그러면 ‘귀걸이’를 의미하는 latent vector, 긴 속눈썹을 의미하는 latent vector, 등 다양한 특징들을 잡아내어 아예 (실존하지 않는) 새로운 여성의 사진을 만들어낼 수 있다!


2. GAN의 원리

GAN은 다음과 같이 두 부분으로 구성된다

  • 1 ) Generator (생성기)
  • 2 ) Discriminator (판별기)

이 두 부분을 다음 예시를 통해 쉽게 이해할 수 있다.

Example

https://img1.daumcdn.net/thumb/R720x0.q80/?scode=mtistory2&fname=http%3A%2F%2Fcfile3.uf.tistory.com%2Fimage%2F9928E6375B75872D170654

최대한 실제 지폐와 유사하게 돈을 만들어 내고 싶은 “위조 지폐범(Generator)”이 있고, 이러한 나쁜 범인들을 검거하고자 하는 “경찰(Discriminator)”이 있다. 위조 지폐범은 자신이 만들어낸 지폐를 경찰로 하여금 진짜 지폐라고 밑게끔 지폐를 만들어내려고 할 것이고, 경찰 또한 최대한 위조 지폐와 일반 지폐를 비교하면서, 위조 지폐를 최대한 잘 구분해내려고 할 것이다. 이 둘 간의 반복적인 경쟁이 끝나고 나면, 위조 지폐범은 거의 실제와 유사한 지폐를 생성해내는 기술을 터득할 수 있을 것이다. 이것이 GAN도 이 사례와 같은 원리로 최대한 ‘그럴 듯한’ 사진을 만들어내게 된다.

위의 예시를 GAN에 적용하면 다음과 같은 그림으로 표현할 수 있다.

https://i.imgur.com/6ZPdsM8.png

D (Discriminator, 판별기)

  • Input : 1) “진짜 정답” & 2) Generator가 만들어낸 “가짜 정답”
  • Output : 주어진 “가짜 정답”이, “진짜 정답”과 얼마나 유사한지 (0~1) 사이 값으로 반환 ( 1 = 진짜다! & 0 = 가짜다! )

G (Generator, 생성기)

  • Input : latent vector (노이즈)
  • Output : 진짜인척을 하고 싶은 정답 ( label값이 1에 가깝게 되도록! )
  • G의 paramter들이 update되는 동안, G의 paramter들은 고정된다

https://img1.daumcdn.net/thumb/


3. Training Generator & Discriminator

Loss Function of “Discriminator”

Decoder가 진짜와 가짜를 잘 구분하는 능력을 기르기 위해, minimize해야 하는 Loss function은 다음과 같이 표현할 수 있다. (Binary Cross Entropy)

\(L^{(D)}(\theta^{(G)},\theta^{(D)})\) = \(-E_{x \sim P_{data}}logD(x)\) \(-E_{z}log(1-D(G(z)))\)

위 식을 직관적으로 이해해보자. ( 위 식에서 \(D(x)\)는 실제 정답 데이터, \(G(z)\)는 Generator가 만든 가짜 데이터 이다 )

위 식을 최소화 하기 위해서는,

  • 1 ) maximize \(D(x)\) : 실제 정답을 정답이라 할 줄(=predict as 1) 알게끔!
  • 2 ) minimize \(D(G(x))\) : 가짜 정답을 오답이라고 (=predict as 0) 말하게끔!

해야한다.


Loss Function of “Generator”

Generator는 최대한 진짜와 유사하게 생긴 가짜를 생성해내는 능력을 그리기 위해 어떠한 loss function을 minimize해야 할까?

정답은 바로 “Discriminator의 Loss function”에 ‘(-)’를 붙이는 것이다. 직관적으로 생각했을 때, 이 둘의 목표는 서로 정반대이다. 한마디로, Generator는 위 \(L^{(D)}(\theta^{(G)},\theta^{(D)})\) 를 maximize하기 위해 노력해야 한다.

하지만 Generator 입장에서 \(L^{(D)}(\theta^{(G)},\theta^{(D)})\)의 두 개의 구성요소인 (1) \(-E_{x \sim P_{data}}logD(x)\) 와 (2) \(-E_{z}log(1-D(G(z)))\) 중, (1) 은 자신과 관련이 없다. (진짜데이터가 진짜임을 판별하는 것은 Discriminator와만 관련 있는 것이지, Generator와는 관련이 없다)

따라서, Generator의 Loss function은 다음과 같이 표현할 수 있다.

\(L^{(G)}(\theta^{(G)},\theta^{(D)})\) = \(-E_{z}log(D(G(z)))\)



4. 다양한 종류의 GAN

  • CGAN (Conditional GAN, 조건부 GAN)
  • WGAN (Wesserstein GAN, 베셔슈타인 GAN)
  • LSGAN (Least Squared GAN, 최소 제곱 GAN)
  • ACGAN (Auxiliary Class GAN, 보조 분류 GAN)