Variational Auto-Encoders는 PixelRNN이나 PixelCNN처럼 p(x)에 대한 명시적인 밀도함수를 알 수 없다.
PixelRNN같은거는 픽셀 값의 조건부 확률로 확률분포를 직접 모델링을 할 수 가 있다. 하지만 VAE는 이미지가 고차원일 때 물리적 요인이나 조명, 시점, 색상 등등 아주 다양한 요인이 이미지의 픽셀값에 영향을 주기 때문에 밀도함수에 접근할 수가 없다.
따라서! 이걸 해결하려는 방안이 뭐냐면 밀도함수의 하한을 최대로 하는 것이다. 이는 실제 밀도함수도 올라갈 것으로 예상할 수 있다.
그래서.. 우선 밀도함수를 직접적으로 접근할 수 없다는 서론이었다.
Variational Auto-Encoders에 대해 설명하기 전에 먼저 Auto-Encoder에 대해서 설명하겠다.
AE란 manifold를 학습하기 위한 모델이다. 따라서 데이터의 압축을 통해 데이터의 중요한 의미만 함축적으로 표현할 수 있도록 Encoder을 학습하는 것이다. 이때 manifold는 데이터 공간상에서 유클리드 거리로는 가까워도 실제 의미적 거리로는 멀 수 있으니 nonlinear한 방식으로 feature을 추출하는 모델을 학습하는 것이다.
여기에서 Decoder단도 함께 학습시켜가며 Encoder단에서 생성된 z벡터를 Decoder을 거쳐서 reconstruct시킨 다음 원본 이미지인 x와 비교해나가며 loss를 줄여나가는 방식으로 학습해나간다.
후에 Decode단은 버려!!서 Encoder만 Downstream task에 사용하게 된다.
이제 Variational Autoencoder이다.
p(z)는 latent vector z의 확률밀도함수이다. 가우시안 분포를 따른다고 가정한다.
p(x|z)는 주어진 z에서 특정 x가 나올 조건부 확률에 대한 확률밀도함수이다.
사전분포와 사후분포...가 뭘까 베이지안 추론? ㅜㅜ
1. 사전분포(prior distribution) : 사전에 관측된 정보를 토대로 모수나 변수에 대한 확률 분포 정의, 이미 알고잇는거 토대로!
2. 사후분포(posterior distribution) : 사전분포와 관측된 데이터를 바탕으로 변수에 대해 업데이트된 분포, 사전분포를 업데이트한 결과! 모수나 변수의 가능성이 어떻게 변하는지 나타냄.
이거능 그림에서 보다시피 이미지를 압축시키는게 목적이 아니라 z에서 이미지 x를 생성해내는데 목적이 있다.
일단.. 이해한 바
1. 원시 데이터에서 latent features z를 학습한다.
2. 새로운 데이터를 생성하기 위해 확률분포로 나타나있는 z에서 샘플링을 하고, decoder을 통해서 새로운 데이터를 생성해낸다.
이때 z는 이미지의 각 pixel에 대해 알맞는 각각의 가우시안 분포이다. 여기에서 샘플링을 하는 것이다. -> feature마다 분포 존재.
이제 Auto Encoder의 디코더를 학습시키는 과정이다.
우선 MLE를 사용한다. 이게 무엇이냐... 하믄 우리가 원하는 정답값인 x가 나올 확률 p(x)가 높을 수록 좋은 모델이기 때문에 이를 최대화 하는 방향으로 vae의 파라미터를 학습시켜나가야 한다. 일단 데이터를 잘 표현하는 z를 뽑아낼 수 있다면 여기에서 새로운 데이터도 만들어 낼 수 있겠다.
그런데, 여기서 중요한 점은 우리는 z를 관측할 수 없다. 따라서 z를 marginalize하는 방식으로 나아간다.
다시 한 번 말하자면 식에서 p(x)가 뜻하는 바는 데이터 x가 나올 확률을 계산하는 것이다. 우리의 데이터가 나올 확률이 최대화 되어야 한다.
위에 그림에서 p(x|z)는 decoder network의 output이므로 계산이 가능하다. 그리고 p(z)는 우리가 정한 가우시안 prior이다. 그런데 여기에서 문제는 모든 z에 대해 적분하는 것이 불가능하다. 그 이유는 다차원 분포일수록 적분이 굉장히 어려워지는 점 때문이다.
따라서 또 다른 방식을 생각해본다. 이번에는 베이즈정리를 사용한다.
여기서도 p(x|z)와 p(z)는 구할 수 있다. 그런데 p(z|x)는 구할 수 없다. 이미지가 주어진다는 전제부터 말이 되지 않는다. 따라서 조금 더 발전을 시켜본다.
p(z|x)는 사후분포라 구할 수 없어? 그러면 새로운 네트워크 q를 학습시켜!! 이렇게 된것이다.
q(z|x)를 사용하는데 이는 변분분포(Variational distribution)이라고 한다. 이는 사후분포를 근사화 하는 역할을 한다.
사전분포를 직접 계산하는게 어려울 때 이 두 분포의 차이를 최소화 하는 것으로 수행된다.
이미지 x를 넣으면 잠재벡터를 생성하는 식으로 작동이 된다. 이때 들어가는 x는 원본 이미지이다.
따라서 p와 완전 별도의 신경망이나 제대로 track할 수 있게 학습된다.
이때의 q는 이미지를 넣으면 latent 벡터의 분포를 생성한다? 완전 인코더의 방식이자나!! 그냥 인코더의 형태이다.
일단 이미지 샘플링이 위 분포에서 어떤 식으로 진행되는지도 살펴보기
그래서 이제...우리는 q(z|x)를 p(z|x)와 비슷하다고 여긴다.
자 이제 sampling 하는 과정을 설명해보겠다. 이를 reparameterization trick이라고 한다.
이는 어떤 데이터의 분포가 있으면 거기에서 하나를 뽑아 기존 DB에 있지 않은 새로운 데이터를 생성하는 것이 목적이다. 따라서 확률분포에서 하나를 뽑아야 하는데, 그냥 random sampling하면 backprop을 할 수 없게 된다. 따라서 약간의 trick을 사용하는데, 입실론을 정규분포에서 샘플링하고 그 값을 분산과 곱하고 평균을 더한 값과 랜덤으로 샘플링한 값은 같은 분포를 가지게 된다. 따라서 덧셈, 곱셈은 backprop이 되므로 위 방법으로 sampling을 진행한다.
여기에서 이제 ELBO라는 것이 나온다.
우리는 maximum likelihood를 통해 loss를 최소화해야한다. 따라서 원래 -log어쩌고가 loss값이니까 log어쩌고를 최대화 해주어야겠다. 그리고 그냥 p(x)값이 최대가 되어야 한다!
우리가 찾기 원하는 바는 p(x)값을 최적화 시킨 값이다.
자.. 차근차근.. 살펴보자...?^^
먼저 첫 번째 줄은 베이즈룰.. 만이 본 식이다. 그리고 분모분자에 q(z|x)를 추가하였다.
이를 먼저 log로 나눌 수 있었는데 각 항을 E를 씌워서 기댓값을 계산한다. 이는 평균적인 값이라고 한다.
그리고 Ez~q(z|x)[logp(x|z)]를 해석해보자면... 주어진 입력 x에 대해 잠재변수 z에서 샘플링한 z에 대한 로그 우도의 기대값을 뜻한다고 한다........이는 입력 데이터 가 주어졌을 때 잠재 변수 가 주어진 상황에서의 데이터 의 가능도를 측정하는 것이란다.. 따라서 Data reconstruction항이라고 한다. 그냥 z에서 reconstruction잘 했냐!!
두번째 항...은 두 확률분포의 거리를 추정하는 것이다. 이는 항상 0보다 큰 수이다.
인코더 네트워크에서 생성한 z의 분포와 z의 사전분포(ex: 가우시안)간의 거리를 측정하는 것이다. 이는 reg term인데 vae가 recontruction task만 잘 하지 않고 실제 분포가 잘 유지되도록? 사전분포와 비슷하게 만들어주는 항이라고 한다.
마지막으로 인코더 네트워크에서 생성한 z의 분포와 p(z|x)의 거리를 측정하는데... 이는 우리가 위에서도 몰랐던 것이야!! 그래서 그냥 생략시켜버리지만 KL이므로 0이상이라는 것을 가정해 식을 >= 로 바꾸게 된다.
그래서 이제 이걸 어떻게 쓰냐고 하면 표준 정규분포에서 어떤 z를 sampling하고 이를 decoder의 input으로 넣는다. 그러면 새로운 데이터가 생성된다.
그리고 왜 VAE를 하냐?? 면
1. 적은 데이터를 가지고도 원래 데이터가 가지는 분포를 꽤 가깝게 근사하고 이를 통해 새로운 데이터를 생성해낼 수 있다.
2. latent variable의 분포를 가정하고 우리가 sampling할 값들의 분포를 control할 수 있게 되고, manifold학습도 잘 된다. latent 벡터에서 한 부분만 건드리면 웃는 입이 된다거나 얼굴이 돌아간다거나.. 그러타!
'인공지능' 카테고리의 다른 글
[코스모스 8주차] Object Detection, Segmentation (0) | 2024.05.09 |
---|---|
[코스모스 7주차] Self-Supervised Learning (0) | 2024.05.07 |
[코스모스 6주차] Activation Function (0) | 2024.04.11 |
[코스모스 5주차] ATTENTION ~ TRANSFORMER (0) | 2024.04.04 |
[모각코 3주차] GAN (0) | 2024.03.21 |