본문 바로가기
논문

[GAN] Generative Adversarial Network 논문 정리

by DI_Lee 2021. 4. 4.

이번주에 정리할 논문은 바로 GAN이다.

 

Generative Adversarial Network (GAN)

 


🔥등장 배경

지난 주 논문에서 등장한 모델인 VAE는 data likelihood를 maximization하기 위해서 여러가지 trick들을 이용했다. 원래 generator를 만들기 위해서 decoder를 붙여주고 완벽하게 최적화할 수 없는 부분은 버리고 Lower Bound를 optimization하는 방법을 활용했다.

 

→ 그러나 이렇게 푸는 것은 너무 복잡하다. 왜? VAE는 경험적으로 모델을 만든 것이 아니고, 수학적으로 증명을 시작해서 모델을 만든 것이기 때문. 즉 하려고 했던 것이 원래 모델의 density를 정확하게 모델링하고 싶었던 것

 

→ 근데 그렇게 하지말고 좀 더 practical하게 그냥 sampling을 했을 때 그림이 그럴듯하게 나오게만 만들면 안될까?

즉 GAN은 어떤 density function을 활용하지 않고, 대신에 game-theoretic을 이용한다 (어떤 2player가 게임을 하는 방식으로 distribution을 training 할 수있도록)

 

 

👉🏻 game-theoty란?

 

A라는 친구가 있고 B라는 친구가 있으면 서로의 decision을 알 수 있다(둘 다 분명하게 결정)

이때 A가 B의 결정을 보고 최적화하고 그 다음 B가 A의 최적화한 결과를 보고 본인의 결정을 다시 최적화하고, 그러면 또 A가 다시 B의 최적화된 결정을 보고 자신의 결정을 최적화하는 과정을 계속 반복

 

→ 그러다보면 결국에 equilibrium에 도달하게 된다(더 이상 더 나은 결정을 만들 수 없는 상태에 도달)

 


🔥 GAN의 구조

그럼 game-theory를 이용하기 위해서는 2 player가 있어야하는데, GAN에서 2 player는 누구인가?

Generator network와 Discriminator network

 

Generator : 가짜 사진을 만드는 네트워크

Discriminator : 진짜와 가짜를 구분할 수 있는 네트워크

→ 이 두가지 네트워크가 서로 경쟁하는 구조

 

 

이때 GAN의 구조를 살펴보면 앞에서 공부했던 AE나 VAE와 다르게 중간에 z가 있는 것이 아니고 일단 z부분으로 시작한다.

→ 즉 Encoder부분이 Discriminator부분이 되고, Decoder 부분이 Generator가 되는 그러한 구조이다.

 

 

 

<Generator랑 Discriminator가 하는 일>

 

  • 따라서 Generator는 이미 압축된 저차원의 latent variable의 z가 Generator 네트워크를 통과하게 되면 이미지가 나오게 된다 → 복원이 되는 것!
  • 그러면 방금 복원된 가짜이미지랑 진짜 우리가 가지고 있는 data set의 이미지인 x가 discriminator network로 들어간다. 이때 D(x)라는 것은 진짜 이미지가 들어간 것이고, D(G(z))는 만들어진 가짜 이미지가 들어간 것이다. 이때 이 Discriminator의 output이 1이면 real, 0이면 fake라고 예측을 한 것이다. 즉 discriminator가 정확하다면 D(x)는 항상 1이어야하고 D(G(z))는 항상 0이라고 답해야한다-> 그게 Discriminator 네트워크의 목적
  • 그런데 !! Generator는 이 discriminator를 속이고 싶다!!
  • (즉, 원래는 D(G(z))는 0이지만, 1이라고 답할 수 있도록 G(z)를 잘 만들어주려고 하는 것이 generator의 목적 ! → 즉 generator와 discrimination이 서로 경쟁한다)

 


🔥 Objective function/ loss function

 

따라서 objective function이 위와 같은 형태가 된다. 이 식은 Min Max problem이기 때문에 한번은 maximization문제를 풀고 동일한 V 함수에 대해서 한번은 minimization 문제를 푸는 서로 다른 두 개의 문제를 푼다 → 즉 한번은 generator를 위해서 한번은 discrimination을 위해서!

 

 

