IT Repository

(2) VAE (Variational AutoEncoder) 본문

Generative/Study

(2) VAE (Variational AutoEncoder)

IT찬니 2020. 1. 18. 19:23

 

 

 

 

 

 

 

참고.
VAE는 이해하기가 수학적으로 조금 까다롭습니다. (정말 어렵습니다 ㅠ)
수학적인 내용을 최소화하면서 설명하나, 기본적인 통계지식은 조금 필요합니다.

(여기서는 KL Divergence를 사용하여 VAE를 설명합니다. Jensen's inequality를 사용하여 ELBO를 설명하는 방법도 있으나 이 부분에 대해서는 다루지 않습니다.)

 

Main Idea of VAE

아래는 VAE의 모델구조를 수식학적으로 해석한 내용입니다.
두 개의 독립사건의 확률은 두 사건의 곱으로 표현할 수 있으므로 아래의 수식이 성립합니다.

$p_\theta(x) = \displaystyle \int p_\theta(z) \cdot p_\theta (x|z) dz$
($\theta$는 nn에 있는 파라미터들의 집합)

 

(1)
각 항은 아래와 같으며, 두 확률밀도함수의 곱을 적분을 모델의 확률밀도함수 $p_\theta (x)$로 정의합니다.
(우리가 찾아내려는, 모델의 PDF $p(x)$를 결정하는 파라미터는 $\theta$ 입니다.)

$p_\theta(z)$는 latent vector z의 확률밀도함수
$p_\theta (x|z)$는 특정한 z 값일 때, 어떤 x가 나올지의 조건부 확률에 대한 확률밀도함수

(2)
즉, 아래와 같이 최종적인 x의 확률을 근사합니다.

  1. 잠재 벡터 z의 확률을 알아내고
  2. 그 다음에 z가 주어졌을 때 x의 확률을 알아냄

(3)
AutoEncoder 구조를 생각해보면
$p_\theta(z)$는 Latent z를 근사하는 확률이므로 인코더
$p_\theta (x|z)$는 z가 주어졌을 때 x를 근사하는 확률이므로 디코더와 유사하겠네요.

(물론 AutoEncoder의 디코더는 단지 학습을 위한 수단에 불과합니다.)

(4)
$p_\theta (x)$는 모델의 확률밀도함수이므로 그 값이 곧 Likelihood가 됩니다.
최대 가능도 추정에 따라 가능도의 최대값이 높은 확률분포가 관측값을 잘 표현하는 모집단입니다.

 

따라서, VAE의 핵심 아이디어는 $p_\theta (x)$의 값이 높아지는 방향으로 트레이닝 시킨다면, $\theta$는 시스템을 잘 표현하는 값으로 최적화된다는 것입니다.

 

What is VAE?

(AutoEncoder에 대한 내용은 이 곳을 참고해주세요.)

AutoEncoder의 디코더는 Latent vector z에서 기존의 데이터를 최대한 비슷하게 복구하는 것이 목표였습니다.
그러나 VAE는 Latent vector z를 통해 유사한 새로운 데이터를 생성하는 것을 목표로 합니다.

예를 들어, 사람을 그리기 위한 조건이(성별, 키, 얼굴형 등) 주어집니다.
그리고 이 조건을 통해 그림을 그린다고 합시다.

여기에서 사람을 몇 가지 조건으로 표현한 것이 Latent vector z가 되고, 그 z를 통해 그린 그림이 x가 되겠네요.
이를 아래와 같이 표현할 수 있습니다.

$\array{ z & \rightarrow & x \\ p_{\theta^\ast}~(z) && p_{\theta^\ast}~(x|z^{(i)})}$

 

즉, 우리는 위의 두 PDF를 잘 표현할 수 있는 모델의 파라미터 $\theta ^\ast$를 찾아내기만 하면 됩니다.

 

Variational Inference

Variational inference란?
이상적인 확률분포를 추정하기 위해서,
다루기 쉬운 분포를 가정하고 이 확률분포의 모수를 바꿔가며 이상적인 확률분포에 근사하게 만들어 대신 사용하는 확률분포 추론방법입니다.

(VAE가 Variational 이라는 수식어가 붙는 이유는 바로 이 Variational Inference를 가정으로 사용하기 때문입니다.)

Variational Inference에서 일반적으로 다루기 쉬운 분포로써 Gaussian 분포를 사용합니다.

따라서, z의 분포 $p(z)$는 Gaussian 분포를 따른다고 가정합니다.
(실제로 대부분의 표정, 포즈, 생김새 등은 일정한 평균에서 조금씩 바뀌는 것과 같으므로 어느정도는 맞는 가정입니다.)

 

How Can We Close to the Actual Distribution?

어찌되었든 두 PDF ($p_{\theta^\ast}~(z)$와 $p_{\theta^\ast}~(x|z^{(i)})$)가 각각의 실제 PDF에 근사하도록 만들면 된다는 것을 알겠는데 어떻게 근사하도록 만들 수 있을까요?
PDF의 값은 가능도이며, 가능도를 최대로 만드는 PDF가 실제와 유사하다고 추정할 수 있는 분포라는 것을 최대 가능도 추정에서 학습했었습니다.

즉, 우리는 최대 가능도 추정을 사용해서 PDF를 실제의 분포에 근사할 것입니다.
그러면 가능도를 계산해봅시다.

(1)
가능도를 계산하기 위한 확률밀도함수 $p(x)$는 아래와 같습니다.

$p_\theta(x) = \displaystyle \int p_\theta(z) \cdot p_\theta (x|z) dz$

그러나 이를 적분할 수가 없습니다.
왜냐하면 $p_\theta(z)$는 우리가 Gaussian 이라는 것을 알고 있습니다.
그러나 단순한 Gaussian에서 고차원 데이터로 향하는 매핑인 $p_{\theta}~(x|z)$는 굉장히 복잡할 것입니다.
따라서, $p_\theta (x|z)$는 모든 샘플을 샘플링해야지만 알 수 있습니다.
(샘플링을 해야지만 알 수 있다는 이야기는 이미지라고 생각했을 때, z를 통해 원본같은 x'을 만들어 내는 함수를 알고 있다면 이미 원본 x의 PDF를 알고 있다는 이야기가 되어버리기 때문입니다.)
그러면 전체 z에 대해서 적분을 하기위해서 Latent space z에 대해서 무한번 샘플링을 해야합니다.

PDF를 정의할 수 없으므로 $p_{\theta}~(x|z)$는 nn을 통해 근사할 수 밖에 없습니다.

(2)
아래는 Bayesian rule에 의해 계산된 사후확률입니다.

$p_\theta(z|x) = p_\theta(x|z) \cdot \dfrac{p_\theta(z)}{p_\theta(x)}$

수식을 보면 이미 눈치채셨겠지만, 가능도 함수가 계산 불가능하면 사후확률도 계산 불가능합니다.
따라서, PDF를 정의할 수 없는 $p_\theta(z|x)$ 역시 nn을 통해 근사할 수 밖에 없습니다.

 

여기서 각 조건부 확률의 의미를 생각해 봅시다.

$p_\theta(x|z)$는 x에서 z로 가는 매핑, 즉 Encoder 입니다.
$p_\theta(z|x)$는 z에서 x로 가는 매핑, 즉 Decoder 입니다.

이 두 개의 구조를 우리는 확률밀도함수로 나타낼 수 없기 때문에 nn을 사용합니다.

 

Q. 왜 PDF를 정의할 수 없는 경우에 nn을 사용하나요?

우리는 nn 역시 MLP이든 CNN, RNN이든 수학적으로 나타냈었습니다.
이 때문에 nn으로 인코더와 디코더를 표현하면 수학적인 모델링이 가능하지 않은가 라고 생각할 수 있습니다.

개인적으로 공부하면서 이 부분이 헷갈려서 생각을 해본 결론은 "PDF는 알 수는 없다." 입니다.

nn으로 레이어를 쌓았을 때에 그 레이어와 오퍼레이션에 대한 수학적 모델링을 통해 구현된게 맞습니다.
z와 x의 분포를 나타내기 위한 함수인 PDF는 모델 파라미터인 수많은 Weight와 bias들을 통해 계산된 값입니다.
따라서, Weight와 bias의 분포를 알아야지 PDF를 정의할 수 있게 됩니다.
그러나 Gradient에 의해 업데이트 되는 이 파라미터들은 어떠한 분포를 통해 업데이트되는 것이 아닙니다.
우리는 이 파라미터들의 분포를 알 수가 없습니다.

따라서, nn은 PDF를 알 수는 없지만 샘플링은 가능한 구조입니다.

(혹시 제가 이해한게 잘못된 것이라면 지적해주시면 반영하여 수정하겠습니다.)

 

What Encoder and Decoder Exactly Do

Encoder network
$q_\phi(z|x)$ (parameters $\phi$)
x를 입력받아, z를 매핑하는 Mean($\mu_{z|x}$)과 Covariance($\sum_{z|x}$)를 구하는 네트워크

Decoder network
$p_\theta(x|z)$ (parameters $\theta$)
z를 입력받아, x를 매핑하는 Mean($\mu_{x|z}$)과 Covariance($\sum_{x|z}$)를 구하는 네트워크

 

그런데 위의 그림을 보면 인코더의 아웃풋과 디코더의 인풋이 서로 다른 것을 알 수 있습니다.
Mean과 Covariance를 알면 우리는 어떠한 Gaussian 분포를 특정할 수 있습니다.
따라서, 특정한 분포에서 하나의 값을 샘플링한 후에 디코더로 흘려보냅니다.

(인코더 역시 마찬가지로 특정한 분포에서 샘플링하여 아웃풋을 출력하게 됩니다.)

즉, 각 네트워크의 최종적인 아웃풋은 아래와 같이 출력됩니다.

Sample $z \leftarrow z \sim \mathcal{N} \left( \mu_{z|x}, \sum_{z|x} \right)$
Sample $x|z \leftarrow x|z \sim \mathcal{N} \left( \mu_{x|z}, \sum_{x|z} \right)$

 

So, How Can We Maximize Likelihood?

그러면 가능도를 계산하는 것은 불가능하므로 가능도를 최대화하는 것은 가능할까요?
만약 가능도를 최대하는 것만이라도 가능하다면, 값은 모르더라도 최대화만 하면 우리의 목표에는 부합할 것입니다.
즉, Optimize는 가능하다는 이야기가 되겠네요.

만약 $p_\theta(x)$의 lower bound가 있다면,
가능도 값이 lower bound 아래로는 떨어질 수 없으므로 lower bound를 계속해서 올려감으로써 가능도를 최대화할 수 있습니다.
(이를 Evidence LowerBOund, ELBO라고 합니다.)

 

Lower Bound with KL Divergence

그러면 $p_\theta(x)$의 lower bound가 존재하는지 알아보겠습니다.

계산을 쉽게 하기 위해서, 가능도 함수를 그대로 사용하지 않고 로그 가능도를 사용해서 계산합니다.
(log함수는 단조증가함수로써 log함수의 lower bound가 있다면, $p(x)$ 역시 lower bound가 있습니다.)

참고.
$\log p_\theta (x^{(i)}) = \mathrm{E}_{z \sim q_{\phi}~\left(z|x^{(i)}~\right)} \bigg[ \log p_\theta \left( x^{{(i)}} \right) \bigg]$의 의미

(1) $q_{\phi}~\left(z|x^{(i)}~\right)$: 인코더 네트워크가 표현하는 Gaussian 분포
(2) $z \sim q_{\phi}~\left(z|x^{(i)}~\right)$: 인코터 네트워크에서 샘플링한 $z$
(3) $\mathrm{E}_{z \sim q_{\phi}~\left(z|x^{(i)}~\right)} \Big[ \log p_\theta \left( x^{{(i)}} \right) \Big]$: 샘플링한 $z$에 대한 $\log p_\theta \left( x^{{(i)}} \right)$의 기대값(적분값)

 

(아래 수식을 따라가기가 너무 버겁다면 마지막 수식만 확인하고, 설명으로 넘어가세요.)

$\begin{eqnarray} \log p_\theta (x^{(i)}) & = & \mathrm{E}_{z \sim q_{\phi}~\left(z|x^{(i)}~\right)} \bigg[ \log p_\theta \left( x^{{(i)}} \right) \bigg] \\ & = & \mathrm{E}_z \bigg[ \log \dfrac{p_\theta \left( x^{(i)} | ~z \right) p_\theta \left( z \right)}{p_\theta \left( z~|~x^{(i)} \right)} \bigg] ~~~~~~~~~~ \big( \text{Bayes' Rule} \big) \\ & = & \mathrm{E}_z \bigg[ \log \dfrac{\color{red} {p_\theta \left( x^{(i)} | ~z \right)} \color{blue} {p_\theta \left( z \right)}}{\color{green} {p_\theta \left( z~|~x^{(i)} \right)}} \cdot \dfrac{\color{green} {q_\phi \left( z~|~x^{(i)} \right)}}{ \color{blue} {q_\phi \left( z~|~x^{(i)} \right)}} \bigg] ~~~~~~~~~~ \big( \text{Multiply by constant} \big) \\ & = & \mathrm{E}_z \bigg[ \log \color{red} {p_\theta \left( x^{(i)} | ~z \right)} \div \color{blue} {\dfrac{q_\phi \left( z~|~x^{(i)} \right)}{p_\theta \left( z \right)}} \times \color{green} {\dfrac{q_\phi \left( z~|~x^{(i)} \right)}{p_\theta \left( z~|~x^{(i)} \right)}} \bigg] ~~~~~~~~~~ \big( \text{Transformation} \big) \\ & = & \mathrm{E}_z \bigg[ \log p_\theta \left( x^{(i)} | ~z \right) \bigg] - \mathrm{E}_z \bigg[ \log \dfrac{q_\phi \left( z~|~x^{(i)} \right)}{p_\theta \left( z \right)} \bigg] + \mathrm{E}_z \bigg[ \log \dfrac{q_\phi \left( z~|~x^{(i)} \right)}{p_\theta \left( z~|~x^{(i)} \right)} \bigg] ~~~~~~~~~~ \big( \text{Logarithms} \big) \\ & = & \mathrm{E}_z \bigg[ \log p_\theta \left( x^{(i)} | ~z \right) \bigg] - D_{KL} \left( q_\phi \left( z~|~x^{(i)} \right) ||~p_\theta \left( z \right) \right) + D_{KL} \left( q_\phi \left( z~|~x^{(i)} \right) ||~p_\theta \left( z~|~x^{(i)} \right) \right) \end{eqnarray}$

참고.
KL Divergence ($D_{KL}$)

$D_{KL} (p||q)$의 정의 : 두 개의 분포, 즉 PDF가 있을 때 두 PDF $p$와 $q$의 비슷한 정도
(1) 비슷하면 낮은 값, 서로 다르면 높은 값
(2) $D_{KL} \geqq 0$

 

최종적으로 도출된 식의 의미를 살펴보면,

1번째 항
z가 주어졌을 때 x를 표현하기 위한 확률밀도함수, 즉 디코더 네트워크를 나타냅니다.
디코더 네트워크의 가능도가 크면 클수록 $\theta$가 그 시스템을 잘 표현하고 있다고 해석할 수 있습니다. (= z로부터 좋은 x의 표현을 만들어 낸다.)
따라서, 1번째 항이 클 수록 모델의 가능도가 커집니다.

2번째 항
x로부터 z를 표현하는 확률밀도함수, 즉 인코더 네트워크와 전제했던 Gaussian 분포가 얼마나 유사한지를 나타냅니다.
유사할수록 KL Divergence는 낮은 값을 나타내므로 인코더 네트워크가 Gaussian 분포를 최대한 잘 표현할 수록 모델의 가능도가 최대화 됩니다.
따라서, 2번째 항이 작을 수록 모델의 가능도가 커집니다.

3번째 항
$p_\theta \left( z~|~x^{(i)} \right)$를 구할 수 없습니다. (intractable)
그러나 KL Divergence는 반드시 0이상의 값입니다.

결론
3번째 항의 값을 알수는 없지만, 가능도의 Lower Bound는 "1번째 항과 - 2번째 항" 이상일 것입니다.
따라서 "1번째 항과 - 2번째 항" 의 값을 올리는 방향으로 트레이닝을 하면, $p_\theta(x)$를 실제의 분포와 유사하도록 근사할 수 있다는 결론이 도출됩니다.

 

Training Procedure

그러면 이제부터 VAE를 훈련시키기 위한 훈련 과정을 알아보겠습니다.

$\mathcal{L} \left( x^{(i)}, \theta, \phi \right) = \mathrm{E}_z \Big[ \log p_\theta \left( x^{(i)} | ~z \right) \Big] - D_{KL} \left( q_\phi \left( z~|~x^{(i)} \right) ||~p_\theta \left( z \right) \right) \\ \log p_\theta \left( x^{(i)} \right) \geqq \mathcal{L} \left( x^{(i)}, \theta, \phi \right)$

위 설명에서의 1번째 항 - 2번째 항을 3개의 변수를 가진 $\mathcal{L} \left( x^{(i)}, \theta, \phi \right)$로 표현하겠습니다.
3번째 항은 어차피 계산 불가능한 항이었으므로 $\mathcal{L} \left( x^{(i)}, \theta, \phi \right)$는 Lower Bound가 됩니다.

우리는 이 Lower Bound를 높이는 방향으로 트레이닝을 해나갈 것입니다.

 

1. 인코더 네트워크

(1)
인풋 x를 인코더 네트워크 $q_\phi (z|x)$ 에 흘려보내서 $\Big( \mu_{z|x}, \sum_{z|x} \Big)$를 출력합니다.
이를 통해 두번째 항의 값을 구합니다.

(2)
$\Big( \mu_{z|x}, \sum_{z|x} \Big)$인 Gaussian 분포에서 z를 샘플링합니다.

$z \leftarrow z|x \sim \mathcal{N} \Big( \mu_{z|x}, \sum_{z|x} \Big)$

2. 디코더 네트워크

(3)
샘플링한 z를 디코더 네트워크 $p_\theta (x|z)$ 에 흘려보내서 $\Big( \mu_{x|z}, \sum_{x|z} \Big)$을 출력합니다.
이를 통해 첫번째 항의 값을 구합니다.

(4)
$\Big( \mu_{x|z}, \sum_{x|z} \Big)$인 Gaussian 분포에서 z를 샘플링한 후 $\hat{x}$를 만들어냅니다.

$\hat{x} \leftarrow x|z \sim \mathcal{N} \Big( \mu_{x|z}, \sum_{x|z} \Big)$

3. 파라미터 업데이트

(5)
Backpropagation을 통해 $\mathcal{L} \left( x^{(i)}, \theta, \phi \right)$를 높이는 방향으로 Gradient Ascent 합니다.
즉, 가능도가 증가하는 방향으로 파라미터 $\phi$와 $\theta$를 업데이트 합니다.

 

Generate Data

$z \leftarrow z \sim \mathcal{N} \left( 0, I \right)$

트레이닝이 완료되고 실제로 데이터를 생성하기 위해서는 우리가 z를 Gaussian 분포로 가정했으므로, Gaussian 분포에서 샘플링한 값 z를 디코더 네트워크에 흘려보내고 동일한 과정으로 최종적으로 $\hat x$를 얻어내면 됩니다.

 

Summary of VAE

아래는 VAE의 장점과 단점입니다.

  • Pros
    • 생성모델에 대한 수학적인 접근
    • 인코더가 다른 작업에 대해 유용한 feature representation을 할 수 있음
  • Cons
    • 가능도의 lower bound를 최대화하는 방식이 Pixel RNN/CNN 보다 좋은 결과가 있지 않음
    • GAN에 비해 생성된 결과가 블러가 많고 질이 떨어짐

사실 위에 단점으로 언급했듯이 블러되는 부분이 강해서, VAE의 퀄리티가 크게 뛰어나지는 않습니다.
우리가 z의 분포를 Gaussian으로 가정했지만, 실제로는 Gaussian이 아닌 경우도 있는 것이 있겠죠.

그래서 딥러닝으로 생성 모델 구성할 때 VAE보다는 GAN을 많이 사용하게 됩니다.
이제는 그러면 최근에 매우 연구도 활발하게 이루어지고 있는 핫한 아키텍쳐인 GAN을 알아보도록 하겠습니다.

 

(GAN은 굉장히 스마트한 방법으로 데이터를 생성하기 위한 구조입니다.
그러나 모델의 수렴이 어렵다는 문제는 계속해서 지적되고 있습니다.
그래서 GAN을 수렴시키는 것이 GAN 분야에서는 중요한 연구 영역이기도 합니다.
VAE보다 실질적으로 GAN이 많이 사용되는 것은 사실이지만 이러한 GAN의 수렴을 위해 AutoEncoder를 사용하는 방법도 있습니다.)

Here is the implemetaion of VAE

'Generative > Study' 카테고리의 다른 글

(3) GAN (Generative Adversarial Network)  (0) 2020.01.19
(1) Introduction of Generative Models  (0) 2020.01.18
(0) Overview of Generative Models  (0) 2020.01.14
Comments