2017년 4월 18일 화요일

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

* Auto-Encoding Variational Bayes, Diederik P. Kingma and Max Welling 2014를 바탕으로 한 리뷰

안녕하세요 오늘은 GAN 시리즈 대신 GAN 이전에 generative model계를 주름잡고 있었던 Variational Auto-Encoder a.k.a. VAE에 대해 살펴보겠습니다. 그동안 논문들을 보다보면 GAN과 VAE를 비교하며 어떤 차이점이 있는지에 대해 여러 차례 언급이 되었기에 제대로 보지는 않았는데도 익숙할 지경입니다.

원래 뭐든 이름을 제대로 알면 다 아는거라고 하죠? :) 그럼 이름에 왜 "Variational"이 들어가고 "Auto-Encoder"는 어떻게 쓰이는지 확인해보겠습니다.


일단 Variational Auto-Encoder(VAE)에 대해 좀 자세히 얘기를 하려면 그리고 "Variational"이 붙은 이유에 대해서 이해하기 위해서 약간의 history를 공부할 필요가 있습니다.

Taxonomy of deep generative models


Generative model의 taxonomy는 우리의 좋은 친구 Ian Goodfellow가 "NIPS 2016 Tutorial: Generative Adversarial Networks"에서 매우 잘 정리해주었습니다. 보시다시피 VAE는 GAN과는 다른 가지로 분류됩니다. 어떤 식으로 다른지에 대해 차근차근 살펴보겠습니다.


Taxonomy of deep generative models

가장 꼭대기 root에 있는 박스를 보시면, "Maximum Likelihood (ML)"라고 적혀있습니다. 이런 단순화는 언제나 위험하지만 결국 큰 범주에서 generative model이 하고자 하는 것은 ML의 원리를 바탕으로 학습을 해보자는 것으로 정리할 수 있습니다. 이 때 어떤 식으로 이 likelihood를 다루느냐(근사를 할 것이냐 혹은 정확히 표현할 것이냐)에 따라 다양한 전략들이 존재합니다.

먼저 크게 두 가지 방식으로 학습 전략이 나뉩니다. 위에 그림에서 왼쪽은 Explicit density, 오른쪽은 Implicit density라 적혀있죠. 그동안 공부했던 GAN은 오른쪽 가지에 해당하는 모델인 것을 보실 수 있습니다. 여기서 간접적인(Implicit) 방식이라 함은 보통 우리가 어떤 model에 대해 틀을 명확히 정의하는 대신 확률 분포를 알기 위해 sample을 뽑는 방법을 얘기하는데요 대표적으로 Markov Chain을 사용하는 방식이 있겠습니다. 우리가 알고있는 혹은 이미 얻은 sample $x$와 transition operator $q$가 주어졌을때, sample $x'$을 반복적으로 뽑다보면 결국에는 (일정 가정하에) $x'$이 $p_{model}(x)$로부터 나온 sample로 수렴한다는 것이 알려져 있습니다:
$$x'\sim q(x'|x)$$
또 다른 방식으로는 그동안 열심히 공부해 온 GANs가 있습니다. GANs가 강력한 이유는 어떤 확률 모델(density)을 굳이 명확히 정의하지 않아도 모델(generator) 자체가 만드는 분포로 부터 sample을 생성할 수 있고 MCMC와는 달리 별다른 input이 없이도 한 번에 sample을 생성할 수 있다는 것입니다.

한편 왼쪽 가지에 해당하는 학습 방법들은 $p_{model}(x;\theta)$와 같이 model을 명확히 정의하여 이를 최대화하는 전략을 택합니다. 우리가 model을 정의했기 때문에 다루기가 비교적 편하고 어느 정도 모델의 움직임이 예측가능한 반면 당연히 우리가 아는 것 이상으로는 결과를 낼 수 없다는 한계가 있습니다.

이 가지에서도 정의한 확률 모델이 계산이 가능(tractable)한지 혹은 불가능(intractable)한지에 따라 다시 두 갈래로 나뉩니다. 모델이 직접 계산 가능한 경우는 사실 우리가 모든 변수를 다룰 수 있기 때문에 세밀한 조정이 가능한 동시에 사용할 수 있는 모델의 종류에 강력한 제약이 생깁니다. 이 것이 싫다면 좀 더 복잡한? 모델을 사용하면 되는데 그 대가로 계산이 불가능하여 density를 근사해야 합니다.

