본문 바로가기

Programmer Jinyo/Machine Learning

쉽게 쓴 GAN ( Generative Adversarial Nets ) 내용 및 수식 정리 + 여러 GAN 들


투명한 기부를 하고싶다면 이 링크로 와보세요! 🥰 (클릭!)

바이낸스(₿) 수수료 평생 20% 할인받는 링크로 가입하기! 🔥 (클릭!)

GAN은 새로운 데이터(사진이라던가, 그림이라던가 하는)를 만들어내는 것을 목적으로 설계된 머신러닝 모델이다.


기본적인 구조는 두개의 적대적인 (서로 싸우는) 네트워크를 훈련시켜서 이것을 구현하도록 되어있는데, D : discriminative model (식별하는 모델) G : generative model (생성하는 모델) 이 그 두 모델이다. (앞으로 D와 G라고 부르겠다)


일단 학습에 필요한 데이터는, 생성하려는 것들의 샘플인데, 이를테면 사진 같은 것들이다.


이 때 , G 는 데이터의 분포를 보고 그럴듯한 새로운 데이터를 만들어내고, D는 실제 데이터인지 아니면 만들어진 데이터인지 알아맞춘다.


이렇게 G : 속이는 모델 , D : 속지 않기 위한 모델 이 한 쌍이 되어서 서로 minmax two-player game을 하며 경쟁하는 매커니즘을 통해 G와 D는 더욱 정교한 학습을 이루게 된다.


결국 마지막에 가서는, G의 성능이 굉장히 올라가서 D가 항상 예측을 1/2로밖에 하지 못하게 되는것이 이상적인 상태가 될 것이다.


이 과정을 논문에서는 다음과 같이 설명하고 있다.





초록색 실선은 generator가 만들어내는 fake data의 분포라고 하고, 


파란색 점선은 discriminator가 real data와 fake data를 구분하는 선이다.


그리고 마지막으로 검정색 점들이 real data들의 분포를 나타낸다.


차츰차츰 학습을 시키다 보면 어느순간 거의 비슷해지는 순간이 온다는 것이다.




이를 수식적으로는 다음과 같이 정리하였다.



사실 이 논문의 핵심은 이 한줄이 전부이다.


이 이후로는 이 수식이 제대로 학습될 것이라는 증명(?) 이 주를 이루는데, 내용적인 부분은 아니니 넘기기로 하겠다.


저 식을 조금 더 분석해보면, D는 전체적인 식을 크게 만드는 방향으로 파라미터를 학습시키는데, D(x)는 크게 만들어야 좋고, D(G(z))는 작게 만들어야 좋다.


또한, G(z)는 D(G(z))를 최소화 하려고 하기 때문에 maximize되는 D(x)의 x와 최대한 같아지려고 노력한다.



GAN을 포함해서 , 여러 GAN을 발전시킨 페이퍼 목록을 첨부한다.

GAN: https://arxiv.org/abs/1406.2661

DCGAN:https://arxiv.org/abs/1511.06434

태초의 GAN은 FC layer을 썼다.. generator을 CNN을 사용하여 만들었다.

DC GAN은 pooling layer을 사용하지 않았다. stride size = 2로 해결.

batch norm 사용, adam 사용

LSGAN: https://arxiv.org/abs/1611.04076

기존 Loss function은 decision boundary를 기준으로 한쪽을 진짜 반대쪽을 가짜로 구별.

cross entropy loss를 사용하기 때문.

문제점 : 아래의 Fake sample들은 실질적으로는 real image에서 멀리 떨어져있음에도 Discriminator가 구분하지 못함.

CELoss 대신 Least square loss 를 사용해서 가까이로 끌고오는 방향으로 구분 해 보자.

Semi supervised GAN :

discriminator이 class를 구분함. ex) mnist에 0~9 + fake 해서 11개의 class를 넣고 어느 클래스에 해당되는지를 판별하게 함.

Generator은 원하는 class에 해당하는 것을 생성할 수 있게 강제됨.

ACGAN:

11번째 fake class말고 real / fake 를 구분 + CLASS를 구분.

cGAN:https://arxiv.org/abs/1611.07004

WGAN: https://arxiv.org/abs/1701.07875

EBGAN:https://arxiv.org/abs/1609.03126

BEGAN:https://arxiv.org/abs/1703.10717

StackGAN : 문장이 있을 때 그 문장의 사진을 만들기 ( ex 새가 날고있다 -> 나는 새 이미지 )


CycleGAN:https://arxiv.org/abs/1703.10593

이미지의 class를 바꾸기. 말 사진을 주면 같은 포즈의 얼룩말 만들기.

image -> G_ab -> image2 -> G_ba -> image3

image2 -> discriminator 속이기

image = image3 일 수 있게 만들기 두가지의 loss를 합

DiscoGAN:https://arxiv.org/abs/1703.05192

StarGAN:https://arxiv.org/abs/1711.09020

SRGAN:https://arxiv.org/abs/1609.04802

SEGAN: https://arxiv.org/abs/1703.09452