본문 바로가기

모델/기타

Variational AutoEncoder(VAE)

안녕하세요. 이번 시간엔 Variational AutoEncoder에 대해 보겠습니다.

(현재 모델을 실험할 수 없는 환경이라 이론만 계속 공부하고 있습니다)

현재 Variational Autoencoder를 활용한 추천시스템 논문을 읽다보니 이 알고리즘을 공부하게 되었습니다.

 

참고 자료는 다음과 같습니다.

 

Variational AutoEncoder 기초, Reparametrizing trick

jaejunyoo.blogspot.com/2017/05/auto-encoding-variational-bayes-vae-3.html

 

초짜 대학원생의 입장에서 이해하는 Auto-Encoding Variational Bayes (VAE) (3)

Machine learning and research topics explained in beginner graduate's terms. 초짜 대학원생의 쉽게 풀어 설명하는 머신러닝

jaejunyoo.blogspot.com

 

cs231n Lecture13

기본구조는 이 영상을 토대로 만들었습니다(아래에서 '영상'이라는 단어가 나온다면 이 영상을 언급한 것입니다.)

www.youtube.com/watch?v=5WoItGTWV54

 

 

cs231n_2017_lecture13.pdf (cs231n Lecture13 자료)

cs231n.stanford.edu/slides/2017/cs231n_2017_lecture13.pdf

 

(cs231n 보조 참고용)

wingnim.tistory.com/70

 

Variational Autoencoder (VAE) 설명 (cs231n 참고)

기존 강의는 pixelCNN의 설명부터 시작한다. VAE는 intractable한 (조절이 까다로운?) latent(잠재) vector z에 대한 density function을 알아내려 한다. 다만 바로 직접적으로 모델을 학습시킬 수는 없고, 대신..

wingnim.tistory.com

 

Deep Generative Modeling | MIT 6.S191 (Reparametrizing trick 참조)

www.youtube.com/watch?v=rZufA635dq4

 

2019_6S191_L4.pdf (Deep Generative Modeling | MIT 6.S191 자료)

introtodeeplearning.com/2019/materials/2019_6S191_L4.pdf

구조

우선 Variational AutoEncoder(이하 VAE라고도 함)에 이름에 AutoEncoder가 붙은 것은 단순히 아래와 같이 네트워크 구조가 유사하여 붙은 것입니다. (아래 그림 참조)

그림 1. AutoEncoder

 

그리고 VAE는 원래 input이 특정 latent variable에서 나온 것이라고 가정합니다. 이를 그림으로 나타내면 다음과 같습니다.

그림 2. Variational AutoEncoder 원리(decoder 부분)

즉, latent variable $z$의 사전확률인 $p(z)$에서 특성 n개를 추출하고 각 특성에 대한 x의 조건부 확률을 구해서 최종적으로 data인 x를 만드는 것입니다. 여기서 $\theta$는 이 모델의 parameter이며 $*$는 optimization이 된 것을 의미하는 것으로 위의 조건부 확률과 사전확률이 최종적으로 optimization 된 모델에서 샘플링 한다는 것을 말합니다.

 

그렇다면 이 모델을 어떻게 표현할 수 있을까요?

1. 우선 각 latent variable의 확률분포인 사전확률 $p(z)$에 대해 정의합니다. 이를 단순한 확률분포(Gaussian 등)로 정의할 것인데 이는 계산량 문제도 있고 단순한 확률분포일지라도 여러 개가 모이면 복잡한 함수도 표현할 수 있기 때문입니다.

* Gaussian으로 사전분포를 가정한 이유는 모델을 최적화하는데 합리적인 분포이기 때문이라고 합니다.

2. $p(x|z)$에 대해 정의합니다. $p(x|z)$의 경우 $z$보다 복잡한 확률모델이 될 것인데 이는 z를 가정했을 때 우리의 input data 분포이기 때문입니다(동시에 이미지를 생성하는 부분이기도 하지요). 그러기 때문에 단순한 확률분포로는 표현하기 어렵습니다. 영상에서는 이를 neural network로 표현할 수 있다고 합니다. 이는 Mean field approximation에서 기원한 것으로 보입니다. 즉, 특정 확률분포는 다음과 같이 나타낼 수 있습니다.

$p(x|z) = \frac{1}{n} \prod_{i=1}^{N} p(x|z_{i})$

학습 과정(그림)

이제 구조를 만들었으니 이를 학습시키는 방법을 그림으로 보겠습니다. 이 식을 통해 학습시킬 수 있습니다.

$p_{\theta}(x) = \int p_{\theta} p_{\theta}(x|z)dz$

 

