생성 모델의 흐름(variation bayes to VAE)

seung·2025년 1월 11일

Generative Model

목록 보기
5/7

생성모델이 뭔지는 우리가 계속 배워왔다.

즉 이미지들의 분포가 있을 때 우리가 여러가지 기법을 이용하여
그 분포와 근사한 분포를 찾아내어 그것으로 부터 샘플링하여 새로운 이미지를 만들어내는 것이다.

생성모델에서 확률이라는 개념이 많이 쓰인다고 알고 있었다.
그렇지만 왜 이런 데이터들을 갑자기 확률분포로써 설명하는 것일까?
왜 갑자기 확률분포라는 개념이 나오지??
그것에 대해 알아보자

가장 기본적인 생성모델

우리가 굉장히 친숙하고 기본적인 생성모델은 computer graphics이다.

computer graphics는 어떻게 컴퓨터가 자연스럽게 영상을 만들 수 있을까 고민에서 나온 framework이다.

우리가 high level description을 통해 output을 생성하고 (generation)

output을 통해 high level descriotion을 뽑아내려는 것(inference)이
computer vision의 목표인 것이다.

그래서 생성은 원래부터 항상 computer vision과 함께했었다 ㅎ

확률 분포를 이용한 생성모델

확률분포를 이용한 생성모델은 그럼 앞에서 배운 생성모델과 어떤 차이가 있는 것일까?

그 차이는 바로 우리가 알고 있는 세상에 대한 선험적인 지식(prior)을 이 frame안에 얼마나 녹여내냐에 차이가 있다.

예시를 통해 알아보자

  • computer graphics
    우리가 simulation 세상에 대해 모든 것을 알고 있다고 가정하는 것이다.
    거의 대부분의 prior가 정해져 있고, 그 이상 넘어가는 것은 커버할 수 없다.

  • statistical generative models(확률 기반 모델)
    우리가 실제 세상에 요소들을 모두 다 모델에 반영하기 힘들기 때문에 사실 생성된 이미지와 실제 이미지의 괴리감이 들게 된다.

    즉 실제 세상이 매우 복잡하니깐 우리가 모든 것을 고려하여 설정하는 것이 아니라 데이터로부터 배워보자라는 모델링을 의미한다.

데이터로부터 모델이 스스로 선험적인 지식을 습득하는 모델링을
확률 기반 모델링이라고 한다.

앞으로 거의 대부분 통계적인 생성모델들을 배우게 될 것이다.

정리하면
통계적 생성모델은 확률분포 p(x)를 정의하고 data sample이 있을 때 우리가 최소한의 선험적 지식과 데이터로부터 학습하여 real data 분포와 근사시키는 일을 한다.

sample 이미지가 있을 때 그 이미지가 real data와 같다면 확률이 높고, 아니라면 낮을 것이다.

확률 기반 생성모델 선정 과정

우리가 학습할 때 선험적 지식을 넣고 학습할텐데 그 때 아무거나 넣는것이 아니라
우리가 잘 알고있는 파라미터들로 이루어진 모델로 설정한다.

ex) gaussian distribution
평균과 분산만 알면 이 분포를 다 알수 있기 때문에 자주 사용된다.

그러한 모든 가능한 정규분포 평균과 분산이 모여있는 model family에서 현재 내 데이터들을 잘 설명하는 평균과 분산을 찾기만 한다면 p_data를 근사할 수 있을 것이다!!

확률모델을 만들기 위해 필요한 요소들

  • 이미지 데이터

  • 정규 분포 평균과 분산이 모여 있는 model family

  • p_data와 p_theta가 얼마나 가까운지를 계산할 distance function

  • 거리를 줄이기 위해 최적화하는 최적화 기법

생성모델을 왜 사용할까?

우리가 ai와 머신러닝을 배울 때 처음 배우는 것이 분류모델이다.
분류모델과 생성모델을 비교해가면서 왜 생성모델을 배워야되는지 알아보자

classification model

분류 모델은 대부분 decision boundary를 학습 하는것이 목적이다.

