- 生成對抗網絡GAN:原理與實踐
- 言有三 郭曉洲
- 3275字
- 2023-11-09 18:51:33
1.2.4 變分自編碼器
自編碼器(autoencoder)在深度學習中占有重要地位,它最開始只是用于降維或者特征學習。一般的自編碼器由編碼器(encoder)和解碼器(decoder)兩個神經網絡構成,如圖1-11所示。

圖1-11 自編碼器結構
樣本x經過編碼器得到它的某種編碼表示z,而且z的維度一般小于x,再將編碼向量z送入解碼器則可得到樣本x的重構x′。如果重構的效果比較好,則認為編碼器成功地學到了樣本的抽象特征,也可以理解為實現了降維。當學習到數據的抽象特征z后,我們不僅可以用于樣本的重構,也可以把提取到的抽象特征用于分類問題,只需要在編碼器后接一個分類器即可,如圖1-12所示。隱變量在生成模型中具有非常重要且廣泛的應用,一方面它可以對樣本進行某種“有意義”的表示;另一方面,基于隱變量的模型相對于FVBN模型具有更高的采樣速度。因為FVBN模型中只包含觀察變量,且觀察變量被建立前后依賴關系,所以我們可以將其中的部分觀察變量修改為隱變量(隱變量是指不可觀測到的變量,但它與模型中可觀察變量存在某種相關關系),并建立兩者的條件概率關系,從而獲得更快的采樣速度。

圖1-12 將自編碼器用于分類任務
VAE[7]將自編碼器構建成一個生成模型。它將z視為生成樣本的隱變量,并對編碼器和解碼器進行了一些修改,最終實現了一個性能卓越的生成模型。與FVBN和GAN等生成模型不同,VAE希望定義一個通過隱變量來生成樣本的生成模型:

這個生成模型生成樣本的方式十分簡潔優雅:先從隱變量的分布pθ(z)中采樣得到z,然后在條件分布pθ(x|z)中采樣即可生成樣本,但是這個生成模型無法被直接搭建出來!因為訓練生成模型通常需要將對數似然函數極大化來求解模型參數θ,即對N個獨立同分布的訓練樣本{x(1),x(2),…,x(N)}來說,要求:。這里必然要計算pθ(x),分析pθ(x)的計算式子。積分號內部是相對容易求解的,對于隱變量z的先驗分布pθ(z),可以將其設計為簡單的高斯分布,對于pθ(x|z),可使用一個神經網絡來學習,難以解決的地方是求積分時需要遍歷所有的隱變量z,因為z在理論上是不可能被精確地遍歷的。另外,隱變量z的后驗分布為:

它也是難以求解的。訓練生成模型必須先求解對數似然函數(也就是說以似然函數作為損失函數),然后使其最大。VAE的想法是:雖然無法求解準確的對數似然函數,但可以設法得到對數似然函數的下界,然后令其下界極大化,這就相當于近似地令對數似然函數達到極大。具體做法是,VAE引入一個新的概率分布qφ(z|x)來逼近后驗分布pθ(z|x),這時的對數似然函數為:

最終的式子由三項組成,前兩項是可以計算的,第三項無法計算,但是根據KL散度的性質可知第三項必定大于或等于0,也就是說

我們將上述不等式右側稱為一個變分下界(ELBO),記為l(x(i);θ,φ),這時只需要最大化變分下界即可,即將變分下界作為模型的損失函數:

至此,VAE的最核心的想法已實現,接下來將描述一些細節,例如,如何將數學模型轉換到神經網絡上?即如何計算變分下界 EBLO?首先來看 EBLO的第二項DKL(qφ(z|x(i))pθ(z)),計算隱變量z的后驗分布的近似分布qφ(z|x(i))和隱變量的先驗分布pθ(z)的KL散度。基于實際經驗,我們做出兩個基本假設:①隱變量的先驗分布pθ(z)為D維標準高斯分布N(0,I),注意這時的pθ(z)將不包含任何未知參數,重新記為p(z);②隱變量的后驗分布的近似分布qφ(z|x(i))為各分量彼此獨立的高斯分布N(μ,Σ;x(i)),也就是說,每一個樣本x(i)均對應一個D維高斯分布N(μ,Σ;x(i))。現在只需要再知道μ(x(i))、Σ(x(i))就可以計算KL散度了。我們用兩個神經網絡(即編碼器,參數為φ)來求解均值、方差的對數(因為方差的對數的值域為全體實數,而方差的值域為全體正實數,使用神經網絡擬合方差的對數不需要精確限定激活函數,相對方便)。由于D維隱變量z的每個維度彼此獨立,則均值為D維向量,而方差為D維對角矩陣,即

此時,方差其實也只有D個需要學習的參數,而不是D2個。那么這里的編碼器的輸入為樣本x(i),第一個編碼器輸出D維向量[μ1,μ2,…,μD],第二個編碼器的輸出也為D維向量[],即

