본문 바로가기
논문

[VAE] Auto-Encoding Variational Bayes 논문 정리(2)

by DI_Lee 2021. 4. 3.

 

 

VAE의 두번째 글이다.

 

앞의 글에서는 VAE의 기본구조와 VAE를 학습하기 위해서 input data x의 likelihood를 최대화하는 수식들을 따라가며 ELBO를 도출하는 것까지 살펴보았다. 이제부터는 ELBO를 이용해서 loss function을 정의하고 그것을 계산해나가는 과정들을 살펴볼 것이다. 

 

 

 

 

결국 우리가 하고 싶은 것은 ELBO를 maximization 해주는 것인데, 보통 최적화에서는

minimization을 하기때문에 ELBO앞에 -를 붙이고 그 값을 최소화하는 세타와 파이를 찾으면 된다.

 

 

이때,  이 수식에서 중요한 것은 각 term이 무엇을 의미하는지 이해하는 것이다.

 

먼저 왼쪽의 Reconstruction error는 어떤 input x가 들어왔을 때 output으로 x가 나올 수 있게 하는 역할을 하는 term이다.

식을 살펴보면 g세타(z)는 결국 z를 decoder에 넣어준 결과이고 그 결과에서 x가 나올 확률을 maximization해주는 것이기 때문에 앞의 term이 결국 reconstruction error가 된다.

 

오른쪽의 Regularization term은 식을 살펴보면 x가 주어졌을 때, z의 distribution이 내가 가정한 z의 distribution과 일치하게 만드는 역할을 하는 term이라는 것을 알 수 있다.

 

이제 그럼 이 식을 실제로 어떻게 계산할 수 있을지 살펴보자.

 

🔥Regularization term

 

먼저 Regularization 파트를 계산하기 위해서 두가지의 가정이 필요하다.

 

먼저 첫번째 가정은, 일단 인코더를 통과해서 나오는 distribution이 VAE에서는 normal distribution을 따른다는 가정이다. 

즉 multivariate gaussian distribution을 따르는데  diagonal한 covariance를 가진경우이다.

 

이 가정이 좀더 단순한 형태가 된것이 바로 가정 2이다.

 

그냥 평균이 0이고 모든 표준편차가 1인 그래서 covariance가 단위행렬로 표현이 되는 그러한 p를 가정하는 것이다.

 

 

즉 인코더를 통과하는 친구는 실제로는 multivariate Gaussian distribution에 diagonal covariance를 갖는 친구지만, 우리가 실제로 z에 대한 distribution은 그냥 가정 2의 표준 정규분포를 따르다고 가정을 하는 것이다.

그럼 이 둘을 같게 해주면서 최적화 시켜줄 수 있다.

 

그럼 어떻게 같게 만들어줄까? 바로 KL Divergence를 이용하는 것이다.

 

 

 

아래에 나와있는 KLD for multivariate normal distributions 식이 바로 변수가 여러개일 때의 KLD 식이다.

(tr은 대각행렬의 합을 의미)

이때 우리는 N1에 해당하는 p(z)를 평균이 0이고, 표준편차가 1인 normal distribution이라고 가정했기 때문에 

KLD식의 평균과 표준편차에 해당하는 값들에 모두 0과 1을 넣어주고 식을 정리해주면 최종적으로 encoder를 통과한 뮤와 시그마만 남게되기 때문에 그 값들을 넣어주면 Regularization 값을 계산할 수 있다.

 

 

🔥Reconstruction error

 

 

일단 먼저 Reconstruction term은 expectation 형태로 되어있기 때문에 정의에 따라서 다음과 같이 적분 형태로 바꿔줄 수 있게 됩니다. 하지만 앞에서도 말했듯이 모든 z에 대한 적분의 형태는 계산이 쉽지 않다.

 

따라서 이때 사용하는 테크닉이 바로 monte-carlo 테크닉이다.

 

monte-carlo technique이란, 어떤 분포를 가정하고 그 분포에서 무한개 혹은 굉장히 큰 수의 sampling을 해서 평균을 내면 그것이 실제 true 기댓값과 거의 동일해질 것이라는 가정이다. 딥러닝에서 monte-carlo 테크닉을 사용하는 것은 사실상 매우 오래걸리기 때문에 잘 사용하지 않기에 여기서는 약간의 trick을 사용한다.

 

바로 L을 1로 가정하는 것이다. 즉, sampling을 한번만 했다는 말과 동일하다. 그냥 랜덤하게 하나만 샘플링을 하고 그것을 대표값으로 사용하는 것이다. 

 

 

 

🔥Reparameterization Trick

 

방금 위에서 살펴본 부분이 바로 이 reparameterization trick이다.

