VAE Tutorial 3

VAE Tutorial 3: SequenceVAE


1. Introduction

MusicVAE 논문의 introduction 내용을 참고했습니다.

Tutorial 1과 2에서 다룬 VAE는 generative model입니다. GAN과는 달리 모델의 explicit하게 학습할 수 있는 explicit density model 입니다. 또한 같은 explicit density model 중의 하나인 PixelCNN & PixelRNN 과는 다르게 데이터의 의미있는 latent representation을 학습할 수 있습니다. 이 때 model은 Deep Neural Network를 사용해서 복잡한 transformation을 표현하도록 합니다. 따라서 VAE를 다른 이름으로는 deep latent variable model이라고도 부릅니다.

VAE는 이전 논문과 코드에서 살펴봤듯이 image를 생성하는데 초첨이 맞춰서 발전했습니다. VAE를 사용해서 여러 흥미로운 연구들이 이뤄졌습니다. 대부분은 VAE가 latent code를 학습하기 때문에 할 수 있는 것들입니다. 예를 들어 갈색 머리 사람의 사진을 모아서 encoder를 통과해 나온 latent vector를 평균 취하면 갈색 머리에 대한 “attribute vector”를 구할 수 있습니다. 만약 검은색 머리에 대한 attribute vector도 구했다면 재밌는 것을 할 수 있습니다. 다음 그림은 “Autoencoding beyond pixels using a learned similarity metric”이라는 논문에서 가져왔는데 attribute vector를 통해 input data를 변형시켜 새로운 data를 생성하는 것을 보여줍니다. 머리색이 변하기도 하고 성별이 변하기도 하며 수염이 생기기도 합니다.

그림 출처 https://arxiv.org/pdf/1512.09300v1.pdf


또한 latent space 상에서 서로 다른 두 latent vector의 interporlation을 통해 재밌는 실험을 할 수도 있습니다. 다음 그림은 “Deep Feature Consistent Variational Autoencoder” 논문에서 가져왔습니다. 그림의 왼쪽 사진에 대한 latent vector를 얻어내고 오른쪽 사진에 대한 latent vector를 얻어내면 \(z_{new} = \alpha z_{left} + (1-\alpha) z_{right}\)와 같은 식으로 linear interpolation으로 새로운 latent vector를 구할 수 있습니다. 다음 그림은 이 \(\alpha\) 값을 0에서 1사이에서 변형시켜가며 그 latent vector를 decoder 통과시켰을 때 나온 이미지를 보여준 것입니다. continuous 하게 왼쪽 이미지에서 오른쪽 이미지로 변해가는 것을 볼 수 있습니다.

그림 출처 https://arxiv.org/pdf/1610.00291.pdf


이러한 연구들은 대부분 이미지 데이터에 대해서 진행되었습니다. 하지만 최근 이와는 다르게 sequential data를 generation 하는 VAE에 대한 연구들도 이뤄지고 있습니다. Sequential한 data를 생성하기 위해서는 latent vector를 통해 data를 generate하는 decoder가 그냥 CNN이나 MLP가 아닌 RNN이나 PixelRNN 같은 autoregressive model을 사용해야 합니다(latent vector가 RNN에 대한 attention과 같이 작동한다고 생각하시면 이해가 쉬울지도 모르겠습니다 혹은 condition). 문제는 VAE의 decoder에 autoregressive model를 사용할 경우 latent code를 무시해버린다는 것입니다. 이러한 현상은 더 long sequence data를 생성할 때 더 명확히 드러납니다. decoder가 latent code를 무시하는 현상을 “posterior collapse”라고 합니다. 이 논문에서는 “posterior collapse” 문제를 해결하기 위해 ELBO의 KL term에 weight를 곱해주는 방법과 RNN(decoder)의 condition을 조정하는 방법을 사용했습니다.

sentence에 대해서도 image에서와 마찬가지로 latent vector interpolation을 테스트해볼 수 있습니다. 아래 사진은 “Generating Sentences from a Continuous Space” 논문에서 가져온 사진입니다. “ i want to talk to you . ”라는 문장의 latent vector와 she did n’t want to be with him . 라는 문장의 latent vector 사이를 linear 하게 interpolation 한 것입니다. 문장이 조금씩 변해가는 것을 볼 수 있습니다. 중요한 것은 모두 문법적으로 맞다는 것입니다. 이렇게 문장을 생성하면서 문장의 의미있는 representation을 학습하는 VAE 모델을 SentenceVAE라고 합니다. 이제 살펴보도록 하겠습니다.

그림 출처 https://arxiv.org/pdf/1511.06349.pdf



2. A VAE for sentences

2.1 Recurrent VAE

(논문이 쓰여질 당시에)기존에 문장을 생성해내는 generative model 중에 state-of-art는 RNNLM(Recurrent Neural Network Language Model)이었습니다. Machine Translation, Image captioning과 같은 task에서 두각을 드러냈지만 문장의 global한 feature를 학습하지 못한다는 단점이 있었습니다. 따라서 이 논문은 VAE라는 새로운 네트워크를 통해 latent vector가 문장의 global feature를 나타내게 하겠다는 것이 목표입니다. RNNLM과 VAE를 적절히 합친다는 뜻입니다. VAE가 hidden latent variable로부터 data를 생성해내는데 여러 task에서 이미 보였듯이 의미있는 representation을 학습합니다. 따라서 RNNLM의 문제를 해결하는데 적절한 방법으로 보이는 것입니다. 다음은 이 논문에서 VAE를 설명하는 부분입니다. 이와같이 만들어낸 사람이 아닌 다른 사람의 해석을 보는 것이 직관력을 기르는데 도움이 됩니다.