이렇게 여러가지 이미지를 각 클래스에 맞게 분류 하는 것을
discriminative model이라고도 한다.

중간의 선을 학습하는 것인데 확률로 보면 어떤 이미지가 들어왔을 때 그것이 침실인지 부엌인지를 나타내는 확률로 나타내어 정답이면 확률을 높이고 오답이면 낮추는 과정을 거친다.

예시)
p( Y=badroom | x=부엌 이미지) =0.001

generative model

생성모델도 분류 모델처럼 분류 task를 수행할 수 있다.
bayes rule에 의해서 가능하게 되는데 살펴보면,

X가 입력 데이터이고, y가 라벨(target)을 나타낼때
이 두 변수의 같이 조합될 확률을 학습한다.(joint distribution)

예를 들어 이미지가 부엌이고 target이 D(dining room)일 확률은 높아야 할 것이고, 이미지가 부엌인데 target이 B(bad room)이면 낮아야 될 것이다.

학습하는 과정은 bayes rule를 이용하여 진행된다.

우리는 joint distribution들을 학습한 뒤에
우리가 알고자 하는 p(y,x)에 입력 이미지에 대한 joint를 다 더한것을
나누어 주어 분류모델에서 구하는 조건부 확률을 구할 수 있다.

그러나 이것을 보면 그런 의문이 생길 수 있다.
그냥 바로 조건부 확률을 구하면 되는 것을 굳이 구하기 힘든 x의 분포를 구해서 베이즈 룰로 조건부 확률을 구할려고 하는 것일까?

이렇게 하는 이유가 있겠지?? 이 방식으로 한다면, 우리는 p(x) 혹은 p(y,x)를 모델링하기 때문에 x가 어떤 형태 이미지여도 상관없이 분류해낼 수 있고, 확률을 계산할 수 있다.

반면에 분류 모델을 보지 못했던 이미지가 들어오면 분류를 제대로 해내지 못하게 된다.(작동 x)

분류모델의 한계

분류 모델은 항상 decision boundary를 기준으로 분류하고 학습하기 때문에
우리의 눈으로 별 차이가 없는 정도의 노이즈를 추가하여 분류해보면
이상하게 분류하는 것을 볼 수 있다.

즉 분류모델을 적대적인 노이즈가 들어가게 되면 취약점이 들어나게 된다.

즉 아래의 그림처럼 x의 위치가 decision boundary와 멀다면 높은 확률로 그 영역의 라벨이라고 할 것이다.

하지만 생성모델로 보면 저 x는 분포에서 좀 떨어진 outlier라고도 생각할 수 있게 된다.
또한 생성모델은 joint distribution으로 학습하기 때문에
분류모델의 p(y|x) 와 p(x)을 둘 다 고려하기 때문에
특정 y의 속해도 데이터의 분포와 떨어져 있다면 낮은 확률이 부여되게 된다.(uncertain을 부여함)

즉 정리하면 분류모델과 다르게 생성모델은 outlier에도 강견한 분류를 할 수 있다는 것이 장점인 모델이다.

생성모델의 학습

생성모델이 왜 중요한지 어떤 특성을 가지는지 확인해보았으니 이번에는 어떻게 학습하는지 알아보자

MLE(maximum likelihood estimator)를 이용해서 학습한다.

샘플 x가 있을 때 우리가 설정한 평균과 분산을 고정하고
likelihood를 계산했을 때 다 더해서 평균을 낸 것이 가장 크게 하는
theta를 찾는 것이 목적이다!!
즉, 현재 입력 데이터를 가장 잘 설명하는 theta를 찾자!!
(확률값들을 원래 곱으로 표현되어 있는데 그러면 너무 작은 값으로 나오기 때문에 log를 붙여서 곱셈을 덧셈으로 바꾸는 방식을 이용한다.)


생성모델의 갈래는 여러가지로 정말 다양하지만 그중에서 은닉변수를 이용한 모델인 latent variable model에 대해서 알아보자

Latent Variable Model