이제 좀 더 구체적으로 그게 무슨 말인지 살펴보자.

 

 

1. Discriminator 학습

 

 

일단 V를 먼저 maximization하게 된다.(V는 generator랑 Discriminator가 input으로 들어간 함수)

→ maximization을 할 때 max 밑에 있는 D가 Decision variable이고 이것을 내가 V를 maximization하는 방향으로 최적화 할 것이다.

→ 이때 최적화하는 것은 D이기 때문에 generator는 given이다(고정이다) = 학습된 generator를 갖다 쓰는 거고 그것을 가지고 나는 discriminator만 최적화한다!

그럼 이제 뒤의 식을 살펴보자!

 

 

<첫번째 항>

x가 data distribution을 따를 때(즉 진짜 데이터의 distribution에서 x를 가져오는 것) log(D(x))는 D(x)가 진짜 이미지가 들어왔을 때 이므로 discriminator가 잘 작동한다면 그 값이 1이 될 것이다(real이니까) 즉 D(x)가 0-1 사이의 값만 가질 수 있다는 것을 고려하면 log1은 전체값이 최대화된 것이라는 것을 알 수 있다.

 

<두번째 항>

z가 p(z)를 따를 때, 즉 latent space에서 z를 sampling하는 방법을 의미하기 때문에 가짜 이미지가 들어온 경우에 대한 식이다. 따라서 D(G(z))는 discriminator 입장에서는 0이 되어야할 것이다. 그러면 또다시 log1이 되기 때문에 전체 값이 최대화 된다.

→ 결국 여기서 하는 것은 Maximization인데, 오른쪽의 식을 최대화할 수 있는 것은 discriminator가 가짜를 0, 진짜를 1이라고 판별할 때이다!!

 

 

2. Generator 학습

 

이번에는 V를 Minimization하게 된다.

→ 이번에는 G를 최적화하는 것이기 때문에 D는 given이다. (앞에서 D를 최적화 했기 때문에 그 값을 가져와서 사용하면 된다.)

그럼 이제 뒤의 식을 살펴보자!

 

<첫번째 항>

원래 이 왼쪽 식에는 G가 들어있지 않다 → 즉 상수값으로 취급해서 학습에서 빠진다!

 

<두번째 항>

Generator 관점에서는 G(z)가 가짜이미지이지만, discriminator를 통과할 때 진짜처럼 보이기를 원한다. 따라서 G(z)가 1이 되고 오르쪽 항이 log0이 되면서 최소화 된다!

→ 이런 식으로 똑같은 V라는 함수를 discriminator는 최대화하지만, generator는 최소화하는 방향으로 학습한다.

 

 

 

👉🏻 Trick

 

그런데 generator를 학습할 때 한가지 trick을 사용할 수 있다.

먼저 log(1-x)와 log(x) 두 그래프를 생각해보자.

 

 

그래프는 전체적으로 y축 대칭이기때문에, log(1-x)를 minimize하는 것과 log(x)를 maximize하는 것을 사실 동일한 문제이다.

 

→ log(1-x)에서 minimize한다는 것은 그래프에서 오른쪽으로 가고싶다는 것

→ log(x)에서 maximize한다는 것은 그래프에서 오른쪽으로 가고싶다는 것

 

이때 x=0일때의 기울기를 한번 살펴보면, log(1-x)는 x=0일때 기울기가 완만한 반면, log(x)는 x=0일때 기울기가 굉장히 급하다. 즉, log(1-x)를 최적화하는 것보다 log(x)를 최적화하는 것이 더 용이하다고 해석할 수 있다. (기울기가 크다는 것은 그만큼 업데이트가 잘 된다는 것이기 때문에)

 

 

