一句話說明:AE簡單來說就是encode先壓縮真實樣本成一個隱變量(一般用z表示),在逆向decode還原生真實樣本通大小的新樣本。調整中間參數,使得前后樣本盡量相似或相同,這樣中間隱變量就能展現原來樣本的特征了。VAE在此基礎上,生成Z前,添加方差(即噪音),構成一個分布式結構,其它基本與AE相同。
一、簡單介紹
變分自編碼器(Variational Autoencoder,VAE),依據李宏毅老師的講解,VAE作為一個生成模型,其基本思路是很容易理解的:把一堆真實樣本通過編碼器網絡變換成一個理想的數據分布,然后這個數據分布再傳遞給一個解碼器網絡,得到一堆生成樣本,生成樣本與真實樣本足夠接近的話,就訓練出了一個自編碼器模型。
那VAE(變分自編碼器)就是在自編碼器模型上做進一步變分處理,使得編碼器的輸出結果能對應到目標分布的均值和方差,如下圖所示,具體的方法和思想在后文會介紹:

二、標准自編碼器——AE
本節主要來源於【1】。

2.1 用one-hot向量
我們用[1, 0, 0, 0]代表貓,用[0, 1, 0, 0]代表狗。雖然這要沒什么問題,但是我們最多只能儲存4張圖片。當然,我們也可以增加向量的長度和網絡的參數,那么我們可以獲得更多的圖片。
2.2 向量表示
上述向量很稀疏。為了解決這個問題,我們想使用實數值向量而不是0,1向量。可認為這種實數值向量是原圖片的一種編碼,這也就引出了編碼/解碼的概念。舉個例子,[3.3, 4.5, 2.1, 9.8]代表貓,[3.4, 2.1, 6.7, 4.2] 代表狗。這個已知的初始向量可以作為我們的潛在變量。
2.3 標准自編碼器——AE
如果像我上面一樣,隨機初始化一些向量去代表圖片的編碼,這不是一個很好的辦法,我們更希望計算機能幫我們自動編碼。在autoencoder模型中,我們加入一個編碼器,它能幫我們把圖片編碼成向量。然后解碼器能夠把這些向量恢復成圖片。

我們現在獲得了一個有點實際用處的網絡了。而且我們現在能訓練任意多的圖片了。如果我們把這些圖片的編碼向量存在來,那以后我們就能通過這些編碼向量來重構我們的圖像。我們稱之為標准自編碼器。
三、VAE直白理解
3.1 文字簡述VAE
但我們想建一個產生式模型,而不是一個只是儲存圖片的網絡。現在我們還不能產生任何未知的東西,因為我們不能隨意產生合理的潛在變量。因為合理的潛在變量都是編碼器從原始圖片中產生的。這里有個簡單的解決辦法。我們可以對編碼器添加約束,就是強迫它產生服從單位高斯分布的潛在變量。正是這種約束,把VAE和標准自編碼器給區分開來了。
現在,產生新的圖片也變得容易:我們只要從單位高斯分布中進行采樣,然后把它傳給解碼器就可以了。
事實上,我們還需要在重構圖片的精確度和單位高斯分布的擬合度上進行權衡。
我們可以讓網絡自己去決定這種權衡。對於我們的損失函數,我們可以把這兩方面進行加和。一方面,是圖片的重構誤差,我們可以用平均平方誤差來度量,另一方面。我們可以用KL散度來度量我們潛在變量的分布和單位高斯分布的差異。
為了優化KL散度,我們需要應用一個簡單的參數重構技巧:不像標准自編碼器那樣產生實數值向量,VAE的編碼器會產生兩個向量:一個是均值向量,一個是標准差向量。

