[딥러닝과 설계] GAN
# GAN
VAE같은 경우는 경험적이 아닌 수학적으로 접근하다보니까 너무 복잡해서,
그냥 sampling했을 때 그럴 듯한 결과가 나오게만 만들면 안될까?
explicit density function하지 말고 game theory를 사용해보자!
game theory: 2-player game이란?
A가 B의 결과를 보고 최적화하고,
B는 A가 최적화한 것을 보고 또 최적화한다.
이 과정을 반복하다보면, A와 B가 둘다 이익을 얻을 수 없는 단계에 이른다.
decoder가 generator, 그리고 encoder가 discriminator이 되는 구조다.
즉, 먼저 generator가 fake image를 만들고
discriminator는 real image와 fake image를 받고 각각이 real(1)인지 fake(0)인지 대답을 한다.
다시 말해, generator는 속이려고 하고 discriminator는 속임을 당하지 않으려고 한다.
또한 한번은 discriminator를 위해 max 문제를 풀고, 또 한번은 generator를 위해 min 문제를 푼다.
일단 discriminator 입장에서 생각해보면,
$D(x)$ 실제 training set에 대한 결과는 1이 나와야 하고, $D(G(z))$ fake image에 대한 결과는 0이 나와야 한다. (최대화)
이제 generator 입장에서 생각해보면,
$D(G(z))$ fake image에 대한 결과는 1이 되기를 원한다. (최소화)
$log(1-x)$를 최소화하는 것은 $log(x)$를 최대화하는 것으로 바꿔서 생각할 수 있다.
굳이 왜 그렇게 해야 합니까?
$log(x)$일 때 초기값 0에서의 기울기의 크기가 더 크기 때문에 최적화가 용이하게 된다. (update 잘됨)
초반에는 generator보다 discriminator 성능이 좋아서 $D(G(z))$의 값이 보통 0에 가까울 것이다.
그러나 학습이 진행되면서 generator가 더욱 감쪽같이 속이는 방향으로 학습되며 1의 값에 가까워질 것이다.
결론적으로는, 최소화에서 최대화를 만들게 된다.
이렇게 순서대로 반복하며 차이를 줄여 수렴하는 구간에 도다르게 된다.
# GAN - Proof
어쨌든 우리의 목표는 $p_{data}(x)$와 유사하게 $p_{g}(x)$를 만드는 과정이다.
따라서 거리를 최소화할 수 있도록 학습시킨다.
어차피 $z -> G(z) -> x -> D(x)$ 이렇게 플로우가 진행된다면
$z$에서 뽑는 것 대신에 generator를 통과한 $x$에서 뽑아도 되는 것 아니야?라는 아이디어로 인하여
$E_{x~p_{g}(x)} [log(1-D(x))]로 바꿔서 계산할 수 있다.
증명과정은 위와 같다 (이해 완료)
VAE와 GAN을 비교해보면,
VAE는 input image와 비슷한 것들을 만들어내지만, GAN의 경우에는 input과 다른 새로운 이미지들을 생성해낸다.
또한, VAE는 smooth하게 만들어지지만, GAN은 Mode collapse(잘 나오는 부분에서만 잘 나오고 그렇지 않은 부분에서 뽑으면 무너지는) 현상이 발생한다.
왜 그럴까?
생각을 해보면 VAE같은 경우는 수학적으로 연속적으로 해결하는 반면, GAN같은 경우는 속이면서 진행하기 때문에 불안정한 형태를 띄는 것이다.
일반적으로 VAE는 차원 축소, GAN은 새로운 이미지 생성할 때 많이 사용된다.
NN대신에 CNN을 encoder, decoder에 적용한 GAN = DCGAN
위의 사진은 재밌는 결과가 나온다.
latent vector를 통해 smiling woman을 샘플링하고
이후에 그냥 무표정의 woman과 man을 샘플링했을 때
smiling woman - neutral woman + neutral man = smiling man이라는 결과 나온다!
정말 smiling woman에는 smiling이라는 feature가 존재한다는 것을 알 수 있다.
latent space가 아닌 pixel space에서 이런 과정을 진행하면 알 수 없는 결과가 나온다는 것을 알 수 있다.
glasses에 관해서도 마찬가지다.
cGAN: 내가 원하는 이미지를 만들고 싶을 때 condition을 추가하여 모델을 만들 수도 있다.
(ex. MNIST인 경우, 0-9 원하는 숫자)
infoGAN: 중요한 condition을 직접 정하지 않고, 학습하면서 알아서 설정해줘 (ex. 숫자, 기울기)
BEGAN: discriminator를 AE로 만드는 구조 - 진짜가 들어오면 복원이 되고 가까자 들어오면 복원이 안되게
이렇게 MNIST의 경우에는 label이라는 condition을 추가할 수 있음
BEGAN에 대한 자세한 방법론이다.