→ 따라서 log(1-D(G(z))을 최소화하는 것이 아니라 그냥 log(D(G(z))을 최대화하면 되는 것!!

 

→ 이제 가짜가 들어갔을 때 진짜다 라고 이야기해주면되니까 D(G(z))이 1이되면 되고, log1이 되기 때문에 최대화된다. 이렇게 trick을 이용해서 바꿔주면 generator가 조금 더 잘 학습할 수 있다.

→ 초반에는 당연히 discriminator가 더 학습이 쉽다. (새로운 데이터를 만드는 것보다 가짜/진짜를 구별하는 것이 더 쉽다) 따라서 처음에는 generator가 잘 작동을 안하기 때문에 아무리 generator가 G(z)를 열심히 만들어도 항상 D가 0에 가깝게 된다.(discriminator가 잘 안속고, 얘가 가짜라는 것을 금새 알아차림!!) = 즉 D(G(z))는 초깃값이 0이라는 뜻이기도 함. 그래서 trick을 이용!

 

 

따라서! 방금 살펴본 두가지 최적화를 너한번 나한번 너한번 나한번 반복하다보면 최종적으로 equilibrium에 도달한다

 

 

 

→ 즉 다시말해, 어느순간 discriminator가 들어온 데이터에 대해 이게 진짜인지, 가짜인지 판별을 하지 못하는 , 진짜가 들어오나 가까가 들어오나 output이 1/2이 나오는 상황이 될때까지 generator를 학습시키면 generator가 그때부터 굉장히 진짜와 유사한 디자인을 만들기 시작한다!!

 

 

여기서부터는 이 과정에 대한 증명과정을 다룰 것이다.

 

 

 


🔥 Proof

이제 그럼 증명 타임이다..!

 

Generative model의 목적을 다시 한번 떠올려보면, 내가 가지고 있는 data distribution과 가장 유사한 generator의 distribution을 만드는 것이였다.

즉! Pdata와 Pg의 거리가 최소화될 수 있도록 만들어주는 것이다

→ GAN은 이 문제를 V(D,G)를 mim, max 문제로 푼다. 이걸 generative model의 관점에서 보면 Pdata와 Pg가 동일한 distribution이면 즉, 그 거리가 최소화 되면 만족을 하는 것이다!

→ 여기서 jenson-shannon divergence를 쓰면, 두 식이 동일해지면 GAN theory로 푸는 것과 수학적으로 두 distribution이 같다고 푸는 것과 동일하다는 것을 증명할 수 있다!!

 

 

👉🏻 Discriminator 최적해 증명

(다 수식이라서 SLIDE 필기로 대체합니당)

👉🏻 Generator 최적해 증명

 

 

 

 

→ 따라서! GAN의 game theory로 풀었을 때 나오는 최종해가 기본적인 generator model의 컨셉과 동일하다는 것을 증명할 수 있다!!

 


🔥VAE vs GAN

 

마지막으로 VAE와 GAN을 비교한 그림이다.

 

 

→ 먼저 VAE로 만든 이미지는 Blurry하며, input이미지와 유사하다는 경향을 띈다. 그에 반해 GAN으로 만든 이미지는 Sharp하며 input 데이터에서 보지 못했던 새로운 이미지들을 만들어준다.

→ 또한 VAE는 모든 디자인 Space에서 smooth하게 학습하지만, GAN은 Mode collapse가 잘 발생한다. mode collapse란, 이미지가 잘나오는 곳에서만 잘나오고 이상한 곳에서 뽑으면 이상한 이미지가 나오는 것이다. 수학적으로 엄밀하게 학습하는 것이 아니라 generator가 속이기만 하면 되는 것이기 때문에, 잘만드는 것만 계속 잘 만들어내는 쪽으로 학습할 수 있다.

→ 또한 GAN은 game theory식으로 학습하면 convergence가 잘 일어나지 않고 발산할 수 있다.

최종적으로 VAE는 차원축소용으로 많이 사용하고, 새로운 이미지를 만들어 낼 때는 GAN을 많이 사용한다.

 

 


 

이렇게 GAN에 대해 정리해보았는데, VAE를 공부하고 난 뒤여서 그런지 그래도 조금은,, 수월했다

 

아래에는 GAN을 정리하는데 참고한 자료이다.

이번에도 강의들을 많이 참고해서 작성해보았다.

 

 

 

<참고 자료>

-숙명여자대학교 기계시스템학부 강남우 교수님 3.4.GAN 강의 youtu.be/cd-kj1ysqOc

-나동빈님의 GAN: Generative Adversarial Networks (꼼꼼한 딥러닝 논문 리뷰와 코드 실습) 강의 youtu.be/AVvlDmhHgC4