# VAE detail
在training階段學習到p(z), 也就是prior
後於使用model時,從p(x) mapping 到p(z), 再由prior mapping 出x'。
下述三個機率先置知識,放在另一個hackmd內:
Maximum Likelihood Estimation(MLE)
Maximum a Posterior(MAP)
Marginal Likelihood
https://hackmd.io/5gu5SPJzR1qJvOVZ_mMSHg
## VAE main
現在輸入樣本x,VAE目的是將其透過encoder輸出低維隱藏分布p(z)的平均值向量及標準差向量以代表p(z),再將p(z)透過decoder試圖還原出x
首先我們有sample x,想找出其prior p(z)
$p_\theta (x,z)=p_\theta (x|z)p(z)$
theta為母數,在模型中是block內的node參數
所以我們知道
$p(x)=\int p_\theta (x,z)dz=\int p_\theta (x|z)p(z)dz$
上式是decoder在做的事
因為我們想讓encoder的輸出為機率分布,所以他的表示只有mean向量及std向量,又其為哪種機率分布我們也不會知道,是由向量中這些mean及std做出的高斯分布疊加成的,所以又稱z為隱藏分布。

在過程中,我們會先設x1,x2,...,xn的資料點之間為獨立關係,取log才分得開來
$logp_\theta (x1,x2,...,xn)=\sum logp_\theta (xi)$
$logp(x)=\mathbb{E}_{q_\phi (z|x)}[logp(x)]=\int _zq(z|x)logp(x)dz=\int _zq(z|x)log(p(z,x)/p(z|x))dz$
$=\int _zq(z|x)log(\frac{p(z,x)}{q(z|x)}\frac{q(z|x)}{p(z|x)})dz=\int _zq(z|x)log(\frac{p(z,x)}{q(z|x)})dz+\int _zq(z|x)log(\frac{q(z|x)}{p(z|x)})dz$
末兩項,後者$\int _zq(z|x)log(\frac{q(z|x)}{p(z|x)})dz$為KL divergence,記做$D_{KL}(q(z|x)||p(z|x))$,為正數,可以介定$q(z|x)$與$p(z|x)$的相似程度,當其趨近於零時,模型即收斂
q(z|x)是我們做出來的機率分布,p(z|x)為實際情況的posterior
前者$\int _zq(z|x)log(\frac{p(z,x)}{q(z|x)})dz=\int _zq(z|x)log(\frac{p(x|z)p(z)}{q(z|x)})dz$叫做lower bound
我們知道:
$p(z|x)=\frac{p(x|z)p(z)}{p(x)}$
也就是
$p(x)=\frac{p(x|z)p(z)}{p(z|x)}$
同取log再取z的期望值就跟lower bound很像,差異在於$q(z|x)$與$p(z|x)$,所以lower bound越大,也是在說明model的收斂程度
有了上面這些,我們就能訓練一個model,使其可以做出一q(z),讓KL divergence收斂到趨近於0後就可以代表prior p(z),從而可以重建出x