이렇게 근사를 하는 방법에는 Monte Carlo approximations이 있습니다. 한 번쯤은 들어보셨을만큼 매우 유명한 방법인데 매우 단순히 얘기하자면 무작위로 많이 샘플을 뽑아서 분포를 유추해보자는 아이디어입니다. 보통 모델에서 fair-sampling 하는 것이 쉽고 (계산량 측면에서) sample 간의 분산이 그리 높지 않은 경우 꽤나 잘 동작하는 방식입니다.  더 직관적인 이해를 위해 예전에 봤던 재미있는 동영상이 있어 여기에 소개해봅니다.


* Garton board experiment 혹은 Monte Carlo experiment라 불리는 실험인데 전체 영상에서 해당 부분부터 시작되도록 해두었으나 총 길이도 그리 길지 않고 내용이 매우 좋으니 한 번 보시길 권합니다.

그러나 이런 방식의 근사는 고차원을 다룰 수록 점점 잘 되지 않고 무엇보다 느리다는 단점이 있습니다. 오늘의 주제인 VAE는 이와 달리 variational inference라는 보다 deterministic한 방식을 사용하여 density를 근사합니다.

돌아돌아 드디어 우리가 오늘의 메인 주제인 variational inference 부분이 나왔는데요 이 부분을 얘기하기 전에 왜 이런 짓을 하는지 좀 더 이해를 쉽게 하려면 이렇게 모델의 intractability가 나오는 이유를 먼저 살펴보고 넘어갈 필요가 있습니다.

앞서 generative model이 하고자 하는 것은 maximum likelihood(ML)의 원리를 바탕으로 학습을 해보자는 것으로 정리할 수 있다고 말씀드렸었습니다. 즉, 관측값 혹은 데이터 sample $x$를 알 때, 이런 관측값이 가장 높은 확률로 나올 수 있는 모델 파라미터 $\theta$ 혹은 latent variable $z$를 찾는 것입니다. 하지만 이 방식만으로는 거꾸로
  $x$를 주고, 여기에 해당하는 latent variable $z$를 뽑거나 알 수는 없습니다.
우리는 양방향을 다 하고 싶은데 말이죠. 그럼 어떻게 하느냐? Maximum A Posteriori (MAP) 방법으로 문제를 풀 수도 있습니다.

ML과 MAP


본격적으로 이야기를 하기 전에 ML과 MAP에 대해 어떻게 하면 쉽게 설명할 수 있을까 찾아보다가 재미있는 예시를 하나 발견하여 저희 notation에 맞게 약간만 수정하여 여기에 소개합니다: (출처: 다크 프로그래머님 블로그 글)

여기서는 classification 문제를 푸는 것을 예시로 들었는데요 관측값을 $x$ 그 값이 나온 class (또는 모델)을 $z$라고 하겠습니다. 예를 들어, 바닥에 떨어진 머리카락의 길이 $x$를 보고 그 머리카락이 남자 것인지 여자 것인지 성별 $z$를 판단하는 문제를 생각해보겠습니다.

  • ML 방법: ML 방법은 남자에게서 그런 머리카락이 나올 확률 $p(x|남)$와 여자로부터 그런 머리카락이 나왔을 확률 $p(x|여)$를 비교해서 가장 확률이 큰, 즉 likelihood가 가장 큰 클래스 혹은 모델(성별)을 선택하는 방법입니다. 
  • MAP 방법: MAP 방법은 $x$라는 머리카락이 발견되었는데 남자 것일 확률 $p(남|x)$, 여자 것일 확률 $p(여|x)$를 비교해서 둘 중 큰 값을 갖는 클래스 혹은 모델(성별)을 선택하는 방법입니다. 
....여기까지만 보시면 매우 헷갈리실 수 있습니다. 

그런데 여기서 남녀의 성비를 고려하면 ML과 MAP의 차이가 명확해집니다. 만약 인구의 90%가 남자(...orz)고 여자가 10%인 매우 성비가 불균등한 지역에서 이 문제를 푼다고 해봅시다. ML은 남녀 성비는 완전히 무시하고 순수하게 남자 여자 중 해당 길이의 머리카락을 가질 확률, 여자 중 해당 길이의 머리카락을 가질 확률만을 비교하는 것입니다. 

