본문 바로가기
Deep Learning/밑바닥부터 시작하는 딥러닝

[정리노트] [AutoEncoder의 모든것] Chap4. VAE Architecture - Conditional VAE, Adversarial AutoEncoder

by Steve-Lee 2020. 7. 14.

AutoEncoder의 모든 것

본 포스팅은 이활석님의 'AutoEncoder의 모든 것'에 대한 강연 자료를 바탕으로 학습을 하며 정리한 문서입니다. 이활석님의 동의를 받아 출처를 밝히며 강의 자료의 일부를 인용해왔습니다. 

AutoEncoder의 모든것 

더보기

AutoEncoder의 모든것 😀(Last Update 20.07.16.Thur - Chap4. VAE Architecture)

👉🏻 시작합니다! 🎈

Chap0. AutoEncoder란 무엇인가? 핵심만 짚어보자


👉🏻 Deep Neural Network의 학습방법 📗
- Backpropagation과 MLE
Chap1. Deep Neural Network의 학습 방법에 대해 알아보자(딥러닝 학습방법)😃


👉🏻 Manifold Learning이란 무엇인가? 📑

- Manifold Learning 및 Dimensionality Reduction에 대해 알아보자
Chap2. Manifold Learning이란 무엇인가

 

👉🏻 AutoEncoder 탐구하기 ⌛️
Chap3. AutoEncoder란 무엇인가(feat. 자세히 알아보자)

👉🏻 Variational AutoEncoder에 대해 알아보자 ☕️
Chap4. Variational AutoEncoder란 무엇인가(feat. 자세히 알아보자)

👉🏻 VAE 파생 모델에 대해 알아보자
- Conditional VAE, Adversarial AutoEncoder에 대해 알아보자
Chap4. VAE Architecture - Conditional VAE, Adversarial AutoEncoder

 

[정리노트] [AutoEncoder의 모든것] Chap4. Variational AutoEncoder란 무엇인가(feat. 자세히 알아보자)

AutoEncoder의 모든 것 본 포스팅은 이활석님의 'AutoEncoder의 모든 것'에 대한 강연 자료를 바탕으로 학습을 하며 정리한 문서입니다. 이활석님의 동의를 받아 출처를 밝히며 강의 자료의 일부를 인�

deepinsight.tistory.com

안녕하세요 Steve-Lee입니다.앞서 Chap 4. 에서는 Variational AutoEncoder에 대해 살펴보았습니다. 이번 시간에는 Variational AutoEncoder를 확장시킨 VAE Architecture에 대해 알아보도록 하겠습니다.

 

Variational AutoEncoder, Conditional Variational AutoEncoder(CAE) 그리고 Adversarial AutoEncoder(AAE)에 대해 학습해 보도록 하겠습니다!

 

<Review> Variational AutoEncoder

