저번에 GAN에 대해 정리하였다. 오늘은 이보다 좀 더 앞선 VAE에 대해 다뤄보려 한다.
VAE는 Autoencoder에 Variational을 붙인 Variational Autoencoder의 약자이다. 그렇다면 Autoencoder가 뭘까?
오토인코더는 아래와 같은 구조를 갖고 있다.

저 네모난 블랙박스를 기준으로 왼쪽 Encoding 부분과 오른쪽 Decoding 부분으로 나눌 수 있다.
왼쪽에 Input data를 넣어 encoding을 하여 더 작은 일명 'feature vector'로 만든다.
encoding layer는 conv layer로 구성된다.(정보는 정보대로 두며 크기를 줄이니까 당연히 conv 레이어일 것이다.)
이제 이 feature vector를 decoder로 다시 원상복구한다. (decoding layer는 당연히 deconv 레이어일 것이다.)
이렇게 복원하면 원본과 100% 동일하진 않지만 어느 정도 비슷한 퀄리티로 나온다고 하고, 본래 압축하는 용도로 많이 쓰였다고 한다.
이때 원본과 얼마나 차이가 있는지를 Reconstruction Loss라고 한다.
여기에서 우리가 관심있는건 encoder 부분 따로, decoder 부분 따로이다. 먼저 encoder로부터 나온 feature vector에 classifier를 달고 라벨을 준다면 어떤 의미를 capturing 하는 모델로 쓰기에 용이할 것이다.
그렇다면 decoder는?
앞서 배운 GAN을 다시 생각해보면, 무작위로 z를 뽑아 어떤 '확률 분포'를 토대로 '결과물을 생성'하였다. 그렇다면 위에서 Decoder 부분만 떼와서 feature vector z를 가지고 생성형 모델을 만들 수 있지 않을까 하는 생각이 든다.
하지만 아쉽게도 바로는 불가능하다. 우선 입력값이 한정되어 있다. 즉 무작위로부터 decoding해서 나오는 결과물이 아니라는 것.
그림으로 표현하면 아래와 같은 상황이다.

실제 출력이 가능한 입력값은 저 파란 벡터들인데, 우리가 빨간 벡터를 준다면 decoding이 불가능할 것이다.
그래서 약간의 트릭이 필요하다. 바로 위의 파란 벡터들의 분포를 정규분포로 만드는 것이다. (앞서 배운 가우시안 정규분포의 workaround 기법을 사용면 될 거 같다.)


위처럼 정규분포로 바꿔주는 과정을 거쳐 만든 생성 모델이 VAE이다.

Mean Vector는 encoder로부터 추론한 확률분포의 중심 - (정규분포의 기준점이 될 것이다.)
Standard Deviation Vector는 이 추론한 확률분포의 분산 정도로 어느 정도 범위에서 z를 뽑을지 범위를 잡는 역할을 한다.
VAE에서 Loss function은 Reconstruction Loss에 KL divergence(mean, deviation)을 더한 형태로 이루어져 있다.

궁극적으로 위의 사진처럼 생성값이 출력될 것이다.
딱봐도 모델이 단순하다. 이런 장점이 있지만 그만큼 퀄리티가 GAN이나 diffusion과 같은 다른 생성형 모델에 비해 안좋다고 한다.