하지만 이 식을 쓰려면 $z$는 latent variabale이기 때문에 모든 $z$에 대해 적분하는 것은 불가능합니다. 그렇다면 Posterior은 어떨가요?

 

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

여기서는 $p_{\theta}(x)$ 부분이 문제입니다. x의 계산량이 너무 많아 계산할 수 없습니다. 이 분포를 우리가 애초에 안다면 위의 식을 쓰면서 복잡하게 할 필요가 없습니다.

 

그렇다면 어떻게 해야할까요? 방법은 다음과 같습니다.

decoder 뿐만 아니라 $p_{\theta}(z|x)$ 에 근사한 $q_{\phi}(z|x)$로 encoder network를 만든다.

이는 $p(x)$에 대한 lower bound를 생성하는데 이는 $p(x)$에 비해 계산이 쉬워 계산을 가능하게 만들어줍니다.

위의 방법을 적용했을 때 모델 network(구조)는 다음과 같습니다.

여기서 $\mu$는 평균을, $\Sigma$는 공분산을 의미합니다. Encoder에서는 x를 Encoder network($ \q_{phi}(z|x) $)에 넣어 \mu_{z|x}$와 $\Sigma_{z|x}$를 생성합니다. 즉, x라는 input 값으로 $q_{\phi}(z|x)$를 구하여 (확률분포는 Gaussian으로 가정하여, 평균값과 분산값이 생성됩니다) 최종적으로 z값을 sampling 하는 것입니다.

Decoder도 유사합니다. z를 Decoder network에 넣어 $\mu_{x|z}$와 $\Sigma_{x|z}$을 구하고 (확률분포는 역시 Gaussian으로 가정) 이를 활용해 $p_{\theta}(x|z)$을 만들어 x|z을 값을 sampling 하게 됩니다.

여기서 $q_{\phi}(z|x) = N(\mu_{z|x}, \Sigma_{z|x})$가 되는 것입니다.(Decoder도 같음)

 

학습과정 (식)

그림에 대해서는 이렇게 정리할 수 있습니다. 다음으로는 위의 그림에 대한 식을 보도록 하겠습니다.

그림 4. p(x)에 대한 수식 (출처 : cs231n_2017_lecture13.pdf)

$p_{\theta}(x)$에 대해 최적화를 해야하므로 식을 나열하는 과정입니다. 표현 방법은 여러 방법이 있으나 저는 영상의 방법을 참고하였습니다.

1. 첫 번째 줄에서 $log p_{\theta}(x^{(i)})$를 Expectation 값에 넣은 것을 볼 수 있습니다. 어차피 Expectation 값에 대해 $logp_{\theta}(x^{(i)})$는 상수라 넣은 값과 넣지 않은 값은 같습니다.

2. 두 번째 줄에서는 Bayes Rule을 사용하여 값을 분해했습니다. 

3. 세 번째 줄은 $q_{\phi}(z|x^{(i)})$을 분모, 분자로 만든 값으로 약분하면 1이 되기 때문에 우변에 곱해도 좌변과 같다는 등식이 성립합니다.

4. 네 번째 줄은 log 규칙에 의해 식이 나뉠 수 있습니다.

5. 다섯 번째 줄은 우변 2개의 식을 KL Divergence로 바꿔준 형태입니다.

 

여기서 마지막 줄의 식에 대해 보면 다음과 같습니다.

- $E_{z}[logp_{\theta}(x^{(i)} | z)]$ : Decoder network에서 나오는 값입니다. sampling을 통해 parameter들을 추정할 수 있습니다.(즉, deep learning에서 backpropagation으로 추정하는 것입니다) 단, Reparametrizing trick을 써야 미분이 가능하여 backpropagation이 가능합니다.