리는 VAE에서 reparameterization trick이라는 것을 써야하는데, 원래 VAE에서 쓰는 방법이 encoder를 통과하면 뮤와 시그마를 뽑아주고, 그것들을 이용해서 normal distribution을 만들고 거기서 sampling을 해 z를 만드는 것이다. 하지만 이 방법은 미분이 불가능하기 떄문에 Backpropagation이 불가능하다. 그래서 등장한 것이 바로 이 reparameterization Trick이다. 위와 같이 평균이 0이고 표준편차가 1인 표준정규분포에서 입실론을 샘플링한뒤, 그것을 표준편차에 곱해주고 뮤에 더해주면 그게 새로운 sampling값이 된다. 이렇게 되면 z가 다음과 같이 식으로 표현이 되고, 즉 미분이 가능해졌기 때문에 backpropagation을 가능하게 만들어준다.

 

 

 

 그럼 지금까지의 reconstruction error의 식을 정리한 과정을 복기해보면, 먼저 expectation 을 적분의 형태로 바꾸어주었고 모든 z에 대해 적분을 계산할 수 없기때문에 Monte-carlo technique을 이용해서 식을 변형해주었다. 

하지만 딥러닝에서는 이 기법이 시간이 매우 오래걸리기 때문에 최종적으로 L을 1로 설정해서 랜덤하게 하나만 샘플링을 해서 그것을 대표값으로 사용했다.

 

 

하지만 여기까지의 최종 식 또한 확률 distribution으로 표현이 되어있기 때문에 계산을 하기위해서 식을 변형해주어야한다.

 

이때 다시  p세타에 대해 어떤 확률분포를 따르냐를 가정해주어야한다.

 

즉 베르누이를 따르거나, 가우시안을 따르거나로 가정을해야하는데, 먼저 첫번째로 베르누이를 따른다고 가정해보자.

그렇게하면, 픽셀의 개수 즉 각 dimension별로 확률을 계산해야하기 때문에 곱하기로 표현을 할 수 있고, log로 인해서 곱셈이 합으로 표현이 가능해진다. 그리고 p세타 식을 베르누이 식으로 변형해주고 그런 뒤 정리를 해주면 cross entropy식이 나오게 된다.

 

 

방금은 베르누이로 가정을 했었는데, 이번에는 가우시안으로 가정을 해보자.

 

이제 뮤와 시그마 값을 디코더가 내주는 것이다. 

그리고 가우시안으로 가정한 것으로 식을 전개해주고, 시그마가 1이라고 가정해서 identity covariance를 가정하면 

결국에 다음과 같이 squared Error로 표현이 가능해진다.

 

 

즉 결국 가우시안으로 가정하면 squared Error가 되고 베르누이로 가정하면 cross entropy가 된다.

 

 

 

즉 기본적으로 Encoder는 가우시안을 사용하지만, Decoder를 다양하게 바꿔주면(reconsturction error식만 바꿔주면 된다) 다음과 같이 다양한 VAE structure를 생성할 수 있다.

 

 

🔥Latent variable dimension

자 그럼 이제 최종적으로, latent variable의 dimension은 어떤 특성을 가지는가를 살펴보자

먼저 input image가 처음에는 선명했으나 latent space를 2차원으로 하면 살짝 흐려지고, 5차원, 20차원으로 갈수록 조금더 디테일한 것들을 표현할 수 있게 된다. 당연히 조금 더 큰 차원으로 축소한 것이 복원이 더 잘되긴하지만, 큰차원으로 축소하는 것은 그만큼 차원축소를 한 의미가 좀 떨어지게 된다.

 

 

🔥VAE 최종 정리

 

최종적으로 VAE를 정리해보면 다음과 같다.

 

 

수식들이 많아서 좀 어렵긴 했지만 차근차근 따라가다보니 그래도 VAE가 뭔지 이해할 수 있었다.  

 

아래에는 VAE의 논문을 정리하고, 공부하는데 참고한 자료들이다. 

특히 숙명여자대학교의 강남우 교수님의 강의와 CS231n 강의, 는 VAE에 대해 자세히 알고 싶으면 꼭 추천하는 강의들이다!

 

<참고 자료>

- 숙명여자대학교 기계시스템학부 강남우 교수님 3.3. Variational AutoEncoder(VAE)강의 youtu.be/GbCAwVVKaHY

- cs231n lecture 13 Generative Models 강의 

youtu.be/5WoItGTWV54

- 이활석님의 '오토인코더의 모든 것' 강의 youtu.be/o_peo6U7IRM

-https://deepinsight.tistory.com/127?category=842339 [Steve-Lee's Deep Insight]