1. 程式人生 > >白話Variational Autoencoder(變分自編碼器)

白話Variational Autoencoder(變分自編碼器)

本文將簡單介紹一下Variational Autoencoder。作者也在學習當中,如有不正確的地方,請大家指正,謝謝~

原始的autoencoder一般分為兩個部分encoder part和decoder part。 encoder是將input轉化為encoding vector,之後通過decoder network重新構造input。


圖1 origanal autoencoder (from wikipedia)

VAE(變分自編碼器) 與原始autoencoder不同的是,在encoder部分通過用概率分佈來表示每一個潛在的特徵。

舉個例子:


圖2 (from reference)

上面的圖中,在經過encoder部分後,我們用一個具體的數來表述每一個潛在的特徵,比如smile的值是0.99。但是有些時候,我們希望用一個區間來表示所有可能的潛在特徵值,這就有了下圖的表示,通過用一個概率分佈函式來表示潛在的特徵。當我們通過潛在狀態decoding時,我們首先對每個概率分佈生成隨機樣本,之後再重新構造input。


圖3 (from reference)

VAE的結構如下圖所示:


圖4 

下面簡單介紹一下VAE背後的統計知識。


圖5

我們有一個隱含變數(hidden variable)Z 是由 X生成的,關係如上圖所示。我們目前只知道X,但是我們想要獲得Z的特徵,換句話說,我們希望計算條件概率p(z|x),應該如何計算呢?

我們知道

其中積分部分非常難計算,所以我們考慮用variational inference間接估算p(z|x)的值。這其中我們用到KL divergence(用來計算兩個概率分佈相似度)。我們通過q(z|x),來近似估計p(z|x)的值,即我們希望minKL(q(z|x) || p(z|x))。具體的推倒過程就不在這裡詳細講述了。

最後想要說明的一點,在實際應用過程中,為了做backpropagation,(如下面左邊的圖中,z的值是一個隨機變數,所以在反向傳播過程中我們沒有辦法計算對z導數)我們通常用reparametrization trick代替randomly sample,(即通過引入一個高斯分佈e,將z變成一個確定的值,從而使得反向傳播可以得以計算)具體過程如下:(圖中圓圈代表隨機變數,方塊代表變數的值是確定的)


圖6

參考資料:

https://www.jeremyjordan.me/variational-autoencoders/

注:文中未標明出處的圖都是作者自己畫的, 如有錯誤和補充, 請留言。轉載請標明出處。謝謝~