본격적으로 VAE Architecture를 다루기 전, 지난 시간에 배웠던 내용을 간단히 remind 해보기로 합니다. 

  • Variational AutoEncoder
    • Generative Model
      • VAE는 Generative Model입니다
      • 한마디로 training DB에 있는 input data와 유사한 데이터를 생성하는 것입니다
      • 우리는 '유사하다'라는 애매한 정의를 조금 더 그럴듯하게 만들어봅니다
    • Variational Inference
      • "(input data) x를 보여줄테니 그 녀석과 유사한 sample을 만들어줘 봐!"
      • 이상적인 data를 sampling 하는 sampling 함수를 Encoder Network를 통해 만들어줍니다
      • 다시, input data x에 대해 Generator가 잘 학습할 수 있도록 만들어주는 z를 sampling 하기 위해 이상적인 sampling함수 posterior(qΦ(z|x))를 도입한 것입니다.
      • 이때 우리는 이상적인 샘플링 함수가 우리가 다루기 쉬운 확률 분포를 근사하도록 condition을 부여합니다
    • Reconstruction
      • 위에서 정의한 sampling함수를 통해 생성한 값이 input값과 같아줬으면 합니다
      • 수식으로는 EqΦ(z|x)[log(p(x|g𝜃(z))]값을 최대화시켜주는 MLE 문제를 푸는 것입니다
        • 위의 수식의 term을 'Reconstruction term'이라고 부릅니다. 이상적인 샘플링 함수 qΦ를 통해 추출한 z vector(latent vector)를 given으로 줬을 때 input data와 유사한 데이터를 얼마나 잘 복원했는가를 확인할 수 있습니다 
  • ELBO(Evidence Lower BOund)
    • 위의 조건들(Condition)을 만족시키는 최적의 식을 구하면 ELBO 수식이 됩니다
    • 네트워크에 x를 Evidence로 줬을 때 위의 조건을 만족하는 최적화식을 구하는 것입니다qΦ

 

 

최적화식에 이러한 조건들(Condition)이 녹아들어 있습니다.

위의 수식을 최적화 시키는 것이 VAE를 학습시키는 방법입니다. 수식의 각 term들을 이해할 수 있다면 학습을 위한 준비가 완료되었다고 볼 수 있습니다.

  • 기타 용어정리
    • prior: p(z)
    • True posterior: p(z|x)
    • 이상적인 샘플링 함수: qΦ(z|x)

이제 학습을 위한 준비가 완료되었습니다. 본격적으로 VAE Architecture에 대해 배워보도록 하겠습니다.

 

Conditional VAE란 무엇인가?

직관적으로 이해하기

Q. 어떤 Condition을 부여한 걸까?

 

  • Condition
    • label 정보를 알고 있으면 Encoder와 Decoder에서 사용하라
    • 구현 시 label의 정보를 추가해주면 된다

위의 condition을 제공해주는 것이 바로 Conditional VAE입니다.

 

Vanilla VAE와 Conditional VAE의 차이는 무엇일까요?

Vanilla VAE(우리가 이전 포스팅에서 다뤘던 초기 VAE)와 Conditional VAE의 차이를 비교해보도록 하겠습니다.

 

위의 Computational Graph를 통해서 이해할 수 있는 직관은 바로 y라는 노드가 새롭게 추가된다는 점입니다. Conditional VAE에서는 y(label 정보)를 알고 있다면 Encoder, Decoder에 추가하라고 했습니다. 그런 조건(Condition)이 위의 Computational Graph에 표현되어 있는 것입니다.

 

Encoder 단에서는 latent vector z를 찾기 위해 x와 함께 y값을 given으로 주었습니다. → qΦ(z|x, y)

마찬가지 Decoder 단에서는 data를 생성하는 과정에서 y값을 같이 넣어줬습니다. p𝜃(x|z, y)

 

또한 M2(CVAE)의 경우 최적화를 했을 때 최적화 식이 ELBO와 같게 됩니다!!

 

Q. 그렇다면 label 정보를 모를 때 어떻게 학습할 수 있을까?

 

1. 기존의 Vanilla VAE를 사용한다.

2. y(label 정보)를 추정해서 학습한다.

 

y정보를 모른다면 추정할 수도 있습니다.

2번 y(label 정보)를 추정하여 학습하는 방법에 대해 알아보겠습니다. 

 

결론부터 말씀드리면 y의 label을 모를 때는 y를 추정하는 네트워크를 별도로 두면 됩니다.

 

Vanilla VAE와 같은 M1으로 학습을 하되 z를 생성하는 과정에서 label y를 추정하는 network를 윗단에 붙여줍니다. 이렇게 함으로써 label의 정보를 추정하여 z vector를 생성할 수 있습니다

 

  • M3구조
    • VAE 구조로 학습을 하는데
    • z를 추정하기 전 윗단에 y를 추정하는 네트워크를 추가

 

VAE, CVAE 비교

Condition을 부여했을 때와 부여하지 않았을 때 성능이 어떻게 달라질까요?

 

VAE와 CVAE의 결괏값 비교를 통해 알아보도록 하겠습니다.

CVAE의 경우 단 1 epoch만으로 입력값과 매우 유사한 값을 생성해 내는 것을 볼수 있습니다

결론부터 말씀드리면 CVAE의 성능이 더 좋은 것을 확인하실 수 있습니다. 이유를 생각해보면 이미 숫자의 정보(label 정보)를 알고 있기 때문입니다.

 

여기에 재미있는 실험을 할 수도 있습니다. 동일한 z-sampling 값에서 label값만 바꾸면 어떤 결과를 얻을 수 있을까요?

 

CVAE의 z-sample에서 label을 변경해봅니다

결과를 보시면 스타일은 비슷한데 다른 문자를 출력해 주는 것을 확인해보실 수 있습니다. 

이렇게 된다면 Font를 생성해 낼 수도 있겠죠? 그래서 실제로 Font를 만들어주는 서비스를 하기도 했다고 합니다

 

CVAE 여담 1. manifold

manifold를 잘 찾았다고 해야할까요 아니면 잘 못찾았다고 해야 할까요/

VAE의 결과와 비교해보면 뭔가 manifold를 잘 찾지 못한 것만 같습니다. 그런데 사실 망한 게 아니라고 합니다ㅎㅎ

레이블별로 manifold를 시각화해보면 manifold를 잘 학습한 결과를 얻을 수 있다고 하네요!

 

CVAE 여담 2. results

단 100개의 label만 condition으로 줬을 때 성능이 어떨까요?

활석님께서는 MNIST데이터에 CVAE를 적용할 때 단 100개의 label정보만 주어 학습을 해보셨다고 합니다. 

5만 개의 데이터에서 단 100개의 label만 사용한 뒤 학습한 feature에 대해 단순한 classifier만 붙였는데도 성능이 매우 잘 나왔다고 합니다. (저도 제 데이터에 한 번 실험해보고 싶어 지네요 ㅎㅎ) 

 

지금까지는 Generation관점에서 정말 재미있는 Conditional VAE였습니다. 

 

다음으로 배울 Architecture는 'Adversarial AutoEncoder'입니다.

 

 

Adversarial AutoEncoder란 무엇인가?

지금까지 우리는 VAE를 학습시킬 때 KL term을 통해 prior과 sampling함수의 차이를 조정했습니다(Regularization!)

 

그런데 GAN의 학습 방법 KL term의 학습 방법과 같지 않어? 

 

GAN의 discriminator를 학습시켜서 KL divergence를 대체하는거야!

 

  • 최적화란?
    • KL의 qΦ를 p(z)와 같아지게 하는것(minimize 최적화 하는것)
    • 최적화 방식이 GAN의 학습방법과 같다!

 

GAN에서 Traget distribution이 있을 때 generation의 분포가 target distribution과 같게 만들어주는 방식과 KL term의 학습방법이 같기 때문에 이를 GAN으로 대체하는 방법이 바로 AAE(Adversarial AutoEncoder)입니다.

 

GAN에 대한 설명은 지면상 생략하겠습니다(향후 포스팅 예정!)

 

AAE Architecture

KL term의 역할에 대해 한 번 더 생각해보면 KL term은 sampling 함수의 값이 prior과 같게 만들어주는 term입니다(같으면 0에 가깝게...!)

 

이러한 KL term의 역할을 GAN으로 대체해 보겠습니다.

 

  • P(prior)에서 만든 sample은 진짜 sample입니다.

  • q(GAN)에서 만든 sample은 가짜 sample입니다.

  • Discriminator에게 이상적인 sampling함수에서 생성된 값이 prior에 가깝게 주문합니다

 

📌 이를 수식으로 표현하면 다음과 같습니다.

 

  • AAE 네트워크의 학습도 결국 -EqΦ(z|x)[log(p(xi|z))]입니다
  • Discriminator를 학습하기 위해서는 prior에서 생성한 값에 대해서는 training DB의 data와 유사하게 만들어줍니다. 이 때 Generator에서 생성한 샘플에 대해서는 cost를 부여합니다
  • Generator는 Generator에서 생성한 샘플로 생성한 데이터가 Discriminator에 의해 training DB에 있는 data와 비슷한 data로 인식되기를 원합니다 

🤨 조금 더 직관적으로 설명할 수 있도록 분발하겠습니다...!

 

VAE와 AAE의 차이 비교

마지막으로 Vanilla VAE와 Adversarial AutoEncoder를 비교해보겠습니다.

두 모델의 차이는 manifold를 시각화 했을 때 알 수 있습니다.

 

  • 정리하면
  • Adversarial AutoEncoder는 좀 더 prior에 가깝게 학습이됩니다
    • Adversarial AutoEncoder는 prior에 좀 더 가깝게 만들어줍니다
    • 반면 VAE는 Normal distribution에 가깝게 학습을 해줍니다

이는 Adversarial AutoEncoder의 가장 큰 장점이라 볼 수 있습니다

 

Manifold를 우리가 원하는 모양으로 바꿀 수 있게 되었습니다

 

마찬가지 AAE도 label정보를 추가해줄 수 있습니다. 

 

정리

이번 시간에는 VAE의 후속 모델로 CVAE와 AAE에 대해 배워보았습니다. 이후 연구로 더 뛰어난 VAE모델이 발견되었을 텐데 정말 궁금하네요.

 

'AutoEncoder의 모든것'강의를 통해 AutoEncoder부터 VAE, CVAE, AAE까지 배울 수 있어서 너무나도 감사합니다ㅠㅠ

AAE의 경우 제가 지금 하고 있는 연구에 적용해 봤을 때 결과가 상당히 기대되는 부분이 있네요ㅎㅎ

 

이상으로 오늘의 포스팅을 마치겠습니다. 오늘도 긴 포스팅 읽어주셔서 감사합니다. 이상 Steve-Lee였습니다. 감사합니다!

 

Reference

댓글