Stanford CS236 Deep Generative Models 수업의 자료를 기반으로 생성모델의 기본 개념들을 정리해보고자 한다. (참고 https://deepgenerativemodels.github.io/syllabus.html)
지난 포스팅 에서는 높은 likelihood 값이 항상 좋은 sample quality를 보장하지 않으며 GAN이 likelihood-free 방식의 학습을 제공한다는 내용을 설명했다. 그리고 likelihood 대신 생성된 sample과 실제 데이터의 distribution을 비교하기 위해 two-sample test를 진행하고 이를 위해 discriminator를 학습시킨다는 내용을 설명했다.
이때 두 분포를 비교하기 위해서 KL-divergence를 이용하기도 하고 symmetric KL-divergence인 Jenson-Shannon Divergence로 정리하기도 한다. 하지만 두 분포를 비교하는 방법이 꼭 이러한 방법들만 있는 건 아니고 매우 다양한 방법이 있을 수 있다. 이러한 방법을 일반화해서 f-divergence라고 부르고 임의의 f-divergence에서 모두 convergence 시킬 수 있는 식도 제안되어있다. 이에 대해서는 매우 잘 정리된 블로그가 있어서 참고하면 좋을 것 같다. (링크 : https://jaejunyoo.blogspot.com/2017/06/f-gan.html)
f-divergence는 아래와 같이 구해지는데 이때 사용되는 f는 convex이고 lower-semicontinuous이면서 f(1)=0을 만족하기만 하면 된다.
이러한 f 함수는 무수히 만들어질 수 있고 아래의 예시들이 있다. KL-divergence와 Jenson-Sahnnon divergence도 모두 f divergence의 일종이라고 할 수 있다.
여튼 이러한 f-divergence의 값은 항상 0보다 크거나 같고 f-divergence가 0이되는 지점은 p와 q가 같을 때이다. 따라서 두 분포간의 거리를 이제 이런 f-divergence로 측정한다고 해보자. 우리의 목표는 f-divergence를 최소화 해줄 \( p_\theta \)를 얻어내는 것이다.
그러면 아래와 같이 두가지 방법으로 구해볼 수가 있는데 우리는 \( p_{data}(x) \)를 알지 못하기 때문에 당연히 아래 식을 바로 계산할수가 없다.
그래서 이제 아래와 같이 f 함수의 특성을 이용하여 식을 전개하는데 Fenchel conjugate라는 식에서 출발해 전개를 시작한다. 전개과정을 굳이 전부 이해하지 못하더라도 아래에서 맨 마지막 결론을 봐보자
두 분포의 차이를 계산하는 f-divergence 값의 lower bound를 likelihood 없이 계산하는 것이 가능해졌다. 그러면 이제 예전에 latent variable 모델에서 계속 했던것처럼 lower bound의 maximize를 구하면 f-divergence 값을 근사를 할 수가 있게된다. 따라서 이 식을 maximize하는 T를 찾아내서 lower-bound를 tight하게 만들어서 f-divergence 값을 근사를 하고 이 값을 최소화하도록 G를 학습을 시키면 된다. 결론적으로는 아래와 같은 형태로 T와 G를 각각 파라미터화 해서 구하게 된다.
이제 어떤 함수던 f-divergence의 objective를 이용하면 GAN을 학습시키는게 가능해졌다.
그런데 f-divergence를 다시 보면 q가 분모에 있는데 q가 0이고 p가 0이 아니면 Distance값이 불연속적이거나 발산해버리는 경우도 생길수가 있다. 아래에 예시가 있다.
그래서 D가 이렇게 불연속적인 지점이 없고 smooth해야 학습이 더 잘 되지 않을까라는 생각에서 Wasserstein distance가 나온다. Wasserstein distance는 Earth-Mover distance라고도 불리는데 optimal transport를 계산한다. 쉽게 말해서 p라는 분포에서 데이터를 옮겨 q라는 데이터 분포로 만들건데, 이때 필요한 옮기는 양의 최솟값을 구한다는 것이다. p에서 데이터를 최소한으로 옮겨서 q라는 분포를 만들겠다 라는것이고 그 양을 p와 q의 distance로 쓰겠다는것이다. 아래는 이를 식으로 표현한 방법이 나와있다. 또한 이렇게 만들면 q(x)가 0이고 p(x)는 0이 아닌 상황이 발생해도 값이 발산하거나 불연속적이 되지 않는다.
이 distance를 구하려면 모든 가능한 p->q transport를 다 계산해서 그 중 최솟값을 찾아야 하는건데 사실 이건 불가능하다. 그래서 아래와 같이 Kantorovich-Rubinstein duality 라는 걸 써서 식이 변환된다.
위 식에서 f의 Lipschitz constant가 1이하 라고했고 이것이 f가 급격히 변하는것을 막아준다고 한다. 어쨌든 식을 이제 이용해 Discriminator와 Generator를 학습시킬 건데 아래와 같이 식이 만들어진다.
D는 이 Wasserstein distance를 늘리기 위해, Generator는 줄이기 위해 학습이 되는것이고 위에서 f의 조건을 만족시키기 위해 f역할을 하는 discriminator에 weight clipping이나 gradient에 제약을 주게 된다.
식이 굉장히 많이 다양하게 나왔지만 맨 처음 나왔던 GAN의 objective와 변한것이 크게 없다. 아래 식이 맨 처음 나왔던 GAN loss인데 비교해보면 거의 다른게 없어보이긴 한다
그럼에도 이 W-GAN은 학습을 훨씬 안정적으로 하게 된다고 한다. 아래처럼 기존 loss가 두 distribution을 구분하기 위해 급격한 경사를 만들어내는 반면 W-GAN은 훨씬 smooth한 경사를 보여준다.
여기까지가 f-divergence와 W-GAN에 대한 내용이었고 다음은 GAN inversion에 관련된 내용인데, 이제 GAN을 이용해서 데이터 x가 있을때 그에 해당하는 latent variable z를 어떻게 찾을것이냐에 대한 내용이다.
이를 위해 아래처럼 BiGAN 구조로 z에서 데이터(x)를 생성하는 generator와 반대로 데이터(x)에서 z를 생성하는 encoder를 만들어 같이 학습을 시키면 데이터에서 z를 추론하도록 만들수 있다.
다음으로는 GAN을 이용해 서로 다른 도메인의 이미지들을 Image-to-Image translation을 하는 내용인데 유명한 CycleGAN이 있다.
X도메인의 이미지를 입력으로 받아 Y를 생성하는 generator G, Y도메인의 이미지를 입력으로 받아 X를 생성하는 generator F를 각각 학습시키고 각각 generate된 이미지인지 실제 데이터셋에 있는 이미지인지 구별하는 Discriminator도 같이 학습시키면 된다.
추가로 우리가 X->Y로 간 이미지를 반대로 Y->X로 다시 가져올 수도 있을것이다. 이때 같은 이미지가 나오도록 해서 consistent한 translation이 이루어지도록 만들수가 있다. 이를 Cycle consistency라고 하고 이를 이용해 추가적인 loss도 만들어 아래와 같이 최종 loss를 설계할 수 있게 된다.
매우 잘 동작한다.
이 외에도 AlignFlow, StarGAN 등등 이미지를 다양한 도메인끼리 서로 변환할 수 있게 해주는 많은 GAN 모델들이 나왔다. 하지만 GAN이 가지는 본질적인 unstable 문제가 완전히 해결되지 않기도 하고 scaling up을 하기에도 훨씬 용이한 Diffusion모델에 밀려 이제는 거의 연구가 진행되지 않는것 같다.
답글 남기기