핵심 한 줄 정리

Generative model은 data를 만든 probability distribution을 학습하는 모델이며, autoregressive model은 chain rule로 exact likelihood를 계산하고 VAE는 latent variable과 ELBO를 도입해 tractable한 lower bound로 학습한다.

중요 개념 정리

Supervised learning과 unsupervised learning

Supervised learning에서는 input과 target의 pair가 주어진다.

D={(x(i),y(i))}i=1N\mathcal{D} = \left\{ \left(x^{(i)},y^{(i)}\right) \right\}_{i=1}^{N}

목표는 training set에서 관찰한 x→yx\rightarrow y mapping을 학습하고 새로운 input에도 일반화하는 것이다. Image classification, captioning, object detection, semantic segmentation이 이에 해당한다.

Unsupervised learning에서는 label 없이 sample xx만 주어진다.

D={x(i)}i=1N\mathcal{D} = \left\{ x^{(i)} \right\}_{i=1}^{N}

이때는 data의 cluster, low-dimensional structure, representation, probability density처럼 직접 관찰되지 않은 structure를 찾는다. K-means clustering, PCA, density estimation이 대표적인 예이다.

Supervised와 unsupervised는 label을 사용하는지에 관한 구분이다. Discriminative와 generative는 어떤 probability distribution을 modeling하는지에 관한 구분이다. 두 기준은 서로 다른 축이므로 같은 의미로 섞어 쓰면 안 된다.

Probability distribution의 normalization

Continuous variable xx의 probability density p(x)p(x)는 다음 조건을 만족한다.

p(x)≥0p(x) \ge 0 ∫p(x) dx=1\int p(x)\,dx = 1

Discrete variable이라면 integral 대신 모든 값에 대한 sum이 1이다.

∑xp(x)=1\sum_x p(x) = 1

전체 probability mass는 1로 고정되어 있다. 어떤 영역의 probability를 높이면 다른 영역에 배분할 mass는 줄어든다. 결국 probabilistic modeling은 어떤 값들이 서로 probability mass를 놓고 경쟁하는지를 정하는 문제이기도 하다.

Discriminative model

Discriminative model은 input xx가 주어졌을 때 target yy의 conditional distribution을 학습한다.

p(y∣x)p(y\mid x)

Image classification에서는 각 image마다 class label들이 probability mass를 놓고 경쟁한다.

∑yp(y∣x)=1\sum_y p(y\mid x) = 1

Image가 바뀌면 별개의 class distribution이 만들어진다. 서로 다른 image끼리는 probability mass를 경쟁하지 않는다.

Label space가 cat과 dog뿐이라면 input이 monkey나 abstract art여도 모델은 cat과 dog의 probability를 합해 1로 만들어야 한다. Standard discriminative classifier는 input 자체가 training distribution 밖이라는 사실을 표현하기 어렵다. 높은 softmax probability가 곧 input이 in-distribution임을 의미하지는 않는다.

Unconditional generative model

Unconditional generative model은 data 자체의 distribution을 학습한다.

p(x)p(x)

Image generative model에서는 가능한 모든 image가 전체 probability mass 1을 나눠 가진다. Training data와 비슷한 plausible image에는 높은 density를, data distribution에서 벗어난 image에는 낮은 density를 부여해야 한다.

예를 들어 zoo animal image를 모델링 한다면 일반적인 동물 이미지에는 상대적으로 높은 density가 필요하고, abstract art에는 낮은 density가 필요하다. 세 다리인 dog와 세 팔인 monkey처럼 둘 다 드문 image라도 실제 세계에서 어느 쪽이 더 그럴듯한지 반영하려면 object와 world structure를 폭넓게 학습해야 한다.

Unconditional model로 할 수 있는 일은 다음과 같다.

  • 새로운 sample xx를 생성한다.
  • Input의 density를 이용해 outlier를 탐지한다.
  • Label 없이 data structure와 representation을 학습한다.

다만 sampling 결과를 직접 제어할 conditioning signal이 없으므로 실제 생성 application에서는 conditional model이 더 유용한 경우가 많다.

Conditional generative model

Conditional generative model은 condition yy가 주어졌을 때 가능한 output xx의 distribution을 학습한다.

p(x∣y)p(x\mid y)

yy는 category label, text prompt, 다른 image, audio, video frame처럼 다양한 정보가 될 수 있다. 각 condition마다 모든 output xx가 probability mass를 놓고 경쟁한다.

Text prompt가 person teaching a class on generative models in front of a whiteboard라면 이를 만족하는 image는 하나가 아니다. 사람의 모습, 교실, camera angle, 조명 등이 다른 수많은 image가 가능하다. Conditional generative model은 하나의 deterministic answer가 아니라 가능한 output 전체의 distribution을 나타낸다.

이 관점은 여러 문제에 그대로 적용된다.

  • Text-to-text는 prompt에 맞는 여러 문장이나 poem 중 하나를 생성한다.
  • Text-to-image는 같은 description을 만족하는 여러 image를 생성한다.
  • Image-to-video는 한 image 뒤에 이어질 수 있는 여러 그럴듯한 장면을 생성한다.

Output에 ambiguity가 존재하고 그 다양성을 보존해야 할 때 generative model이 필요하다. 반대로 정답이 사실상 하나인 task라면 deterministic discriminative model로 충분할 수 있다.

조건 yy가 범주라면 이 분포를 분류에도 사용할 수 있다.

y^=arg⁡max⁡yp(x∣y)p(y)\hat{y} = \arg\max_y p(x\mid y)p(y)

각 범주에서 xx가 나타날 가능성을 비교해 가장 적합한 범주를 고른다. 모든 범주에서 그 가능성이 낮다면 어느 범주에도 잘 맞지 않는 이상치로 판단할 수도 있다.

여기서 yy는 입력 feature를 보기 전 label distribution이라고 볼 수 있다.

정답이 하나가 아니라 여러 plausible한 출력이 존재하고, 그 가능성들의 구조적인 분포까지 표현하고 싶을 때 생성 모델이 유용하다. GPT 같은 언어 모델도 다음 토큰 하나를 분류하는 것처럼 보이지만, 실제로는 이전 토큰들을 조건으로 다음 토큰의 확률분포를 반복적으로 모델링하고 그 분포에서 샘플링해 문장을 생성하므로 생성형 모델이다.

세 probability model의 관계

Discriminative model, unconditional generative model, conditional generative model은 베이즈정리로 연결된다.

베이즈정리는 동시확률(joint probability)에서 출발한다. 동시확률 p(x,y)p(x,y)는 xx와 yy가 함께 일어날 확률이며, 어느 변수를 먼저 기준으로 잡느냐에 따라 두 방식으로 분해할 수 있다.

p(x,y)=p(y∣x)p(x)p(x,y) = p(y\mid x)p(x)

이는 전체에서 xx가 일어날 확률에, xx가 일어난 경우 yy도 일어날 조건부 확률을 곱한 것이다. 반대로 yy를 먼저 기준으로 잡으면 다음과 같다.

p(x,y)=p(x∣y)p(y)p(x,y) = p(x\mid y)p(y)

두 식은 같은 동시확률 p(x,y)p(x,y)를 나타내므로 다음 관계가 성립한다.

p(y∣x)p(x)=p(x∣y)p(y)p(y\mid x)p(x) = p(x\mid y)p(y)

양변을 p(x)p(x)로 나누면 베이즈 정리 공식을 얻는다.

p(y∣x)=p(x∣y)p(y)p(x)p(y\mid x) = \frac{p(x\mid y)p(y)}{p(x)}

직관적으로는 evidence xx를 관측했을 때 hypothesis yy가 맞을 확률을 계산하는 식이다. 변수의 역할을 바꾸거나 위 식을 재배열하면 conditional generative model이 다루는 p(x∣y)p(x\mid y)도 다음과 같이 표현할 수 있다.

p(x∣y)=p(y∣x)p(x)p(y)p(x\mid y) = \frac{ p(y\mid x)p(x) }{ p(y) }

Discriminative model과 generative model을 연결하는 베이즈정리

p(y∣x)p(y\mid x), p(x)p(x), p(y)p(y)를 알면 p(x∣y)p(x\mid y)를 얻을 수 있다. 반대로 식을 재배열하면 다른 conditional distribution도 계산할 수 있다.

생성형 모델의 분류

Generative model은 density를 직접 계산할 수 있는지, sample을 어떤 방식으로 만드는지에 따라 나눌 수 있다.

생성 모델을 확률 밀도 계산과 표본 생성 방식에 따라 분류한 구조

계열Density 평가Sampling대표 방법
Explicit, exact densityExactp(x)p(x) 계산 가능대개 순차적이거나 구조에 의존Autoregressive model
Explicit, approximate densityp(x)p(x)의 bound 또는 approximation 계산Latent에서 직접 생성 가능VAE
Implicit, direct samplingp(x)p(x) 계산 불가한 번의 generator forwardGAN
Implicit, iterative samplingp(x)p(x)를 직접 사용하지 않거나 계산이 복잡함여러 refinement step 필요Diffusion model

Explicit density model은 주어진 sample의 likelihood를 평가할 수 있다는 장점이 있다. 그러나 exact density를 쉽게 계산하는 구조가 sampling 속도나 model architecture를 제한할 수 있다.

Implicit model은 density 값보다 realistic sample 생성에 집중한다. GAN은 latent sample을 generator에 한 번 통과시켜 output을 만들고, diffusion model은 noise에서 시작해 여러 denoising step을 반복한다.

이 분류는 각 방법의 핵심 차이를 보는 틀이다. 실제 모델은 conditional generation을 추가하거나 latent token을 사용하는 등 여러 계열의 아이디어를 결합할 수 있다.

이후 수식에서는 표기를 단순하게 하려고 condition yy를 생략하고 p(x)p(x)로 쓴다. 같은 논의는 p(x∣y)p(x\mid y)에도 적용되며, 실제 응용에서는 조건부 생성을 다루는 경우가 많다.

%% title: Generative Model 분류
%% caption: Density를 얼마나 직접 다룰 수 있는지와 sample을 한 번에 만드는지 반복적으로 만드는지에 따라 대표 계열이 나뉜다.
flowchart TB
    gm["Generative Models"]
    gm --> explicit["Explicit Density"]
    gm --> implicit["Implicit / Sample-Based"]
    explicit --> exact["Exact Likelihood<br/>Autoregressive"]
    explicit --> approx["Approximate Likelihood<br/>VAE / ELBO"]
    implicit --> direct["Direct Sampling<br/>GAN"]
    implicit --> iterative["Iterative Sampling<br/>Diffusion / Flow"]
    exact --> trade1["likelihood 정확<br/>sampling 순차적"]
    approx --> trade2["latent sampling<br/>bound로 학습"]
    direct --> trade3["sampling 빠름<br/>density 없음"]
    iterative --> trade4["training 안정적<br/>sampling 반복"]

최대우도 추정(Maximum likelihood estimation)

최대우도 추정은 관찰한 data가 나타날 가능도를 가장 크게 만드는 parameter를 찾는 방법이다. 먼저 parameter WW가 정해지면 xx의 확률을 계산할 수 있는 명시적인 함수로 distribution을 표현한다.

p(x)=f(x,W)p(x) = f(x,W)

여기서 ff는 parameter WW를 가진 신경망으로, xx에 대한 확률을 계산한다.

학습에서는 data xx는 고정하고 WW를 바꾸면서 관찰한 샘플들에 높은 확률을 부여하는 값을 찾는다.

최대우도추정 과정에서 하는 일은, 학습 데이터에 있는 고정된 샘플들의 확률을 최대화하도록 신경망이 모델링하는 분포를 변화시키는 것

관찰한 데이터는 알 수 없는 true distribution pdata(x)p_{\text{data}}(x)에서 독립적으로 샘플링 되었다고 가정한다.(i.i.d-독립 동일 분포(independent and identically distributed))

x(i)∼i.i.d.pdata(x)x^{(i)} \overset{\text{i.i.d.}}{\sim} p_{\text{data}}(x)

Dataset x(1),x(2),…,x(N)x^{(1)},x^{(2)},\ldots,x^{(N)}이 주어졌다고 하자. 샘플이 서로 독립이라는 가정을 사용하면 전체 likelihood를 각 샘플의 확률을 곱한 형태로 쓸 수 있다. 여기에 log를 적용하고 pW(x)=f(x,W)p_W(x)=f(x,W)를 대입하면 학습 목표는 다음과 같이 정리된다.

W∗=arg⁡max⁡W∏i=1NpW(x(i))=arg⁡max⁡W∑i=1Nlog⁡pW(x(i))=arg⁡max⁡W∑i=1Nlog⁡f(x(i),W)\begin{aligned} W^* &= \arg\max_W \prod_{i=1}^{N} p_W\left(x^{(i)}\right) \\ &= \arg\max_W \sum_{i=1}^{N} \log p_W\left(x^{(i)}\right) \\ &= \arg\max_W \sum_{i=1}^{N} \log f\left(x^{(i)},W\right) \end{aligned}

Likelihood와 probability는 식의 모양은 같아도 무엇을 고정하고 변화시키는지가 다르다.

  • Probability는 distribution parameter WW를 고정하고 xx에 따라 값이 어떻게 달라지는지 본다.
  • Likelihood는 관찰한 xx를 고정하고 WW에 따라 값이 어떻게 달라지는지 본다.

Log-likelihood와 negative log-likelihood

Log-likelihood는 모델이 각 학습 샘플에 부여한 log probability의 합이다.

ℓ(W)=∑i=1Nlog⁡pW(x(i))=∑i=1Nlog⁡f(x(i),W)\begin{aligned} \ell(W) &= \sum_{i=1}^{N} \log p_W\left(x^{(i)}\right) \\ &= \sum_{i=1}^{N} \log f\left(x^{(i)},W\right) \end{aligned}

Probability의 곱은 매우 작은 수가 되어 underflow가 발생하기 쉽다. 로그는 단조 함수(monotonic function)이므로 likelihood를 최대화하는 parameter와 log-likelihood를 최대화하는 parameter가 같다.

Optimization에서는 loss를 최소화하는 convention을 사용하므로 negative log-likelihood, NLL을 사용한다.

LNLL(W)=−∑i=1Nlog⁡pW(x(i))=−∑i=1Nlog⁡f(x(i),W)\begin{aligned} \mathcal{L}_{\text{NLL}}(W) &= -\sum_{i=1}^{N} \log p_W\left(x^{(i)}\right) \\ &= -\sum_{i=1}^{N} \log f\left(x^{(i)},W\right) \end{aligned}

Dataset 크기에 관계없이 loss scale을 유지하려면 평균을 사용할 수 있다.

LNLL(W)=−1N∑i=1Nlog⁡pW(x(i))=−1N∑i=1Nlog⁡f(x(i),W)\begin{aligned} \mathcal{L}_{\text{NLL}}(W) &= -\frac{1}{N} \sum_{i=1}^{N} \log p_W\left(x^{(i)}\right) \\ &= -\frac{1}{N} \sum_{i=1}^{N} \log f\left(x^{(i)},W\right) \end{aligned}

Categorical distribution에서 NLL은 cross entropy와 같은 형태가 된다. 따라서 language model의 next-token cross entropy도 autoregressive generative model의 maximum likelihood objective이다.

Autoregressive factorization

앞에서 정의한 pW(x)=f(x,W)p_W(x)=f(x,W)를 계산하기 위해 하나의 data sample xx를 순서가 있는 TT개 component로 나눈다고 하자.

x=(x1,x2,…,xT)x = (x_1,x_2,\ldots,x_T)

여기서 아래첨자 tt는 한 샘플 안의 component 위치이고, 위첨자 ii는 dataset의 서로 다른 샘플을 나타낸다.

Probability chain rule을 사용하면 결합분포(joint distribution)를 조건부 분포(conditional distribution)의 곱으로 분해할 수 있다.

pW(x)=pW(x1,x2,…,xT)=pW(x1)pW(x2∣x1)⋅pW(x3∣x1,x2)⋯pW(xT∣x1,…,xT−1)=∏t=1TpW(xt∣x<t)\begin{aligned} p_W(x) &= p_W(x_1,x_2,\ldots,x_T) \\ &= p_W(x_1) p_W(x_2\mid x_1) \\ &\quad\cdot p_W(x_3\mid x_1,x_2) \cdots p_W(x_T\mid x_1,\ldots,x_{T-1}) \\ &= \prod_{t=1}^{T} p_W\left(x_t\mid x_{<t}\right) \end{aligned}

x<tx_{<t}는 x1,…,xt−1x_1,\ldots,x_{t-1}을 뜻한다. Log-likelihood는 다음과 같이 각 step의 합이 된다.

log⁡pW(x)=∑t=1Tlog⁡pW(xt∣x<t)\log p_W(x) = \sum_{t=1}^{T} \log p_W \left( x_t \mid x_{<t} \right)

이렇게 분해할 때 변수들이 서로 독립이라고 가정할 필요는 없다. 그냥 모든 결합분포에 성립하는 확률의 연쇄법칙을 적용한 것이다. 모델이 해야 할 일은 전체 sequence의 모든 조합을 한 번에 모델링하는 대신 prefix가 주어졌을때 다음 컴포넌트의 분포를 예측하는 것이다.

각 xtx_t가 VV개 값 중 하나를 갖는 discrete variable이라고 하면, 길이 TT의 토큰 시퀀스에는 총 VTV^T개의 가능한 조합이 존재한다.

Autoregressive factorization은 VTV^T개 결합 결과(joint outcome)를 테이블로 직접 저장하지 않고 매 step VV개 category에 대한 conditional distribution을 예측하게 한다.

%% title: Autoregressive Factorization의 Training과 Sampling
%% caption: Training에서는 causal mask로 모든 next-token loss를 병렬 계산할 수 있지만, sampling은 새 token을 이전 prefix에 붙여 순차적으로 반복해야 한다.
flowchart TB
    sequence["Sequence x₁, x₂, …, xᵀ"] --> factor["p(x) = Π p(xₜ | x<ₜ)"]
    factor --> train["Training<br/>ground-truth sequence + causal mask"]
    train --> parallel["All Position Losses<br/>parallel computation"]
    factor --> sample["Sampling"]
    sample --> t1["sample x₁"]
    t1 --> t2["sample x₂ | x₁"]
    t2 --> t3["sample x₃ | x₁,x₂"]
    t3 --> more["… repeat until xᵀ"]

RNN과 causal Transformer

RNN hidden state hth_t는 prefix x≤tx_{\le t}의 정보를 요약한다.

ht=fθ(ht−1,xt)h_t = f_\theta(h_{t-1},x_t)

Hidden state에서 다음 토큰의 분포를 예측할 수 있다.

pθ(xt+1∣x≤t)=softmax⁡(Wht+b)p_\theta(x_{t+1}\mid x_{\le t}) = \operatorname{softmax}(Wh_t+b)