3.2 舉例說明VAE
為了更加形象,我們可以認為潛在變量是一種數據的轉換。
我們假設我們有一堆實數在區間[0, 10]上,每個實數對應一個物體名字。比如,5.43對應着蘋果,5.44對應着香蕉。當有個人給你個5.43,你就知道這是代表着蘋果。我們能用這種方法夠編碼無窮多的物體,因為[0, 10]之間的實數有無窮多個。
但是,如果某人給你一個實數的時候其實是加了高斯噪聲的呢?比如你接受到了5.43,原始的數值可能是 [4.4 ~ 6.4]之間的任意一個數,真實值可能是5.44(香蕉)。如果給的方差越大,那么這個平均值向量所攜帶的可用信息就越少。
我們可以把這種邏輯用在編碼器和解碼器上。編碼越有效,那么標准差向量就越能趨近於標准高斯分布的單位標准差。
這種約束迫使編碼器更加高效,並能夠產生信息豐富的潛在變量。這也提高了產生圖片的性能。而且我們的潛變量不僅可以隨機產生,也能從未經過訓練的圖片輸入編碼器后產生。
用文獻【5】的圖示很好理解這兩者的差距:


四、VAE的模型理論
4.1 模型框架
本節理解主要來源於【7】,其中比較難理解的部分為一對一配對:
再次強調,這時候每一個 Xk 都配上了一個專屬的正態分布,才方便后面的生成器做還原。但這樣有多少個 X 就有多少個正態分布了。我們知道正態分布有兩組參數:均值 μ 和方差 σ^2(多元的話,它們都是向量)。
個人理解:數量是一對一的,只是維度上有差異。降低的是單個物品的維度。

從損失函數出發:重構損失(D(X̂k,Xk)^2) + KL loss:

首先,我們希望重構X,也就是最小化(D(X̂k,Xk)^2),但是這個重構過程受到噪聲的影響,因為Zk是通過重新采樣過的,不是直接由encoder算出來的。顯然噪聲會增加重構的難度,不過好在這個噪聲強度(也就是方差)通過一個神經網絡算出來的,所以最終模型為了重構得更好,肯定會想盡辦法讓方差為0。而方差為0的話,也就沒有隨機性了,所以不管怎么采樣其實都只是得到確定的結果(也就是均值)。說白了,模型會慢慢退化成普通的AutoEncoder,噪聲不再起作用。
為了使得為了使模型具有生成能力,VAE決定讓所有的p(Z∣X)都向標准正態分布看齊。如果所有的p(Z∣X)都很接近標准正態分布N(0,I),那么根據定義:

這樣我們就能達到我們的先驗假設:p(Z)是標准正態分布。然后我們就可以放心地從N(0,I)中采樣來生成圖像或者其他原始信息了。那怎么讓所有的p(Z∣X)都向N(0,I)看齊呢?如果沒有外部知識的話,其實最直接的方法應該是在重構誤差的基礎上中加入額外的loss:

因為它們分別代表了均值μ 和方差的對數logσ2,達到N(0,I)就是希望二者盡量接近於0了。不過,這又會面臨着這兩個損失的比例要怎么選取的問題,選取得不好,生成的圖像會比較模糊。所以,原論文直接算了一般(各分量獨立的)正態分布與標准正態分布的KL散度KL(N(μ,σ2)∥N(0,I))作為這個額外的loss,計算結果為:

這里d是隱變量的維度,μi和σi表示分別代表一般正態分布的均值向量和方差向量的第i個分量。直接用這個式子做補充loss,就不用考慮均值損失和方差損失的相對比例問題了。顯然,這個loss也可以分兩部分理解:

4.2 Reparameterization Trick
這是實現模型的一個技巧。我們要從p(Z∣Xk)中采樣一個Zk出來,盡管我們知道了p(Z∣Xk)是正態分布,但是均值方差都是靠模型算出來的,我們要靠這個過程反過來優化均值方差的模型,但是"采樣"這個操作是不可導的,而采樣的結果是可導的,於是我們利用了一個事實:


於是,我們將從N(μ,σ2)采樣變成了從N(0,I)中采樣,然后通過參數變換得到從N(μ,σ2)中采樣的結果。這樣一來,"采樣"這個操作就不用參與梯度下降了,改為采樣的結果參與,使得整個模型可訓練了。
4.3 VAE本質
VAE本質上就是在我們常規的自編碼器的基礎上,對encoder的結果(在VAE中對應着計算均值的網絡)加上了"高斯噪聲",使得結果decoder能夠對噪聲有魯棒性;而那個額外的KL loss(目的是讓均值為0,方差為1),事實上就是相當於對encoder的一個正則項,希望encoder出來的東西均有零均值。
那另外一個encoder(對應着計算方差的網絡)的作用呢?它是用來動態調節噪聲的強度的。直覺上來想,當decoder還沒有訓練好時(重構誤差遠大於KL loss),就會適當降低噪聲(KL loss增加),使得擬合起來容易一些(重構誤差開始下降);反之,如果decoder訓練得還不錯時(重構誤差小於KL loss),這時候噪聲就會增加(KL loss減少),使得擬合更加困難了(重構誤差又開始增加),這時候decoder就要想辦法提高它的生成能力了。