반면에 MAP는 각각의 성별로부터 해당 길이의 머리카락이 나올 확률뿐만 아니라 남녀의 성비까지 고려해서 최종 클래스를 결정하는 방법입니다. 

즉, MAP는
$$p(여|x) = \frac{p(여, x)}{p(x)} = \frac{p(여, x)}{p(여,x)+p(남,x)} = \frac{p(여, x)}{p(x|여)p(여)+p(x|남)p(남)}$$
이렇게 $p(남)$, $p(여)$의 정보를 더 고려하기 때문에 ML보다는 좀 더 정확한 모델을 찾을 수 있습니다.

여기서 문제는! 성비와는 달리 현실에서는 보통 $z$가 뭐가 있는지를 모르고 (lack of prior knowledge) 모든 $z$를 고려하여 분모인 $p(x)$를 구할 수 없는 경우가 대다수 입니다($p(x)$를 안다는 말은 데이터의 분포를 이미 알고 있다는 말인데 그러면 사실 할 일이 끝난거죠). 이런 경우 단순하게 $p(남)=p(여)$라고 놓고 문제를 푸는 경우가 많은데, 이 경우 MAP는 ML과 같게 됩니다.

Problem scenario


자 위에서 설명한 문제점이 고스란히  generative model에도 적용이 됩니다. 우리의 dataset $X=\{x^{(i)}\}_{i=1}^N$가 i.i.d. samples of continuous or discrete $x$들로 이루어져 있다고 하고, 우리가 관측하는 sample 데이터 $x$가 어떤 관측되지 않은(우리가 모르는) latent variable $z$가 영향을 미치는 어떤 random process로부터 생성된다고 가정해보겠습니다.
Directed graphical model

이를 위에 보시는 것과 같은 도식으로 나타낼 수 있는데요. 검은 선이 생성 모델 $p_\theta(z)p_\theta(x|z)$이고, 점선이 우리가 variational approximation $q_\phi(z|x)$를 이용하여 근사할 $p_\theta(z|x)$입니다.

이렇게 근사를 하는 이유가 바로 앞서 설명드린 문제점 때문입니다. Posterior인 $p_\theta(z|x)=p_\theta(x|z)p_\theta(z)/p_\theta(x)$를 알고 싶은데 이를 계산하기 위해 필요한 분모 부분 $p_\theta(x) = \int_z p_\theta(x|z)p_\theta(z)dz$가 계산이 불가능한(intractable) 경우가 많기 때문입니다. 조금만 생각해보시면 당연한 것이 일단 우리가 알지도 못하는 모든 $z$에 대해 적분(marginalization) 해줄 수가 없는 것도 있지만 애초에 latent distribution $p(z)$과 data distribution인 $p(x)$를 알면 이렇게 복잡한 짓을 할 이유가 없죠. 그냥 data generation을 하고싶으면 그 distribution에서 sampling 하면 되니까요.

결국 모든 문제는 우리가 저기 도식에서 아는 것이 별로 없기 때문에 생깁니다. Optimal 모델 파라미터 $\theta^*$도 모르고 latent variable $z$에 대한 것도 정보가 없는 경우가 많죠. 그리고 이런 intractability는 likelihood model이 조금만 복잡해져도 매우 흔하게 나타납니다. 안타깝지만 혹은 당연하지만 비선형성이 들어간 신경망은 이런 복잡한 모델에 속합니다.

Variational approximations


이런 부분을 해결하고자 제시된 테크닉이 바로 variational approximation입니다. 예전에 infoGAN을 설명할 때 잠시 설명드렸었죠? Variational method들은 보통 다음과 같은 lower bounding technique을 사용합니다:
$$\cal{L}(x;\theta)\leq \log p_{model}(x;\theta).$$
쉽게 말하자면 $\log p_{model}(x;\theta)$을 직접 계산하기가 어렵다면 하한(lower bound)을 구하는데 이를 우리가 알고 있고 계산이 편한 모델로 대체한 다음 이 하한에 해당하는 부분을 최대화하는 방식으로 문제를 우회하자는 것입니다. 이 때, 등호가 maximum일 때 성립한다는 것도 보여줘야겠죠. 