- $D_{KL}(q_{\phi} (z | x^{(i)} || p_{\phi} (z) )$ : 우리가 만들었던 q 함수와 p 함수의 분포차이를 의미합니다.(KL divergence가 두 분포의 차이를 측정하는 것이기 때문에 이러한 의미가 있습니다)

- $D_{KL}(q_{\phi} (z | x^{(i)} || p_{\phi} (z| x^{(i)}) )$ : 두 번째 식이랑 유사하나 $p_{\phi}(z | x^{(i)})$ term이 있습니다.  이 값은 위에서도 봤지만 계산이 불가능한 term이라 수정이 필요합니다.

 

위의 마지막 term에 대한 해결책으로 다음과 같은 특성을 활용합니다.

그림 5. p(x)에 대한 수식 (출처 : cs231n_2017_lecture13.pdf)

위의 그림 5는 마지막 수식을 다르게 표현한 것입니다. 파란색 박스로 된 부분이 우리가 한번씩 언급하는 ELBO(Evidence Lower BOund)라는 부분입니다. 왜 그렇게 되냐면 저기 마지막 term은 $\ge 0$이기 때문에 $logp_{\theta}(x^{(i)})$는 ELBO보다 크거나 같은 부등식 형태의 식이 만들어집니다.

$logp_{\theta}(x^{(i)}) \, \ge \, \mathcal{L}(x^{(i)}, \theta, \phi )$

 

이를 통해 최종적으로 학습하는 식은 다음과 같이 구성됩니다.

$\theta^{*}, \phi^{*} = arg max_{\theta, \phi}\sum_{i=1}^{N}\mathcal{L}(x^{(i)}, \theta, \phi)$

여기서 마지막 term은 어차피 0보다 크므로 냅두고 ELBO의 값을 최대화 시켜서 최종적으로 $logp_{\theta}(x^{(i)})$의 값을 극대화 시키는 parameter를 찾는 것입니다. 이 과정에서 z도 학습이 되기 때문에 최종적으로는 x를 제일 잘 생성할 수 있는 latent variable z의 parameter까지 학습시키는 것입니다. 

* 계산을 가능하게 하기 위해 마지막 term 부분까지는 고려를 못하는 측면도 있긴 하지만 lower bound 이상의 확률값은 만들게 됩니다.

 

추가로 ELBO 식을 보면 다음과 같은 형태입니다.

- $E_{z}[logp_{\theta}(x^{(i)} | z)]$ : 모든 z의 경우를 고려한 $x^{i}$에 대한 expectation 값입니다. 이는 input data를 Reconstruct하는 부분에 대한 식입니다.

- $D_{KL}(q_{\phi} (z | x^{(i)} || p_{\phi} (z| x^{(i)}) )$ : 우리가 만든 q함수에 대한 사후확률을 사전확률과 유사하게 만드는 부분의 식입니다.

식과 구조

이제 식과 구조를 연결해보겠습니다.

그림 6. 식과 구조 연결(encoder) (출처 : cs231n_2017_lecture13.pdf)

그림 6을 보면 네모난 x가 있는데 그곳은 Input Data부분입니다. 과정은 다음과 같습니다.

- mini batch로 x 데이터 생성하고 Encoder network에 넣으면 평균값과 공분산을 만들 수 있는데 이를 $\mu z|x$, $\Sigma z|x$라고 명명합니다. 여기서 Encoder network인 $q_{\phi}(z|x)$는 KL divergence의 사후분포를 사전분포에 근접시키는데 활용됩니다.

- $\mu z|x$, $\Sigma z|x$을 정규분포 식에 넣어 Sample z를 추출합니다.

- z을 Decoder network에 넣어 $\mu x|z$, $\Sigma x|z$을 생성합니다. 

- $\mu x|z$, $\Sigma x|z$을 정규분포 식에 넣어 최종적으로 $x^{hat}$을 생성합니다. 이 값은 ELBO의 첫번째 term 부분에 이용됩니다.

부록 : Reparametrizing trick

위에서 보면 $E_{z}[logp_{\theta}(x^{(i)} | z)]$는 Reparametrizing trick이 필요하다고 했습니다. 왜 그럴까요? 이유는 z가 sampling 된 값이기 때문에 backpropagation에서 미분이 불가능하기 때문입니다.

그림 7. Reparametrizing trick (출처 : 2019_6S191_L4.pdf)

그림 7의 왼쪽을 보면 z는 Stochastic node입니다. 즉, z는 현재 sampling된 값이므로 미분이 안됩니다. 이를 Deterministic node로 바꾸기 위해 오른쪽에서는 $\epsilon$ 값을 추가로 쓰고 있습니다.

* Deterinistic node : input이 같으면 output도 같은 값으로 나오는 노드

z에 Reparametrizing trick을 적용하면 아래와 같은 식으로 변형됩니다. 

$ z = g(\phi, x, \epsilon) = (예시)  \mu(z|x) + \Sigma(z|x)*\epsilon$

즉, z는 특정 파라미터로 미분할 수 있는 형태가 되는 것입니다. 기존에는 $ z ~ N(\mu(x|z), \Sigma(x|z))$에서 변형된 것입니다.

 

지금까지 Variational AutoEncoder에 대한 설명이었습니다.

혹시 이해안되시거나 궁금하신점, 잘못된 부분 있으시면 말씀해주세요!

감사합니다.

'모델 > 기타' 카테고리의 다른 글

LMNN(Large Margin Nearest Neighbors)  (0) 2021.04.08
LSTM  (0) 2020.12.28
Recurrent Neural Network  (0) 2020.12.27
DTW(Dynamic Time Warping)  (0) 2020.08.02