1. 程式人生 > >Autoencorder理解(7):Variational Autoencoder

Autoencorder理解(7):Variational Autoencoder

以下將分為6個部分介紹:

  • vae結構框架
  • vae與ae區別
  • 提及一下為什麼要取樣
  • 如何優化
  • vae應用
  • vae生成/抽象看待vae學習

1.框架:

先來看一下VAE的結構框架,並先預告一下結論: VAE 包括 encoder (模組 1)和 decoder(模組 4) 兩個神經網路。兩者通過模組 2、3 連線成一個大網路。利益於 reparemeterization 技巧,我們可以使用常規的 SGD 來訓練網路。

Figure1.VAE framework.

2.區別:

個人認為和ae在本質上的區別在於z code的生成方式,以及loss的定義. 先看一下torch vae中的程式碼對loss的定義:

img

以及梯度的回傳:

img

所以結論為:
1)在ae中,z是encoder直接的顯式輸出的神經元向量,decoder出來的衡量為距離.
2)在vae中,encoder 的輸出(2×m 個數)視作分別為 m 個高斯分佈的均值(z_mean)和方差的對數(z_log_var)而輸入decoder的z是根據均值和方差生成服從相應高斯分佈的隨機數的一個向量.對編碼器新增約束,就是強迫它產生服從單位高斯分佈的潛在變數。正式這種約束,把VAE和標準自編碼器給區分開來了。 如下:

imgimg

我們計算解碼器的loss時,我們就可以從標準差向量中取樣,然後加到我們的均值向量上,就得到了編碼去需要的潛在變數。

img

同時,decoder出來的衡量為交叉熵加kl散度:

img

3.為什麼要取樣:

為了SGD能夠使用。

運用了 reparemerization 的技巧。由於 z∼N(μ,σ),我們應該從 N(μ,σ) 取樣,但這個取樣操作對 μ 和 σ 是不可導的,導致常規的通過誤差反傳的梯度下降法(GD)不能使用。通過 reparemerization,我們首先從 N(0,1) 上取樣 ϵ,然後,z=σ⋅ϵ+μ。這樣,z∼N(μ,σ),而且,從 encoder 輸出到 z,只涉及線性操作,(ϵ 對神經網路而言只是常數),因此,可以正常使用 GD 進行優化。

img

4.如何優化:

1)首先明確目標:
encoder 和 decoder 組合在一起,我們能夠對每個 x∈X,輸出一個相同維度的 x̂ 。我們目標是,令 x̂ 與 x 自身儘量的接近。即 x 經過編碼(encode)後,能夠通過解碼(decode)儘可能多的恢復出原來的資訊。 (注:嚴格而言,按照模型的假設,我們要優化的並不是 x 與 x̂ 之間的距離,而是要最大化 x 的似然。

即若是encoder/decoder的編碼過程中,編碼滿足的是一個x 與 x̂ 之間最大似然概率分佈.

2)定義損失函式以及約束:
不同的損失函式,對應著不是 p(x|z) 的不同概率分佈假設,由於 x∈[0,1],因此,我們用交叉熵(cross entropy)度量 x 與 x̂ 差異,xent 越小,x 與 x̂ 越接近。

img

我們也可以用均方誤差來度量,mse 越小,兩者越接近。

img

3)訓練過程中的附加約束KL散度
訓練過程中,輸出即是輸入,這便是 VAE 中 AE(autoencoder,自編碼)的含義。另外,我們需要對 encoder 的輸出 z_mean(μ)及 z_log_var(logσ2)加以約束。這裡使用的是 KL 散度。

img

4)總的優化目標:

img

5.vae應用:

1)相似資料生成:
由於我們指定 p(z) 標準正態分佈,再接合已經訓練和的 decoder (p(x|z)),就可以進行取樣,生成類似但不同於訓練集資料的新樣本。

img

下圖是基於訓練出來的 decoder,取樣生成的影象x̂ 。 嚴格來說,生成下圖的程式碼並不是取樣,而是 E[x|z] 。伯努力分佈和高斯分佈的期望,正好是 decocder 的輸出 x̂。

img

2)高維資料視覺化:
encoder 可以將資料 x,對映到更低維的 z 空間,如果是2維或3維,就可以直觀的展示出來。

img

3) 缺失資料補充:
對許多現實問題,樣本點的各維資料存在相關性。因此,在部分維度缺失或不準確的情況,有可能通過相關資訊得到填補。下圖展示一個簡單的資料填補的例項。其中,第一行為原圖,第二行為人行中間某些畫素的缺失圖,第三行為利用 VAE 模型恢復的圖。

img

4)半監督學習:
相比於高成本的有標註的資料,無標註資料更容易獲取。半監督學習試圖只用一小部分有標註的資料加上大量無標註資料,來學習到一個較好預測模型(分類或迴歸)。
VAE 是無監督的,而且也可以學習到較好的特徵表徵,因此,可以被用來作無監督學習。

6.vae學習到的問題抽象:

1)模型結構類別ae:

從模型結構(以及名字)上看,VAE自編碼器(audoencoder)非常的像。特別的,VAE 和 CAE(constractive AE)非常相似,兩者都對隱層輸出增加長約束。而 VAE 在隱層的取樣過程,起到和 dropout 類似的正則化作用。

2)學習過程中,實際為學習一個分佈

資料雖然高維,但相似資料可能分佈在高維空間的某個流形上(例如下圖)。而特徵學習就要顯式或隱式地學習到這種流形。正是這種流形分佈,我們才能從低的隱變數恢復出高維的觀測變數。如上面回覆mnist資料,相似的隱變數對應的觀測變數確實比較像,並且這樣相似性是平滑的變化。

img

3) 資料生成的衡量: 舉個例子, 當我們計算解碼器的loss時,我們就可以從標準差向量中取樣,然後加到我們的均值向量上,就得到了編碼去需要的潛在變數, 實現如下圖:

img

VAE除了能讓我們能夠自己產生隨機的潛在變數,這種約束也能提高網路的產生圖片的能力。 
為了更加形象,我們可以認為潛在變數是一種資料的轉換。 我們假設我們有一堆實數在區間[0, 10]上,每個實數對應一個物體名字。比如,5.43對應著蘋果,5.44對應著香蕉。當有個人給你個5.43,你就知道這是代表著蘋果。我們能用這種方法夠編碼無窮多的物體,因為[0, 10]之間的實數有無窮多個。

但是,如果某人給你一個實數的時候其實是加了高斯噪聲的呢?比如你接受到了5.43,原始的數值可能是 [4.4 ~ 6.4]之間的任意一個數,真實值可能是5.44(香蕉)。
如果給的方差越大,那麼這個平均值向量所攜帶的可用資訊就越少。現在,我們可以把這種邏輯用在編碼器和解碼器上。

編碼越有效,那麼標準差向量就越能趨近於標準高斯分佈的單位標準差。 (以0為均數、以1為標準差的正態分佈,記為N(0,1)) 這種約束迫使編碼器更加高效,並能夠產生資訊豐富的潛在變數。這也提高了產生圖片的效能。而且我們的潛變數不僅可以隨機產生,也能從未經過訓練的圖片輸入編碼器後產生。