우리가 위에서 구하려고 했던 p(x)를 그냥 구하려고 하면 상당히 어렵고 힘들다.

그래서 이 연구자들이 은닉변수를 이용해서 이 문제를 해결하자라고 생각했다.

그냥 p(x)도 모르는데 은닉변수까지 추가해서 해결한다는게 어떻게 가능한다는 걸까??
왜 latent variable이 학습에 도움이 되는거지?!?!?

latnet variable 사용하는 이유

예를 들어
우리가 mnist데이터(클래스가 10개인 손글씨 데이터)가 있을 때 우리의 분포는 mixture of gaussian으로 생각할 수 있다.

즉, 각각의 클래스가 뭉쳐져 있는 mixture of gaussian으로 생각할 수 있고, 그 안에는 10개의 봉우리가 있을 것이다.
(각각의 클래스로 보면 하나의 봉우리, gaussian 분포로 볼 수 있다.)

이 때 z라는 것을 하나의 클래스, 클러스터라고 하면은 우리가 클래스를 하나로 설정하면 p(x|z)는 single gaussian, 하나의 봉우리를 가지는 단순한 정규분포로써 표현할 수 있다는 장점을 갖게 된다!!

이 z(latent variable)를 사용하지 않고
x 전체로 분포를 표현할려고 한다면 10개의 가우시안들이 조합된 좀 더 복잡한 분포를 학습해야 할 것이다

정리하면 우리가 z를 알고 있다면,
x를 쪼개서 단순한 분포로 모델링 할 수 있고 그것들이 모여서 복잡한 p(x)를 근사할 수 있다는 것이다!!

latent variable model의 등장

우리가 위의 이야기 처럼 z를 이용하면 모든게 잘 될 것 같지만
또다른 문제는 z를 알고 있다면이라는 전제이다
z를 모른다면 이것을 사용하는 것은 더더욱 어려운 것이 아닌가?!?!

그래서 이 잠재변수를 입력 데이터로부터 학습 시키는 방법들이 많이 등장하기 시작했고 그런 방법들이 latent variable model인 것이다!!!

이 방식이 장점만 있지는 않다. z라는 것을 이용해 모델링 함으로써 모델의 표현력이나 유연함이 떨어지고, 학습도 좀 어렵다는 단점이 있다.

z를 이용해서 어떻게 학습하는지 예시를 통해 알아보자

예시

각각의 픽셀을 우리가 관측한 데이터(X)라고 하고, 저 이미지에서 보이지 않은 픽셀들을 은닉변수(Z)라고 해보자.
이때 우리의 목표는 아마 중간에 가려진 부분을 잘 채워넣는 것이 될 것이다.

이런 상황에서 우리가 배운 모델이 어떻게 적용되는지 알아보자

우리가 저 가려진 이미지를 보면 유추를 하게 된다
왠지 7인거 같은데 3인거 같은데? 라는 생각을 하게 되는데 그 이유는 우리 머리안에 이미 데이터에 대한 선험적인 지식이 있기 때문이다.

이처럼 그러면 전체 클래스에 대해서 선험적 지식인 p(x)에 대해서 잘 학습된 생성모델이 있다고 하면 이 가려진 부분을 채워넣을 수 있을 것이다.

우리가 알고 있는 부분은 주어져 있지만 모르는 부분을 존재할 수 있는
픽셀의 조합들 중 모든 조합의 확률을 계산해서 그걸 다 더해서 가장 그럼직한 것을 찾으면 빈 부분을 채워넣을 수 있다는 말이다.

즉 모델의 선험적인 지식을 기반으로 빈 부분을 채워넣기에 가장 그럼직하고 확률이 높은 z를 찾아 낼 수 있을 것이다.

likelihood 계산적 한계


위와 같은 계산을 컴퓨터에게 시키면 매우 어려운 작업이다.
그 이유는 뭘까?

우리가 만약 모르는 픽셀이 30개라고 하고 픽셀의 값이 0 또는 1이라면, 2^30이라는 경우의 수를 따져서 계산해야한다.
게다가 이게 연속적인 값(이미지 같은 것)이라면 더더욱 계산하기 힘들어진다.(조합 개수가 무한해지기 때문)

