//
Search
🔥

VAE(Variational AutoEncoder)

오늘 연구실 세미나에서 VAE에 대한 내용을 다뤄서 간단히 정리해보았다.

Latent Space

예시를 한번 들어보겠다.
xRn,    zRm,    ARn×mx \in \mathbb{R}^n, \;\;z \in \mathbb{R}^m, \;\; A \in \mathbb{R}^{n \times m} 에서
xx : raw data point
zz: hidden or latent representation (m<nm<n)
AA : matrix for linear transform
vv : independent and identically distributed gaussian noise( 독립 항등 가우시안 분포 노이즈 )
x=Az+vx = Az + v 로 생성되었다고 가정한다. 이 경우 raw data point인 xxzz 로부터 linear transform을 통해 noisily generated되었다.
이는 PCA라는 고전적 방법의 가정과 일치하며, PCA는 zz를 찾는 과정이라 할 수 있다.
일반적으로 우리는 raw data xx 만을 보게되고 zz에는 접근하지 않는다. 이것이 zz를 hidden / latent representation이라 일컫는 이유이다.
그렇지만 우리는 더 근본적이고 압축된 데이터의 표현인 zz에 접근하면 좋을 것이다. ⇒ 어떠한 알고리즘에 사용할 유용한 input이 될 수 있다.
그러나 PCA는 xxzz의 선형변환인 경우만 가정하므로 실패하는 경우가 많다.
zz가 매우 복잡하고, xx와 선형관계가 아닌 경우가 많기 때문이다.
그래서 사용하게 되는 것이 AutoEncoder이다.

AutoEncoder(AE)

VAE라는 말만 들으면 낯설게 느껴지지만 딥러닝을 공부해 본 사람이라면 autoencoder는 많이 들어본 단어일 것이다.
AutoEncoder란 원본 xx로부터 저차원의 representation zz를 구해 스스로 네트워크를 학습하는 방법이다.
그림처럼 encoder와 decoder로 이뤄져있다. 가운데에 compressed representation이 zz이다.
encoder : 학습데이터를 latent variable vector로 잘 표현하는 역할
decoder : latent variable vector zz 로부터 학습데이터와 비슷한 데이터를 만드는 역할.
별도의 레이블이 없고, 원본데이터를 레이블로 사용하는 Unsupervised Learning이다.
주 목적은 encoder를 잘 학습해 성능 좋은 feature extractor로 사용하는 것이다.
입력 xx와 출력 yy가 최대한 동일한 값을 갖는 것이 목적이므로, loss는 입력값 xx와 decoder의 출력값 yy의 차이이다. ( e.g. L1 Loss, L2 Loss )
최소한의 성능을 보장할 수 있다는 점에서 장점이 있다 ( GAN같은 경우 최소한의 성능 보장 불가 )

Variational AutoEncoder(VAE)

AE와 유사한 구조를 가지지만 어떠한 의미에서 매우 다르다
VAE의 시작 → random noise로부터 원하는 영상을 얻을 수 없을까? (참고로 VAE는 GAN보다 훨씬 빨리 제안되었다)
단순히 생각해보면, 2D noise (H×W×3H \times W \times 3 크기)를 입력으로 얻을 수 있는 영상의 개수는 256H×W×3256^{H \times W \times 3} 개이다. ( 픽셀값이 0~255니까 )
그 중 임의로 뽑은 랜덤노이즈로 내가 원하는 이미지를 얻을 수가 있을까? 말이 안된다.
그러나
Pdata(x)P_{data}(x)라는 확률분포를 가지는 dataset을 사용해 이 dataset을 잘 나타내는 분포를 만들어 random noise가 그 분포 내에 속하도록하면 dataset과 유사한 결과값을 얻어낼 수 있을 것이다!
Uniform한 random noise가 아닌 dataset이 가지는 확률 분포 내에서 random noise를 생성
입력을 복원하는 AE와 달리 VAE는 데이터를 “생성”해야하기 때문에 데이터셋의 분포 그 자체를 학습해야 한다.
따라서 VAE는 위의 그림처럼 encoder에서 학습한 데이터의 분포 (zz의 분포)로부터 samping한 zz를 decoder의 입력으로 사용해 decoder는 zz로부터 데이터를 생성한다.
좀 더 detail하게 말하자면 z의 prior distribution을 N(0,1)\mathcal{N}(0,1) 으로 하고, 학습과정에서 평균 μ\mu와 표준분포 σ\sigma를 학습한다.

