[Generative Artificial Intelligence] Generative Adversarial Networks – 1

Stanford CS236 Deep Generative Models 수업의 자료를 기반으로 생성모델의 기본 개념들을 정리해보고자 한다. (참고 https://deepgenerativemodels.github.io/syllabus.html)

앞의 lecture에서 설명한 Autoregressive model, Latent Variable Model, Normalizing Flow Model들 전부 모델의 Likelihood를 계산해서 이를 최대화 하면서 학습을 진행했다. 하지만 과연 높은 Likelihood가 정말 높은 sample quality를 보장하는가? 아니다. 한가지 예시를 생각해보자. \( p_{data} \)가 있고 다른 \( p_{\theta} \) 가 있을 때, \( p_{\theta} = 0.01p_{data}(x) + 0.99 p_{noise}(x) \) 이라고 하자. 즉 \( p_{\theta} \) 는 굉장히 노이즈가 심한 확률분포가 된다. 따라서 지금 상태로 \( p_{\theta} \)로 샘플링을 하면 99% 의 sample이 noise가 되버린다. 그런데 이때 likelihood를 한번 계산해보자.

즉, \( E_{p_{data}}[log p_{data}(x)] – log100 <= E_{p_{data}}[log p_{\theta}(x)] <= E_{p_{data}}[log p_{data}(x)] \)이 된다. 그런데 우리는 n dimension의 data x에 대해서 \( log p_{data}(x) \)를 아래와 같이 계산한다.

즉, n이 커지면 \( E_{p_{data}}[log p_{data}(x)] \)는 \( log 100 \) 에 비해 굉장히 커지고 \( log 100 \) 값을 무시할수 있게 되면서 \( E_{p_{data}}[log p_{\theta}(x)] ~= E_{p_{data}}[log p_{data}(x)] \) 이 되버리는 것이다. 샘플의 퀄리티는 거의 노이즈이지만 likelihood는 최댓값이 돼버리는 일이 나타난다. 즉 높은 likelihood값이 항상 좋은 sample quality를 보장하지는 않는다는 것이다.

또한 sample이 좋은데 test log-likelihood가 낮은 일도 일어날 수 있다. 가장 쉬운 케이스는 샘플을 그대로 외워버리는 케이스이다. 그래서 생성이 dataset이랑 똑같이 나오는데 dataset과 조금만 다른 이미지가 들어가도 likelihood가 0에 가깝게 나와버리는 케이스이다. 이런 케이스들을 생각해보면 likelihood와 sample quality를 분리해서 생각해야될 필요를 느낀다. 여기서 GAN이 이러한 Likelihood-free learning 방식을 제공해주게 된다.

서로 다른 분포 P, Q로부터 생성된 sample들 S1, S2가 있다고 하자. 이 두 데이터셋을 가지고 P, Q의 분포가 비슷한지 어떻게 측정할 수 있을까?

가장 단순하게 생각해볼 수 있는건 S1의 sample들과 S2의 sample들의 각각의 평균, variance등을 측정해 차이를 측정해보는 방법이 있을 수 있다. 이 차이가 특정 threshold보다 작으면 같은 P와 Q가 같은 분포고 크면 다른 분포고 이런식으로 두 분포를 비교해볼 수 있을것이다. 이런 방식은 Two-sample test 라고 한다.

하지만 데이터의 dimension이 높아지면 이 two-sample test를 하기 위한 기준을 정하는것이 어려워진다. 단순히 평균, 분산 이런 정보로 비교하는건 당연히 한계가 있다. 따라서 이를 위해 두 데이터간의 차이를 비교해줄 discriminator를 학습하자는것이 GAN의 key idea가 된다.

아래와 같이 데이터 x가 들어왔을 때 이 데이터가 실제 \( p_{data} \)에 존재하면 1(real), 그게 아니라 흉내낸 모델 \( p_\theta \)에서 나온것 같으면 0(fake)으로 구별하고자 하는 것이 discriminator의 역할이다. 경찰(discriminator)과 도둑(generator)으로 예시를 많이들 든다.

Discriminator를 학습시키는 Loss자체는 굉장히 쉽다. 진짜 데이터셋에 존재하는 x는 1이 되도록, 가짜로 생성된 데이터인 x는 0이 되도록 아래처럼 학습시키면 된다. 그러면 아래와 같이 optimal한 discriminator의 분포도 바로 예상이 가능하고 이상적으로 generator가 학습이 돼서 \( p_{data} \)와 \( p_\theta \)가 같아지면 D는 1/2이 된다.

이제 Generator의 역할은 Discriminator를 속이는 것이 된다. 즉 Generator의 목적의 위의 discriminator의 objective를 최대화 하는 방향으로 학습하면 된다. 그래서 최종적으로는 아래와 같은 loss가 나오고 generator와 discriminator의 min max 게임이 된다.

여튼 이론상 잘 되어야할것 같지만 GAN은 Unstable한 학습, Mode collapse등 다양한 문제를 겪는다는것이 잘 알려져있다.

GAN을 학습할때 보통 generator에서 나온 sample과 실제 데이터의 sample을 이용해 discriminator를 학습을 시키고 다음으로 generator를 학습시키는 과정을 반복하는데 이론적으로는 잘 수렴해야겠지만 실질적으로는 아래 처럼 두 loss가 진동하다가 발산하는 일이 많이 일어난다.

특히 mode collapse라고 하는 현상이 많이 일어나는데 아래처럼 sample을 얻으면 같은 데이터가 계속 나오는 현상이다.

학습 자체가 discriminator를 속이기만 하면 되고 같은 이미지가 여러개 나와도 잘 속일 수 있는 이미지이기만 하면 loss도 줄어든다. 따라서 아래예시들 Target distribution이 있을 때 전체 분포를 따라가는 것이 아니라 특정 분포에 쏠림현상같은 것이 일어난다.

아래는 예시로 MNIST를 학습시키는데에도 그러한 mode collapse가 일어나 하나의 sample만 얻어지는 모습이다.

따라서 이러한 mode collapse를 막기 위해 다양한 trick이 들어가는데 이를 다음 lecture에서 설명한다.

Donghun Ryou


Popular Categories


Search the website


today visits :

76

total visits :

11075