이런 함수들은 또한 기울기를 계산하는 것도 매우 힘들어 역전파를 통한 가중치 업데이트도 힘들 것이다.

이것을 단순화 하기 위해 우리는 2가지 방법을 이용할 수 있다.


MLE를 위한 여러가지 기법

1. Naive monte carlo

우리가 하고자 하는 것이 p_theta(x)를 만들어 학습시키는 것이다.
p_theta(x)를 표현하기 위해 모든 z에 대해서 sum을 해주면 되지만
그렇게 되면 복잡하기 때문에 z가 균일 분포에서 값이고
그것을 이용하여 p_theta(x,z)의 기댓값을 구하는 것으로 바꿔서 생각하는 방법이다!

이렇게 표현하고 나면 우리는 sampling이 가능해진다.
(z가 균일분포에서 왔다고 가정할 수 있기 때문)

즉 z의 분포에서 랜덤하게 뽑아서 그것들을 다 평균내는 과정을 하는 것이다 우리가 계속 반복적으로 샘플링을 해서 계산하게 되면 p_theta(x)로 수렴함이 보장된다.

이 방법도 단점이 존재하는데 말했던 것처럼 z가 무한히 있을 수 있고 그것들을 다 계산한다는게 불가능하다.

아까 예시로 생각해보면 숫자 이미지는 대부분 배경이고 숫자가 그려진 것은 중앙에만 존재한다.

우리가 좀만 생각해보면 배경보다 숫자가 있을만한 픽셀에서 z를 뽑아내는게 상식적이다. 이걸 다 고려하는 것은 비효율적이며, 매우 계산량이 많을 것이다!

이 몬테카를로 방식은 그런 환경을 다 무시하고 균일하게 뽑기 때문에 굉장한 단점이 된다.

2. Importance sampling

모든 z를 동등하게 확률 조건으로 뽑는 것이 아니라 우리가 설정한 q(z)의 분포에서 뽑아서 기댓값을 구하도록 하는 것이다!

uniform 대신 우리가 선험적인 지식을 사용해서 좀 더 나은 분포를 찾을려고 하는 것이다!!


즉 q(z)에서 z를 샘플링하여 p_theta(x)가 최대화되는 방향으로 theta를 업데이트하는 과정을 반복한다.

이제 여기서 중요해지는 것은 q(z)를 어떻게 설정할까???
이 q(z)를 잘 설정해야 이 몬테카를로가 진짜 데이터 분포로 더 빠르게 수렴할 것이다.

이 방식은 q(z)를 어떻게 설정하냐에 따라서 성능이 매우 달라지고,
q(z)를 선험적인 지식을 이용해 번겁롭게 모델링을 해야하며,
샘플링하고 업데이트하고 하는 방식을 계속 반복해야 해서 매우 느리다는 단점이 있다.

그래서 이 방식도 그렇게 선호되지는 않는다.

3. variational inference!

그럼 정말 최적의 방법이 없을까 생각에서 나온게 일단 최적의 q(z)를 찾는 방법을 수학적으로 표현해보기로 했다.

일단 예시로 아까 보았던 이미지를 생각해보겠다.

보이지 않는 부분을 z라고 했을 때 어떻게 모델링하는 것이 가장 좋을까?

첫번째로 이것을 변수를 하나 주어서 진짜 q(z)를 모르겠으니깐 수학적으로 근사하는 분포를 표현한 것이 아래와 같은 수식이다.

이 수식을 해석해보면 위의 이미지에서 한 픽셀이 검은색이 나올 확률, 흰색이 나올 확률을 phi로 두고 phi를 어떻게 설정하냐에 따라서 다양한 q(z)를 얻을 수 있을 것이다.

자 이제 q(z)에서 phi를 구하는 과정으로 바뀌었다.
그럼 phi값이 어때야 최적일까??
만약 0.5와 같다면 균일분포와 다를것이 없고, 1로 하자니 너무 극단적이다.