簡言之,重構的過程是希望沒噪聲的,而KL loss則希望有高斯噪聲的,兩者是對立的。所以,VAE跟GAN一樣,內部其實是包含了一個對抗的過程,只不過它們兩者是混合起來,共同進化的。
五、模型比較


上圖分別是AE,VAE和GAN
5.1 VAE和AE的比較:
相同點:兩者都是X->Z->X'的結構
不同點:AE尋找的是單值映射關系,即:z=f(x)。而VAE尋找的是分布的映射關系,即:DX→DZ
為什么會有這個差別呢?我們不妨從生成模型的角度考慮一下。既然AE的decoder做的是Z−>X'的變換,那么理論上它也可以作為生成器使用。但這里有個問題,顯然不是所有的RZ都是有效的Z。Z的邊界在哪里?如何得到有效的Z,從而生成x?這些都不是AE能解決的。VAE映射的是分布,而分布可以通過采樣得到有效的z,從而生成相應的x。個人理解:換句話說,AE是固定的z,而VAE是一個分布(一般是由均值和標准差構成的正態分布),相當於一個概率范圍。若是將VAE中的方差設置為0,則就是為AE的形式。
5.2 VAE和GAN:
VAE(Variational Auto-Encoder)和GAN(Ganerative Adversarial Networks)都是生成模型(Generative model)
AE是可以理解為VAE中encoder輸出的方差為0的一種情況,這個時候就是單值映射了。就我目前的理解,GAN中引入的隨機數是為了輸出的多樣性,而VAE引入隨機數是為了增大泛化性。
相比於變分自編碼器, GANs沒有引入任何決定性偏置( deterministic bias),變分方法引入決定性偏置,因為他們優化對數似然的下界,而不是似然度本身,這看起來導致了VAEs生成的實例比GANs更模糊。當然要區別看待這個問題:GAN的目的是為了生成,而VAE目的是為了壓縮,目的不同效果自然不同。
附件一:問答
Q1:我們的模型卻要最小化重構誤差,讓X_k對應的z_k分布盡可能包含X_k樣本的信息,最后又要再最小化z的分布和N(0,1),在N(0,1)上采樣z來生成。這樣做的目的是什么?
A1 :這個做法的目的是引入噪音,提高模型的泛化能力。比如極端點,假如一個網絡死記硬背住了各個X和z的對應,也可以做到重構誤差很低,但是沒有任何泛化能力。強迫z必須從分布中取樣,就是讓網絡不能這么干
Q2:loss包含哪些,怎么訓練
A2:總的loss等於重構誤差加KL loss,如果不用概率分布,直接用均值做重構(就是傳統的encoder-decoder)是比較容易訓練的,能得到更大的loss的下降。所以開始訓練梯度會選擇這個路徑,等到重構誤差不大了,梯度慢慢會傾向於降低KL loss
參考文獻
【1】Variational Autoencoders Explained: http://kvfrans.com/variational-autoencoders-explained/
【2】李宏毅老師視頻: https://www.bilibili.com/video/av15889450/?p=33
【3】解釋: http://www.gwylab.com/note-vae.html
【4】論文:2014-Diederik P Kingma, Max Welling: Auto-Encoding Variational Bayes
【5】Variational Autoencoders: https://www.jeremyjordan.me/variational-autoencoders/
【6】VAE解釋,實踐用的全連接形式:https://zhuanlan.zhihu.com/p/27549418
【7】蘇劍林理解VAE: https://zhuanlan.zhihu.com/p/34998569
【8】變分自編碼器介紹、推導及實現 https://zhuanlan.zhihu.com/p/83865427
