1. 程式人生 > >沒有任何公式——直觀的理解變分自動編碼器VAE

沒有任何公式——直觀的理解變分自動編碼器VAE

 autoencoders作為一種非常直觀的無監督的學習方法是很受歡迎的,最簡單的情況是三層的神經網路,第一層是資料輸入,第二層的節點數一般少於輸入層,並且第三層與輸入層類似,層與層之間互相全連線,這種網路被稱作自動編碼器,因為該網路將輸入編碼成一個隱藏程式碼,然後從隱藏表示中譯碼出來。通過簡單的測量重構誤差和反傳網路引數能夠很好的訓練該類網路。

上圖是另一種版本的自動編碼器,稱為“變分自動編碼器-VAE”,不同點在於其隱藏程式碼來自於訓練期間學習到的概率分佈。

90年代,一些研究人員提出一種概率解釋的神經網路模型,在該模型中,提供了適當的貝葉斯方法。然而,學習這些模型的引數是困難的,直到深度學習研究的新進展導致了用於這種概率方法能更有效的學習引數。

概率解釋通過假設每個引數的概率分佈來降低網路中每個引數的單個值的剛性約束。例如,如果在經典神經網路中計算權重w_i=0.7,在概率版本中,計算均值大約為u_i = 0.7和方差為v_i = 0.1的高斯分佈,即w_i =N0.7,0.1)。這個假設將輸入,隱藏表示以及神經網路的輸出轉換為概率隨機變數。這類網路被稱為貝葉斯神經網路或BNN

學習的目標是找到上述分佈的引數。這種學習被稱為“推理”,貝葉斯網路中的推論對應於計算潛在變數相對於資料的條件概率。這類模型引入了變分逼近推理方法後,將該計算問題轉換為優化問題,可以使用隨機梯度下降法來解決。

在貝葉斯網路中,網路可以基於分佈引數重新引數化。在變分自動編碼器中,僅在隱藏節點上假設這些分佈。因此,編碼器變成一個變分推理網路,而且譯碼器變成一個將隱藏程式碼映射回資料分佈的生成網路。

將分佈的均值和方差視為傳統網路的引數,並將方差乘以來自噪聲發生器的樣本以增加隨機性。通過引數化隱藏分佈,可以反向傳播梯度得到編碼器的引數,並用隨機梯度下降訓練整個網路。此過程能夠學習到隱藏程式碼的均值與方差值,這就是所謂的。

在經典版的神經網路中,可以用均方誤差(MSE)簡單測量網路輸出與期望的目標值之間的誤差。但在處理分佈時,MSE不再是一個好的誤差度量,因此用KL­散度測量兩個分佈之間的差異。事實證明變分近似和真實後驗分佈之間的距離不是很容易被最小化。它包括兩個主要部分。因此,可以最大化較小的項(ELBO)。從自動編碼器的角度來看,ELBO函式可以看作是輸入的重建代價與正則化項的和。

在最大化ELBO之後,資料的下限接近資料分佈,則距離接近零,間接地最小化了誤差距離。最大化下界的演算法與梯度下降的完全相反。沿著梯度的正方向達到最大值,這整個演算法被稱為自動編碼變分貝葉斯

下面是一個虛擬碼,可以看到VAE的架構:

文字框: network= {    # encoder   encoder_x = Input_layer(size=input_size, input=data)   encoder_h = Dense_layer(size=hidden_size, input= encoder_x)    # the re-parameterized distributions that are inferred from data    z_mean = Dense(size=number_of_distributions, input=encoder_h)   z_variance = Dense(size=number_of_distributions, input=encoder_h)   epsilon= random(size=number_of_distributions)    # decoder network needs a sample from the code distribution   z_sample= z_mean + exp(z_variance / 2) * epsilon    #decoder   decoder_h = Dense_layer(size=hidden_size, input=z_sample)   decoder_output = Dense_layer(size=input_size, input=decoder_h) }  cost={   reconstruction_loss = input_size * crossentropy(data, decoder_output)   kl_loss = - 0.5 * sum(1 + z_variance - square(z_mean) - exp(z_variance))   cost_total= reconstruction_loss + kl_loss }  stochastic_gradient_descent(data, network, cost_total)

該筆記是基於此keras例子。編碼器的所得學習潛在空間和在MNIST資料集上訓練的簡單VAE的結果如下。

VAE Latent space

VAE generated samples

文章原標題《An intuitive understanding ofvariational autoencoders without any formula》,作者:HamidrezaSaghir ,譯者:海棠

註解1

引入變分分佈q,則ELBO由邊緣對數似然率的下界確定。由log函式的凹性,且由Jensen等式得到:,進而:

ELBO與邊緣概率p(x)之間的差別是真實後驗分佈與近似後驗分佈之間的距離,即. 或者說ELBOKL項之間的距離是對數歸一化p(x)

如今我們定義了一個損失函式,還需要計算該損失函式的梯度,以進行SGD優化。該梯度不易解析求解,但可用MCMC直接從q(z|x)抽樣得到其估計值。因為MCMC可能從很少的數值中抽樣,所以這一方法有很大的方差。

這正是採用重新調參技巧的原因。假定隨機變數z=g(x, )x和已知iid抽樣 的確定性函式,增加了z的隨機性。重新調參將不可導的隨機變數z轉換成了x和一個隨機變數的可導函式,於是ELBO的梯度為。這個對梯度的估計叫做隨機梯度變分貝葉斯SGVB,實驗證明其方差較小。SGVB也叫黑盒推斷方法,因為它不管我們在生成和推斷網路中採用何種函式,只需計算在處取樣的梯度。現在,如果我們選擇深度網路做為我們的似然率和近似後驗分佈函式,則ELBO的所有3都是可導的了。於是,我們有了一個端到端的可導模型。

註解2

在上述ELBO的推導中,第1項是變分後驗分佈的熵,第2項是聯合分佈的對數。聯合分佈可被寫做p(x,z)=p(x|z)p(z),於是ELBO可寫做

1項是對數似然率,即重建代價。第2項是先驗分佈和後驗分佈之間的KL發散,即不允許後驗分佈偏離先驗分佈太多的正則化項。如果只用第1項做為代價函式,而不用正則化項,則對最大似然率的學習會出現過擬合。

註解3VAE可能遇到的問題

KL發散度量兩種分佈之間的距離,但是它不是一個真的距離,因為它不對稱. 因此我們選擇的距離的方向對最小化的結果有關係。例如,最小化KL(p|q),原本p具有高概率,而我們選擇q有高概率,則當p有多個模式時,q會將多個模式模糊混合。反之,最小化KL(q|p),原本p有小概率,而我們選擇q有小概率,則當p有多個模式時,KL發散的最小化會產生單一模式(模式摺疊)。在VAE中我們實際上是最小化KL(q|p),因此模式摺疊是個常見問題。另外,由於真實分佈的複雜性,我們也會見到模糊問題。下圖從深度學習的觀點給出了這兩個問題的示意。

alt text

references:

[1] Kingma,Diederik P., and Max Welling. “Auto-encoding variational bayes.” arXiv preprintarXiv:1312.6114 (2013).

[2] Rezende,Danilo Jimenez, Shakir Mohamed, and Daan Wierstra. “Stochastic backpropagationand approximate inference in deep generative models.” arXiv preprintarXiv:1401.4082 (2014).

[3]https://hips.seas.harvard.edu/blog/2013/01/24/complexity-of-inference-in-bayes-nets/

[4]https://www.cs.princeton.edu/courses/archive/fall11/cos597C/lectures/variational-inference-i.pdf

Hamidreza Saghir

Written by Hamidreza Saghir

Machine LearningResearcher - PhD Candidate at University of Toronto