dataset이 encoder로 들어가면…

그림처럼 Latene distribution으로 나타내어진다. 실제 코드로 구현된 것에 따르면
위의 그림처럼 encoder로부터 μ\muσ\sigma가 추출되고, N(0,1)\mathcal{N}(0, 1)을 따르는 ϵ\epsilon ( prior distribution )으로 z=μ+σϵz=\mu + \sigma \odot \epsilon 으로 zz를 sampling한다.
단순히 정규분포에서 sampling하는 형식으로 구현을 하면 encoder와 decoder 사이 latent variable 부분에서 backpropagation이 불가해지기 때문에 이렇게 μ\muσ\sigma 값을 통한 선형 결합을 통해 gaussian 분포의 sampling을 하도록했다.
Reparameterization Trick

sampling된 zz가 decoder로 들어가면…

sampling된 zz는 매우 다차원의 Latent distribution에서 어떠한 특징에 대한 값을 갖고 있는 vector가 된다. sampling된 zz가 decoder로 들어가게되면 그림처럼 해당하는 feature에 대한 결과물이 output으로 나오게 된다.
당연히 sampling된 zz값에 따라 다르게 생긴 결과물이 나오게 될 것이다.
한마디로 정리하자면,
Training
encoder를 통해 Latent Distribution을 잘 예측하여 decoder에서 reconstruction이 잘 되도록 한다
Test
AutoEncoder에서와 같이 encoder 부분은 떼어내고 학습을 통해 정의된 Latent Distribution에서 latent variable z를 sampling해 decoder를 통해 새로운 이미지를 출력하도록 한다.

VAE의 단점

blurry output
VAE에는 치명적인 단점이 있는데, sampling한 결과가 blurry한 특성이 있다는 것이다. 실제로 인터넷에는 GAN의 이미지가 왜 VAE보다 선명한것이냐! 라는 질문이 많이 올라와 있다. 아래 그림이 그를 잘 보여주는 이미지 이다.
위 이미지에서 회색으로 표시된 실선이 실제 이미지의 분포이다. 파란 부분이 VAE가 예측한 분포, 빨간 선이 GAN이 예측한 분포이다.
잘 생각해보자. VAE는 어떠한 분포 ( e.g. 가우시안 분포 )를 가정하고 시작하기 때문에 encoder가 예측한 분포는 그 분포를 따라야 한다. 가우시안 분포를 가정하고 시작했다면 encoder가 예측한 Latent distribution은 가우시안 분포여야 하는 것이다. 그렇기에 input image의 실제 분포를 정확히 따라가기 어렵다. 그림처럼 저 세개의 회색 선을 어우르면서도 가우시안 분포를 따르는 그런식으로 학습이 되는 것이다.→ blurry하면서 실제같지는 않은 결과물이 나옴.
반면에 GAN같은 경우에는 generator가 생성한 이미지를 discriminator가 실제 image와 구분하지 못할 때 학습이 끝난다. 이는 generator가 생성한 이미지가 실제와 똑같아야 끝나는 것이다! 그림을 보면 세가지 선중 하나의 선을 따라서 GAN이 학습되었다. 세가지 분포를 모두 담아내지는 못했지만 한가지 분포를 잘 모방했기에 어쩄든 Discriminator가 구분하지 못하게 된다. (이는 GAN의 고질적 문제인 mode collapse 문제를 나타내기도 한다. 데이터셋을 완전히 모방하지는 못했으나 하나의 mode만을 잘 모방해 discriminator를 속여버리는 문제 )
둘의 차이를 잘 나타낸 그림이었다.
Posterior collapse
또하나는 Posterior collapse문제이다.
이는 decoder가 encoder가 예측한 latent distribution q(zx)q(z|x) 를 무시하고 결과를 내는 것을 말한다.
xx로부터 zz의 분포를 모델링하고, 그 분포로 부터 zz를 sampling할 때, sampling된 zz가 처음에 정의해준 prior distribution을 그대로 모방하는 현상 → 간단히 말해 zzxx의 정보를 제대로 담아내지 못하는 현상이다.
이 문제는 discrete한 데이터 (음성데이터라던지…) 에서 더 두드러진다고 실험적으로 밝혀졌다
⇒ 이를 해결하기 위해 VQ-VAE라는 게 나왔는데, 추후에 또 다뤄보겠다!
reference