이제 VAE라는 이름에서 "Variational" 부분이 왜 붙었는지는 짐작이 가셨으리라 생각됩니다. VAE에서도 이런 테크닉을 사용해서 앞에 posterior 같은 문제를 좀 더 쉬운 문제로 바꿔서 풀겠다는 것이죠. 그럼 "Auto-Encoder" 부분은 어떤 식으로 사용되는 것일까요? 그건 다음 글에서 좀 더 다뤄보도록 하겠습니다 (광고보고 오시죠! 60초? 후 공개됩니...???ㅋㅋ 이렇게 intro만 주구장창하는 글로 마치는 것도 처음인듯하네요;;)

약간의 힌트를 드리자면 $p_\theta(z)p_\theta(x|z)$에서 우리가 prior knowledge를 바탕으로 가정한 $p_\theta(z)$를 빼고 (예시 Gaussian), $p_\theta(x|z)$ 부분을 잘 보시면 latent variable $z$를 줬을 때 sample $x$를 뽑아내는 모델이라 생각하실 수 있습니다. 즉, $z$를 code라고 생각하시면 $p_\theta(x|z)$는 decoder 모델이 되겠구요 반대로 $q_\phi(z|x)$는 이미지와 같은 sample $x$를 주었을 때 code를 내뱉는 encoder가 되겠습니다. 정확히 Auto-Encoder의 형태와 겹치지요?

별거 아닌데 이렇게 해석할 수 있다는 것도 알고나서 저는 매우 재미있고 신기했습니다. 뭔가를 조금이나마 이해한거 같아서 신이 났죠ㅋㅋ 이런 관점에서 generative model을 보니 참 재미있습니다. 세상에는 아직 배울게 참 많습니다. 그럼 다음 글에서 뵙겠습니다. 

다음 읽을거리



참고문헌:
[1] Auto-Encoding Variational Bayes, Diederik P. Kingma and Max Welling 2014
[2] NIPS 2016 Tutorial: Generative Adversarial Networks, Ian Goodfellow 2016



