


因此在VAE中,encoder輸出的不直接是code,而是一組m和一組σ,而向量c才是真正的加了噪聲的code,其中ci = exp(σi) x ei + mi。訓練過程中的優化目標也不僅是重構誤差,還有一項 Σ (exp(σi) - (1+σi) + (mi)2),要強迫加的噪聲的方差不能太小(因為是模型學習的參數,如果不做限制,為了能重構的更好,會越更新σi 越使得噪聲方差接近0;而實際上我們希望σi 接近0(真正的方差接近1),所以最小化exp(σi) - (1+σi),mi平方項可以理解為L2 norm正則)。

而 VAE 實際上就是GMM的 distributed representation 的版本,先從一個高斯分布中采樣出一個向量 z, z 的每個維度就表示某一種特性,再根據 z 來決定高斯分布的 μ 和 σ。由於 z 是連續的,所以有無窮多個z,就有無窮多個高斯分布(在GMM中有幾個高斯就是固定的)。在z的空間中,每個點都可能被sample到,而每一個點都對應到一個不同的高斯分布。
那么如何得到 z 和高斯的 μ 和 σ之間的對應關系呢?干脆就用一個NN來描述 μ(z) 和 σ(z) 的函數關系。
所以在整個 VAE 模型中,關鍵不是使用 p(z)(先驗分布)是正態分布的假設(z服從別的分布也可以),而是假設 p(z | x)(后驗分布)是正態分布(GMM)。
但直接這樣處理的話會導致梯度更新出現問題。因為 z 要從后驗分布中 sampling 得到,這種隨機性會導致 encoder-decoder 不可微。所以采用 re-parameterization trick ,引入一個新的變量來表示不確定性,把采樣過程移出計算圖,就可以梯度更新了,而新引入的變量處理為一個 weight 固定的輸入。例如下圖,本來是想要從 N(x, Φ2) 中采樣 z ;現在從 N(0, 1) 中采樣得到 ε , 然后令 z = x + ε*Φ 即可。
回到 VAE 的目標函數。估計 μ(z) 和 σ(z) 的方法就是最大似然估計,令 μ(z) 和 σ(z) 的取值使得對手上所有的數據x的似然越大越好。
任務就是要通過極大似然估計來更新 μ(z) 和 σ(z) 這兩個函數,也就是更新對應的NN參數(decoder)。此外引入一個任意的分布 q(z | x),作用接下來再說,它也是由一個NN來表示。
接下來求解 log p(x),先引入一個任意的分布q(z | x)再把它積掉,其中 p(x) = p(x, z)/p(z | x),代入展開,發現對數似然函數的下界。
如果只是優化 p(x | z) 令 Lb 變大,雖然下界變大了,但 log p(x) 整體卻不一定變大,因為不知道log p(x) 和 Lb 之間的差距是多少。引入 q(z | x) 的目的就在於,如果固定 p(x | z) 優化 q(z | x) 令下界變大,由於 q(z | x) 和 p(x) 無關,所以 log p(x) 的值不會改變,那么當Lb 變大,q(z | x) 和 p(z | x) 的 KL散度就會變小,理想情況下 q(z | x) 和 p(z | x) 一致,Lb 變大到和 log p(x) 相等,這時候如果再優化 p(x | z) 令Lb 變大,那么 log p(x) 就一定會隨之變大。
然后展開 Lb 看如何最大化它,其中第一項為 - KL(q(z | x) || p(z)),最大化 Lb 的過程中,q(z | x) 和 p(z) 的 KL散度會最小化(q(z | x) 會越來越接近 p(z)),這就是 VAE 目標函數中 Σ (exp(σi) - (1+σi) + (mi)2) 的作用。
而最大化第二項即為最大化 Eq(z | x)[logp(x | z )],也就是給定一個 x , 根據 q(z | x) 來 sample 一個 z,然后要最大化log p(x | z) 。這就是 autoencoder 的拓撲結構的作用。因為高斯分布在均值的位置采樣概率最大,所以就忽略σ(z),讓最后的 μ(z) 和 數據 x 越接近越好。
VAE 的問題就是不會生成新的數據,產生的數據是訓練集中已有的、最多可能也只是訓練集中已經有的數據的線性組合。這是被定義在 component 層面的目標函數所限制的。