21.3 - VAE Generalizations (간단하게 Motivation + 컨셉까지만)
21.4 - Avoiding Posterior Collapse 방법들만 간단히 설명 (별거 없음)
21.1 Introduction Generative Models / 생성모델 - 데이터셋 X \mathcal X X 에 대한 분포를 추정하는 모델이다. 추정된 분포 (모델) 에서 랜덤 샘플링을 하게 된다면 우리의 데이터셋 에서 뽑는 원리가 되기에. Label 이 필요없기에 비지도 학습의 일종이다.
우리의 데이터 x \mathbf{x} x 를 Encoder q ( z ∣ x ) q(\mathbf{z}\mid \mathbf x) q ( z ∣ x ) 에 넣어서 z \mathrm{z} z 으로 압축을 시켜준다. 그런 다음에 Decoder p ( x ∣ z ) p(\mathbf x \mid \mathbf z) p ( x ∣ z ) 에 넣어서 다시 원본 이미지처럼 만들어준다.
이 장에서 z , x ∣ z \mathrm z, \mathbf x \mid \mathrm z z , x ∣ z 에 대한 가정은 다음과 같다.
z ∼ p θ ( z ) \mathbf z \sim p_{\boldsymbol \theta}(\mathbf z) z ∼ p θ ( z ) x ∣ z ∼ E x p f a m ( x ∣ d θ ( z ) ) \mathbf x \mid \mathbf z \sim \mathrm{Expfam}\left(
\mathbf x \mid d_{\boldsymbol \theta}\left(\mathbf z\right)
\right) x ∣ z ∼ Expfam ( x ∣ d θ ( z ) ) p ( z ) : p(\mathbf z) : p ( z ) : 우리가 알고 있는 Latent z \mathbf z z 에 대한 가정.d θ ( z ) : d_{\boldsymbol \theta}(\mathbf z) : d θ ( z ) : Decoder (NN)E x p f a m ( x ∣ η ) : \mathrm{Expfam}\left(
\mathbf x \mid \mathbf \eta
\right) : Expfam ( x ∣ η ) : Exponential Family Distribution, 예시로 GaussianMessage Passing Algorithms 개념을 빌리자면,
p ( z ∣ x ) : p(z \mid x) : p ( z ∣ x ) : 우리의 데이터 x x x 가 z z z 의 어느 부분에 해당되는지 모른다. Hidden 이기 때문에. 그렇기에 이것을 Encoder 측에서 모델링 해줘야 한다.p ( x ∣ z ) : p(x \mid z) : p ( x ∣ z ) : 우리의 Latent z z z 를 x x x 차원으로 다시 늘려주며, 이것은 이미 우리가 z z z 가 뭔지 알고 있다는 가정이기에 그저 MLE 를 사용하면 된다.VI 개념을 빌리자면, p ( z ∣ x ) = p ( x ∣ z ) p ( z ) p ( x ) p(z \mid x) = \frac{p(x \mid z) p(z)}{p(x)} p ( z ∣ x ) = p ( x ) p ( x ∣ z ) p ( z ) 이며 p ( x ) = ∫ p ( x ∣ z ) p ( z ) d z p(x) = \int p(x \mid z) p(z) dz p ( x ) = ∫ p ( x ∣ z ) p ( z ) d z 이기에 Intractable 하기에 VI 를 활용하며, 이때 활용되는건 Amortized VI, 다른 분포 q q q 으로 p p p 를 각 데이터 마다 하는 것이 아닌 모든 데이터 포인트에 대해서 모델링 시켜줍니다.
z z z 차원이 커지면 적분 값을 구하는게 불가능해진다.p ( x ∣ z ) p(x\mid z) p ( x ∣ z ) 를 구하는데 Neural Network 을 사용하게 된다면 Non-linear 해지며, 우리는 p ( x ∣ z ) p(x\mid z) p ( x ∣ z ) 를 그러면 z z z 에 대한 함수로 바라보는게 불가능해진다.
21.2 VAE Basics 아주 기본적인 세팅에서 VAE 의 생성모델 부분 (Generative Model) 이 정의해주는 것은 :
p θ ( z , x ) = p θ ( z ) p θ ( x ∣ z ) p_{\boldsymbol{\theta}}(\boldsymbol{z}, \boldsymbol{x})=
p_{\boldsymbol{\theta}}(\boldsymbol{z})
p_{\boldsymbol{\theta}}(\boldsymbol{x} \mid \boldsymbol{z}) p θ ( z , x ) = p θ ( z ) p θ ( x ∣ z ) p θ ( z ) : p_{\boldsymbol{\theta}}(\boldsymbol{z}) : p θ ( z ) : 보통은 Gaussian 으로 세팅하며 z z z 차원이 고차원이면 그저 다변량 정규분포이다.p θ ( x ∣ z ) = ∏ d = 1 D B e r ( x d ∣ σ ( d θ ( z ) ) : p_{\boldsymbol{\theta}}(\boldsymbol{x} \mid \boldsymbol{z}) = \prod_{d=1}^{D}\mathrm{Ber}\left(
x_d \mid \sigma\left(
d_{\boldsymbol \theta}(\boldsymbol{z}
\right)
\right) : p θ ( x ∣ z ) = ∏ d = 1 D Ber ( x d ∣ σ ( d θ ( z ) ) : 예시 중 하나, 그저 Product of Exponential Family Distributions 이기만 하면 된다.아주 기본적인 세팅에서 VAE 의 추론 부분 (Recognition Model) 이 정의해주는 것은 :
q ϕ ( z ∣ x ) = q ( z ∣ e ϕ ( x ) ) ≈ p θ ( z ∣ x ) q_{\boldsymbol{\phi}}(\boldsymbol{z} \mid \boldsymbol{x})
=q\left(\boldsymbol{z} \mid e_{\boldsymbol{\phi}}(\boldsymbol{x})\right) \approx p_{\boldsymbol{\theta}}(\boldsymbol{z} \mid \boldsymbol{x}) q ϕ ( z ∣ x ) = q ( z ∣ e ϕ ( x ) ) ≈ p θ ( z ∣ x ) q ϕ ( z ∣ x ) = N ( z ∣ μ , diag ( exp ( ℓ ) ) ) : q_{\boldsymbol{\phi}}(\boldsymbol{z} \mid \boldsymbol{x})=\mathcal{N}(\boldsymbol{z} \mid \boldsymbol{\mu}, \operatorname{diag}(\exp (\boldsymbol{\ell}))) : q ϕ ( z ∣ x ) = N ( z ∣ μ , diag ( exp ( ℓ ))) : 보통은 이것도 Gaussian 이라고 가정, 즉 Latent z z z 도 가우시안.( μ , ℓ ) = e ϕ ( x ) : (\boldsymbol{\mu}, \boldsymbol{\ell})=e_{\boldsymbol{\phi}}(\boldsymbol{x}) : ( μ , ℓ ) = e ϕ ( x ) : ℓ = log σ \boldsymbol \ell = \log \boldsymbol \sigma ℓ = log σ , 시그마 부분이 벡터, 이유는 Prior 를 Vanilla VAE 에서는 Mean-field Gaussian 으로 Assume 하기 때문. 그래서 아래 알고리즘은 튀어나오는 값이 조금 다르다.p θ ( z , x ) = p θ ( z ) p θ ( x ∣ z ) : p_{\boldsymbol{\theta}}(\boldsymbol{z}, \boldsymbol{x})=
p_{\boldsymbol{\theta}}(\boldsymbol{z})
p_{\boldsymbol{\theta}}(\boldsymbol{x} \mid \boldsymbol{z}) : p θ ( z , x ) = p θ ( z ) p θ ( x ∣ z ) : Decoder 부분q ϕ ( z ∣ x ) : q_{\boldsymbol{\phi}}(\boldsymbol{z} \mid \boldsymbol{x}) : q ϕ ( z ∣ x ) : Encoder 부분이것들을 Negative Log-Likelihood (NLL) 형태로 바꿔서 로스 형태로 표현하면 된다.
알고리즘은 다음과 같으며, Lines 5-7 부분의 경우에는 Cholesky Decomposition 을 활용해서 다변량 정규분포에서 뽑는 모습. 그러면 여기에서의 Encoder 는 사실은 e ϕ ( x ) e_{\boldsymbol \phi}(\boldsymbol x) e ϕ ( x ) 이다. 추가적으로 Full Covariance Gaussian Posterior 를 Assume 함.
참조 for Multivariate Normal Dist. Sampling using Cholesky Decomposition from 통계전산 강의 (정성현 교수님 강의안)
Covariance Matrix is always PD (아주 특이 케이스 제외하면), hence we can use Cholesky Decomposition.
위의 식에서는 L ′ L^\prime L ′ 이 사실은 하삼각행렬일 보장이 없기에 Diagonal + 상단 부분을 제외한 Mask M M M 으로 씌워준 다음에 Diagonal 에 σ \sigma σ 를 넣어주면서 Covariance Matrix 을 만들어줌.
ε ∼ N \boldsymbol \varepsilon \sim \mathrm{N} ε ∼ N 이면 Linear Combination 으로 우리가 원하는 정규분포로 샘플링 해줄 수 있다.
Z ∼ N ( 0 , 1 ) , a Z + b → D N ( b , a 2 ) Z \sim \mathrm{N}(0, 1), \quad aZ + b \stackrel{D}{\rightarrow}\mathrm{N}(b, a^2) Z ∼ N ( 0 , 1 ) , a Z + b → D N ( b , a 2 ) Line 10 : Computing for the NLL of q ϕ ( z ∣ x ) q_{\boldsymbol{\phi}}(\boldsymbol{z} \mid \boldsymbol{x}) q ϕ ( z ∣ x ) Line 11 : Computing for the NLL of p θ ( z ) p_{\boldsymbol \theta}(\boldsymbol z) p θ ( z ) Line 12 : Computing for the NLL of p θ ( x ∣ z ) p_{\boldsymbol \theta}(\boldsymbol x \mid \boldsymbol z) p θ ( x ∣ z ) 사실 Line 13 에서 정의하는 로스가 그저 -ELBO Term 이 되어버린다. 정확하게는 (w/o considering parameters),
L = − E q [ log p ( x ∣ z ) ] ⏟ L log p x + − E q [ log p ( z ) ] ⏟ L log p z − − E q [ log q ( z ∣ x ) ] ⏟ L log q z = − E L B O = L log p x + L log p z − L log q z = − E q [ log p ( x ∣ z ) ] + E q [ − log p ( z ) + log q ( z ∣ x ) ] = − E q [ log p ( x ∣ z ) ] + K L ( q ( z ∣ x ) ∥ p ( z ) ) \begin{aligned}
L &= \underbrace{-\mathbb{E}_q[\log p(x \mid z)]}_{L_{\log p_x}}
+\underbrace{-\mathbb{E}_q[\log p(z)]}_{L_{\log p_z}}
-\underbrace{-\mathbb{E}_q[\log q(z \mid x)]}_{L_{\log q_z}} = -\mathrm{ELBO} \\
& = L_{\log p_x} + L_{\log p_z} - L_{\log q_z} \\
& = -\mathbb{E}_q\left[\log p(x \mid z) \right] + \mathbb{E}_q\left[- \log p(z) + \log q(z \mid x) \right] \\
& = -\mathbb{E}_q\left[\log p(x \mid z) \right] + \mathrm{KL}\left(q\left(z\mid x\right) \| p\left(z\right) \right)
\end{aligned} L = L l o g p x − E q [ log p ( x ∣ z )] + L l o g p z − E q [ log p ( z )] − L l o g q z − E q [ log q ( z ∣ x )] = − ELBO = L l o g p x + L l o g p z − L l o g q z = − E q [ log p ( x ∣ z ) ] + E q [ − log p ( z ) + log q ( z ∣ x ) ] = − E q [ log p ( x ∣ z ) ] + KL ( q ( z ∣ x ) ∥ p ( z ) ) About ELBO L ( θ , ψ ∣ x ) = E q ψ ( z ) [ − log p θ ( x , z ) + log q ψ ( z ) ] \mathcal{L}(\theta, \psi \mid x) = \mathbb{E}_{q_\psi(z)} \big[ -\log p_\theta(x, z) + \log q_\psi(z) \big] L ( θ , ψ ∣ x ) = E q ψ ( z ) [ − log p θ ( x , z ) + log q ψ ( z ) ] How to sample in this VAE?
어느 정도 수렴이 된다면 우리가 디코더 d θ ( z ) d_{\boldsymbol \theta}(\boldsymbol z) d θ ( z ) 를 Prior p ( z ) p(\boldsymbol z) p ( z ) 에서 시작해서 이미지로 나오게끔 잘 만들어줬기 때문에 그저 z ∼ p ( z ) \boldsymbol z \sim p(\boldsymbol z) z ∼ p ( z ) 에서 뽑은 다음에 이것을 디코더 d θ ( z ) d_{\boldsymbol \theta}(\boldsymbol z) d θ ( z ) 에 넣어주기만 하면 된다.
Advantage of VAE over AE?
Autoencoder 는 사실은 생성모델이 아니다. 압축하는게 사실은 목표이며 더 잘 압축하기 위해서 Decoder 를 결합한게 Autoencoder 일 뿐이다. 한 마디로 Randomness 요소가 없다. 그러기에 Latent 에 대해서 Randomness 요소가 있는 VAE 가 생성 측면에서는 이점을 가진다.
About Autoencoder from 생성모델 강의 (송경우 교수님 강의안)
Final Loss Term would be :
L ( θ , ϕ ∣ D ) = − E q ϕ ( z ∣ x ) [ log p θ ( x ∣ z ) ] + D K L ( q ϕ ( z ∣ x ) ∥ p θ ( z ) ) L(\boldsymbol\theta, \boldsymbol\phi \mid \mathcal D) = -\mathbb{E}_{q_\phi(\boldsymbol z \mid \boldsymbol x)}\left[\log p_{\boldsymbol \theta}(\boldsymbol x \mid \boldsymbol z) \right] + D_{\mathbb{KL}}\left(q_\phi(\boldsymbol z \mid \boldsymbol x) \| p_{\boldsymbol \theta}\left(\boldsymbol z\right) \right) L ( θ , ϕ ∣ D ) = − E q ϕ ( z ∣ x ) [ log p θ ( x ∣ z ) ] + D KL ( q ϕ ( z ∣ x ) ∥ p θ ( z ) ) Alternative Expression for ELBO in VAE
Joint Generative 부분 : p θ ( x , z ) = p θ ( z ) p θ ( x ∣ z ) p_{\boldsymbol{\theta}}(\boldsymbol{x}, \boldsymbol{z})=p_{\boldsymbol{\theta}}(\boldsymbol{z}) p_{\boldsymbol{\theta}}(\boldsymbol{x} \mid \boldsymbol{z}) p θ ( x , z ) = p θ ( z ) p θ ( x ∣ z ) p θ ( x ) = ∫ z p θ ( x , z ) d z p_{\boldsymbol{\theta}}(\boldsymbol{x})= \int_{\boldsymbol z} p_{\boldsymbol \theta}(\boldsymbol x, \boldsymbol z) d\boldsymbol z p θ ( x ) = ∫ z p θ ( x , z ) d z p θ ( z ∣ x ) = p θ ( x , z ) / p θ ( x ) p_{\boldsymbol{\theta}}(\boldsymbol{z} \mid \boldsymbol{x})=p_{\boldsymbol{\theta}}(\boldsymbol{x}, \boldsymbol{z}) / p_{\boldsymbol{\theta}}(\boldsymbol{x}) p θ ( z ∣ x ) = p θ ( x , z ) / p θ ( x ) Joint Inference 부분 :q D , ϕ ( z , x ) = p D ( x ) q ϕ ( z ∣ x ) q_{\mathcal{D}, \phi}(\boldsymbol{z}, \boldsymbol{x})=p_{\mathcal{D}}(\boldsymbol{x}) q_{\boldsymbol{\phi}}(\boldsymbol{z} \mid \boldsymbol{x}) q D , ϕ ( z , x ) = p D ( x ) q ϕ ( z ∣ x ) p D ( x ) = 1 N ∑ n = 1 N δ ( x n − x ) p_{\mathcal{D}}(\boldsymbol{x})=\frac{1}{N} \sum_{n=1}^N \delta\left(\boldsymbol{x}_n-\boldsymbol{x}\right) p D ( x ) = N 1 ∑ n = 1 N δ ( x n − x ) q D , ϕ ( z ) = ∫ x q D , ϕ ( x , z ) d x q_{\mathcal{D}, \boldsymbol{\phi}}(\boldsymbol{z})=\int_{\boldsymbol{x}} q_{\mathcal{D}, \boldsymbol{\phi}}(\boldsymbol{x}, \boldsymbol{z}) d \boldsymbol{x} q D , ϕ ( z ) = ∫ x q D , ϕ ( x , z ) d x q D , ϕ ( x ∣ z ) = q D , ϕ ( x , z ) / q D , ϕ ( z ) q_{\mathcal{D}, \boldsymbol{\phi}}(\boldsymbol{x} \mid \boldsymbol{z})=q_{\mathcal{D}, \boldsymbol{\phi}}(\boldsymbol{x}, \boldsymbol{z}) / q_{\mathcal{D}, \boldsymbol{\phi}}(\boldsymbol{z}) q D , ϕ ( x ∣ z ) = q D , ϕ ( x , z ) / q D , ϕ ( z ) 이것들을 이용해서 ELBO Term 을 다음과 같이 바꿔줄 수가 있습니다.
풀이 Original Loss (Negative ELBO) :
L = − E q [ log p ( x ∣ z ) ] + K L ( q ( z ∣ x ) ∥ p ( z ) ) , w/o params L ( θ , ϕ ∣ D ) = E p D ( x ) [ − E q ϕ ( z ∣ x ) [ log p θ ( x ∣ z ) ] + D K L ( q ϕ ( z ∣ x ) ∥ p θ ( z ) ) ] \begin{aligned}
L
& = -\mathbb{E}_q\left[\log p(x \mid z) \right] + \mathrm{KL}\left(q\left(z\mid x\right) \| p\left(z\right) \right), \quad \text{w/o params} \\
L(\theta, \phi \mid \mathcal D) &= \mathbb{E}_{p_{\mathcal D}(\boldsymbol x)}\left[-\mathbb{E}_{q_\phi(\boldsymbol z \mid \boldsymbol x)}\left[\log p_{\boldsymbol \theta}(\boldsymbol x \mid \boldsymbol z) \right] + D_{\mathbb{KL}}\left(q_\phi(\boldsymbol z \mid \boldsymbol x) \| p_{\boldsymbol \theta}\left(\boldsymbol z\right) \right) \right]
\end{aligned} L L ( θ , ϕ ∣ D ) = − E q [ log p ( x ∣ z ) ] + KL ( q ( z ∣ x ) ∥ p ( z ) ) , w/o params = E p D ( x ) [ − E q ϕ ( z ∣ x ) [ log p θ ( x ∣ z ) ] + D KL ( q ϕ ( z ∣ x ) ∥ p θ ( z ) ) ] Positive ELBO with parametrization :
ELBO ( θ , ϕ ∣ D ) = E p D ( x ) [ E q ϕ ( z ∣ x ) [ log p θ ( x ∣ z ) ] − D K L ( q ϕ ( z ∣ x ) ( z ∣ x ) ∥ p θ ( z ) ) ] \text{ELBO}(\theta, \phi \mid \mathcal D) = \mathbb{E}_{p_{\mathcal D}(\boldsymbol x)}\left[\mathbb{E}_{q_\phi(\boldsymbol z \mid \boldsymbol x)}\left[\log p_{\boldsymbol \theta}(x \mid z) \right] - D_{\mathbb{KL}}\left(q_\phi(\boldsymbol z \mid \boldsymbol x)\left(z\mid x\right) \| p_{\boldsymbol \theta}\left(z\right) \right) \right] ELBO ( θ , ϕ ∣ D ) = E p D ( x ) [ E q ϕ ( z ∣ x ) [ log p θ ( x ∣ z ) ] − D KL ( q ϕ ( z ∣ x ) ( z ∣ x ) ∥ p θ ( z ) ) ] 여기에 = c \stackrel{c}{=} = c 을 Mean Equal up to additive constants 으로 둔다면, 뒤에 있는 상수 부분인 p D ( x ) p_\mathcal{D}(x) p D ( x ) Term 을 버릴 수가 있다.
21.21 과 같이 해석을 할 수도 있고 아래 보이는 식과 같이 또 다르게 해석할 수도 있다 (Marginal as z instead of x).
Ł ( θ , ϕ ∣ D ) = c − D K L ( q D , ϕ ( z ) ∥ p θ ( z ) ) − E q D , ϕ ( z ) [ D K L ( q ϕ ( x ∣ z ) ∥ p θ ( x ∣ z ) ) ] \mathrm{Ł}(\boldsymbol{\theta}, \boldsymbol{\phi} \mid \mathcal{D}) \stackrel{c}{=}-D_{\mathbb{K} \mathbb{L}}\left(q_{\mathcal{D}, \boldsymbol{\phi}}(\boldsymbol{z}) \| p_{\boldsymbol{\theta}}(\boldsymbol{z})\right)-\mathbb{E}_{q_{\mathcal{D}, \boldsymbol{\phi}}(\boldsymbol{z})}\left[D_{\mathbb{K} \mathbb{L}}\left(q_{\boldsymbol{\phi}}(\boldsymbol{x} \mid \boldsymbol{z}) \| p_{\boldsymbol{\theta}}(\boldsymbol{x} \mid \boldsymbol{z})\right)\right] Ł ( θ , ϕ ∣ D ) = c − D KL ( q D , ϕ ( z ) ∥ p θ ( z ) ) − E q D , ϕ ( z ) [ D KL ( q ϕ ( x ∣ z ) ∥ p θ ( x ∣ z ) ) ] 둘 다 달라진건 사실 없고 ELBO 에 대한 관점만 바뀌었을 뿐! 그럼 그래서 이렇게 보는 이점이 뭘까?
1번째 Term 에서 보이는 바와 같이 Inference & Generative Prior 의 차이를 최소화 시켜준다는 것을 알 수가 있음. 2번째 Term 에서 보이는 바와 같이 z z z 를 통해서 x x x 를 만드는 Reconstruction 과정에서 Inference & Generative Distribution 의 차이를 최소화 시켜준다는 것을 알 수가 있음.
VAE Generalizations L ( θ , ϕ ∣ D ) = − E q ϕ ( z ∣ x ) [ log p θ ( x ∣ z ) ] + D K L ( q ϕ ( z ∣ x ) ∥ p θ ( z ) ) L(\boldsymbol\theta, \boldsymbol\phi \mid \mathcal D) = -\mathbb{E}_{q_\phi(\boldsymbol z \mid \boldsymbol x)}\left[\log p_{\boldsymbol \theta}(\boldsymbol x \mid \boldsymbol z) \right] + D_{\mathbb{KL}}\left(q_\phi(\boldsymbol z \mid \boldsymbol x) \| p_{\boldsymbol \theta}\left(\boldsymbol z\right) \right) L ( θ , ϕ ∣ D ) = − E q ϕ ( z ∣ x ) [ log p θ ( x ∣ z ) ] + D KL ( q ϕ ( z ∣ x ) ∥ p θ ( z ) ) 근데 결과를 조금 살피면 Blurry 하다는 모습을 보인다는 것을 알 수가 있다 (맨 아랫 줄에 해당함). 이에 대한 이유로는 Gaussian Decoder 를 사용한다는 것이 문제이다.
Decoder 에 대해서 얘기했을 때 우리는 Decoder 가 그저 Neural Network 이라고 말만 했었지만, 사실은 그것보다 조금 더 구체적으로 들어가야된다.
이미지 x x x 가 예시로 MNIST 이미지라서 28 × 28 28\times 28 28 × 28 이며 z z z 는 예시로 d d d -차원이라고 한다면, 우리의 생성된 이미지 x ^ \hat{x} x ^ 는 정규분포에서 뽑힌 값이다.
x ^ i , j ∼ N ( [ μ θ ( z ) ] i , j , [ σ θ ( z ) ] i , j ) \hat{x}_{i,j} \sim \mathrm{N}\left(\left[\mu_\theta\left(\boldsymbol{z} \right)\right]_{i,j}, \left[\sigma_{\theta}(\boldsymbol z) \right]_{i,j}\right) x ^ i , j ∼ N ( [ μ θ ( z ) ] i , j , [ σ θ ( z ) ] i , j ) 실제 이미지 x x x 랑 생성된 이미지 x ^ \hat{x} x ^ 를 비교했을 때의 확률을 최대화 시키는 것은 픽셀별로 평균낸 꼴이 되어버림.
p θ ( x ∣ z ) = ∏ i N ( x i ; μ i ( z ) , σ 2 ) ⟹ − log p θ ( x ∣ z ) ∝ ∑ i ( x i − μ i ( z ) ) 2 p_\theta(x \mid z)=\prod_i \mathcal{N}\left(x_i ; \mu_i(z), \sigma^2\right) \quad \Longrightarrow \quad-\log p_\theta(x \mid z) \propto \sum_i\left(x_i-\mu_i(z)\right)^2 p θ ( x ∣ z ) = i ∏ N ( x i ; μ i ( z ) , σ 2 ) ⟹ − log p θ ( x ∣ z ) ∝ i ∑ ( x i − μ i ( z ) ) 2 평균을 내어버리기에 Blurry 한 이미지들이 나오게 된다고 한다.
그러면 이걸 어떻게 고칠 수가 있을까? → \rightarrow → Prior 를 더 표현력 있게 만든다 (예시: Normalizing Flows, z K = f K ∘ ⋯ ∘ f 1 ( z 0 ) , z 0 ∼ N ( 0 , I ) z_K=f_K \circ \cdots \circ f_1\left(z_0\right), \quad z_0 \sim \mathcal{N}(0, I) z K = f K ∘ ⋯ ∘ f 1 ( z 0 ) , z 0 ∼ N ( 0 , I ) )
더 간단한 방법으로는 β \beta β -VAE 가 있다. 근데 이것을 알기 전에 Disentanglement 에 대해서 알아야 한다.
원래 비전에서는 이것을 Total-Correlation Loss 으로 사용하기는 하지만,
T C ( z ) = ∑ k H ( z k ) − H ( z ) = D K L ( p ( z ) ∥ ∏ k p k ( z k ) ) \mathrm{TC}(\boldsymbol{z})=\sum_k \mathbb{H}\left(z_k\right)-\mathbb{H}(\boldsymbol{z})=D_{\mathbb{K} \mathbb{L}}\left(p(\boldsymbol{z}) \| \prod_k p_k\left(z_k\right)\right) TC ( z ) = k ∑ H ( z k ) − H ( z ) = D KL ( p ( z ) ∥ k ∏ p k ( z k ) ) 다른 논문에서는 다음의 Modified 된 VAE 의 로스함수에서 β > 1 \beta > 1 β > 1 을 사용하는 것이 TC 를 줄이는 것과 똑같다고 한다.
L β ( θ , ϕ ∣ x ) = − E q ϕ ( z ∣ x ) [ log p θ ( x ∣ z ) ] ⏟ L E + β D K L ( q ϕ ( z ∣ x ) ∥ p θ ( z ) ) ⏟ L R \mathcal{L}_\beta(\boldsymbol{\theta}, \boldsymbol{\phi} \mid \boldsymbol{x})=\underbrace{-\mathbb{E}_{q_{\boldsymbol{\phi}}(\boldsymbol{z} \mid \boldsymbol{x})}\left[\log p_{\boldsymbol{\theta}}(\boldsymbol{x} \mid \boldsymbol{z})\right]}_{\mathcal{L}_E}+\beta \underbrace{D_{\mathbb{K} \mathbb{L}}\left(q_{\boldsymbol{\phi}}(\boldsymbol{z} \mid \boldsymbol{x}) \| p_{\boldsymbol{\theta}}(\boldsymbol{z})\right)}_{\mathcal{L}_R} L β ( θ , ϕ ∣ x ) = L E − E q ϕ ( z ∣ x ) [ log p θ ( x ∣ z ) ] + β L R D KL ( q ϕ ( z ∣ x ) ∥ p θ ( z ) ) β = 0 : \beta = 0 : β = 0 : 그저 Vanilla VAEβ < 1 : \beta < 1 : β < 1 : Encoder 가 압축하는 z z z 에 N ( 0 , I ) N(0, I) N ( 0 , I ) 를 덜 따라가게끔 만들어준다.일종의 z z z 로 인해서 발생한 Information Bottleneck 을 줄여주게 된다고 보면 되며, z z z 가 x x x 에 대한 더 많은 정보를 담고 간다고 보면 됨. β > 1 : \beta > 1 : β > 1 : 반대로 Penalize 를 더 해주며, Encoder 가 N ( 0 , I ) N(0, I) N ( 0 , I ) 으로 안 가면 더 페널티를 높여주며 Disentanglement 유도가 된다.원래 β \beta β -VAE 논문에서는 이를 통해서 특정 z z z 를 바꾸면 이미지에 대한 특징들을 찾을 수 있다고 한다.
Azimuth : 방위각 / 각도
InfoVAE 그럼 VAE 에서 생길 수 있는 또 다른 문제점은 뭐가 있을까?
Encoder 의 목표에서는 z ∣ x z\mid x z ∣ x 를 N ( 0 , I ) N(0, I) N ( 0 , I ) 에 가깝게 하는 목표도 있지만 x x x 에 관한 정보를 최대한 담는다는 것도 있다. 하지만 Vanilla ELBO 에서는 z ∣ x z\mid x z ∣ x 가 N ( 0 , I ) N(0, I) N ( 0 , I ) 으로 ‘Collapse’ 해버릴 수도 있다는 단점이 존재한다.
그러면 이때 Mutual Information 을 고려해보자. I ( X ; Z ) I(X;Z) I ( X ; Z ) 이라고 하면 X X X 와 Z Z Z 가 공유하고 있는 정보이다.
이 값을 올리게 된다면 X X X 와 Z Z Z 는 더욱 더 많은 정보를 공유하게 될 것이다. 이것을 VAE Loss 에 포함시켜준다면 다음과 같다.
α \alpha α 값을 올리면 M I MI M I 가 올라가면서 Encoder 가 x x x 에 대해서 z z z 으로 압축시킬 때 x x x 에 대한 정보를 너무 많이 잃지 않도록 만든다.λ \lambda λ 값의 경우 β \beta β -VAE 부분을 반영한 모습, α : = 1 − λ \alpha := 1- \lambda α := 1 − λ 인 경우에는 λ \lambda λ 가 β \beta β 가 된다.새로운 변수 c c c 가 Condition (Class) 일 때 VAE 를 모델링 하는 것.
p θ ( x , z ∣ c ) = p ( z ) p θ ( x ∣ z , c ) p_\theta(x, z \mid c)=p(z) p_\theta(x \mid z, c) p θ ( x , z ∣ c ) = p ( z ) p θ ( x ∣ z , c ) q ϕ ( z ∣ x , c ) q_\phi(z \mid x, c) q ϕ ( z ∣ x , c )
Avoiding Posterior Collapse Posterior Collapse 이란 우리가 Encoder 를 통해서 압축한 z z z 가 q ϕ ( z ∣ x ) ≈ p ( z ) q_\phi (z\mid x) \approx p(z) q ϕ ( z ∣ x ) ≈ p ( z ) 으로 되어버리는 케이스이다. 즉 x x x 에 대해서 독립이 되어버린다는 케이스.
KL-Annealing - β \beta β -VAE 에서의 β \beta β 값을 학습 초반에는 0.0 0.0 0.0 에서 시작하다가 점차적으로 1.0 1.0 1.0 으로 올려주는 Scheduling 방식. Free bits - 원래는 L R = ∑ i D K L ( q ϕ ( z i ∣ x ) ∥ p θ ( z i ) ) \mathcal{L}_R=\sum_i D_{\mathbb{K} \mathbb{L}}\left(q_{\boldsymbol{\phi}}\left(z_i \mid \boldsymbol{x}\right) \| p_{\boldsymbol{\theta}}\left(z_i\right)\right) L R = ∑ i D KL ( q ϕ ( z i ∣ x ) ∥ p θ ( z i ) ) 이었다면 이것을 L R ′ = ∑ i max ( λ , D K L ( q ϕ ( z i ∣ x ) ∥ p θ ( z i ) ) ) \mathcal{L}_R^{\prime}=\sum_i \max \left(\lambda, D_{\mathbb{K} \mathbb{L}}\left(q_{\boldsymbol{\phi}}\left(z_i \mid \boldsymbol{x}\right) \| p_{\boldsymbol{\theta}}\left(z_i\right)\right)\right) L R ′ = ∑ i max ( λ , D KL ( q ϕ ( z i ∣ x ) ∥ p θ ( z i ) ) ) 으로 바꿔주는 것 (Lower bounds the rate)
VAEs with Hierarchical Structure 이 문제를 정의를 좀 해보자면, 다음과 같다.
그러면 모델의 Expressive Power 가 늘어나게 된다.
Markovian 가정을 깨버릴 수가 있다. Layer 들로 나눠줄 수가 있기에.
p θ ( x , z ) = p θ ( z L ) [ ∏ l = L − 1 1 p θ ( z l ∣ z l + 1 : L ) ] p θ ( x ∣ z 1 : L ) p_{\boldsymbol{\theta}}(\boldsymbol{x}, \boldsymbol{z})=p_{\boldsymbol{\theta}}\left(\boldsymbol{z}_L\right)\left[\prod_{l=L-1}^1 p_{\boldsymbol{\theta}}\left(\boldsymbol{z}_l \mid \boldsymbol{z}_{l+1: L}\right)\right] p_{\boldsymbol{\theta}}\left(\boldsymbol{x} \mid \boldsymbol{z}_{1: L}\right) p θ ( x , z ) = p θ ( z L ) [ l = L − 1 ∏ 1 p θ ( z l ∣ z l + 1 : L ) ] p θ ( x ∣ z 1 : L ) l = 2 → L l=2 \rightarrow L l = 2 → L 과 같은 Bottom-up 이 아닌 아래와 같은 Top-down Approach 도 고려해볼 수 있음.
q ϕ ( z ∣ x ) = q ϕ ( z L ∣ x ) ∏ l = L − 1 1 q ϕ ( z l ∣ x , z l + 1 : L ) q_{\boldsymbol{\phi}}(\boldsymbol{z} \mid \boldsymbol{x})=q_{\boldsymbol{\phi}}\left(\boldsymbol{z}_L \mid \boldsymbol{x}\right) \prod_{l=L-1}^1 q_{\boldsymbol{\phi}}\left(\boldsymbol{z}_l \mid \boldsymbol{x}, \boldsymbol{z}_{l+1: L}\right) q ϕ ( z ∣ x ) = q ϕ ( z L ∣ x ) l = L − 1 ∏ 1 q ϕ ( z l ∣ x , z l + 1 : L ) E ( θ , ϕ ∣ x ) = E q ϕ ( z ∣ x ) [ log p θ ( x ∣ z ) ] − D K L ( q ϕ ( z L ∣ x ) ∥ p θ ( z L ) ) − ∑ l = L − 1 1 E q ϕ ( z > l ∣ x ) [ D K L ( q ϕ ( z l ∣ x , z > l ) ∥ p θ ( z l ∣ z > l ) ) ] \begin{aligned}\mathrm{E}(\boldsymbol{\theta}, \boldsymbol{\phi} \mid \boldsymbol{x}) & =\mathbb{E}_{q_{\boldsymbol{\phi}}(\boldsymbol{z} \mid \boldsymbol{x})}\left[\log p_{\boldsymbol{\theta}}(\boldsymbol{x} \mid \boldsymbol{z})\right]-D_{\mathbb{K L}}\left(q_{\boldsymbol{\phi}}\left(\boldsymbol{z}_L \mid \boldsymbol{x}\right) \| p_{\boldsymbol{\theta}}\left(\boldsymbol{z}_L\right)\right) \\& -\sum_{l=L-1}^1 \mathbb{E}_{q_{\boldsymbol{\phi}}\left(\boldsymbol{z}_{>l} \mid \boldsymbol{x}\right)}\left[D_{\mathbb{K L}}\left(q_{\boldsymbol{\phi}}\left(\boldsymbol{z}_l \mid \boldsymbol{x}, \boldsymbol{z}_{>l}\right) \| p_{\boldsymbol{\theta}}\left(\boldsymbol{z}_l \mid \boldsymbol{z}_{>l}\right)\right)\right]\end{aligned} E ( θ , ϕ ∣ x ) = E q ϕ ( z ∣ x ) [ log p θ ( x ∣ z ) ] − D KL ( q ϕ ( z L ∣ x ) ∥ p θ ( z L ) ) − l = L − 1 ∑ 1 E q ϕ ( z > l ∣ x ) [ D KL ( q ϕ ( z l ∣ x , z > l ) ∥ p θ ( z l ∣ z > l ) ) ]
VQ-VAEs (Vector Quantized VAEs) Posterior Collapse 문제를 해결하기 위한 또 다른 방법. x x x 마다 z z z 가 좀 다양하게 나오길 기대하지만 그렇지 않고 비슷하게 나온다는 것.
VAE 와는 다르게 Encoder 가 Continuous 가 아닌 Discrete Latent 변수 를 뱉게끔 만든다.
Encoder 의 뒷 부분은 z e ( x ) z_e(x) z e ( x ) 의 각각의 Spatial Location ( i , j ) (i,j) ( i , j ) 에 관해서 Mapping 을 시켜주는 다음과 같은 함수라 하자.
q ( z i j = k ∣ x ) = { 1 if k = argmin k ′ ∥ z e ( x ) i , j , : − e k ′ ∥ 2 0 otherwise q\left(\boldsymbol{z}_{i j}=k \mid \boldsymbol{x}\right)= \begin{cases}1 & \text { if } k=\operatorname{argmin}_{k^{\prime}}\left\|\boldsymbol{z}_e(\boldsymbol{x})_{i, j,:}-e_{k^{\prime}}\right\|_2 \\ 0 & \text { otherwise }\end{cases} q ( z ij = k ∣ x ) = { 1 0 if k = argmin k ′ ∥ z e ( x ) i , j , : − e k ′ ∥ 2 otherwise 이것에 그러면 ( i , j ) (i,j) ( i , j ) 에 해당하는 k k k 값이 있다는 뜻. 그러면 우리의 Codebook 을 찾아서 이 값에 해당되는 Embedding Vector e k e_k e k 를 찾는다 (Embedding lookup).
( z q ) i j = e k where z i j = k \left(\boldsymbol{z}_q\right)_{i j}=\boldsymbol{e}_k \text { where } \boldsymbol{z}_{i j}=k ( z q ) ij = e k where z ij = k 그럼 다음에 이 값을 모아서 z q ( x ) z_q(x) z q ( x ) 이라고 한다면 (Fig 에서 디코더의 Input) 이것을 Decoder 에 넣고 Output 을 뱉는다.
L = − log p ( x ∣ z q ( x ) ) + ∥ sg ( z e ( x ) ) − e ∥ 2 2 + β ∥ z e ( x ) − sg ( e ) ∥ 2 2 \mathcal{L}=-\log p\left(\boldsymbol{x} \mid \boldsymbol{z}_q(\boldsymbol{x})\right)+\left\|\operatorname{sg}\left(\boldsymbol{z}_e(\boldsymbol{x})\right)-\boldsymbol{e}\right\|_2^2+\beta\left\|\boldsymbol{z}_e(\boldsymbol{x})-\operatorname{sg}(\boldsymbol{e})\right\|_2^2 L = − log p ( x ∣ z q ( x ) ) + ∥ sg ( z e ( x ) ) − e ∥ 2 2 + β ∥ z e ( x ) − sg ( e ) ∥ 2 2 1번째 Term 은 그저 Reconstruction loss, Decoder 에 줄 입력값인 z q ( x ) \boldsymbol z_q(\boldsymbol x) z q ( x ) 에 대해서 출력된 이미지에 대한 로스 업데이트. 2번째 Term 은 Encoder output z e \boldsymbol z_e z e 를 고정시키고 Codebook 인 e \boldsymbol e e 에 대해서만 업데이트 해주는 것. 3번째 Term 은 2번째 Term 의 반대. KL Term 대신에 Codebook 개념으로 바라보기에 이렇게 다르게 바라봐야 된다.
Why the stop gradient to divide the loss into two?
둘다 업데이트를 동시에 하게 된다면 Encoder 와 Codebook 둘다 똑같은 방향으로 업데이트 하게 되며 둘에 대한 거리는 계속해서 유지될 것이다 (Moving Target).
Encoder 의 Output 이 Codebook 과 정확하게 일치하게끔 만들기 싫기에 β \beta β 값을 줄여주면 이것을 방지해준다.
Conclusion What is VAE? Autoencoder 의 Latent 를 Prior 분포으로 모델링 시키면서 확률적 요소를 더해준 것이다. Variational Inference 를 활용한다. VAE 의 문제점으로는? Disentanglement: z z z 가 특징을 잡으면서 압축이 되어야 하는데 그게 안될 수도 있다. Posterior Collapse : 압축된 z z z 가 Input x x x 에 대한 정보를 대부분 잃어가면서 Prior z z z 에 맞춰지게끔 하는 경우. Encoder collapses to the prior.