댓글 14개:

  1. 사소한 오타지만 ML과 MAP설명 box부분에서 "MAP 방법은 z라는 머리카락이 ... "에서 z라는 머리카락이 아니라 x라는 머리카락인것 같습니다. 감사하게 잘 보고 있습니다!

    답글삭제
    답글
    1. cpark510님 감사합니다. 수정하였습니다.

      삭제
  2. VAE 에서 p(z|x) 를 q(z|x)~N(mean, var) 로 근사를 하는 것과, tractable density 에서 애초에 p(z|x)~N(mean, var) 로 정의하고 estimate 하는 것과 무엇이 다른가요? 물론 tractable density 에 적혀있는 방법들이 이런 방식의 접근을 하지는 않는것 같기는 합니다만... 구분이 헷갈려서 질문드립니다!

    답글삭제
    답글
    1. 준범님 안녕하세요. 오 제가 놓친 부분인 것 같습니다. 좀 더 생각하게 해주는 좋은 질문이네요. 저도 지금 답을 하면서 이게 정답이라고 할 수는 없는데 질답을 하며 의견을 나누면 좀 더 이해가 깊어질 것 같습니다. 음 일단 VAE가 KL regularization term + likelihood와 같이 해석될 수 있었으니 likelihood만 사용하던 기존의 방식과는 달리 regularization이 더해진 것이 다르다고 보입니다(의견입니다. 어찌 생각하시는지요?).

      삭제
    2. 그리고 NIPS 2016 tutorial에서 Goodfellow가 언급하였듯 tractable density를 사용하는 방식은 상당히 효과적이긴 하지만 이런 모델들이 사용할 수 있는 tractable density가 상당히 제한적이라는 단점이 있지요. 제가 이해하기로 VAE에서는 reparameterization이 될만한 3가지 class에 모델 g가 해당하는 경우 tractable이 아니더라도 쓰일 수 있는 것 같습니다만 사실 이 부분은 정확치 않습니다.

      삭제
  3. 안녕하세요 글을 읽던 중 궁금한 점이 생겨서 댓글 남겨 드립니다 :)
    p_model 을 명확히 정의하면 explicit density의 갈래로 간다고 써주셨는데, 이 때 "명확히" 라는 말이 무엇인지 잘 모르겠습니다. GAN의 경우도 Generator를 통해서 p(x)를 q_theta(x|z)로 modeling한 것이라고 생각했는데 이런 경우는 왜 implicit인지 설명해 주실 수 있으신가요?..

    답글삭제
    답글
    1. 질문이 좀 부정확한 것 같아서 궁금한점을 다시 말씀드리자면..정확하게는 vae는 intractable explicit모델인데, 이것이 implicit한 모델과 어떠 한 차이를 갖는지 잘 모르겠습니다. 전자는 그러면 p(x_i), 말 그대로 0~1사이 확률값을 근사적으로 내뱉는 모델인가요?

      삭제
    2. 답변이 매우 늦었습니다. 제가 저번 학기에 디펜스를 준비하면서 블로깅을 하지 못했었네요. 음 설명을 늦었지만 달아보자면 GAN이 implicit density model이라는 것은 GAN이 Sampler라는 얘기를 이해하시면 됩니다. 즉, GAN은 모델의 목적 자체가 어떤 data의 분포를 학습하고자하는 것이 아니라 진짜같은 sample을 generate하는 것이 목적으로 고안된 sampler입니다. 반면에 VAE는 data의 분포를 학습하고 싶은데, 이게 intractable하니까 variational inference라는 방법으로 풀어보자고 제안한 것이구요. 즉, VAE는 data 분포가 잘 학습되기만 하면 sampling(혹은 data generation)이 저절로 따라오는 것입니다. 그렇기 때문에 둘의 성격이 다르고 VAE는 explicit하게 분포를 학습하고자 하는 모델이라 하는 것입니다.

      삭제
  4. 매번 글 잘 보고 있습니다. 저도 대학원생인데 너무 많이 배우고 있어요
    감사드립니다!

    Problem Scenario 에서 질문 있습니다!
    pθ(x)=∫zpθ(x,z)pθ(z)dz 이 식에서
    marginal을 계산하는데 왜 p(z)가 들어가나요?
    pθ(x)=∫zpθ(x,z)dz 가 익숙해서 그런지..
    너무 유치한 질문인가요? ㅎ,,,

    답글삭제
    답글
    1. 그냥 오타가 아닐까요??
      joint가 아니라 conditional로 적어야 맞는 것 같아요

      삭제
    2. 그동안 제가 디펜스를 준비하느라 답변을 달지 못했었습니다. 전혀 질문 유치하지 않구요. 음 밑에 Unknwown님 말씀대로 제 오타...orz..입니다. 늦었지만 댓글 감사합니다!

      삭제
  5. 오오.. 처음 볼땐 이해 못했는데, 쿨러교수님 강의 몇개보고 오니 대강 이해가 가네요.
    그런데, 중간 부분관련 질문이 있습니다.
    "즉, 관측값 혹은 데이터 sample x를 알 때, 이런 관측값이 가장 높은 확률로 나올 수 있는 모델 파라미터 θ 혹은 latent variable z를 찾는 것입니다. 하지만 이 방식만으로는 거꾸로
    x를 주고, 여기에 해당하는 latent variable z를 뽑거나 알 수는 없습니다."
    x를 알때 z와 θ를 찾는 것의 거꾸로는 z와 θ를 알 때 x를 뽑는거 아닌가요?

    답글삭제
    답글
    1. Unknown님 안녕하세요 네 무슨 말씀인지 이해가 갑니다. 그런데 likelihood를 알면 우리가 알고 있는 latent 성질 외에 다른 것을 찾지는 못한다는 것입니다. Likelihood model은 말씀하신 것과 같이 각각 latent variable을 명시하여 줬을 때, data를 뽑는 모델이지 거꾸로 데이터만 덜렁 주어졌을 때 이 데이터가 어떤 성격을 가지고 있는지 찾을 수있는 모델이 아니니까요.

      삭제
  6. 안녕하세요! 좋은 글 감사합니다, 공부에 많은 도움이 되고 있습니다.
    궁금한 점이 있어서 댓글을 남깁니다.
    VAE는 MLE라는 뿌리에서 출발하는데 중간에 MAP가 필요하다고 나오는데 그러면 MAP에서 출발하는 것 아닌가요? 대부분 재준님 블로그 뿐만 아니라 다른 논문에서도 MLE를 이야기하지 MAP는 이야기하지 않는 것 같아서 질문드립니다.

    답글삭제