Stanford CS236 Deep Generative Models 수업의 자료를 기반으로 생성모델의 기본 개념들을 정리해보고자 한다. (참고 https://deepgenerativemodels.github.io/syllabus.html)
이전 lecture에서 normalizing flow models가 어떤 건지, 모델을 만들때 어떤 조건들이 필요한지 알아봤었다. 조건에는 먼저, latent variable z를 data x로 변환시키기위한 함수 f가 invertible해야한다는 것, f의 jacobian계산이 용이해지도록 \( x_i \) 가 \( z_{<i} \)에 의해서만 영향을 받아야된다는 것이 있었다. 이제 이 조건을 만족시키면서 어떻게 모델을 구성할 수 있을지 알아보자
가장먼저 “NICE: Non-linear Independent Components Estimation(Dinh et al., 2014)” 방법이 나온다. z와 x를 채널 dimension에서 d, 1-d 채널로 나눠 \(z_{1:d}, z_{d+1:n} \), \(x_{1:d}, x_{d+1:n} \)로 만들고 additive coupling layer를 사용해서 forward와 inverse mapping을 \( m_\theta \)(neural network)를 이용해 계산한다. 이렇게 하면 mapping도 invertible해지고 jacobian도 아래와 같이 쉽게 계산된다.
위의 NICE 방법은 jacobian의 determinant 값이 항상 1이다. gemotery 관점에서 보면 x에서 z로 변환될때 volume 변하지 않게 된다는 의미이다. 이렇게 volume이 보존되는게 더 다양한 data를 생성해야되는데 방해가 될 수 있다. 그래서인지 NICE에서 생성된 이미지결과를 보면 단순한 이미지는 어느정도 잘 생성하지만 뭔가 비슷비슷한 느낌이 들고 복잡한 이미지는 잘 생성해내지 못한다.
따라서 아래와 같은 방식으로 additive coupling layer를 수정해서, 단순히 더하기로 적용되던 additive layer를 곱으로 적용되도록 바꾸면 여전히 normalizing flow model의 조건을 만족하면서도 volume이 바뀔 수 있게 된다.
이렇게 수정된 모델로 생성한 이미지는 훨씬 복잡한 데이터도 잘 표현할 수 있게 된다.
또한 latent variable을 사용하는 모델의 장점이자 목적인 latent간의 interpolation도 아래와 같이 굉장히 스무쓰하게 잘 진행되는것을 볼 수 있다.
이제 autoregressive model을 이용해서 이러한 flow model을 만드는 방법을 알아보자. 가장 대표적인 두 방법이 Masked Autoregressive Flow (MAF)와 Inverse Autoregressive Flow (IAF) 방식이 있다.
먼저 MAF의 forward mapping 방식을 보면 아래와 같다. x는 autoregressive model방식으로 \( x_i \)를 생성하면서 latent variable이 섞여 들어가고 \( \mu, \alpha \)는 neural network가 된다.
그대로 inverse mapping도 쉽게 할 수 있게 된다.
보면 결국 x는 하나하나 autoregressive하게 생성해야해서 속도가 느린데 x->z mapping 같은 경우에는 x가 이미 모두 있는 상황에서 z로 mapping하는거라 병렬적으로 처리가 가능하다. 따라서 likelihood 계산이 빠르게 된다는 장점이 있다.
이제 IAF방식을 살펴보자. 위의 MAF방식은 \( x_i \)를 얻기위해 \(x_{<i} \)들에 network를 태웠는데 반대로 z에 network를 태우는 방식이다. 그러면 아래와 같이 forward와 inverse mapping을 설계할 수 있다. 위의 MAF방식과 반대로 z는 기본적으로 원래 모두 있는 상태니까 z->x의 forward mapping은 병렬적으로 빠르게 수행할 수 있다. 하지만 반대로 inverse mapping은 z를 autoregressive하게 연산해야하기 때문에 속도가 느리다. 따라서 sampling은 빠르고 likelihood 계산은 느린 MAF와는 반대 상황이 나온다.
정리하면
MAF : likelihood 연산이 빠름, sampling이 느림
IAF : sampling이 빠름, likelihood 연산이 느림
따라서 MAF는 MLE기반의 학습에 좋고 density estimation을 하는데 유리하고 IAF는 sampling이 빠르니까 real-time generation에 유리하다. 이 두 방식의 장점을 섞는 방법은 없을까?
Parallel Wavenet 모델이 그러한 모델이고 방식은 아래와 같이 probability density distillation을 사용한다.
student와 teacher의 KL divergence를 줄이는 식으로 student를 학습시키게 되는데, teacher가 MAF모델이 되고 likelihood 계산이 빨라 학습이 빠르다는 장점을 이용해 MAF모델을 학습을 시킨다. 이후 MAF모델을 이용해 student인 IAF모델을 학습시키는데 이제 오래걸리는 likelihood 계산을 통해 학습시키지 않고 MAF모델과 KL divergence를 minimize하도록 만들어 학습을 시킨다. 그리고 test에는 IAF만 사용해서 sampling을 한다. 이렇게 만든것이 Parallel Wavenet이고 기존 original Wavenet보다 1000배 efficient하다고 한다.
CNN도 autoregressive용으로 만들어졌던 pixelCNN을 사용해서 invertible하게 만들수 있고 ordering을 하면 jacobian matrix도 triangular로 만들어 계산을 쉽게 할 수 있다고 한다. 이렇게 만든 network가 MiniNet이고 아래와 같이 convolution filter를 masking해서 만든다.
마지막으로 나오는 내용은 Gaussianization Flows 라는 방법이다. 우리는 지금까지 \( p_{data} \) 를 예측하고 근사하기 위해 \( p_\theta \)를 만들고 데이터셋으로 학습을 시켜온건데 이제 normalizing flow model에서는 이걸 z의 latent variable space에서도 할 수 있게 된다.
실제 데이터 x들을 \( f^{-1}_\theta \) 함수로 latent variable로 변환해 실제 gaussian 분포를 따르는 z와 유사해지도록 하면 되는것이고 그 내용이 아래에 나와있다.
여기서 어떤 데이터의 분포를 Gaussian으로 만들기 위한 Gaussianization을 위해 아래에 Inverse CDF 방법을 적용한다. Inverse CDF를 간단히 설명하면 특정 분포를 따르는 난수를 생성하는 방법이다. 어떤 확률분포 \( p_{data} \)가 있다고 할때 그 분포에서 데이터를 sampling을 할건데 \( p_{data} \)를 따르도록 sampling을 하고 싶을때, 아래처럼 누적 확률분포 \( F_{data} \)를 구하고 그 누적확률분포의 역함수를 만들어 원래 \( p_{data} \)를 얻을 수있다. 이때 그 역함수 \( F^{-1}_{data} \)에서 uniform하게 데이터를 얻으면 원래 \( p_{data} \) 분포를 따르도록 sampling을 할 수 있다는 것이다.
그니까 사실상 일종의 sampling을 위한 기법인데 이를 반대로 이용하면 위처럼 \( U = F_{data}(\tilde{X}) \)의 식을 얻어낼 수가 있고 Uniform분포는 또 가우시안 분포로 쉽게 변환할 수 있다 ( \( \phi^{-1} \) ). 결론적으로 \( \phi^{-1}F_{data} \) 를 통해 data를 가우시안 분포로 변환할 수 있다는 것이다. 그런데 이렇게 하면 변환된 데이터가 각 dimension에서는 guassian 분포가 되는데 아래에 나와있지만 사실 각 dimension이 gaussian이라고 전체 분포가 gaussian이 되는것은 아니다.
그래서 아래처럼 변환된 데이터를 rotation하면 각 dimension별로 gaussian이 깨지게 된다. 거기서 다시 guassianization을 적용하면 조금씩 전체 분포가 gaussian으로 변환된다.
이 gaussianizaiton flow에서는 그래서 일단 x->z 역변환을 위한 커널을 trainable하게 만들어 학습을 하고 또 rotation을 어떻게 시킬것인지에 대해 trainable rotation matrix를 만들어 학습을 한다고 한다. 이 과정들이 Jacobian계산이 효율적이여서 쉽게 계산할 수 있다고 한다. 그렇게 step1과 step2를 번갈아 가며 커널과 rotation matrix를 학습시키면 아래와 같이 latent variable이 우리가 원하는 가우시안 분포로 변해서 normalizing flow model을 잘 학습시킬 수 있게된다고 한다.
답글 남기기