---
# System prepended metadata

title: Variational auto-encoder (VAE) 原理解釋
tags: [讀書筆記]

---

# Variational auto-encoder (VAE) 原理解釋

###### tags: `讀書筆記`

## 概論

- 基本架構
![](https://i.imgur.com/Jeebhlh.png)


-  說明
在 auto-encoder 中，$\vec{m}$ 即作為 code，並直接透過 decoder 重建回接近 input 的 output。
因此對於 VAE，我們可以將 $\vec{c}$ 想成原本的 code（$\vec{m}$）加上 noise（$\exp({1 \over 2} \vec{logvar}) \circ \vec{e}$），而 $\vec{\sigma} = \exp({1 \over 2} \vec{logvar})$ 為 noise 的標準差，$\vec{e}$ 則由 standard normal distribution 抽樣而來（在[Why VAE? - 直覺上的原因](#Why-VAE---直覺上的原因)將說明為什麼要加上 noise）。

- 目標
    - **最小化 reconstruction error**
    即 input 與 output 越接近越好
    - **最小化** $\mathbf{\Sigma_i [\exp(logvar_i) - (1+logvar_i) + (m_i)^2]}$
    如果單純最小化 reconstruction error 會使得 $\vec{\sigma}$ 都是 0，加上 noise 便失去意義。但若要使 $\exp(logvar_i) - (1+logvar_i)$ 最小，$logvar_i$ 必須是 0 而 $\sigma_i$ 即是 1，noise 的標準差就不為 0。而最小化 $(m_i)^2$ 則可視為 L2 regularization。

## Why VAE? - 直覺上的原因

在 auto-encoder 中，code 和 image 的對應關係是非線性的，因此就算 code 只差一點，得到的 image 很可能大不相同。

然而，我們期待在 code 差一點點時得到相近的 image，因此將原 image 通過 encoder 得到的 code 加上 noise，並要求重建出來的 image 仍要和原 image 越接近越好。如此一來，如果有一個 code 介於兩張 images 通過 encoder 得到的兩個 code 之間，我們可以期待其得到的 image 會像那兩張 images 的組合。
因此 code 的 attributes 可代表 image 的變化趨勢的軸。

## Why VAE? - paper 的解釋

- 目標
    - 估計 image 的機率分布 $p(x)$
    - 從 $p(x)$ 抽樣出 image $x'$

- 如何估計 $p(x)$？
利用 Gaussian Mixture Model 的概念，由無限多個 Gaussian distributions 疊合以估計複雜的 $p(x)$
首先決定是無限多個 Gaussian distributions 中的哪一個（$z$）：
$$
z \sim N(0, 1)
$$
$z$ 所決定的 Gaussian distribution $N(\mu(z), \sigma(z))$ 就是給定 $z$ 的情況下隨機變數 $x$ 的機率分布：
$$
x|z \sim N(\mu(z), \sigma(z))
$$
按照不同 Gaussian distributions 出現的機率將其疊合（對 $z$ 積分）即可得到 $p(x)$：
$$
p(x) = \int p(z)\,p(x|z)\,dz = \int p(x, z)\,dz
$$
$p(z)$ 即為 standard normal distribution，$p(x|z)$ 則是 $N(\mu(z), \sigma(z))$，然而 $\mu(z)$ 和 $\sigma(z)$ 也是待估計的，且此積分通常計算困難。
我們也可以將 $p(x)$ 透過條件機率的公式寫成：
$$
p(x) = {p(x, z) \over p(z|x)}
$$
然而後驗機率 $p(z|x)$ 也是未知。後驗機率難以計算的問題相當經典，可以透過 variational inference 的方法解決，也就是以簡單的分布 $q(z|x)$ 近似難以計算的 $p(z|x)$。
此外，為了估計最有可能的 $p(x)$，我們要最大化觀測資料 $x$ 的 log likelihood：
$$
log\,p(x) = \int q(z|x)\,log\,p(x)\,dz = \int q(z|x)\,log({p(x, z) \over p(z|x)})\,dz \\ = \int q(z|x)\,log({p(x, z) \over q(z|x)}{q(z|x) \over p(z|x)})\,dz \\ = \int q(z|x)\,log({p(x, z) \over q(z|x)})\,dz + \int q(z|x)\,log({q(z|x) \over p(z|x)})\,dz \\ = E_{q(z|x)}\,log({p(x, z) \over q(z|x)}) + KL(q(z|x)||p(z|x)) \\ \geq E_{q(z|x)}\,log({p(x, z) \over q(z|x)})\,\text{(evidence lower bound)}
$$
KL divergence 是兩個機率分布相似程度的度量，由於其值非負數，故 $E_{q(z|x)}\,log({p(x, z) \over q(z|x)})$ 為 $log\,p(x)$ 的 lower bound。又由於 $log\,p(x)$ 被稱為 evidence（因為 $log\,p(x)$ 是我們為資料選擇好的 model 的 evidence），所以 $E_{q(z|x)}\,log({p(x, z) \over q(z|x)})$ 被稱為 evidence lower bound (ELBO)。同時尋找 $p(x|z)$ 和 $q(z|x)$ 以提高 ELBO 除了可以提高 log likelihood，又可以降低 $q(z|x)$ 和 $p(z|x)$ 的 KL divergence（找到最能近似 $p(z|x)$ 的 $q(z|x)$）。
$$
E_{q(z|x)}\,log({p(x, z) \over q(z|x)}) = E_{q(z|x)}\,log({p(z)\,p(x|z) \over q(z|x)}) \\ = -\int q(z|x)\,log({q(z|x) \over p(z)})\,dz + E_{q(z|x)}\,log\,p(x|z) \\ = -KL(q(z|x)||p(z)) + E_{q(z|x)}\,log\,p(x|z)
$$
因此，我們必須最小化 $KL(q(z|x)||p(z))$：
$$
KL(q(z|x)||p(z)) = \int q(z|x)\,log({q(z|x) \over p(z)})\,dz \\ = \int q(z|x)\,log\,q(z|x)\,dz - \int q(z|x)\,log\,p(z)\,dz \\ = \int N(z; \mu, \sigma)\,log\,N(z; \mu, \sigma)\,dz - \int N(z; \mu, \sigma)\,log\,N(z; 0, 1)\,dz \\ = -{N \over 2}log(2\pi)-{1 \over 2} \Sigma_{i=0}^{N}(1+log\,\sigma_i^2) + {N \over 2}log(2\pi) + {1 \over 2} \Sigma_{i=0}^{N}(\mu_i^2+\sigma_i^2) \\ = {1 \over 2}\Sigma_i [\sigma_i^2 - (1+log\,\sigma_i^2) + \mu_i^2]
$$
這也就是直觀解釋中避免 noise 的標準差為零並加上 L2 regularization 的數學原因。
至於最大化 $E_{q(z|x)}\,log\,p(x|z)$ 即代表重建的 image 要和輸入的 image 越像越好，也就是最小化 reconstruction error。

## 參考資料
- 李宏毅老師的線上影片[ML Lecture 18: Unsupervised Learning - Deep Generative Model (Part II)](https://youtu.be/8zomhgKrsmQ)
- Variational auto-encoder paper [Auto-Encoding Variational Bayes](https://arxiv.org/pdf/1312.6114.pdf)