一文讀懂變分自編碼器VAE,搞定圖像或文本生成

一文讀懂變分自編碼器VAE,搞定圖像或文本生成

變分自編碼器網絡架構(可用於圖像或者文本的壓縮與生成)

變分自編碼器(VAE)是複雜分佈上無監督學習最具前景的方法之一,是重要深度學習中重要的生成模型,應用於圖像(Auto-Encoding Variational Bayes )或文本生成(Generating Sentences from a Continuous Space)。自動編碼器將輸入數據順序地解構為隱藏表示,並使用這些表示來順序地重構與它們的原始內容相似的輸出。它本質上是數據特定的數據壓縮,而這意味著它只能對類似於已經它訓練的數據進行壓縮。同時這意味著,我們可以進行數據的復原或者說生成。

當然,自動編碼器也被公認為是有損耗的,因此相較於原始輸入,解壓縮輸出結果會稍微降低一些。那麼大家可能會有所疑問,如果它們會造成質量損失,為什麼還那麼實用呢?這是一個很好的問題,事實證明,它們對於數據去噪是非常有用的,即我們在這裡訓練一個自動編碼器,從自身損壞版本中重構輸入,這樣它就可以消除類似的損壞數據。

在瞭解VAE前,首先我們來談談貝葉斯推理(Bayesian inference)。所有閱讀這篇文章的人可能都知道深度學習,以及談到近似複雜函數時它的有效性,然而

貝葉斯推理提供了一個獨特的框架來解釋不確定性,所有的不確定性都是用概率表示的。這是有道理的,如果你仔細想想,在任何給定的時間,都有證據支持或反對我們已知的事物,這些證據可以被用來創造一個新的概率。再進一步,當我們學習新的東西時,我們必須考慮我們已經知道的,並將新的證據加入到考慮範圍內,創造一個新的概率。貝葉斯理論基本上是用數學方法描述這個概念的。

VAE就是這些想法的產物。從貝葉斯的角度來看,我們可以將VAE的輸入、隱藏表示和重構輸出視為有向圖形模型中的概率隨機變量。假設它包含一些數據的特定概率模型,x和潛在/隱藏變量z,我們便可以寫出模型的聯合概率,如下所示:

一文讀懂變分自編碼器VAE,搞定圖像或文本生成

模型的聯合概率

給定模型生成的一個字符,我們不知道隱形變量的設置是如何生成這個字符的,我們的模型本質上就是隨機的!

VAE由3個主要部分組成:

•編碼器

•解碼器

•損失函數

給定輸入x,假設我們有一個28×28的手寫數字圖像,它可以達到784維度,其中每個像素都是一維的。現在,這將會編碼到一個潛在/隱藏的表示空間,而這將要比784少很多。我們現在可以採樣高斯概率密度來獲得表示的噪聲值。

是不是很酷?下面我們就用代碼來將這個表示出來吧。

首先,我們導入庫並找到我們的超參數。

一文讀懂變分自編碼器VAE,搞定圖像或文本生成

接下來,初始化編碼器網絡。該網絡的工作是將輸入映射到隱藏的分佈參數中。我們接受輸入,並通過ReLU(壓縮維度的經典非線性激活函數)的密集完全連接層發送它。下一步,我們將輸入數據轉換為隱藏空間中的兩個參數。我們使用密集,完全連接層 - z mean和z log sigma來預定義大小。

一文讀懂變分自編碼器VAE,搞定圖像或文本生成

解碼器將“z”作為其輸入,並將參數輸出到數據的概率分佈中。我們假設每個像素是1或0(黑色或白色),現在我們可以使用伯努利分佈,因為它會將“成功”定義為二進制值來表示單個像素。因此,解碼器將獲得一個數字的潛在/隱藏表示以作為其輸入,並且它會輸出784個伯努利參數,每個像素一個,所以在0和1之間有784個值。

我們將使用z_mean和z_log_var,通過定義採樣函數,從隱藏/潛在正態分佈中隨機抽取新的類似點。以下代碼塊中的epsilon是一個隨機正態張量。

一文讀懂變分自編碼器VAE,搞定圖像或文本生成

一旦我們得到z,我們可以將其提供給我們的解碼器,解碼器會將這些潛在空間點映射回原始輸入數據。因此,為了構建一個解碼器,我們首先用兩個完全連接層及其它們各自的激活函數對其進行初始化。因為數據是從一個小的維度提取到一個較大維數,所以其中一些會在重構過程中丟失。

一文讀懂變分自編碼器VAE,搞定圖像或文本生成

確實很酷?但是這個“一些”到底是多少呢?為了獲取準確值,我們將建立損失函數對其進行精確測量。下面的第一項是測量重構損失。如果解碼器 輸出在重建數據方面很糟糕,那麼損失方面的成本就會相當大。下一個項是正則化項,意味著它可以保持每個數字的表示儘可能多樣化。所以舉個例子來說就是,如果兩個不同的人同時寫出數字3,那麼這些表示結果可能會看起來很不一樣,因為不同的人寫的結果當然會不一樣。這可能是一個不盡如人意的結果,而正則化項的任務就是拯救“不如意”!我們對不良行為進行懲罰(如這裡的例子),並確保類似的表示是緊密相連的。

我們可以將總損失函數定義為重構項和KL的散度正則化項的總和。

一文讀懂變分自編碼器VAE,搞定圖像或文本生成

現在來到訓練部分,我們通常會使用梯度下降來訓練這個模型,以優化我們對編碼器和解碼器參數的損失。但是我們如何對隨機確定的變量的參數進行衍生?

原來,我們已經將隨機性建立在我們的模型本身上了。現在,梯度下降通常期望一個給定的輸入總是返回一個固定參數組的相同輸出。在我們這種情況下唯一的隨機來源將是輸入。那麼我們如何解決這個問題呢?我們重新確定參數!我們將對樣本進行重新確定參數,使得隨機性可以獨立於參數。

我們將定義一個取決於參數確定性的函數,因此我們可以通過引入隨機變量將隨機性注入到模型中。編碼器將生成平均值向量和標準偏差向量,而不是生成實數值的向量。我們採用涉及z的函數關於其分佈參數的導數。我們將模型的優化器定義為rmsprop,並將損失函數定義為vae_loss。

我們通過導入MNIST數據集並將它們饋送到我們的模型中,為給定數量的訓練次數和批量大小開始下面的訓練。

一文讀懂變分自編碼器VAE,搞定圖像或文本生成

下面我們畫出二維平面上的鄰域。每個顏色聚類用一個數字表示,而閉合聚類本質上是與結構相似的數字。

一文讀懂變分自編碼器VAE,搞定圖像或文本生成

一文讀懂變分自編碼器VAE,搞定圖像或文本生成

數字表示法

另一種表示方法是通過掃描潛在計劃(latent plan)生成數字,定期採樣潛點,併為這些點生成相應的數字,如下所示:

一文讀懂變分自編碼器VAE,搞定圖像或文本生成

一文讀懂變分自編碼器VAE,搞定圖像或文本生成

一文讀懂變分自編碼器VAE,搞定圖像或文本生成

生成的數字

這在某些程度上讓你感到震撼!

所以這個練習在本質上有三個關鍵的要點:

•變分編碼器允許我們通過執行無監督學習以生成數據。

•VAE =貝葉斯推理+深度學習。

•重參數化使我們能夠通過網絡進行反向傳播,隨機獨立的參數使我們能夠得出梯度。

github:https://github.com/vvkv/Variational-Auto-Encoders/blob/master/Variational%2BAuto%2BEncoders.ipynb。


分享到:


相關文章: