差分自編碼器介紹、推導及實現

說在前面的話

最近幾天在看VAE(variational auto-encoder)相關的資料,自己也是第一次接觸到,在網上陸陸續續看了一些資料和視頻,從看不懂,到迷迷糊糊,再到理解並用代碼實現,這也花費了我將近兩天的時間,所以,如果你也和我一樣剛接觸到,請耐心地多翻閱資料,看完本文並理解本文可能會需要花費你比較多時間。本文中,我會盡力把概念描述得更加intuitive,把數學公式推導過程列出,再最後對結果做一個解釋。

如果有理解或表述不當,大家在評論下留言啦~ ?

0. 預備知識

0.1 信息量

在信息理論中,我們用以下式子來量化一個事件xx的信息量I(x)I(x):

I(x)=logp(x)p(x)xI(x)=-logp(x),p(x)爲事件x發生的概率

loglog底數爲e時,信息量的單位爲nat(奈特),當loglog底數爲2時,信息量的單位爲bit(比特)。

0.2 信息熵(Entropy)

此外,如果用以下兩個式子分別來表示隨機變量XX在離散和連續情況下的信息熵HH:
H=logp(x)p(x)H=logp(x)p(x)dx H=\sum{-logp(x)*p(x)} \\ H=\int{-logp(x)*p(x)dx}
信息熵可以看做是對信息量的期望。

0.3 K-L散度(Kullback-Leibler divergence)

K-L散度又被稱爲相對熵(relative entropy),是對兩個概率分佈間差異的非對稱性度量。

假設p(x),q(x)p(x), q(x)是隨機變量 上的兩個概率分佈,則在離散和連續隨機變量的情形下,相對熵的定義分別爲:
KL(p(x)q(x))=p(x)logp(x)q(x)KL(p(x)q(x))=p(x)logp(x)q(x)dx KL(p(x)||q(x))=\sum{p(x)log\frac{p(x)}{q(x)}} \\ KL(p(x)||q(x))=\int{p(x)log\frac{p(x)}{q(x)}}dx

注意!K-L散度不是對稱的,它不是描述兩個分佈之間的距離,因爲按照上述定義,KL(p(x)q(x))KL(q(x)p(x))KL(p(x)||q(x))\ne KL(q(x)||p(x))

0.4 貝葉斯公式(Bayes Rule)

這個就不多講了,爲了和下述的notation保持一致,公式表述如下
p(zx)=p(z,x)p(x)=p(xz)p(z)p(x)p(z|x)=\frac{p(z,x)}{p(x)}=\frac{p(x|z)p(z)}{p(x)}

1. 什麼是差分自編碼器

差分自編碼器的英文是(variational auto-encoder,VAE),其實在將VAE之前,我們必須提一下自編碼器(auto-encoder,AE)。

在AE的結構中包含一個編碼器(encoder)和解碼器(decoder),其中encoder的作用是將我們的數據空間Rn\R^n映射到另一個隱變量(latent variable)空間Rd\R^d上去,具體來說,我們的一個輸入數據樣本xx將被被編碼成一個vector,這個vector中的每一維度就是一些該樣本的屬性;而decoder要乾的事則剛好與encoder相反,它可以接受一個latent vector,並且重新變回到原樣本空間上去。至於具體怎麼轉化,這個很複雜,我們也不知道它中間到底是怎麼變換的,怎麼辦呢?神經網絡來幫忙,神經網絡理論上就是可以擬合任何一個函數的,不管你有多複雜。

(圖片來源網絡,侵刪)
(圖片來源網絡,侵刪)

如上圖所示,舉例類比我們人寫數字的行爲來說,我現在讓你寫一個4,在你聽到這句話之後且開始動筆之前,你會在大腦裏想,哦,你讓我寫4,4應該先這樣彎一下,而且最後有一豎,筆畫應該寫長點…類似這種,whatever,這些你思考的屬性就是latent variable,也即encode。然後,你的大腦再根據你所想的這些屬性指導你去把這個4寫出來,即decode。至於大腦怎麼指導這些空間變換的,誰知道呢!

說了這麼多,終於可以開始將VAE了,它和AE的不同點就在於,AE中間輸出的是隱變量的具體取值,而VAE中間要輸出的是隱變量的具體分佈情況,這樣一來,我們就可以從這個分佈中另外取樣,送入到decoder,就可以生成類似輸入樣本xx的其他樣本xx'了,並且這兩個會十分近似。 That is to say, the encoder in VAE will output the probability distribution of each latent attribution rather than telling us a single value to describe each latent state.

再舉個例子,這個示例來源於 [1] Variational autoencoders, Jenemy Jordan,如果我們有個人臉的數據集,在AE中,我們希望它完成下圖的工作:
在這裏插入圖片描述(圖片創作於Jenemy Jordan,侵刪)

即對每一個屬性,給出一個確切的取值。比如上面的smile屬性,現在取值是0.99,那模型爲什麼輸出一個0.99呢?爲啥不是0.98,0.97等等呢?是的,這就是VAE乾的事情,VAE希望學習到關於該smile屬性的概率分佈,當然,該概率分佈函數y取值最大時對應的x就是這裏的0.99,也即AE給出該屬性的那個確切值,如下圖所示:
在這裏插入圖片描述
(圖片創作於Jenemy Jordan,侵刪)

好,那現在我知道當前這個人笑的燦爛程度是0.99,並且長鬍須的程度是0.85,假如我現在想知道長鬍須程度是0.65的人笑的燦爛程度是0.89的人臉會是怎樣的樣子怎麼辦呢?那就取樣唄,反正VAE學習到了各個屬性的分佈,然後再送入decoder變換回來,就類型下圖所示:
在這裏插入圖片描述
(圖片創作於Jenemy Jordan,侵刪)

於是,VAE的總體架構如下圖所示:
在這裏插入圖片描述
好了,終於說完了VAE是在做什麼,接下來我將完成數學理論推導,請務必理解推導過程,別擔心,那很簡單!

2. 數學理論推導

現在我們假設知道的確有這樣的latent variables,但是我們不知道它到底是一個怎樣的分佈,現在能夠觀測到的就是樣本xx,我們希望在給定xx的條件下去推出zz的分佈,即p(zx)p(z|x).

根據貝葉斯定理,可得:

p(zx)=p(xz)p(z)p(x)p(z|x)=\frac{p(x|z)p(z)}{p(x)}

然而,這個後驗概率p(zx)p(z|x)是不可解的,因爲無法計算p(x)p(x),根據全概率公式可知:

p(x)=p(xz)p(z)dzp(x)=\int p(x|z)p(z)dz

如果z是一個維度很高的變量,你想想是不是有無窮多重的積分,會變成大概這樣的計算式子:

p(x)=.....p(xz)p(z)dzp(x)=\int\int\int\int\int\int.....p(x|z)p(z)dz

於是這裏大致有兩種方法求解:

  • ① 蒙特卡羅算法(Mote Carlo method),不斷取樣z,取樣越多p(x)越接近真實的分佈。
  • ② Variational Inference,既然p(zx)p(z|x)不可解,那我就嘗試用一個可解的分佈q(zx)q(z|x)去近似p(zx)p(z|x),即approximation的方式。

注意一下,你可能會在其他資料中看到這裏的表述是q(z)q(z)而不是q(zx)q(z|x),其實這裏無關緊要,只取決於你如何解釋它,因爲當前的xx是已經給出了的嘛,請務必記住這點, 我個人還是習慣於寫成q(zx)q(z|x)的形式!好的,故事從這裏開始。

我們想讓q(zx)q(z|x)去近似p(zx)p(z|x),所以肯定希望這兩個分佈間的差異越小越好,K-L散度就可以派上用場,我們希望minKL(q(zx)p(zx))min KL(q(z|x)||p(z|x))

而根據K-L散度的定義,可知:
KL(q(zx)p(zx))=q(zx)logq(zx)p(zx)dz=q(zx)logq(zx)p(xz)p(z)p(x)dz=q(zx)logq(zx)dz+q(zx)logp(x)dzq(zx)log[p(xz)p(z)]dz=q(zx)logq(zx)dz+logp(x)q(zx)dzq(zx)log[p(xz)p(z)]dzq(zx)dz=1=logp(x)+q(zx)logq(zx)dzq(zx)log[p(xz)p(z)]dz KL(q(z|x)||p(z|x))=\int q(z|x)log\frac{q(z|x)}{p(z|x)}dz \\ = \int q(z|x)log\frac{q(z|x)}{\frac{p(x|z)p(z)}{p(x)}}dz \\ = \int q(z|x)log q(z|x)dz+\int q(z|x)logp(x)dz-\int q(z|x)log[p(x|z)p(z)]dz \\ = \int q(z|x)log q(z|x)dz+logp(x) \int q(z|x)dz-\int q(z|x)log[p(x|z)p(z)]dz (注意\int q(z|x)dz=1) \\ = logp(x) + \int q(z|x)log q(z|x)dz-\int q(z|x)log[p(x|z)p(z)]dz (把第二項提前)\\

暫停一下,回顧一下我們是要幹嘛,最小化上面這一大串,xx是已經給定的,所以雖然我不知道p(x)p(x)是多少,但它的確肯定是個定值,於是最小化KL(q(zx)p(zx))KL(q(z|x)||p(z|x))等價於最小化最後兩項,我們記作爲LL
L=q(zx)logq(zx)dzq(zx)log[p(xz)p(z)]dz=q(zx)logq(zx)dzq(zx)logp(xz)dzq(zx)logp(z)dz=q(zx)logq(zx)p(z)dzq(zx)logp(xz)dz=KL(q(zx)p(z))Ezq(zx)[logp(xz)] L= \int q(z|x)log q(z|x)dz-\int q(z|x)log[p(x|z)p(z)]dz \\ = \int q(z|x)log q(z|x)dz-\int q(z|x)logp(x|z)dz-\int q(z|x)logp(z)dz \\ = \int q(z|x)log \frac{q(z|x)}{p(z)}dz-\int q(z|x)logp(x|z)dz \\ =KL(q(z|x)||p(z))- E_{z服從q(z|x)}[logp(x|z)]

再次贊停,現在是要最小化LL,也等價於最大化L-L,即最大化

Ezq(zx)[logp(xz)]KL(q(zx)p(z)).................................IE_{z服從q(z|x)}[logp(x|z)]-KL(q(z|x)||p(z)).................................(I)

這是啥?第一項就是說不斷在z上採樣,然後使得被重構的樣本中重構xx的機率最大;第二項就是說使得我們假設的後驗證分佈q(zx)q(z|x)和先驗分佈p(z)p(z)儘量接近,這個式子也就差不多指引我們去構造一個auto-encoder,所以這也是爲什麼這個模型叫VAE吧。
在這裏插入圖片描述

再深入研究一下(I)(I)式:

第一項實際上是一個重建error,爲什麼?好,我們說從zzx^\hat{x}的轉換是神經網絡乾的事情,它是一個函數,雖然說我們不知道它具體的表達式是什麼,無論我輸入一個怎樣的input,總是會給我一個相同的output,所以(I)(I)式的第一項中的logp(xz)logp(x|z)可以看作是logp(xx^)logp(x|\hat{x}),假設p是一個正態分佈,你自己想想會是什麼!L2L_2loss!當然,如果你假設p是伯努利分佈,那就是交叉熵了。

第二項,我們說是爲了讓我們假設的後驗證分佈q(zx)q(z|x)和先驗分佈p(z)p(z)儘量接近,論文中假設p(z)是一個標準高斯分佈,爲什麼這麼假設呢?

The key is to notice that any distribution in d dimensions can be generated by taking a set of d variables that are normally distributed and mapping them through a sufficiently complicated function.

所以,在decoder部分,你可以看做神經網絡的前幾層是將一個關於z的正態分佈映射到其他對應的latent value上去,也就好似傳統AE中的code vector中一個個的single value。

If f (z; q) is a multi-layer neural network, then we can imagine the network using its first few layers to map the normally distributed z’s to the latent values (like digit identity, stroke weight, angle, etc.) with exactly the right statitics. Then it can use later layers to map those latent values to a fully rendered digit.

爲了好算,我們假設q(zx)q(z|x)也是高斯分佈,然後就可以用一個閉式直接計算了。

3. 實現

在論文中,有提到一個reparameterization trick,主要是處理反向傳播時的求導問題,這個就不細說了,最後參考文獻中很多資料中都有提到。

下面用TensorFlow在MNIST數據集上實現一下VAE,代碼下次調好了上傳。

4. References

博客:
[1] Jenemy Jordan: Variational autoencoders
[2] Irhum Shafkat: Intuitively Understanding Variational Autoencoders
[3] 花式解釋AutoEncoder與VAE
[4] 張俊: 變分自編碼器VAE:原來是這麼一回事
[5] Tensorflow: Convolutional Variational Autoencoder

視頻及幻燈片:
[6] Ali Ghodsi: Deep Learning, Variational Autoencoder (Oct 12 2017)
[7] Stanford CS231n: Lecture on Variational Autoencoders
[8] Sherlock: Raymond Yeh, Junting Lou, Teck-Yian Lim: CS598LAZ - Variational Autoencoders

論文:
[9] Diederik P Kingma, Max Welling: Auto-Encoding Variational Bayes
[10] CARL DOERSCH, Tutorial on Variational Autoencoders, Carnegie Mellon / UC Berkeley, August 16, 2016

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章