본문 바로가기
AIML 분야/다른 연구 분야

NVAE: A Deep Hierarchical Variational Autoencoder 읽기

by 포숑은 맛있어 2021. 3. 10.
반응형

VAE가 뭔지도 다 까먹었겠다, 읽으면서 쓰는 글.

 

arxiv.org/pdf/2007.03898v3.pdf

github.com/NVlabs/NVAE

ichi.pro/ko/vae-variational-auto-encoder-leul-sayonghan-saengseong-modelling-277371603749134

 

 

논문이랑 엄청나게 상관은 없겠지만 VAE를 까먹어서 떠올리는 글

제목 NVAE.

일단 generative model이다. CelebA dataset 비슷한게 보이는데, 보통 image generation하면 GAN이 많이 떠오르는데 VAE를 쓰긴 하나보다 싶다. VAE는 AutoEncoder 구조에서 중간에 Latent variable에 mu, variance가 들어가는걸로 알고 있다. 이렇게 하면 우리가 만들어야하는 domain의 분포를 확률기반 모델로 잘 배워서 생성할 수 있지 않을까? 대략 그런 아이디어였던 것 같다. 분포를 배우는 게 핵심.
그러니까 당연히 확률모델의 Parameter (mu, var)가 있으면 이걸로 latent variable z를 만들고, 이걸 가지고 data X를 만드는 것. 대략 사람이 이러이러한 분포를 따르는데 확률에 따라 랜덤 돌려가지고 '대충 머리 까맣고 눈 녹색이고 살집있고 어쩌구 저쩌구한 context가 뽑혔으니 어서 만들렴' 이런 느낌? 그래서 p(x|z)를 maximize하도록 학습하는 게 디코더일 것 같음.

엄청 대충 생긴건 뭔지 아는데 대체 왜 variational인지, 어떤 확률적 근거를 가지고 있는지는 잘 기억이 안난다. 대략 기억하기로는 likelihood가 나왔던 것 같다. variational inference.
true distribution p 몰라가지고 q가지고 추정하는데 이게 KLD를 minimize하는거랑 어떤 식을 minimize하는거랑 같은 의미였어서 해당 loss를 최소화하는 방식으로 학습했던 것 같다. 맞나?

확인하러 가자.

그래서 p(x|z)인데 variational inference는 뭐였고 그게 뭐하는거더라? latent variable z는 왜 그냥 샘플링 하는거지? 아니면 어떻게 잘 뽑나?

=> z sampling 함수를 몰라서 그걸 추론하는거였다.
대충 우리가 잘 아는 완전 쉬운 분포를 가지고 실제 sampler 분포를 추정.

- https://ratsgo.github.io/generative%20model/2018/01/27/VAE/
https://deepinsight.tistory.com/127 참고

일단 내가 이해한 바로는, 디코더를 만드는 게 목적임. p(x|z).
그리고 학습 데이터를 가지고 디코더를 잘 만들도록 학습시키려고 함. 그러려면 인코더가 만든 z를 어찌저찌 잘 활용해서 x를 생성한 결과, 인풋으로 줬던 p(x) 실제 데이터와 매우매우 유사해야한다는 것임. p(x) = p(x|z)p(z).
그런데 z는 input이 바뀔 때 마다 계속 다를것임. context가 다르니 당연함. 계산이 너무 어려움.
그래서 추정하려고 함. variational inference 사용. 다루기 쉬운 잘 알려진 분포 q(z)를 사용해서 p(z)를 추정할거임.
ELBO라는 방법이 있는데, 이게 evidence의 lower bound를 구하는 것 같음. p(x)를 evidence라고 부르는 듯.

아무튼 mu, var를 그냥 직접 나오게 하면 되지 왜 굳이 mu, var각각을 만들어주는 네트워크가 있냐. 그게 앞서 말했듯이 z가 input이 바뀔 때 마다 계속 변할테니까 이를 반영하기 위한 듯. 그러면 새로운 분포 q_z의 파라미터가 mu, var가 되는 것이고, 이걸 가지고 정규분포에서 랜덤하게 뽑아내서 z를 생성할 수 있는 것임. 그걸 가지고 데이터를 잘 만들어야하는 것이고.

학습 로스. 디코더 어떻게 학습하지? loss어떻게 둘건데?
아까 p(z), q(z)를 쓴댔는데 z가 input x에 driven되는걸로 했다고 했으니 p(z|x).
VAE 디코더는 posterior p(z|x)를 학습하는데, 그냥 하긴 어려워서 q를 둔 것.
아무튼 식을 전개하면 logp(x)에 대한 식이 나오는데,

 

으악 급한 일이 생겨서 셋팅 하고와서 다시 본다

반응형

댓글