Causal Transformer는 attention mask로 position tt가 미래 토큰을 보지 못하게 한다.

AttentionMask⁡t,j={0,j≤t−∞,j>t\operatorname{AttentionMask}_{t,j} = \begin{cases} 0, & j\le t \\ -\infty, & j>t \end{cases}

미래 위치의 attention score를 음의 무한대로 가려 causal self-attention을 계산하는 과정

훈련에서는 GT sequence 전체를 한 번에 넣고 모든 position의 next-token loss를 병렬로 계산할 수 있다. 각 출력은 causal mask 때문에 prefix에만 의존한다.

LAR=−∑t=1Tlog⁡pθ(xt∣x<t)\mathcal{L}_{\text{AR}} = -\sum_{t=1}^{T} \log p_\theta(x_t\mid x_{<t})

Sampling에서는 아직 생성하지 않은 미래 토큰을 input으로 사용할 수 없다. 첫 token부터 하나씩 sampling하고 다시 모델에 넣어 다음 token을 생성해야 하므로 sequence length 방향으로 순차적이다.

Autoregressive model의 exact likelihood

주어진 complete sequence xx를 모델에 넣으면 각 position에서 실제 next token에 부여한 probability를 얻는다. 이를 모두 곱하면 sample의 exact model likelihood가 된다.

pθ(x)=pθ(x1)pθ(x2∣x1)⋯pθ(xT∣x<T)p_\theta(x) = p_\theta(x_1) p_\theta(x_2\mid x_1) \cdots p_\theta(x_T\mid x_{<T})

구현상으로는 probability를 직접 곱하지 않고 log space에서 더한다.

log⁡pθ(x)=∑t=1Tlog⁡pθ(xt∣x<t)\log p_\theta(x) = \sum_{t=1}^{T} \log p_\theta(x_t\mid x_{<t})

Autoregressive model이 explicit exact-density model로 분류되는 이유이다. Model architecture와 parameter가 정해지면 임의의 sequence에 대한 normalized likelihood를 계산할 수 있다.

Image를 autoregressive sequence로 만들기

Text는 token의 1D sequence이고 각 token이 discrete vocabulary에 속하므로 autoregressive modeling과 자연스럽게 맞는다. Image는 2D이고 픽셀 밝기값(intensity)를 continuous value로 볼 수 있어 순서를 정하고 output distribution을 선택해야 한다.

8-bit RGB 이미지는 각 채널값이 0부터 255까지의 정수다. 이미지를 한줄로 읽는 Raster scan 순서로 픽셀과 채널을 펼치면 discrete sequence로 바꿀 수 있다.

xt∈{0,1,…,255}x_t \in \{0,1,\ldots,255\}

1024×10241024\times1024 RGB 이미지를 채널 단위로 펼치면 sequence length는 다음과 같다.

T=1024×1024×3=3,145,728T = 1024\times1024\times3 = 3{,}145{,}728

각 position에서 256-way softmax로 다음 channel 값을 예측할 수 있다. PixelRNN이나 PixelCNN 계열은 이 원리를 이미지에 적용한다.

문제는 sequence가 지나치게 길어진다는 점이다. Training computation이 크고 샘플링은 수백만 step을 순차적으로 실행해야 한다. 또한 raster order는 image의 2D structure를 자연스럽게 반영하는 유일한 순서가 아니다.

최근에는 raw pixel보다 압축된 latent token이나 discrete visual token을 autoregressive하게 모델링한다. Sequence가 짧아지고 high-level structure를 토큰 단위로 다룰 수 있지만, 이미지를 토큰으로 바꾸는 별도의 encoder나 tokenizer가 필요하다.

Autoregressive model의 장단점

장점은 다음과 같다.

  • Probability chain rule에 기반해 exact normalized likelihood를 계산한다.
  • NLL이라는 명확하고 안정적인 objective로 학습한다.
  • RNN과 causal Transformer를 그대로 사용할 수 있다.
  • Text처럼 순서와 discrete vocabulary가 자연스러운 데이터에 잘 맞는다.

한계는 다음과 같다.

  • Sampling이 sequence length에 대해 순차적이다.
  • Image처럼 순서가 명확하지 않은 데이터에는 순서를 인위적으로 정해야 한다.
  • Raw pixel sequence는 너무 길어 고해상도 생성 비용이 크다.
  • Likelihood가 높다는 것과 사람이 느끼는 인지적 품질(perceptual quality)가 항상 일치하지는 않는다.

(Non-Variational) Autoencoders (Deterministic Autoencoder)

Deterministic Autoencoder는 입력마다 확률분포가 아닌 하나의 고정된 latent code를 직접 생성하는 Autoencoder다.

같은 입력을 넣으면 항상 같은 latent representation이 나오며, latent space 자체에 확률적인 불확실성을 두지 않는다.

Autoencoder는 encoder가 input xx를 latent code zz로 압축하고 decoder가 이를 다시 reconstruction x^\hat{x}로 복원한다. 입력을 압축해서 zz라는 표현으로 만들고, 그 zz만으로 원본을 얼마나 잘 복원하는지를 통해 입력의 중요한 정보를 학습하게 한다. reconstruction은 일종의 자기지도 학습용 훈련 과제라고 생각할 수 있다.

Reconstruction objective 자체가 최종 목적은 아니다. 입력을 그대로 복사하는 방법은 이미 알고 있으므로 제약 속에서 입력의 중요한 구조를 zz에 담는 representation을 학습하는 것이 목적이다.

z=fϕ(x)z = f_\phi(x) x^=gθ(z)\hat{x} = g_\theta(z)

대표적인 reconstruction objective는 L2 loss이다.

Lrec=∥x−gθ(fϕ(x))∥22\mathcal{L}_{\text{rec}} = \left\lVert x-g_\theta(f_\phi(x)) \right\rVert_2^2
  • xx: 원본 입력
  • fϕf_\phi: parameter ϕ\phi를 가진 encoder
  • gθg_\theta: parameter θ\theta를 가진 decoder
  • gθ(fϕ(x))=x^g_\theta(f_\phi(x))=\hat{x}: 복원된 입력
  • ∥⋅∥22\lVert\cdot\rVert_2^2: 원본과 복원 결과 사이의 제곱 L2 거리

Encoder와 decoder의 capacity가 충분하고 zz가 크면 Autoencoder가 의미 있는 특징을 배우지 않고 입력을 단순히 복사할 수 있다. 이를 막기 위한 bottleneck은 latent dimension zz를 작게 만들어 정보를 압축하도록 하는 제약이다. noise는 입력 일부를 가리거나 잡음을 섞어 단순 복사 대신 원래 구조를 복원하도록 만드는 제약이다.

예를 들어 1024×10241024\times1024 RGB image는 약 300만 개 채널 값을 가지지만 zz를 128-dimensional vector로 제한할 수 있다. 모델은 모든 픽셀을 그대로 전달할 수 없으므로 reconstruction에 중요한 정보를 latent code에 압축해야 한다.

Representation learning에는 인코더와 zz를 사용할 수 있다. 그러나 deterministic autoencoder만으로 generation을 하기는 어렵다. 훈련 샘플이 latent space 어디에 매핑 되는지는 알 수 있지만, valid sample을 만드는 새로운 zz를 어떤 distribution에서 뽑아야 하는지는 정의되지 않기 때문이다.

핵심 문제는 일반 Autoencoder가 latent space에 알려진 probabilistic structure를 부여하지 않는다는 것이다. Reconstruction만 잘하면 되므로 latent code들이 공간에 어떤 형태로 배치되는지는 모델에게 맡겨진다. 따라서 latent space에서 임의의 zz를 뽑더라도 그것이 실제 데이터와 비슷한 결과를 만들어내는 valid latent인지 알 수 없다.

그렇다면 latent space를 아무렇게나 두지 않고 우리가 알고 있는 probability distribution의 형태에 가깝도록 정리할 수는 없을까?

VAE는 latent representation이 Gaussian distribution과 같은 알려진 distribution에 가까워지도록 제약한다. 그러면 학습 이후 새로운 입력 없이도 알려진 distribution에서 새로운 latent code를 샘플링 할 수 있다.

znew∼N(0,I)z_{\text{new}} \sim \mathcal{N}(0,I)

샘플링한 latent code를 디코더에 넣으면 새로운 데이터를 생성할 수 있다.

znew→Decoder→xnewz_{\text{new}} \rightarrow \text{Decoder} \rightarrow x_{\text{new}}

일반 Autoencoder에서는 새로운 latent code를 어디서 뽑아야 하는지가 불분명하지만 VAE는 latent space에 probabilistic structure를 부여하여 알려진 distribution에서 새로운 zz를 샘플링 할 수 있게 한다.

일반 Autoencoder는 x↔x^x \leftrightarrow \hat{x}의 reconstruction만 학습하고, 그 사이의 latent code zz가 어떤 분포를 가져야 하는지는 따로 학습하지 않는다. 그래서 zz의 분포가 랜덤하게 형성될 수 있고, generation할 때 새로운 zz를 어디서 뽑아야 할지 알 수 없다.

새로운 zz를 만들 수만 있다면 이를 decoder에 넣어 새로운 x^\hat{x}를 생성할 수 있다.

새로운 latent code z를 decoder에 넣어 이미지를 생성하는 과정

Variational AutoEncoders(VAEs) - VAE의 latent-variable model

VAE는 관측 데이터 xx를 설명하는 잠재변수 zz의 분포를 학습하고, 그 latent space에서 샘플링해 새로운 데이터를 생성하는 latent-variable generative model이다.

서로 독립적으로 뽑힌 training data를 다음과 같이 두자.

D={x(i)}i=1N\mathcal{D} = \left\{x^{(i)}\right\}_{i=1}^{N}

VAE는 각 관측값 x(i)x^{(i)}가 관찰되지 않은 잠재변수 z(i)z^{(i)}로부터 생성되었다고 가정한다.

z(i)∼p(z),x(i)∼pθ(x∣z(i))z^{(i)} \sim p(z), \qquad x^{(i)} \sim p_\theta\left(x\mid z^{(i)}\right)

이미지를 예로 들면 z(i)z^{(i)}는 물체의 속성이나 방향처럼 x(i)x^{(i)}를 만들어낸 잠재 요인을 나타낸다고 해석할 수 있다.

이는 실제 데이터가 반드시 이러한 과정으로 만들어진다는 주장이 아니라 VAE가 데이터를 설명하기 위해 사용하는 probabilistic modeling assumption이다.

이 생성 가정을 어떻게 학습할 수 있을까? 기본 아이디어는 최대우도(maximum likelihood)이다. 그러나 훈련 데이터에서는 xx만 관찰되고 이를 생성한 zz는 관찰되지 않으므로, xx의 우도를 구하려면 가능한 모든 zz를 고려해 주변화해야 한다.

PixelRNN과 PixelCNN 같은 autoregressive model은 다음과 같이 density를 명시적으로 계산하고 training data의 likelihood를 직접 최대화할 수 있다.

pW(x)=∏t=1TpW(xt∣x1,…,xt−1)p_W(x) = \prod_{t=1}^{T} p_W\left(x_t\mid x_1,\ldots,x_{t-1}\right)

VAE는 이와 달리 exact likelihood를 직접 계산하는 대신 lower bound를 최적화한다. 그 대신 encoder가 데이터를 설명하는 structured latent vector를 제공하며, 이를 representation과 generation에 사용할 수 있다.

Variational Autoencoder, VAE는 latent code에 known probability distribution을 부여한다. Generative process는 먼저 사전분포에서 latent zz를 뽑고, decoder distribution에서 data xx를 뽑는 과정이다.

z∼p(z)z \sim p(z) x∼pθ(x∣z)x \sim p_\theta(x\mid z)

가장 흔한 사전분포(prior)는 standard Gaussian이다.

p(z)=N(0,I)p(z) = \mathcal{N}(0,I)

학습이 끝나면 사전분포에서 새로운 latent code를 뽑고, 학습된 decoder distribution에서 새로운 데이터를 샘플링한다.

znew∼p(z),xnew∼pθ∗(x∣znew)\begin{aligned} z_{\text{new}} &\sim p(z), \\ x_{\text{new}} &\sim p_{\theta^*}\left(x\mid z_{\text{new}}\right) \end{aligned}

여기서 θ∗\theta^*는 학습을 마친 decoder의 파라미터다.

결합분포는 다음과 같다.

pθ(x,z)=pθ(x∣z)p(z)p_\theta(x,z) = p_\theta(x\mid z)p(z)

훈련 데이터에서는 xx만 관찰할 수 있고 xx를 생성한 zz는 관찰할 수 없다. zz는 latent variable이다.

주변우도(Marginal likelihood)가 어려운 이유

Maximum likelihood로 decoder pθ(x∣z)p_\theta(x\mid z)를 학습하려면 latent variable을 모두 주변화(marginalize)해야 한다.

주변화(marginalization)는 관찰하지 못한 잠재변수 zz를 가능한 모든 값에 대해 적분하여 없애는 것이다. 어떤 zz에서 xx가 생성되었는지 알 수 없으므로, 가능한 모든 zz에서 xx가 나올 확률 또는 확률밀도를 합산한다.

pθ(x)=∫pθ(x,z) dz=∫pθ(x∣z)pθ(z) dz\begin{aligned} p_\theta(x) &= \int p_\theta(x,z)\,dz \\ &= \int p_\theta(x\mid z)p_\theta(z)\,dz \end{aligned}

첫 번째 등식은 결합분포 pθ(x,z)p_\theta(x,z)를 zz에 대해 적분하는 과정이고, 두 번째 등식은 이를 조건부분포와 사전분포의 곱으로 풀어 쓴 것이다. 직관적으로는 가능한 모든 zz를 고려한 뒤 xx가 나올 확률만 남기는 과정이다. 이렇게 zz를 없애고 xx만 남긴 pθ(x)p_\theta(x)를 주변분포(marginal distribution)라고 한다.

이때 사전분포 항은 모델이 정한 분포라 계산할 수 있고, pθ(x∣z)p_\theta(x\mid z)는 디코더가 zz를 입력받아 xx의 조건부분포를 계산하므로 주어진 zz에서 구할 수 있다. 어려운 것은 각 항의 계산이 아니라 가능한 모든 zz에 대해 이를 적분하는 과정이다. 그렇기에 적분항(integrand)은 계산할 수 있지만, 고차원 잠재공간 전체에 대한 적분은 일반적으로 계산하기 어렵다.

디코더가 신경망이면 pθ(x∣z)p_\theta(x\mid z)는 zz에 대한 복잡한 nonlinear function이다. 고차원 latent space 전체를 정확히 적분하는 것은 일반적으로 불가능하다.(고 한다.) 또한 훈련 루프 내부에서 수치 적분을 시도하는것 또한 효과적인 방법은 아니다.

그렇기에 latent variable을 주변화하여 marginal likelihood를 정확히 계산하기 어렵다. 그런데 이 marginal likelihood는 latent variable의 정확한 사후분포를 계산할 때도 필요하다.

사후분포 수식정리

베이즈정리로 정확한 사후분포(true posterior)를 쓰면 다음과 같다.

pθ(z∣x)=pθ(x∣z)p(z)pθ(x)p_\theta(z\mid x) = \frac{ p_\theta(x\mid z)p(z) }{ p_\theta(x) }

강의에서는 이 베이즈정리를 pθ(x)p_\theta(x)에 대해 정리한 형태도 사용한다. 먼저 결합분포는 두 가지 방식으로 분해할 수 있다.

pθ(x,z)=pθ(x∣z)p(z)p_\theta(x,z) = p_\theta(x\mid z)p(z)

또한 순서를 반대로 쓰면 다음과 같다.

pθ(x,z)=pθ(z∣x)pθ(x)p_\theta(x,z) = p_\theta(z\mid x)p_\theta(x)

두 식은 같은 결합분포를 나타내므로 다음이 성립한다.

pθ(x∣z)p(z)=pθ(z∣x)pθ(x)p_\theta(x\mid z)p(z) = p_\theta(z\mid x)p_\theta(x)

양변을 pθ(z∣x)p_\theta(z\mid x)로 나누면 강의에 나온 식을 얻는다.

pθ(x)=pθ(x∣z)p(z)pθ(z∣x)p_\theta(x) = \frac{ p_\theta(x\mid z)p(z) }{ p_\theta(z\mid x) }

새로운 식이 아니라 베이즈정리를 pθ(x)p_\theta(x)에 대해 다시 정리한 것이다. 여기서는 고정된 사전분포를 사용하는 VAE 표기에 따라 p(z)p(z)로 썼다. 사전분포를 pθ(z)p_\theta(z)로 표기하더라도 유도 과정은 같다.

분모의 pθ(x)p_\theta(x)가 바로 계산하기 어려운 marginal likelihood이므로 사후분포도 직접 계산하기 어렵다. 여기서 근사 사후분포가 필요해진다.

근사 사후분포까지의 맥락을 정리해 보자면,

대략 다음 흐름을 머릿속에 정리하고자 한다.

  1. 먼저 사전분포(prior)에서 latent zz를 샘플링 한다고 가정한다.

    z∼p(z)z \sim p(z)
  2. zz가 주어지면, Decoder가 조건부분포를 모델링하고, 그 분포에서 xx가 생성된다.

    x∼pθ(x∣z)x \sim p_\theta(x \mid z)
  3. 그런데 실제 학습 데이터에서는 xx만 관측하고, 어떤 zz가 xx를 만들었는지 모른다. 그래서 관측된 xx를 만들어낸 latent zz를 추론하기 위해 다음 사후분포가 필요하다.

    pθ(z∣x)p_\theta(z \mid x)
  4. 사후분포를 구하기 위해서 베이즈 정리를 쓰면 다음과 같다.

    pθ(z∣x)=pθ(x∣z)p(z)pθ(x)p_\theta(z\mid x) = \frac{ p_\theta(x\mid z)p(z) }{ p_\theta(x) }
  5. 여기서 분모의 주변우도는 모든 가능한 zz를 주변화 해야한다.

    pθ(x)=∫pθ(x∣z)p(z) dzp_\theta(x) = \int p_\theta(x\mid z)p(z)\,dz
  6. 그런데 Decoder가 신경망이라서 이 적분은 고차원 잠재공간에서 복잡한 비선형 함수를 적분하는 문제로 바뀌고, 일반적으로 정확하게 계산하기 어렵다.

  7. 따라서 정확한 사후분포(true posterior) pθ(z∣x)p_\theta(z \mid x) 도 정확하게 계산하기 어렵다.

  8. 그래서 계산하기 쉬운 근사 사후분포를 둔다.

    qϕ(z∣x)≈pθ(z∣x)q_\phi(z\mid x) \approx p_\theta(z\mid x)
  9. 이 qϕ(z∣x)q_\phi(z\mid x)의 파라미터를 xx로부터 만들어주는 신경망이 Encoder이다.

    x→Encoderϕ→qϕ(z∣x)x \to \text{Encoder}_\phi \to q_\phi(z\mid x)
  10. 이후 근사 사후분포에서 zz를 샘플링한다.

    z∼qϕ(z∣x)z \sim q_\phi(z\mid x)

사후분포를 고려한 학습 전체 직관과 생성 직관은 다음과 같다.

x→Encoderϕ→qϕ(z∣x)→z→Decoderθ→pθ(x∣z)→x^x \rightarrow \text{Encoder}_\phi \rightarrow q_\phi(z\mid x) \rightarrow z \rightarrow \text{Decoder}_\theta \rightarrow p_\theta(x\mid z) \rightarrow \hat{x}

근사 사후분포에서 zz를 샘플링하고, 그 zz를 디코더에 넣어 조건부 생성분포 pθ(x∣z)p_\theta(x \mid z) 를 얻고 그 분포를 통해 복원된 x^\hat{x}를 얻는다.

학습 이후 생성시에는 latent space를 prior에서 샘플링 가능하도록 정리되어 있기 때문에, 인코더를 거치지 않고 prior에서 바로 zz를 뽑는다.

z∼p(z)→Decoderθ→pθ(x∣z)→xnewz \sim p(z) \rightarrow \text{Decoder}_\theta \rightarrow p_\theta(x\mid z) \rightarrow x_{\text{new}}

근사 사후분포(Approximate posterior)와 encoder

근사 사후분포는 계산하기 어려운 정확한 사후분포(true posterior)를 대신해 사용하는 근사 확률분포다.

VAE는 true posterior pθ(z∣x)p_\theta(z\mid x)를 직접 계산하는 대신 encoder network로 approximate posterior를 학습한다.

잠재변수에서 관측값의 분포를 만드는 decoder와 관측값에서 잠재변수의 분포를 만드는 encoder

qϕ(z∣x)≈pθ(z∣x)q_\phi(z\mid x) \approx p_\theta(z\mid x)

이 관계를 베이즈정리로 정리한 식에 대입하면 다음과 같이 pθ(x)p_\theta(x)를 근사할 수 있다.

pθ(x)≈pθ(x∣z)p(z)qϕ(z∣x)p_\theta(x) \approx \frac{p_\theta(x\mid z)p(z)} {q_\phi(z\mid x)}

이때 VAE는 서로 독립적인 가중치 θ\theta와 ϕ\phi를 가진 두 신경망인 디코더와 인코더를 함께 학습한다. 디코더는 잠재코드 zz를 입력받아 관측값 xx의 분포를 출력하고, 인코더는 xx를 입력받아 zz의 분포를 출력한다.

확률분포를 신경망이 출력하도록 만들기 위해 두 분포를 정규분포로 가정하고, 신경망이 그 매개변수를 출력하게 한다.

디코더가 출력하는 분포

연속형 이미지를 모델링하는 단순한 VAE에서는 디코더의 조건부분포를 고정 분산을 가진 대각 가우스 분포로 둘 수 있다.

pθ(x∣z)=N(μθ(z),σx2I)=N(μx∣z,σ2)\begin{aligned} p_\theta(x\mid z) &= \mathcal{N} \left( \mu_\theta(z), \sigma_x^2 I \right) \\ &= \mathcal{N} \left( \mu_{x\mid z}, \sigma^2 \right) \end{aligned}

디코더는 평균 μθ(z)\mu_\theta(z)를 출력하고 분산 σx2\sigma_x^2는 고정한다.

디코더가 출력하는 평균 μx∣z\mu_{x\mid z}는 관측값 xx와 같은 형상이며, 고정 분산 σ2\sigma^2는 모든 차원에 동일하게 적용된다.

픽셀마다 서로 다른 분산을 학습할 수도 있지만, 픽셀 사이의 공분산을 모델링하지 않으면 이 분포에서의 표본 생성은 평균 이미지에 픽셀별 분산으로 크기를 조절한 독립적인 잡음을 더하는 것과 같다. 이 방식은 픽셀 사이의 구조적인 변화를 표현하지 못하므로 디코더의 분산을 고정한다.

강의의 디코더는 pθ(x∣z)p_\theta(x\mid z)를 확률분포로 정의하지만, 출력 이미지를 만들 때는 이 분포에서 픽셀별 잡음을 표본추출하지 않고 평균 μθ(z)\mu_\theta(z)를 그대로 사용한다.

인코더가 출력하는 분포

인코더가 모델링하는 근사 사후분포 qϕ(z∣x)q_\phi(z\mid x)를 대각 가우스 분포로 가정한다. 인코더는 잠재벡터 하나를 직접 출력하지 않고 이 분포의 매개변수를 출력한다.

qϕ(z∣x)=N(μϕ(x),diag⁡(σϕ2(x)))=N(μz∣x,Σz∣x)\begin{aligned} q_\phi(z\mid x) &= \mathcal{N} \left( \mu_\phi(x), \operatorname{diag}(\sigma_\phi^2(x)) \right) \\ &= \mathcal{N} \left( \mu_{z\mid x}, \Sigma_{z\mid x} \right) \end{aligned}

잠재변수로부터 관측값 분포의 평균을 출력하는 디코더와 관측값으로부터 잠재변수 분포의 평균과 공분산을 출력하는 인코더

dzd_z차원 잠재변수라면 인코더는 dzd_z차원의 평균 벡터와 dzd_z차원의 분산 또는 로그 분산 벡터를 출력한다. 대각 공분산의 각 항목은 잠재변수 각 차원의 분산을 나타낸다. 완전 공분산은 O(dz2)O(d_z^2)개의 값을 필요로 하므로 대각 공분산을 사용한다.

μz∣x\mu_{z\mid x}와 σz∣x\sigma_{z\mid x}는 모두 잠재변수 zz와 같은 크기의 벡터다.

대각 공분산은 비대각 원소를 00으로 두므로 서로 다른 잠재 차원 사이의 상관관계를 모델링하지 않는다. 예를 들어 h×wh\times w개의 값에 대한 완전 공분산은 (hw)2=h2w2(hw)^2=h^2w^2개의 항목을 필요로 하지만, 대각 공분산은 hwhw개의 분산만 필요로 한다.

분산은 항상 양수여야 하므로 제약이 없는 log⁡σ2\log\sigma^2를 출력하고 지수함수를 적용해 분산을 얻는다.

σ2=exp⁡(log⁡σ2)\sigma^2 = \exp(\log\sigma^2)

복원 손실

위에서 가정한 디코더의 가우스 분포에 관측값 xx를 넣어 밀도함수를 풀어 쓰면 다음과 같다. 여기서 DD는 xx의 차원이다.

pθ(x∣z)=1(2πσx2)D/2⋅exp⁡(−12σx2∥x−μθ(z)∥22)\begin{aligned} p_\theta(x\mid z) &= \frac{1} {(2\pi\sigma_x^2)^{D/2}} \\ &\quad\cdot \exp \left( -\frac{1}{2\sigma_x^2} \left\lVert x-\mu_\theta(z) \right\rVert_2^2 \right) \end{aligned}

이 식에 −log⁡-\log를 취하면 곱은 합으로 바뀌고 지수함수가 풀린다.

−log⁡pθ(x∣z)=D2log⁡(2πσx2)+12σx2∥x−μθ(z)∥22\begin{aligned} -\log p_\theta(x\mid z) &= \frac{D}{2} \log(2\pi\sigma_x^2) \\ &\quad+ \frac{1}{2\sigma_x^2} \left\lVert x-\mu_\theta(z) \right\rVert_2^2 \end{aligned}

분산 σx2\sigma_x^2를 고정했으므로 첫 번째 항은 학습되는 θ\theta와 관계없는 상수다. 따라서 음의 로그우도를 다음과 같이 쓸 수 있다.

−log⁡pθ(x∣z)=12σx2∥x−μθ(z)∥22+const-\log p_\theta(x\mid z) = \frac{1}{2\sigma_x^2} \left\lVert x-\mu_\theta(z) \right\rVert_2^2 + \text{const}

따라서 고정 분산 가우스 우도를 최대화하는 것은 상수항과 고정된 비례계수를 제외하면 L2 복원 오차를 최소화하는 것과 같다. 픽셀별 독립 가우스 분포는 여러 가능한 이미지의 세부 표현을 평균내기 때문에 복원 결과와 생성 표본이 흐릿해질 수 있다.

Evidence Lower Bound

ELBO까지의 맥락을 정리해 보자면,

지금까지는 계산하기 어려운 정확한 사후분포(true posterior) pθ(z∣x)p_\theta(z\mid x)를 인코더가 만드는 근사 사후분포 qϕ(z∣x)q_\phi(z\mid x)로 대신하는 구조를 만들었다. 하지만 이것만으로는 인코더와 디코더를 어떤 학습 목표로 함께 학습할지가 아직 정해지지 않았다.

원래 목표는 관측 데이터 xx의 로그우도를 크게 만드는 것이다.

log⁡pθ(x)\log p_\theta(x)

하지만 pθ(x)p_\theta(x)는 잠재변수 zz를 모두 주변화해야 하므로 직접 계산하기 어렵다.

pθ(x)=∫pθ(x∣z)p(z) dzp_\theta(x) = \int p_\theta(x\mid z)p(z)\,dz

따라서 직접 계산하기 어려운 log⁡pθ(x)\log p_\theta(x)를 그대로 최적화하는 대신 계산 가능한 하한을 training objective로 사용하고 이것을 최대화하는 방향으로 인코더와 디코더를 함께 학습한다. 그 하한이 ELBO다.

ELBO

VAE는 직접 계산하기 어려운 log⁡pθ(x)\log p_\theta(x) 대신 Evidence Lower Bound, ELBO를 최대화한다.

직관적으로는 직접 계산하기 어려운 log⁡pθ(x)\log p_\theta(x)를 아래에서 받치는 하한을 두고, 그 하한을 끌어올려 실제 log⁡pθ(x)\log p_\theta(x)에 가깝게 만드는것이다.

먼저 베이즈정리로 정리한 식에 qϕ(z∣x)/qϕ(z∣x)=1q_\phi(z\mid x)/q_\phi(z\mid x)=1을 곱한 뒤 로그를 세 항으로 분리한다.

log⁡pθ(x)=log⁡pθ(x∣z)p(z)pθ(z∣x)=log⁡pθ(x∣z)p(z)qϕ(z∣x)pθ(z∣x)qϕ(z∣x)=log⁡pθ(x∣z)−log⁡qϕ(z∣x)p(z)+log⁡qϕ(z∣x)pθ(z∣x)\begin{aligned} \log p_\theta(x) &= \log \frac{p_\theta(x\mid z)p(z)} {p_\theta(z\mid x)} \\ &= \log \frac{ p_\theta(x\mid z)p(z)q_\phi(z\mid x) }{ p_\theta(z\mid x)q_\phi(z\mid x) } \\ &= \log p_\theta(x\mid z) - \log \frac{q_\phi(z\mid x)}{p(z)} + \log \frac{q_\phi(z\mid x)}{p_\theta(z\mid x)} \end{aligned}

오른쪽에는 zz가 들어 있지만 세 항을 다시 합치면 qϕ(z∣x)q_\phi(z\mid x)가 상쇄되고, 베이즈정리에 따라 나머지 항도 pθ(x)p_\theta(x)로 돌아간다. 따라서 식 전체는 zz와 무관한 값이다.

zz와 무관한 상수 CC는 어떤 분포에서 zz를 표본추출하더라도 기댓값이 자기 자신과 같다.

Ez∼q(z)[C]=C\mathbb{E}_{z\sim q(z)}[C] = C

log⁡pθ(x)\log p_\theta(x)는 zz에 의존하지 않으므로 z∼qϕ(z∣x)z\sim q_\phi(z\mid x)에 대한 기댓값을 취해도 값이 같다.

log⁡pθ(x)=Ez∼qϕ(z∣x)[log⁡pθ(x)]\log p_\theta(x) = \mathbb{E}_{z\sim q_\phi(z\mid x)} \left[ \log p_\theta(x) \right]

위에서 분리한 세 항을 기댓값 안에 그대로 대입한다.

log⁡pθ(x)=Eqϕ(z∣x)[log⁡pθ(x∣z)−log⁡qϕ(z∣x)p(z)+log⁡qϕ(z∣x)pθ(z∣x)]\begin{aligned} \log p_\theta(x) = \mathbb{E}_{q_\phi(z\mid x)} \left[ \log p_\theta(x\mid z) - \log\frac{q_\phi(z\mid x)}{p(z)} + \log\frac{q_\phi(z\mid x)}{p_\theta(z\mid x)} \right] \end{aligned}

기댓값의 선형성에 따라 세 항을 각각의 기댓값으로 분리할 수 있다. 아래에서 Ez\mathbb{E}_z는 z∼qϕ(z∣x)z\sim q_\phi(z\mid x)에 대한 기댓값이다.

log⁡pθ(x)=Ez[log⁡pθ(x∣z)]−Ez[log⁡qϕ(z∣x)p(z)]+Ez[log⁡qϕ(z∣x)pθ(z∣x)]\begin{aligned} \log p_\theta(x) &= \mathbb{E}_z \left[ \log p_\theta(x\mid z) \right] \\ &\quad- \mathbb{E}_z \left[ \log \frac{q_\phi(z\mid x)}{p(z)} \right] \\ &\quad+ \mathbb{E}_z \left[ \log \frac{q_\phi(z\mid x)}{p_\theta(z\mid x)} \right] \end{aligned}

KL 발산(KL divergence)의 정의는 다음과 같다.

DKL(q∥p)=Eq[log⁡qp]D_{\mathrm{KL}}(q\parallel p) = \mathbb{E}_q \left[ \log\frac{q}{p} \right]

따라서 두 번째 항과 세 번째 항은 각각 다음 KL 발산이 된다.

−Ez[log⁡qϕ(z∣x)p(z)]=−DKL(qϕ(z∣x)∥p(z))Ez[log⁡qϕ(z∣x)pθ(z∣x)]=DKL(qϕ(z∣x)∥pθ(z∣x))\begin{aligned} -\mathbb{E}_z \left[ \log\frac{q_\phi(z\mid x)}{p(z)} \right] &= -D_{\mathrm{KL}} \left( q_\phi(z\mid x) \parallel p(z) \right) \\ \mathbb{E}_z \left[ \log\frac{q_\phi(z\mid x)}{p_\theta(z\mid x)} \right] &= D_{\mathrm{KL}} \left( q_\phi(z\mid x) \parallel p_\theta(z\mid x) \right) \end{aligned}

첫 번째 항과 두 번째 항을 ELBO로 묶으면 전체 식은 다음과 같다.

log⁡pθ(x)=Ez[log⁡pθ(x∣z)]−DKL(qϕ(z∣x)∥p(z))⏟LELBO(x)+DKL(qϕ(z∣x)∥pθ(z∣x))\begin{aligned} \log p_\theta(x) &= \underbrace{ \mathbb{E}_z \left[ \log p_\theta(x\mid z) \right] - D_{\mathrm{KL}} \left( q_\phi(z\mid x) \parallel p(z) \right) }_{\mathcal{L}_{\mathrm{ELBO}}(x)} \\ &\quad+ D_{\mathrm{KL}} \left( q_\phi(z\mid x) \parallel p_\theta(z\mid x) \right) \end{aligned}

첫 번째 항 - 데이터 복원(data reconstruction) 입력 xx에서 인코더가 만든 qϕ(z∣x)q_\phi(z\mid x)를 따라 zz를 표본추출하고, 디코더의 pθ(x∣z)p_\theta(x\mid z)가 원래 xx에 높은 우도를 부여하도록 한다. 고정 분산 가우스 디코더에서 log⁡pθ(x∣z)\log p_\theta(x\mid z)는 L2 복원 오차 형태로 계산할 수 있다.

두 번째 항 - 사전분포(prior) qϕ(z∣x)q_\phi(z\mid x)는 인코더가 xx로부터 예측한 잠재공간의 분포이고, p(z)p(z)는 사전분포다. ELBO를 최대화할 때 음의 KL 발산은 인코더의 출력 분포가 사전분포에 가까워지도록 한다. 두 분포가 가우스 분포이면 이 KL 발산을 닫힌 형태로 계산할 수 있다.

세 번째 항 - 사후분포 근사(posterior approximation) 인코더가 만든 근사 사후분포 qϕ(z∣x)q_\phi(z\mid x)가 정확한 사후분포 pθ(z∣x)p_\theta(z\mid x)와 가까워져야 한다. 이 KL 발산은 log⁡pθ(x)\log p_\theta(x)와 ELBO 사이의 간격이며 항상 00 이상이다. 따라서 log⁡pθ(x)=ELBO+DKL\log p_\theta(x)=\mathrm{ELBO}+D_{\mathrm{KL}}에서 음수가 아닌 KL 항을 빼고 보면 ELBO≤log⁡pθ(x)\mathrm{ELBO}\le\log p_\theta(x)가 되므로 ELBO가 로그우도의 하한이 된다. 강의에서 KL 항을 drop 한다는 것은 등식에서 없애도 값이 같다는 뜻이 아니라 그 항을 제외한 값이 하한이 된다는 뜻이다. 정확한 사후분포를 계산하기 어려워 이 KL 항을 직접 계산해 학습하지는 못한다.

이를 간단히 쓰면 다음 항등식이 된다.

log⁡pθ(x)=LELBO(x)+DKL(qϕ(z∣x)∥pθ(z∣x))\log p_\theta(x) = \mathcal{L}_{\text{ELBO}}(x) + D_{\mathrm{KL}} \left( q_\phi(z\mid x) \parallel p_\theta(z\mid x) \right)

qϕ(z∣x)/qϕ(z∣x)=1q_\phi(z\mid x)/q_\phi(z\mid x)=1을 넣은 이유는 식의 값을 바꾸려는 것이 아니라 기댓값을 취했을 때 log⁡(q/p)\log(q/p) 꼴을 KL 발산으로 바꿀 수 있게 만들기 위해서다.

KL divergence는 항상 0 이상이므로 ELBO는 log-likelihood의 lower bound이다.

직관적으로 log-likelihood가 ELBO에 0 이상의 값을 더한 형태이므로 ELBO가 log⁡pθ(x)\log p_\theta(x) 보다 커질 수 없다.

log⁡pθ(x)≥LELBO(x)\log p_\theta(x) \ge \mathcal{L}_{\text{ELBO}}(x)

ELBO는 다음 두 항으로 이루어진다.

LELBO(x)=Eqϕ(z∣x)[log⁡pθ(x∣z)]−DKL(qϕ(z∣x)∥p(z))\mathcal{L}_{\text{ELBO}}(x) = \mathbb{E}_{q_\phi(z\mid x)} \left[ \log p_\theta(x\mid z) \right] - D_{\mathrm{KL}} \left( q_\phi(z\mid x) \parallel p(z) \right)

두 식을 합치면 강의 슬라이드의 부등식을 다음과 같이 쓸 수 있다.

log⁡pθ(x)≥Ez∼qϕ(z∣x)[log⁡pθ(x∣z)]−DKL(qϕ(z∣x),p(z))\begin{aligned} \log p_\theta(x) &\ge \mathbb{E}_{z\sim q_\phi(z\mid x)} \left[ \log p_\theta(x\mid z) \right] \\ &\quad- D_{\mathrm{KL}} \left( q_\phi(z\mid x), p(z) \right) \end{aligned}

오른쪽 전체가 VAE의 학습 목표이며, 이 값을 최대화한다.

ELBO를 최대화하도록 인코더 q와 디코더 p를 함께 학습하는 VAE 구조

VAE는 ELBO를 최대화하도록 인코더의 qϕ(z∣x)q_\phi(z\mid x)와 디코더의 pθ(x∣z)p_\theta(x\mid z)를 함께 학습한다. 인코더는 xx로부터 잠재분포의 평균과 공분산을 출력하고, 디코더는 표본추출한 zz로부터 xx의 분포를 출력한다.

첫 번째 항은 sampled latent zz에서 original xx를 높은 likelihood로 복원하게 한다. 두 번째 항은 encoder가 예측한 latent distribution을 미리 정한 사전분포 p(z)p(z)에 가깝게 만든다.

Loss를 최소화하는 형태로 쓰면 부호가 바뀐다.

LVAE=−Eqϕ(z∣x)[log⁡pθ(x∣z)]+DKL(qϕ(z∣x)∥p(z))\mathcal{L}_{\text{VAE}} = -\mathbb{E}_{q_\phi(z\mid x)} \left[ \log p_\theta(x\mid z) \right] + D_{\mathrm{KL}} \left( q_\phi(z\mid x) \parallel p(z) \right)

그러므로 VAE loss는 reconstruction loss와 latent prior regularization의 합이다.

Gaussian KL divergence

Approximate posterior가 diagonal Gaussian이고 prior가 N(0,I)\mathcal{N}(0,I)이면 KL 항을 샘플링 없이 정확히 계산할 수 있다.

DKL(qϕ(z∣x)∥N(0,I))=12∑j=1dz(μj2+σj2−log⁡σj2−1)D_{\mathrm{KL}} \left( q_\phi(z\mid x) \parallel \mathcal{N}(0,I) \right) = \frac{1}{2} \sum_{j=1}^{d_z} \left( \mu_j^2 + \sigma_j^2 - \log\sigma_j^2 - 1 \right)

이 항은 평균을 0에 가깝게, 분산을 1에 가깝게 유도한다. 모든 샘플의 posterior가 prior와 완전히 같아져야 한다는 뜻은 아니며, reconstruction objective와 균형을 이루며 latent space를 regularize한다.

재매개변수화 기법(Reparameterization trick)

Encoder distribution에서 직접 샘플링하는 연산은 일반적인 deterministic computation graph처럼 미분할 수 없다.

z∼N(μ,diag⁡(σ2))z \sim \mathcal{N}(\mu,\operatorname{diag}(\sigma^2))

Sampling noise를 parameter와 분리하면 다음과 같이 다시 쓸 수 있다.

ϵ∼N(0,I)\epsilon \sim \mathcal{N}(0,I) z=μ+σ⊙ϵz = \mu + \sigma\odot\epsilon

Randomness는 ϵ\epsilon에만 있고, zz는 μ\mu와 σ\sigma에 대한 differentiable function이 된다. 따라서 decoder의 reconstruction gradient가 zz를 거쳐 encoder의 mean과 variance parameter까지 전달된다.

VAE training 과정

VAE는 variational lower bound를 최대화하는 방향으로 훈련한다.

Ez∼qϕ(z∣x)[log⁡pθ(x∣z)]−DKL(qϕ(z∣x), p(z))\mathbb{E}_{z \sim q_\phi(z \mid x)} \left[\log p_\theta(x \mid z)\right] - D_{\mathrm{KL}}\left(q_\phi(z \mid x),\, p(z)\right)

인코더가 잠재분포의 평균과 공분산을 출력하고 재매개변수화한 z를 디코더에 전달하는 VAE 훈련 과정

한 미니배치의 훈련 과정은 다음과 같다.

  1. 입력 데이터 xx를 인코더에 넣어 zz에 대한 분포 qϕ(z∣x)=N(μz∣x,Σz∣x)q_\phi(z\mid x)=\mathcal{N}(\mu_{z\mid x},\Sigma_{z\mid x})를 얻는다. 인코더는 μϕ(x)\mu_\phi(x)와 log⁡σϕ2(x)\log\sigma_\phi^2(x)를 출력하며, 표준편차는 σϕ(x)=exp⁡(12log⁡σϕ2(x))\sigma_\phi(x)=\exp\left(\frac{1}{2}\log\sigma_\phi^2(x)\right)로 구한다.
  2. 사전분포 손실(prior loss)을 계산하여 인코더 출력이 평균 0, 분산 1인 단위 가우스 분포 p(z)=N(0,I)p(z)=\mathcal{N}(0,I)에 가까워지게 한다.
  3. 인코더가 출력한 qϕ(z∣x)q_\phi(z\mid x)에서 zz를 표본추출한다. 재매개변수화 기법(reparameterization trick)을 사용하여 ϵ∼N(0,I)\epsilon\sim\mathcal{N}(0,I)를 뽑고 z=ϵ⊙Σz∣x+μz∣xz=\epsilon\odot\Sigma_{z\mid x}+\mu_{z\mid x}로 계산한다.

표기 참고: 강의자는 Σz∣x\Sigma_{z\mid x}를 공분산의 대각성분으로 설명하지만, 재매개변수화 식에서는 이를 표준편차처럼 곱한다. 찾아보니 정확히는 다음과 같이 쓴다.

Σz∣x=diag⁡(σz∣x2),z=μz∣x+σz∣x⊙ϵ\Sigma_{z\mid x} = \operatorname{diag} \left( \sigma_{z\mid x}^2 \right), \qquad z = \mu_{z\mid x} + \sigma_{z\mid x}\odot\epsilon

강의에서는 Σ/σ\Sigma/\sigma 표기를 다소 느슨하게 사용한다.

  1. zz를 디코더에 넣어 pθ(x∣z)=N(μx∣z,σ2)p_\theta(x\mid z)=\mathcal{N}(\mu_{x\mid z},\sigma^2)의 예측 데이터 평균 μx∣z\mu_{x\mid z}를 얻는다.
  2. 복원 손실(reconstruction loss)을 계산하여 예측 평균 μx∣z\mu_{x\mid z}가 원본 xx와 L2 거리에서 가까워지게 한다.
  3. 복원 음의 로그우도와 KL 발산을 더해 표본별 negative ELBO를 계산한다.
L^VAE(x)=−log⁡pθ(x∣z)+DKL(qϕ(z∣x)∥p(z))\widehat{\mathcal{L}}_{\mathrm{VAE}}(x) = -\log p_\theta(x\mid z) + D_{\mathrm{KL}} \left( q_\phi(z\mid x) \parallel p(z) \right)
  1. 표본별 손실을 미니배치 전체에서 평균 낸다.
Lbatch=1B∑i=1BL^VAE(x(i))\mathcal{L}_{\mathrm{batch}} = \frac{1}{B} \sum_{i=1}^{B} \widehat{\mathcal{L}}_{\mathrm{VAE}} \left(x^{(i)}\right)
  1. 재매개변수화 경로로 역전파하고 인코더의 ϕ\phi와 디코더의 θ\theta를 함께 갱신한다.

이 두 손실을 통해 인코더 qϕ(z∣x)q_\phi(z\mid x)와 디코더 pθ(x∣z)p_\theta(x\mid z)를 함께 학습한다. 기댓값은 각 훈련 표본마다 하나 또는 소수의 zz를 표본추출하여 몬테카를로 방식으로 근사한다. 재매개변수화 덕분에 이 확률적 추정값으로도 전체 경로의 기울기를 계산할 수 있다.

%% title: VAE의 End-to-End Training 경로
%% caption: Encoder가 approximate posterior의 μ와 σ를 만들고, reparameterization으로 latent z를 sample한 뒤 decoder가 x를 복원한다. Reconstruction NLL과 prior KL을 함께 최소화한다.
flowchart LR
    x["Input x"] --> encoder["Encoder qφ(z|x)"]
    encoder --> mu["μφ(x)"]
    encoder --> sigma["σφ(x)"]
    eps["ε ~ N(0,I)"] --> reparam["z = μ + σ ⊙ ε"]
    mu --> reparam
    sigma --> reparam
    reparam --> decoder["Decoder pθ(x|z)"]
    decoder --> recon["Reconstruction NLL"]
    x --> recon
    mu --> kl["KL(qφ(z|x) || N(0,I))"]
    sigma --> kl
    recon --> elbo["Negative ELBO"]
    kl --> elbo
    elbo -. "backpropagation" .-> encoder
    elbo -. "backpropagation" .-> decoder

Reconstruction과 prior의 trade-off

VAE의 reconstruction 항과 KL 항은 latent space zz에 서로 반대되는 요구를 한다. 인코더는 입력 xx마다 하나의 고정된 zz를 바로 출력하는 대신, zz가 따를 분포의 평균과 분산을 출력한다.

qϕ(z∣x)=N(μz∣x,Σz∣x)q_\phi(z\mid x) = \mathcal{N} \left( \mu_{z\mid x}, \Sigma_{z\mid x} \right)

이 분포에서 실제 잠재벡터 zz를 하나 표본추출하여 디코더에 넣는다.

z∼qϕ(z∣x)z \sim q_\phi(z\mid x)

복원 항이 원하는 것

reconstruction loss는 원본 xx를 최대한 정확하게 복원하려 한다. 이를 위해 서로 다른 입력에는 서로 확실히 구분되는 고유한 평균을 부여하고, 같은 입력에서 표본추출되는 zz의 변동은 작게 만드는 편이 유리하다.

μz∣x1≠μz∣x2≠μz∣x3\mu_{z\mid x_1} \neq \mu_{z\mid x_2} \neq \mu_{z\mid x_3} Σz∣x→0\Sigma_{z\mid x} \rightarrow 0

분산이 0에 가까우면 표본추출해도 거의 항상 평균과 같은 값이 나온다.

z≈μz∣xz \approx \mu_{z\mid x}

그러면 디코더는 각 잠재벡터를 입력 데이터의 식별자처럼 외워 복원할 수 있다. 복원은 쉬워지지만 평균들이 멀리 흩어지고 그 사이에 의미 없는 빈 영역이 생길 수 있다.

KL 항이 원하는 것

KL 항은 인코더가 만든 근사 사후분포 qϕ(z∣x)q_\phi(z\mid x)를 평균 0, 분산 1인 표준 가우스 사전분포에 가깝게 만든다.

p(z)=N(0,I)p(z) = \mathcal{N}(0,I) qϕ(z∣x)≈N(0,I)q_\phi(z\mid x) \approx \mathcal{N}(0,I)

따라서 입력마다 평균을 멀리 떨어뜨리는 대신 평균을 0 근처로 모으고, 0에 가까워지려는 분산은 1에 가까워지게 한다.

μz∣x→0\mu_{z\mid x} \rightarrow 0 Σz∣x→I\Sigma_{z\mid x} \rightarrow I
복원 항의 요구KL 항의 요구
서로 다른 입력을 확실히 구분함잠재벡터를 같은 사전분포 안에 모음
입력마다 서로 다른 고유한 평균을 만듬평균을 0 근처로 끌어당김
분산을 0에 가깝게 만듬분산을 1에 가깝게 만듬
입력 정보를 최대한 많이 저장함잠재공간을 연속적인 형태로 정돈함

복원 항만 사용하면 훈련 데이터는 잘 복원해도 각 데이터의 잠재벡터가 멀리 흩어져 중간 영역에 의미가 없을 수 있다. 그러면 사전분포에서 새로운 zz를 표본추출했을 때 실제 데이터와 비슷한 결과를 얻기 어렵다.

두 요구는 다음 ELBO 안에서 함께 최적화된다.

LELBO=Eqϕ(z∣x)[log⁡pθ(x∣z)]−DKL(qϕ(z∣x)∥p(z))\mathcal{L}_{\mathrm{ELBO}} = \mathbb{E}_{q_\phi(z\mid x)} \left[ \log p_\theta(x\mid z) \right] - D_{\mathrm{KL}} \left( q_\phi(z\mid x) \parallel p(z) \right)

첫 번째 항은 xx를 복원할 정보를 zz에 충분히 보존하게 하고, 두 번째 항은 zz가 사전분포에서 크게 벗어나지 않도록 정돈한다.

복원 손실은 각 입력을 구별할 수 있도록 잠재벡터에 정보를 보존하려 하고, KL 발산은 그 잠재벡터들이 표준 가우스 분포를 따르도록 압축하고 정돈하려 한다.

VAE는 두 항의 균형을 통해 복원이 가능하면서 사전분포에서도 표본추출할 수 있는 연속적인 잠재공간을 학습한다. 반대로 KL 항이 지나치게 강하면 인코더가 입력 정보를 무시하고 항상 사전분포와 비슷한 분포를 내는 사후붕괴(posterior collapse)가 생길 수 있다.

VAE sampling과 latent interpolation

훈련할 때는 실제 데이터 xx를 인코더에 넣어 잠재분포를 만들고, 그 분포에서 zz를 표본추출한 뒤 디코더에 전달한다.

x→qϕ(z∣x)→z→pθ(x∣z)x \rightarrow q_\phi(z\mid x) \rightarrow z \rightarrow p_\theta(x\mid z)

복원 항은 zz로부터 원래 데이터 xx를 설명할 수 있도록 디코더를 학습하고, KL 항은 인코더가 만드는 잠재분포를 미리 정한 사전분포와 호환되도록 만든다. 따라서 디코더는 사전분포와 호환되는 zz를 입력받아 xx의 조건부분포 pθ(x∣z)p_\theta(x\mid z)를 만들도록 학습된다.

p(z)=N(0,I)p(z) = \mathcal{N}(0,I)

훈련과 생성에서 zz가 나오는 곳

훈련할 때 디코더가 받는 zz는 사전분포에서 직접 뽑은 값이 아니라 인코더의 근사 사후분포에서 뽑은 값이다.

z∼qϕ(z∣x)z \sim q_\phi(z\mid x)

KL 항이 이 근사 사후분포를 사전분포 쪽으로 규제했기 때문에, 생성할 때는 실제 xx와 인코더 없이 사전분포에서 zz를 직접 표본추출할 수 있다.

z∼p(z)=N(0,I)z \sim p(z) = \mathcal{N}(0,I) x^∼pθ(x∣z)\hat{x} \sim p_\theta(x\mid z)

즉 zz는 입력 데이터의 분포에서 뽑는 것이 아니라 사전분포에서 뽑는다. 디코더는 이 zz를 조건으로 하는 xx의 조건부분포를 만들고, 그 분포에서 새로운 데이터 x^\hat{x}를 생성한다. 실제 출력으로는 조건부분포에서 표본추출하거나 그 분포의 평균 μθ(z)\mu_\theta(z)를 사용한다.

생성할 때는 사전분포에서 zz를 하나 표본추출하고, 그 zz를 디코더에 통과시켜 새로운 데이터를 만든다.

복원 손실만 사용했다면 각 데이터의 잠재벡터가 잠재공간 곳곳에 흩어질 수 있다. 이 경우 표준 가우스 분포에서 임의로 뽑은 zz가 디코더가 학습한 영역에 속한다는 보장이 없다. KL 항은 잠재분포를 사전분포 근처에 정돈하므로, z∼p(z)z\sim p(z)로 표본추출한 값이 학습된 잠재영역에 들어갈 가능성을 높인다. 반대로 학습에 사용한 사전분포와 크게 다른 분포에서 zz를 뽑으면 디코더가 거의 학습하지 않은 영역의 값이 들어갈 수 있으므로 제대로 된 데이터를 생성한다는 보장이 없다.

사전분포 제약으로 잠재공간이 연속적으로 정돈되므로 두 잠재벡터 사이를 보간하면 출력도 비교적 부드럽게 변한다.

z(α)=(1−α)za+αzbz(\alpha) = (1-\alpha)z_a + \alpha z_b 0≤α≤10 \le \alpha \le 1

손글씨 숫자 VAE에서 잠재차원을 움직이면 한 숫자가 다른 숫자로 부드럽게 변하는 모습을 볼 수 있다. 다음 그림은 두 잠재차원 z1z_1과 z2z_2를 각각 변화시키며 디코더가 생성한 결과를 배열한 것이다.

두 잠재차원 z1과 z2를 변화시킬 때 손글씨 숫자가 연속적으로 변하는 VAE 잠재공간

대각 가우스 사전분포는 zz의 각 차원이 서로 독립적인 형태를 갖도록 유도한다. 이 제약은 서로 다른 잠재차원이 데이터의 서로 다른 변화 요인을 나타내는 분리된 표현(disentangled representation)을 장려한다. 다만 각 차원이 반드시 독립적인 의미 요인을 표현하거나 분리된 표현이 자동으로 보장되는 것은 아니다.

%% title: VAE의 생성과 Latent Interpolation
%% caption: 새 sample을 만들 때는 encoder를 사용하지 않고 prior에서 z를 뽑아 decoder에 넣는다. 두 latent 사이를 이동하면 decoder output의 연속적인 변화를 볼 수 있다.
flowchart LR
    prior["Prior<br/>z ~ N(0,I)"] --> decoder["VAE Decoder<br/>pθ(x|z)"]
    decoder --> sample["Generated Sample x"]
    za["Latent z_a"] --> interp["z(α) = (1-α)z_a + αz_b"]
    zb["Latent z_b"] --> interp
    interp --> shared["Same Decoder"]
    shared --> path["Smooth Output Path<br/>x(0) … x(1)"]

Autoregressive model과 VAE 비교

항목Autoregressive modelVAE
DensityExact normalized likelihoodELBO로 log-likelihood를 lower-bound
StructureSequence factorizationLatent-variable model
TrainingNext-token NLLReconstruction NLL + KL
SamplingToken을 순서대로 생성Priorzz를 뽑아 decoder forward
Latent representation명시적인 global latent가 필수는 아님Encoder가qϕ(z∣x)q_\phi(z\mid x) 제공
장점Stable MLE, exact likelihoodSmooth latent space, fast generation
한계Sequential samplingApproximate likelihood, blurry output 가능

Autoregressive model은 exact density를 위해 sequence ordering과 sequential sampling을 받아들인다. VAE는 exact likelihood를 포기하고 tractable lower bound를 사용하지만, inference와 generation에 유용한 latent representation을 얻는다.