The variational autoencoder (vae, Kingma and Welling, 2015; Rezende et al., 2014) is a generative model that is based on a regularized version of the standard autoencoder. This model imposes a prior distribution on the hidden codes z which enforces a regular geometry over codes and makes it possible to draw proper samples from the model using ancestral sampling. The vae modifies the autoencoder architecture by replacing the deterministic function ϕenc with a learned posterior recognition model, q(z|x). This model parametrizes an approximate posterior distribution over z (usually a diagonal Gaussian) with a neural network conditioned on x. Intuitively, the vae learns codes not as single points, but as soft ellipsoidal regions in latent space, forcing the codes to fill the space rather than memorizing the training data as isolated codes.

VAE의 학습 목표인 ELBO는 다음과 같습니다. 이 때, \(g_{\phi}(\epsilon, x) = \mu + \sigma\epsilon\) 입니다(reparametization trick). \[\mathcal{\tilde{L^B}}(x^{(i)}, \theta, \phi) = \frac{1}{L}\sum_{l=1}^L (log p_{\theta}(x^{(i)} \vert z^{(i, l)})) - D_{KL}(q_{\phi}(z \vert x^{(i)}) \Vert p_{\theta}(z))\]

VAE를 sequence generation에 사용하기 위해 encoder와 decoder에 MLP가 아닌 single layer LSTM을 사용합니다. prior는 똑같이 gaussian 분포를 사용합니다. 이 gaussian prior는 ELBO의 KL term에 의해서 일종의 regularizer로 작용합니다. 그리고 latent code는 decoder에 condition으로 작용하며 generation 과정을 조절합니다. 이 모델의 구조는 다음과 같습니다. 문장은 단어 단위로 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 입니다. 만약 모델이 의미있는 latent code를 얻어내도록 학습이 되었다면 KL term은 0이 아닐 것이고(문장마다 다른 latent code를 생성하려면 prior와 posterior가 동일한 분포를 가지면 안됩니다) cross entropy term은 상대적으로 작을 것(reconstruction quality가 좋다)입니다. 하지만 위 모델을 그대로 구현해서 학습을 하면 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이 되어버립니다. 이런 현상 즉, “posterior collapse”가 발생하면 VAE를 사용하는 의미가 없습니다. 이 문제를 해결하는 것이 중요합니다. 이 논문에서는 두 가지 방법을 제시합니다. (1) KL cost annealing (2) word dropout and historyless decoding 입니다.


2.2 KL cost annealing

Posterior collapse 문제를 해결하기 위해 KL term에 곱해지는 weight variable을 도입합니다. 이 weight가 도입된 Objective 식은 다음과 같습니다. 단순히 \(\beta\)라는 weight를 KL에 곱해준 겁니다. \[\mathcal{\tilde{L^B}}(x^{(i)}, \theta, \phi) = \frac{1}{L}\sum_{l=1}^L (log p_{\theta}(x^{(i)} \vert z^{(i, l)})) - \beta D_{KL}(q_{\phi}(z \vert x^{(i)}) \Vert p_{\theta}(z))\]

학습이 시작될 때 \(\beta\)는 0으로 setting 됩니다. 이렇게 되면 cross entropy 항만 남게 되므로 그냥 auto-encoder와 같은 형태가 됩니다. \(\beta\)를 0으로 놓는 것은 가능한 많은 정보를 latent에 담아내라는 것입니다. 학습이 진행됨에 따라 \(\beta\) 값을 점점 증가시킴으로서 latent code를 smooth하게 prior 분포로 묶어줍니다. 그리고 \(\beta\)가 1이 되면 원래 ELBO의 값이 되어서 일반적인 VAE가 됩니다. \(beta\)를 0에서 1로 키우는 과정(파란선)은 아래 그림과 같이 sigmoid 함수의 형태로 scheduling 합니다. 이에 따라 KL term은 초반에 엄청 상승합니다. KL term의 영향이 적기 때문에 encoder는 제약없이 latent space 상에 representation을 형성하기 때문입니다. 하지만 점점 \(\beta\)가 1에 가까워지면 이 KL term은 줄어들어서 수렴합니다.


2.3 Word dropout and historyless decoding

word drop은 decoder를 약하게 만드는 방법입니다. 학습 과정 동안 decoder의 lstm은 이전 ground truth를 input으로 받는데 이러면 데이터 자체에 의존해서 다음 word를 생성합니다. 이 때, 이 ground truth의 일부를 (예를 들어 3 단어 중 1 단어) 무작위로 다른 단어로 바꾸는 것입니다. 그러면 decoder는 좀 더 latent vector에 의존해서 문장을 생성합니다. 전체 문장 중에 단어 몇 개를 바꿀 것인지는 새로운 parameter \(k \in [0, 1]\) 를 적용해서 조절합니다. SequenceVAE에 대해서 더 자세히 알기 위해 Code를 살펴보겠습니다.


4. Code Review


3. Experiment & Conclusion

3.1 Experiment

3.2 Conclusion







© 2018. by Woongwon Lee

Powered by dnddnjs