모각코

[모각코 1주차] VAE를 공부하면서!

y_unique 2024. 3. 6. 22:58
728x90

이번은 모각코 1주차 포스팅! 

요즘 공부하고 있는 생성모델 중, 

그 중에서도 VAE에서 궁금했던 점과 

짚고 넘어가야 하는 점들에 대해서 정리해 보았당! 


Reparameterization Trick

이 트릭은 주로 sampling 연산을 미분할 수 없어서 backprop을 사용하지 못하는 문제를 해결하기 위해 사용된다. 

즉 sampling 과정을 바로 미분할 수 없으니! samplig 연산 과정의 parameter를 바꾸어서 미분이 가능하도록 변환하는 기법이다. 

 

입실론을 N(0, 1)에서 샘플링해서 std에 곱해주고 mean과는 더해주는 방식으로 샘플링을 직접 하는 것을 막는 것이다. 이것을 사용하지 않는다면 출력된 mean과 std에 대한 가우시안 분포에서 직접! sampling을 해야하는데, 그렇게 되면 deterministic 하지 않기 때문에 역전파가 불가하다는 것이다. 

샘플링한 latent variable은 Z라고 부르고 이것을 사용해 decoder를 통과시켜 원래 데이터를 생성시키게 된다. 

autoencoder에서는 manifold로 차원 축소를 잘 해내는 것이 목적이지만! 

variational autoencoder는 latent variable z가 가우시안 분포를 따른다고 가정하여 생성에 쓰고자 하는것이 목적! 이다. 

 

Posterior Collapse

먼저 위 모델의 구조를 살펴보자면 다음과 같다.

문장은 단어 단위로 LSTM에 input으로 들어간다. 이 input은 word embedding의 output vector 이고, 문장이 모두 끝까지 입력으로 들어가고 나면 hidden state의 값이 latent space 상에서 multivariate gaussian의 mean과 variance가 된다.

그러면 reparameterization trick을 사용해서 latent code z를 sampling 할 수 있는데,  이 latent code가 decoder LSTM 모델의 initial hidden state가 되어 word space 상에서의 확률을 output으로 내보내게 되는 것이다.

 

여기서 이 모델을 학습시키는데에 있어서 challenge한 부분은 ELBO의 KL term이다. (아래에서 ELBO에 대해 다룰 예정)

만약 모델이 의미있는 latent code를 얻어내도록 학습이 되었다면 KL term은 0이 아닐 것이고, (문장마다 다른 latent code를 생성하려면 prior과 posterior가 동일한 분포를 가지면 안됨) cross entropy term은 상대적으로 작을 것이다. 

 

하지만 위 모델을 그대로! 구현하여 학습한다면 KL term이 0이 되어버리는 문제가 발생한다는 것이다. 이렇게 되면 decoder가 문장을 생성할 때 latent code가 영향을 줄 수 없게 된다. (모든 문장이 동일한 latent code를 가진 것과 같아!) 

 

  • 📌 KL term이 0이 되는 이유는 뭐야?
    • LSTM의 hidden state의 입력이 확률적이기 때문! 따라서 이러한 입력에 LSTM이 민감하기 때문이다.                                  이런 경우 decoder는 latent를 무시해버리고 gradient는 encoder로 흘러가지 않게 된다. 그러면 encoder는 오직 KL term에 의해서만 학습이 되기 때문에 KL term이 0이 되는 것이다. 

 

즉 위 현상은 VAE에서 decoder에 autoregressive model 을 사용할 경우 latent vecter를 무시해버리는 현상인데, 이를

posterior collapse 라고 하며,  VAE가 가진 유명한 문제이다. 쉽게 말하자면 x -> z -> x인 구조에서 latent z에 관한 정보를 잘 담지 못하는 현상이다. 

 

여기서 autoregressive model이란 sequential한 data를 생성하기 위해서 latent vector를 통해 data를 생성하는 decoder가 그냥 CNN이나 MLP가 아닌, RNN이나 PixelRNN과 같은 모델을 지칭한다. 

이러한 posterior collapse같은 현상은 더 long한 sequence data를 생성하려고 할 때 더 잘 드러나게 된다. 


위 현상을 수학적으로 더 접근해보자면, 

먼저 VAE의 목적식인 evidence variational lower bound (ELBO)는 아래와 같다. 

  • x: observed variable
  • z: latent variable 

다음과 같은 local optimum이 빠지는 것을 의미한다. 우리는 z와 x에 관련된 유의미한 정보가 담기길 기대히지만! 그렇지 못한다는 것! 

 

더하여 위와 같은 ELBO를 maximize 한다는 것은 approximated posterior와 model posteriord의 KL divergence를 minimize하는 것과 동일하다! 는 것을 알고 가야한다. 


그러면 이러한 현상을 어떻게 해결할까! 

 

1) KL cost annealing 

KL term에 곱해지는 weight variable을 도입하는 것이다.

도입된 최종 Object식은 다음과 같은데, 단순히 β라는 weight를 KL에 곱해준 것이다. 

가능한 많은 정보를 latent에 담아내라는 의미에서 학습이 시작될 때 β는 0으로 setting해준다. 다음 학습이 진행됨에 따라 β의 값을 점점 증가시킴으로써 latent code를 smooth하게 prior 분포로 묶어준다. 

 

다음 β가 1이 되면 원래 ELBO의 값이 되어서 일반적인 VAE가 되는 것이다. 

β를 0에서 1로 키우는 과정이 파란색 선과 같고 그림과 같이 sigmoid 함수의 형태로 나타낸다. 초반에 KL이 상승하는데, 점점 β가 1에 가까워지면 KL term은 줄어들어 수렴하게 된다. 

 

 

 2) Word dropout and historyless decoding 

word drop은 한마디로 decoder를 약하게 만드는 방법이다. 학습 과정 동안 decoder의 LSTM은 이전 ground truth를 input으로 받는데, 이러면 데이터 자체에 의존해서 다음 word를 생성한다. 이 때, ground truth의 일부를 무작위로 다른 단어로 바꾸어 주는 것인데, 이러면 decoder는 새로운 latent vector에 의존해서 문장을 생성하게 될 것이다. 전체 문장 중에  단어 몇 개를 바꿀 것인지는 새로은 parameter로 조정하게 된다고 한다.

 

 

근데 여기서 의문...

 

이런 방식이 왜 decoder를 약하게 만드는 방법이지?

그리고 decdoer를 약하게 만드는 방법이 왜 posterior callopse의 해결 방안인 것일까?

 


의문만 잔뜩 남긴 포스팅인가

아니 근데 사실 이렇게 정리해도 

반은 이해하고 반은 이해 못 한 거 같애!

진짜 VAE ... 너무 어려운 녀석..

쪼금만 더 더 더 파고들어보도록 할게요.

일단 시간이 늦었으니!

ㅃ ㅏ이