由于兩個高斯分布的每個維度彼此獨立,KL散度可分開計算,其中第d維的KL散度值為:

上述計算過程比較簡單,在此不展開。易知總KL散度為:

在計算上,通過讓編碼器學習隱變量后驗分布的近似分布的均值和方差,我們得到了隱變量后驗分布的近似分布的概率密度表達式,從而可以計算 KL散度。本質上,VAE訓練編碼器是希望KL散度值達到最小,即令后驗近似分布趨近于標準高斯分布,也就是說,對每個樣本x(i),qφ(z|x(i))都向高斯分布靠攏。
現在來看ELBO的第一項 Ez[logpθ(x(i)|z)]。為了計算這一項,我們需要使用一個經驗上的近似:

計算這一項時并不需要采樣所有不同z再計算logpθ(x(i)|z),而只需要從中采樣一次即可。這樣的做法看似不合理,但實際效果證明約等于的關系是成立的,另外,聯想到一般的自編碼器中是一一映射的,即一個樣本x對應一個隱變量z,可認為qφ(z|x(i))是一個非常銳利的單峰分布,故多次采樣計算均值和一次采樣效果相差不大。接下來,為了計算logpθ(x(i)|z),我們再次做出假設,假設pθ(x|z)是伯努利分布或高斯分布。當假設為伯努利分布時,對應的x為二值(0 1)、Q個維度彼此獨立的向量,將伯努利分布的Q個參數[ρ1,ρ2,…,ρQ]交給神經網絡學習,這個神經網絡即解碼器,它由θ來參數化,其輸入為隱變量z,輸出為[ρ1,ρ2,…,ρQ],即

現在可以計算樣本的似然為:

相應的對數似然函數為:

所以只需要把編碼器的最后一層激活函數設計為sigmoid函數,并使用二分類交叉熵作為解碼器的損失函數即可。若假設pθ(x(i)|z)為高斯分布,對應的x為實值、Q個維度彼此獨立的向量,將該高斯分布每個維度的方差固定為某個常數σ2,而Q個均值參數[μ1,μ2,…,μQ]交給神經網絡學習,這個神經網絡即解碼器,它同樣由θ來參數化,輸入為隱變量z,輸出為[μ1,μ2,…,μQ],即

現在可以計算樣本的似然函數為:

相應的對數似然為:

所以需要把編碼器的最后一層激活函數設計為值域為全體實值的激活函數,并使MSE作為損失函數。在計算上,我們基于經驗知識使用了一次采樣的近似操作,并依靠編碼器學習pθ(x|z)的參數,最后計算條件概率下樣本的似然。VAE希望將解碼器部分對應的損失函數的值最大,本質上是希望樣本的重構誤差最小,這在伯努利分布中非常明顯,而在高斯分布中,MSE損失希望編碼器的輸出(高斯分布的均值)與樣本盡可能接近。
回顧上面的過程,訓練流程是這樣的:將樣本x(i)送入解碼器可計算得到隱變量后驗近似分布的各項參數(即高斯分布的均值和方差),這時需要從分布中采樣一個隱變量z,然后將z送入解碼器,最后計算損失函數,并反向傳播更新參數。其實這里有一個小問題,從分布中采樣的過程是不可導的,即編碼器計算的均值和方差參數在采樣得到隱變量后就被“淹沒”了,解碼器面對的只是一個孤立的、不知從哪個高斯分布采樣得到的z。我們需要把μ(x(i))、σ(x(i))與編碼器建立計算上的聯系,否則反向傳播時,梯度傳播到采樣得到z的環節就會中斷。重參數技巧(Reparameterization Trick)做了一個簡單的處理,它直接在標準正態分布中采樣N(0,I)得到ε,然后令z=μ+ε×σ,這樣,反向傳播的環節被打通,如圖1-13所示。

圖1-13 變分自編碼器正向計算
訓練完成后,直接從p(z)中采樣得到隱變量z,然后送入解碼器,在伯努利分布中解碼器輸出樣本每個維度取值的概率;在高斯分布中解碼器輸出均值,即生成的樣本。
VAE與GAN經常被用來進行比較,GAN屬于隱式概率生成模型,在GAN中沒有顯式出現過似然函數,而VAE屬于顯式概率生成模型,它也試圖最大化似然函數,但是不像FVBN模型中存在精確的似然函數以供其最大化,而是得到了似然函數的下界,近似地實現了極大似然。在圖像生成問題上,VAE的一個比較明顯的缺點是,生成圖像模糊,這可能是使用極大似然的模型的共同問題,因為極大似然的本質是最小化DKL (pdata||pmodel),這個問題的解釋涉及KL散度的性質,在此不再展開。
VAE模型的核心代碼如下:


