最近在學習生成模型的相關知識,這篇文章將介紹一下變分自編碼器(Variational Auto-encoder),本文只介紹一些粗淺內容,不會涉及比較深刻的問題。
作者 | 小米粥
編輯 | 言有三
1. 自編碼器
自編碼器(autoencoder)在深度學習中占有重要地位,它最開始的目的是用於降維或特徵學習。一般的自編碼器由編碼器(encoder)和解碼器(decoder)兩個神經網絡構成,如下圖所示:
樣本x經過編碼器得到它的某種編碼表示z,而且z的維度小於x,再將z送入解碼器則可得到樣本x的重構x'。如果重構的效果比較好,則認為編碼器成功地學到了樣本的抽象特徵,也可以理解為實現了降維。
當編碼器學習到數據的抽象特徵z後,我們不僅可以用於重構樣本,還可以把提取到的抽象特徵用於分類問題,只需要在編碼器後接一個分類器即可,如下圖所示:
到了VAE,則期望構建一個生成模型,它將z視為生成樣本的隱變量(隱變量,顧名思義是指不可觀測到的變量,但其對模型中可觀察變量的輸出存在影響),並對編碼器和解碼器進行了一些修改,最終實現了一個性能卓越的生成模型。
2.VAE的思想
與FVBN和GAN等生成模型不同,我們希望通過定義一個由隱變量「控制」的生成模型:
這個生成模型生成樣本的方式將十分簡潔優雅:先從隱變量的分布Pθ(z)中採樣得到z,然後在條件分布Pθ(x|z)中採樣即可得到生成樣本,但是這個生成模型無法搭建出來!因為訓練生成模型通常需要將對數似然函數極大化來求解模型參數θ,即對訓練樣本{x(1),x(2),...,x(n)},要求
這裡必然要計算Pθ(x),分析Pθ(x)的計算式,積分號內部的計算沒有問題,對於隱變量的先驗分布Pθ(z)可以將其設計為簡單的高斯分布,對Pθ(x|z)可使用一個神經網絡來學習,無法解決的地方是遍歷所有的隱變量z求積分!而且,隱變量z的後驗分布
也是難以求解的(因為其分母無法計算)。
一般的訓練生成模型必須先求解對數似然函數(也就是說以似然函數作為損失函數),然後使其最大,VAE的想法是:雖然無法求解準確的對數似然函數,但可以設法得到對數似然函數的下界,然後令下界極大即可,這就相當於近似地令對數似然函數達到極大了。
具體做法是這樣的:剛才說到隱變量z的後驗分布Pθ(z|x)是難以計算的,VAE引入了一個新的機率分布qφ(z|x)來逼近Pθ(z|x),這時的對數似然函數為
最終的式子由三項組成,前兩項是可以計算的,處理細節下面再說,第三項無法計算,但是根據KL散度的性質可知第三項必定大於等於0(這個性質涉及到泛函中的變分,變分自編碼器的變分即來源於此),也就是說
我們將上述不等式右側稱為一個變分下界(ELBO),記為L(x(i);θ,φ),這時只需要最大化變分下界即可,即將變分下界作為模型的損失函數:
VAE的最核心的想法已實現,接下來將描述一些細節,如何將數學模型轉換到神經網絡上?如何計算變分下界EBLO。
3. 編碼器
首先關注EBLO的第二項 ,它是計算隱變量的後驗分布的近似分布qφ(z|x(i))和隱變量的先驗分布Pθ(z)的KL散度。在基於實際中的經驗,作出兩個假設:1.隱變量的先驗分布Pθ(z)為D維標準高斯分布N(0,I),注意這時的Pθ(z)將不包含任何參數,重新記為P(z);2.隱變量的後驗分布的近似分布qφ(z|x(i))為各分量彼此獨立的高斯分布N(μ,Σ;x(i)),也就是說對每一個樣本x(i),均對應一個高斯分布N(μ,Σ;x(i))。現在需要只要再知道μ(x(i)),Σ(x(i))就可以計算KL散度了,我們用兩個神經網絡(即編碼器,參數為φ)來求解均值、方差的對數(因為方差的對數的值域為全體實數,而方差的值域為全體正實數,使用神經網絡擬合方差的對數不需要精確設計激活函數的值域,相對方便)。由於D維的隱變量z的每個維度彼此獨立,則均值為D維向量,而方差為D維對角矩陣,即
方差其實也只有D個需要學習參數,而不是DxD個。這裡所謂的編碼器的輸入為樣本x(i),第一個編碼器輸出D維向量為
第二輸編碼器出也為D維向量,即:
即有
由於兩個高斯分布每個維度彼此獨立,KL散度可分開計算,其中第d維的KL散度值為:
上述計算過程比較簡單,在此不展開。由於每個分量彼此獨立,易知總KL散度為:
在計算上,通過讓編碼器學習隱變量後驗分布的近似分布的均值和方差,得到了隱變量後驗分布的近似分布的表達式,從而可以計算KL散度,本質上,VAE訓練編碼器是希望KL散度值達到最小,即令後驗近似分布趨近於標準正態分布,就是說對每個樣本 , qφ(z|x(i)) 都向標準高斯分布靠攏。
4. 解碼器
現在關注ELBO的第一項 ,為了計算這一項,需要使用一個經驗上的近似
意思是說計算這項時並不需要採樣所有不同z再計算log P(x(i)|z)求均值,而只需要從中採樣一次即可。這樣的做法看似是不合理,但實際效果證明約等於的關係是成立的,聯想到普通自編碼器中是一一映射的,一個樣本x對應一個隱變量z,可想像qφ(z|x(i))是一個非常銳利的單峰分布,故多次採樣計算均值和一次採樣效果相差不大。
接下來,為了計算log P(x(i)|z),我們再次作出假設,假設Pθ(x|z)是伯努利分布或高斯分布。當假設為伯努利分布時,對應x為二值 、Q個維度彼此獨立的向量,而伯努利分布的Q個參數交給神經網絡學習,這個神經網絡即解碼器,它由θ來參數化,輸入為隱變量z,輸出為:
即
現在可以計算樣本的似然為:
相應的對數似然為:
所以只需要把編碼器的最後一層激活函數設計為sigmoid函數,並使用二分類交叉熵作為解碼器的損失函數即可。
若假設Pθ(x|z)為高斯分布,對應x為實值、Q個維度彼此獨立的向量,而高斯分布每個維度的方差固定為某個常數σx σ,Q個均值參數交給神經網絡學習,這個神經網絡即解碼器,它由θ來參數化,輸入為隱變量 ,輸出為
解碼器即
現在可以計算樣本的似然函數為:
相應的對數似然為:
所以需要把編碼器的最後一層激活函數設計值域為全體實值的激活函數,並使MSE作為損失函數即可。
在計算上,基於經驗知識使用了一次採樣的近似操作,並依靠編碼器學習Pθ(x|z)的參數,最後計算了條件機率下樣本的似然。VAE希望將解碼器部分對應的損失函數最大,本質上是希望樣本的重構誤差最小,這在伯努利分布中非常明顯,在高斯分布中,MSE損失希望將編碼器的輸出(高斯分布的均值)與樣本接近。
5.重參數
回顧上面的過程,正向推斷過程是這樣的:將樣本x(i)送入編碼器可計算得到隱變量後驗近似分布的各項參數(即高斯分布的均值和方差),這時需要從分布中採樣一個隱變量z,然後將z送入編碼器,最後計算損失函數,反向傳播更新參數。
其實這裡一個小問題,從分布中採樣的過程是不可導的,即編碼器計算的均值和方差參數在採樣得到隱變量後就被「淹沒」了,解碼器面對的只是一個孤立的不知從哪個高斯分布採樣得到的z。需要把μ和Σ告訴編碼器,否則反向傳播時,梯度傳到採樣得到的z就會斷掉。
重參數技巧(Reparameterization Trick)做了一個簡單的處理,採樣隱變量時,直接在標準正太分布N(0,I)中採樣得到 ,然後考慮編碼器學得的均值和方差參數,令
這樣,反向傳播的環節被打通。為了便於直觀理解,整個VAE的正向流程如下圖所示:
訓練完成後,推斷時,直接從標準高斯分布p(z)中採樣得到隱變量z,然後送入解碼器,在伯努利分布中解碼器輸出機率值;在高斯分布中解碼器輸出均值,即生成的樣本。
6. 小評
VAE與GAN不同,GAN屬於隱式機率生成模型,在GAN中沒有顯式出現過似然函數,而VAE屬於顯式機率生成模型,它也力求最大化似然函數,但是不像FVBN模型中存在精確的似然函數以供最大化,VAE得到了似然函數的下界,近似地實現了極大似然。
在圖像生成問題上,VAE的優點是多樣性好,而一個比較明顯的缺點是,生成圖像模糊,這可能是使用極大似然的模型的共同問題,因為極大似然的本質是最小化
再深入一些,這個問題的解釋設計到KL散度的性質,在此便不再展開。
[1]Kingma, Diederik P., and Max Welling. "Auto-encoding variational bayes." arXiv preprint arXiv:1312.6114 (2013).
總結
這篇文章講了一下原始的自編碼器,然後講了VAE的基本思想,以及如何構造編碼器和解碼器,最後簡要對VAE的一個缺點進行了評價。