그러면 우리가 이 phi를 찾기 위한 효율적인 방법이 뭐가 있을까??

그것은 바로 우리가 i번째 픽셀이 흰색을 확률을 1로 두는데 그 때 우리가 저 이미지가 어떤 숫자일 것이라는 선험적 지식을 넣어서 그 확률을 지정하는 것이다.

예를 들어 저 위의 숫자 이미지가 8인 것 같다는 선험적 지식을 넣어 8이 나올 것 같은 곳에만 확률을 부여하여 진행한다는 의미이다.
이것을 다시 수학적으로 생각하면 posterior이다!!

즉 우리는 p(z|x)가 x를 봤을 때 가장 그럼직한 z를 찾아낼 수 있도록 하는 가장 최적화된 q(z)라는것을 우리는 경험적으로 알고 있다.

이제 우리는 posterior를 구하기만 하면 된다.
하지만 문제는.. 이것도 어떻게 분포되어 있는지 알 수 없다.. ㅠㅠ
어떤 해결 방법이 있을까?


Variational Inference란?

p(z|x)를 모르는데 q(z)로 어떻게 설정하냐?의 해답은 가우시안 분포로 근사시키는 것이다!

아래 처럼 복잡한 p(z|x)의 분포를 가장 잘 나타내는 단순한 가우시안 분포로 찾아서 가장 그럼직한 z를 뽑아낼거다.
이것이 variational inference이다!!

하늘색 분포보다 파란색 분포가 p(z|x)와 유사하기 때문에 저 분포를 q(z)로 두고 importance sampling을 한다면 더 빠르게 수렴하고 학습할 수 있다.

이 방식을 통해 우리는 우리가 구할려고 하는 inference문제를 최적화 문제로 바꿔서 생각할 수 있게 된다.

우리가 처음에 importance sampling에서 위와 같은 식으로 하는 추론 문제를 푸는 것이 목적이었다.
이 목적을 이제는 아래와 같이 두 분포의 유사도가 가까워지는게 목적인 최적화 문제로 바꿔서 생각하게 된다.

우리가 지금은 p(z|x)를 모르지만 안다고 가정하면 그것에 가까운 q(z)를 찾기만 하면 되는 것이다!

inference문제와 optimizer 문제의 차이는
추론문제는 q(z)에서 일일히 샘플링하여 계산해서 최대화되는 파라미터를 찾는 것이지만 최적화 문제는 내가 설정한 q(z)모델이 p(z|x)와 젤 가깝게 하는 것으로 inference에 비해 단순하다!
이것이 variantional inference의 key idea이다!!

하지만 안다고 가정했을 때에 일이다.
문제는 p(z|x)를 우리는 모르고 p(z|x)를 구하는 것은 p(x)를 근사하는 것 만큼 어렵다.

그 이유를 살펴보면 위에서 본 식을 풀어보면 결국 p(z|x)를 이용해 KL divergence를 구하는 것은 p(x)를 알아야 풀 수 있는 것이다.

이 문제를 우리는 어떻게 해결 해야할까?


Evidence Lower Bound

kl 거리 함수를 직접적으로 계산할 수 없기 때문에 이제 우회하는 방법을 찾기 시작했다.

이때 찾은 방법이 ELBo방식이다!!

KL식을 뜯어 보면서 그 우회하는 방법에 대해 알아보자

KL식에서 우리가 구하지 못하는 골칫덩어리인 p_theta(x)를 넘겨서 식을 정리하여 생각해보자

우리가 p(x)를 모르지만 KL 식과 저 빨간부분항으로 구성된다는 것을 알 수 있다.

또한 KL이 거리함수로서 non-negative한 것도 알기 때문에 우리는 저 빨간부분을 evidence의 하한 즉, ELBo라고 할 수 있는 것이다.

ELBo를 보면 모든것이 q(z)를 통해서 구해지는 것을 확인 할 수 있다.
(계산이 가능하다는 것이다!)

즉, 우리가 설정한 q(z)에 따라서 ELBo가 정해지고 ELBo를 최대화 하면 우리는 p_theta(x)를 최대화할 수 있다는 것을 알 수 있다!!!
우리가 q(z)를 최대화 하는 방향으로 업데이트 하면 q(z) 최적화 되면서 p(z|x)와 같아져 KL이 0이 되고 log p(x)=ELBo가 되기 때문이다!

즉 우리가 계산할 수 있고 알고 있는 ELBo를 최대화하는 문제로 바꾸어서 생각하면 궁극적으로 q(z)를 p(z|x)로 근사할 수 있다는 말이다!

최종 정리한 식

KL 식빼고 생각하면 아래와 같은 식으로 나타낼 수 있고,
q(z) = p(z|x) 일때, equality가 성립한다고 할 수 있다.

ELBo 해석하기


p(z|x)를 q(z|x)로 근사하고 싶어하는 것이 variational inference이고
가장 최적의 q(z|x)를 찾는 것이 ELBo를 최대화하여 KL을 줄이는 것과 같다는 것을 위의 그림을 통해 알 수 있다.


variation inference 한계

하지만 이 ELBo도 단점이 있는데 예시를 살펴보자

우리가 log-likelihood 함수가 있고, q를 바꿔가면서 maximize를 하여 계산할 때
그래프와 같이 ELBo를 항상 최대화 하는 것이 likelihoob를 최대화하는 것과 동치가 되지 않을 수 있다.

그래도 반복적으로 q를 만들어서 하다보면 결국 높은 지점으로 가게 된다라는게 variational inference의 한계이다.

ELBo의 다른 해석

ELBo를 두가지 텀으로 구성해서 해석해보면

  • 첫번째 항
    앞에 있는 q(z)logp(z,x)는 p(z,x)가 가장 클 때 그 지점에서 z를 샘플리이해야 ELBo를 최대화 할 수 있다.
    즉 항상 z를 p(z,x)가 가장 높은 값에서 샘플링하도록 설정하는 것

  • 두번째 항
    첫번째 항의 문제는 너무 뾰족한 분포가 되어 두루두루 커버할 수 없는 분포가 된다는 것이다.
    그것을 해결하기 위해 엔트로피와 같은 설정하는 항이다.

즉 이 ELBo로써 q(z)에 원하는 것은 적절히 높은 부분들을 커버하면서 퍼져있는 분포를 만드는 것이다!

ELBo에 대한 다른 접근 - (1)

위와 같은 방식으로 ELBO를 구할 수 있지만 jensen's inequality로 접근해서 구할 수 있다.

이 방식도 간단하고 좋지만 단점이 부등식에서의 차이가 얼마만큼인지 정확히 알지 못한다는 단점이 있다.

위에서 배운 ELBO를 구하는 방식은 KL로써 q(z)와 p(z|x)의 차이로써 알 수 있었지만 이것은 알 수가 없다.
즉 뭐 때문에 gap이 생기고, 그 gap이 얼마나 차이나는지 알 수 없다.

ELBo에 대한 다른 접근 - (2)


likelihood와 prior의 균형으로써 볼수도 있다.

  • likelihood
    내가 뽑을 수 있는 z중에 현재 x|z(likelihood)가 가장 높은 것을 찾자

  • prior
    prior는 q(z)가 너무 뾰죡해지지 않도록 우리가 사전에 정의한 smooth한 p(z)와 유사하도록 하는 것이다.

VAE

지금까지 배운 것을 알게 되면 우리는 VAE에 대해서 완벽하게 알게 되었다.

지금까지 한 방법들을 neural network로 진행하는 것이 VAE이다!
(variation bayes를 auto encoder를 이용해서 진행한 것!)

Diffusion 모델이 사실 VAE모델의 갈래로 해석될 수 있기 때문에
우리가 VAE를 완벽하게 안다면 Diffusion을 쉽게 이해할 수 있다.

1개의 댓글

comment-user-thumbnail
2025년 1월 11일

이해가 쏙쏙 되네요! 좋은 글 감사합니다. :)

답글 달기