2019. 5. 11. 01:27ㆍ관심있는 주제/GAN
GAN을 발표할 일이 있어서, 내 생각을 정리하기도 하면서, 공유를 하고 싶어서 글을 남깁니다.
GAN을 맨 처음 배울 때 자주 적합는 분류표다.
크게 Explicit density 와 Implicit density 2가지로 나눌 수가 있다.
Explicit density 는 P_model(x)를 확실히 정의 할 수 있고 계산할 수 있는(tractable) 이든지 approximate처럼 근사하는 VAE 같은 것으로 나눌 수 있다.
Implicit density 는 P_model(x)를 명시적으로 정의하지 않고 확률 분포를 알기 위해 sample을 뽑는 방법을 말한다.
이 개념에 대해서 항상 헷갈리는데 좋은 답변을 찾아서 공유하고자 한다.
(유재준 님 블로그) GAN이 Sampler라는 얘기를 이해하시면 됩니다.
즉, GAN은 모델의 목적 자체가 어떤 data의 분포를 학습하고자 하는 것이 아니라 진짜 같은 sample을 generate 하는 것이 목적으로 고안된 sampler입니다. z라는 noise이면서 latent vector라는 곳에서 바로 딱히 모델을 정의하지 않고 Neural Network를 태워서 생성하기 때문에 어떤 모델을 명시적으로 정의하지 않고 만든다고 할 수 있다.
반면에 VAE는 data의 분포를 학습하고 싶은데, 이게 intractable하니까 variational inference라는 방법으로 풀어보자고 제안한 것이고요. 즉, VAE는 data 분포가 잘 학습되기만 하면 sampling(혹은 data generation)이 저절로 따라오는 것입니다. 그렇기 때문에 둘의 성격이 다르고 VAE는 explicit 하게 분포를 학습하고자 하는 모델이라 하는 것입니다.
참고 : http://jaejunyoo.blogspot.com/2017/04/auto-encoding-variational-bayes-vae-1.html
GAN 논문 수는 계속 늘어날정도로 딥러닝의 큰 축이 되었다고 생각하고 요즘은 강화 학습이 대세인 것 같기는 하지만, 나는 GAN 쪽이 먼가 더 재미있다.
What is GAN?!
이 네트워크 구조를 가장 재밌고 쉽게 이해할 수 있는 예시로는 경찰과 도둑으로 네트워크를 설명하는 것인데요.
WGAN 부터는 Discriminator를 critic이라는 비평가라는 표현을 쓰고 Generator를 배우는 학생? 정도로 표현을 쓰기도 합니다. 아무튼 여기서는 경찰과 도둑으로 설명을 드리자면, 도둑(Generator)은 경찰(Discriminator)을 속이기 위해 진짜 같은 가짜 돈을 왕창 벌려고(학습) 합니다. 그리고 경찰(D)은 도둑(G)이 만든 가짜와 진짜 돈을 잘 분류하기 위해 노력(학습)을 합니다.
실제로 task에서는 G를 사용 할 수도 있고 D를 사용할 수도 있지만, 결국 생성(G, 도둑)이 잘 학습을 하는 것이 중요합니다. 그래서 결국에는 경찰(D)이 0.5로 진짜와 가짜를 보고 분류할 수 없게 되면 최적이 됩니다.
기본적인 구조는 맨 왼쪽과 같고 이것들을 다양하게 변형한 형태가 있습니다.
예를 들어 condition(y)를 조건으로 줘서 나중에 생성시 조건을 준 값을 통해서 원하는 class를 생성할 수도 있고,
아니면 내부 구조에서 latent에게 잘 특성을 부여하게 학습이 되게 할 수도 있습니다( mnist 학습 하면 굵기 크기, 등등 중요한 feature를 배워서 더 원하는 것을 학습할 수 있게 됨) 이 처럼 latent에 관심을 가지는 논문도 많이 나오고 있습니다. 저 역시 latent를 조절해서 원하는 것을 잘 생성하는 것에 관심이 있습니다.
그래서 학습은 어떻게?!
다음으로는 그러면 이러한 네트워크 구조를 어떻게 학습을 시켜야 할까요?
일단 입장을 Generator 와 Discriminator를 나눠서 생각해야 합니다.
Generator (도둑) ( 나는 Discriminator를 잘 속이는 가짜 돈을 만들 거야 D(G(z)) = 1 이 되게
Discriminator (경찰) 나는 도둑(Generator)이 만든 가짜 돈과 진짜 돈을 완벽하게 분류(Classifiy)할 거야!
지금 입장에서 보면 알 듯이 가짜냐 진짜냐 , 0, 1 binary case로 정의를 할 수 있기 때문에 Cross entropy처럼 구현이 가능합니다!
그렇다면 어떻게 하는 게 이것이 최적화가 되는 걸까?!
Proof
일단 저기서 G(z)를 Generator를 잘 학습시켜서 x = G(z)처럼 잘 생성했다고 생각해보자.
그다음 G는 고정시키고 D의 최적화를 할 때! y에 대해서 optimal을 구하게 되면 다음과 같이 최적의 값이 나온다.
그다음 그 max (D)를 최적화한 값을 이용하여 min G를 해보자.
근데 이 식을 잘 보면 JS Divergence의 일부인 것을 확인할 수 있다. 그래서 만약 JS는 항상 양수니까 저것이 최적화가 되면 0이 되고 그때 가장 작은 값은 -2 log 2가 된다고 한다.
그래서 p_g와 p_r이 같은 경우 JS는 0이고 그때의 Discriminator는 0.5 ( 생성이 잘 됐을 때는 Discriminator는 진짜와 가짜를 구분을 못한다!)
그렇다면 이 GAN는 장점이 뭐고 다른 알고리즘보다 어떤 것이 나을까?
앞에서 언급한 것처럼 GAN은 Implicit density로 추정하는 sampler이기 때문에 MCMC 같은 마코프 체인이 없이 한 번에 생성할 수 있다는 것이 큰 장점이고 , VAE같이 Lower bound 같은 부분도 없다! 그래서 VAE보다 blurry 한 것을 만들지도 않는다!!
그렇다면 이 GAN는 단점은 뭐고 학습 시 문제점이 많다는데 뭐가 문제인 걸까?
일단 학습을 언제 정지시킬지를 잘 모른다. FID 같은 score가 있긴 하지만, 그런 것은 단순히 평가 매트 랙이기 이걸로 정지시킬 수 있는지는 모르겠다.
여러 가지 문제점을 조사를 해보니 그중 몇 개를 뽑았다. 일단 mode collpase로 결국 쉽게 만들 수 있는 놈은 만들어 버려서 속이겠다고는 의미다!
또 이 구조 자체가 수렴을 안 하게 발산하기가 쉽다!
학습을 하다 보면 Gradient 가 사라지는 경우가 많다 (그래서 Spectral normalization을 사용해서 보통 해결한다고 알 고 있다.)
적절한 metric이 빨리 나오기를 기대한다
이 것을 GAN 관련 전반적인 흐름은 설명한 것 같습니다.
최근 나온 GAN 논문 중 StyleGAN는 정말 말도 안 될 정도의 고화질의 성능이 나오고 대단한 논문인 것 같습니다.
Stylegan 논문은 일단 누가 정리해주는 걸 보고 그러긴 하는데, 어렵지만 반드시 깨야하는 존재니, 열심히 해야 할 것 같습니다!
다음에는 여기 있는 내용을 번역을 하든 정리를 하든 볼만한 가치가 있는 내용인 것 같습니다!