技術(shù)頻道

娓娓工業(yè)
您現(xiàn)在的位置: 中國傳動網(wǎng) > 技術(shù)頻道 > 技術(shù)百科 > 變分自編碼器VAE:原來是這么一回事

變分自編碼器VAE:原來是這么一回事

時(shí)間:2018-06-15 16:30:01來源:網(wǎng)絡(luò)轉(zhuǎn)載

導(dǎo)語:?其實(shí)真正的VAE,跟很多教程說的的還真不大一樣,很多教程寫了一大通,都沒有把模型的要點(diǎn)寫出來。于是寫了這篇東西,希望通過下面的文字,能把VAE初步講清楚。

過去雖然沒有細(xì)看,但印象里一直覺得變分自編碼器(VariationalAuto-Encoder,VAE)是個(gè)好東西。趁著最近看概率圖模型的三分鐘熱度,我決定也爭取把VAE搞懂。

于是乎照樣翻了網(wǎng)上很多資料,無一例外發(fā)現(xiàn)都很含糊,主要的感覺是公式寫了一大通,還是迷迷糊糊的,最后好不容易覺得看懂了,再去看看實(shí)現(xiàn)的代碼,又感覺實(shí)現(xiàn)代碼跟理論完全不是一回事啊。

終于,東拼西湊再加上我這段時(shí)間對概率模型的一些積累,并反復(fù)對比原論文Auto-EncodingVariationalBayes,最后我覺得我應(yīng)該是想明白了。

其實(shí)真正的VAE,跟很多教程說的的還真不大一樣,很多教程寫了一大通,都沒有把模型的要點(diǎn)寫出來。于是寫了這篇東西,希望通過下面的文字,能把VAE初步講清楚。

分布變換

通常我們會拿VAE跟GAN比較,的確,它們兩個(gè)的目標(biāo)基本是一致的——希望構(gòu)建一個(gè)從隱變量Z生成目標(biāo)數(shù)據(jù)X的模型,但是實(shí)現(xiàn)上有所不同。

更準(zhǔn)確地講,它們是假設(shè)了服從某些常見的分布(比如正態(tài)分布或均勻分布),然后希望訓(xùn)練一個(gè)模型X=g(Z),這個(gè)模型能夠?qū)⒃瓉淼母怕史植加成涞接?xùn)練集的概率分布,也就是說,它們的目的都是進(jìn)行分布之間的變換。

生成模型的難題就是判斷生成分布與真實(shí)分布的相似度,因?yàn)槲覀冎恢纼烧叩牟蓸咏Y(jié)果,不知道它們的分布表達(dá)式。

那現(xiàn)在假設(shè)服從標(biāo)準(zhǔn)的正態(tài)分布,那么我就可以從中采樣得到若干個(gè)Z1,Z2,…,Zn,然后對它做變換得到X?1=g(Z1),X?2=g(Z2),…,X?n=g(Zn),我們怎么判斷這個(gè)通過f構(gòu)造出來的數(shù)據(jù)集,它的分布跟我們目標(biāo)的數(shù)據(jù)集分布是不是一樣的呢?

有讀者說不是有KL散度嗎?當(dāng)然不行,因?yàn)镵L散度是根據(jù)兩個(gè)概率分布的表達(dá)式來算它們的相似度的,然而目前我們并不知道它們的概率分布的表達(dá)式。

我們只有一批從構(gòu)造的分布采樣而來的數(shù)據(jù){X?1,X?2,…,X?n},還有一批從真實(shí)的分布采樣而來的數(shù)據(jù){X1,X2,…,Xn}(也就是我們希望生成的訓(xùn)練集)。我們只有樣本本身,沒有分布表達(dá)式,當(dāng)然也就沒有方法算KL散度。

雖然遇到困難,但還是要想辦法解決的。GAN的思路很直接粗獷:既然沒有合適的度量,那我干脆把這個(gè)度量也用神經(jīng)網(wǎng)絡(luò)訓(xùn)練出來吧。

就這樣,WGAN就誕生了,詳細(xì)過程請參考互懟的藝術(shù):從零直達(dá)WGAN-GP。而VAE則使用了一個(gè)精致迂回的技巧。

VAE慢談

這一部分我們先回顧一般教程是怎么介紹VAE的,然后再探究有什么問題,接著就自然地發(fā)現(xiàn)了VAE真正的面目。

經(jīng)典回顧

首先我們有一批數(shù)據(jù)樣本{X1,…,Xn},其整體用X來描述,我們本想根據(jù){X1,…,Xn}得到X的分布p(X),如果能得到的話,那我直接根據(jù)p(X)來采樣,就可以得到所有可能的X了(包括{X1,…,Xn}以外的),這是一個(gè)終極理想的生成模型了。

當(dāng)然,這個(gè)理想很難實(shí)現(xiàn),于是我們將分布改一改:

這里我們就不區(qū)分求和還是求積分了,意思對了就行。此時(shí)p(X|Z)就描述了一個(gè)由Z來生成X的模型,而我們假設(shè)Z服從標(biāo)準(zhǔn)正態(tài)分布,也就是p(Z)=N(0,I)。如果這個(gè)理想能實(shí)現(xiàn),那么我們就可以先從標(biāo)準(zhǔn)正態(tài)分布中采樣一個(gè)Z,然后根據(jù)Z來算一個(gè)X,也是一個(gè)很棒的生成模型。

接下來就是結(jié)合自編碼器來實(shí)現(xiàn)重構(gòu),保證有效信息沒有丟失,再加上一系列的推導(dǎo),最后把模型實(shí)現(xiàn)。框架的示意圖如下:

▲VAE的傳統(tǒng)理解

看出了什么問題了嗎?如果像這個(gè)圖的話,我們其實(shí)完全不清楚:究竟經(jīng)過重新采樣出來的Zk,是不是還對應(yīng)著原來的Xk,所以我們?nèi)绻苯幼钚』疍(X?k,Xk)^2(這里D代表某種距離函數(shù))是很不科學(xué)的,而事實(shí)上你看代碼也會發(fā)現(xiàn)根本不是這樣實(shí)現(xiàn)的。

也就是說,很多教程說了一大通頭頭是道的話,然后寫代碼時(shí)卻不是按照所寫的文字來寫,可是他們也不覺得這樣會有矛盾。

VAE初現(xiàn)

其實(shí),在整個(gè)VAE模型中,我們并沒有去使用p(Z)(先驗(yàn)分布)是正態(tài)分布的假設(shè),我們用的是假設(shè)p(Z|X)(后驗(yàn)分布)是正態(tài)分布。

具體來說,給定一個(gè)真實(shí)樣本Xk,我們假設(shè)存在一個(gè)專屬于Xk的分布p(Z|Xk)(學(xué)名叫后驗(yàn)分布),并進(jìn)一步假設(shè)這個(gè)分布是(獨(dú)立的、多元的)正態(tài)分布。

為什么要強(qiáng)調(diào)“專屬”呢?因?yàn)槲覀兒竺嬉?xùn)練一個(gè)生成器X=g(Z),希望能夠把從分布p(Z|Xk)采樣出來的一個(gè)Zk還原為Xk。

如果假設(shè)p(Z)是正態(tài)分布,然后從p(Z)中采樣一個(gè)Z,那么我們怎么知道這個(gè)Z對應(yīng)于哪個(gè)真實(shí)的X呢?現(xiàn)在p(Z|Xk)專屬于Xk,我們有理由說從這個(gè)分布采樣出來的Z應(yīng)該要還原到Xk中去。

事實(shí)上,在論文Auto-Encoding Variational Bayes的應(yīng)用部分,也特別強(qiáng)調(diào)了這一點(diǎn):

In this case, we can let the variational approximate posterior be a multivariate Gaussian with a diagonal covariance structure:

論文中的式(9)是實(shí)現(xiàn)整個(gè)模型的關(guān)鍵,不知道為什么很多教程在介紹VAE時(shí)都沒有把它凸顯出來。盡管論文也提到p(Z)是標(biāo)準(zhǔn)正態(tài)分布,然而那其實(shí)并不是本質(zhì)重要的。

再次強(qiáng)調(diào),這時(shí)候每一個(gè)Xk都配上了一個(gè)專屬的正態(tài)分布,才方便后面的生成器做還原。但這樣有多少個(gè)X就有多少個(gè)正態(tài)分布了。我們知道正態(tài)分布有兩組參數(shù):均值μ和方差σ^2(多元的話,它們都是向量)。

那我怎么找出專屬于Xk的正態(tài)分布p(Z|Xk)的均值和方差呢?好像并沒有什么直接的思路。

那好吧,我就用神經(jīng)網(wǎng)絡(luò)來擬合出來。這就是神經(jīng)網(wǎng)絡(luò)時(shí)代的哲學(xué):難算的我們都用神經(jīng)網(wǎng)絡(luò)來擬合,在WGAN那里我們已經(jīng)體驗(yàn)過一次了,現(xiàn)在再次體驗(yàn)到了。

于是我們構(gòu)建兩個(gè)神經(jīng)網(wǎng)絡(luò)μk=f1(Xk),logσ^2=f2(Xk)來算它們了。我們選擇擬合logσ^2而不是直接擬合σ^2,是因?yàn)棣襘2總是非負(fù)的,需要加激活函數(shù)處理,而擬合logσ^2不需要加激活函數(shù),因?yàn)樗烧韶?fù)。

到這里,我能知道專屬于Xk的均值和方差了,也就知道它的正態(tài)分布長什么樣了,然后從這個(gè)專屬分布中采樣一個(gè)Zk出來,然后經(jīng)過一個(gè)生成器得到X?k=g(Zk)。

現(xiàn)在我們可以放心地最小化D(X?k,Xk)^2,因?yàn)閆k是從專屬Xk的分布中采樣出來的,這個(gè)生成器應(yīng)該要把開始的Xk還原回來。于是可以畫出VAE的示意圖:

事實(shí)上,VAE是為每個(gè)樣本構(gòu)造專屬的正態(tài)分布,然后采樣來重構(gòu)。

分布標(biāo)準(zhǔn)化

讓我們來思考一下,根據(jù)上圖的訓(xùn)練過程,最終會得到什么結(jié)果。

首先,我們希望重構(gòu)X,也就是最小化D(X?k,Xk)^2,但是這個(gè)重構(gòu)過程受到噪聲的影響,因?yàn)閆k是通過重新采樣過的,不是直接由encoder算出來的。

顯然噪聲會增加重構(gòu)的難度,不過好在這個(gè)噪聲強(qiáng)度(也就是方差)通過一個(gè)神經(jīng)網(wǎng)絡(luò)算出來的,所以最終模型為了重構(gòu)得更好,肯定會想盡辦法讓方差為0。

而方差為0的話,也就沒有隨機(jī)性了,所以不管怎么采樣其實(shí)都只是得到確定的結(jié)果(也就是均值),只擬合一個(gè)當(dāng)然比擬合多個(gè)要容易,而均值是通過另外一個(gè)神經(jīng)網(wǎng)絡(luò)算出來的。

說白了,模型會慢慢退化成普通的AutoEncoder,噪聲不再起作用。

這樣不就白費(fèi)力氣了嗎?說好的生成模型呢?

別急別急,其實(shí)VAE還讓所有的p(Z|X)都向標(biāo)準(zhǔn)正態(tài)分布看齊,這樣就防止了噪聲為零,同時(shí)保證了模型具有生成能力。

怎么理解“保證了生成能力”呢?如果所有的p(Z|X)都很接近標(biāo)準(zhǔn)正態(tài)分布N(0,I),那么根據(jù)定義:

這樣我們就能達(dá)到我們的先驗(yàn)假設(shè):p(Z)是標(biāo)準(zhǔn)正態(tài)分布。然后我們就可以放心地從N(0,I)中采樣來生成圖像了。

為了使模型具有生成能力,VAE要求每個(gè)p(Z_X)都向正態(tài)分布看齊。

那怎么讓所有的p(Z|X)都向N(0,I)看齊呢?如果沒有外部知識的話,其實(shí)最直接的方法應(yīng)該是在重構(gòu)誤差的基礎(chǔ)上中加入額外的loss:

因?yàn)樗鼈兎謩e代表了均值μk和方差的對數(shù)logσ^2,達(dá)到N(0,I)就是希望二者盡量接近于0了。不過,這又會面臨著這兩個(gè)損失的比例要怎么選取的問題,選取得不好,生成的圖像會比較模糊。

所以,原論文直接算了一般(各分量獨(dú)立的)正態(tài)分布與標(biāo)準(zhǔn)正態(tài)分布的KL散度KL(N(μ,σ^2)‖N(0,I))作為這個(gè)額外的loss,計(jì)算結(jié)果為:

這里的d是隱變量Z的維度,而μ(i)和σ_{(i)}^{2}分別代表一般正態(tài)分布的均值向量和方差向量的第i個(gè)分量。直接用這個(gè)式子做補(bǔ)充loss,就不用考慮均值損失和方差損失的相對比例問題了。

顯然,這個(gè)loss也可以分兩部分理解:

推導(dǎo)

由于我們考慮的是各分量獨(dú)立的多元正態(tài)分布,因此只需要推導(dǎo)一元正態(tài)分布的情形即可,根據(jù)定義我們可以寫出:

整個(gè)結(jié)果分為三項(xiàng)積分,第一項(xiàng)實(shí)際上就是?logσ^2乘以概率密度的積分(也就是1),所以結(jié)果是?logσ^2;第二項(xiàng)實(shí)際是正態(tài)分布的二階矩,熟悉正態(tài)分布的朋友應(yīng)該都清楚正態(tài)分布的二階矩為μ^2+σ^2;而根據(jù)定義,第三項(xiàng)實(shí)際上就是“-方差除以方差=-1”。所以總結(jié)果就是:

重參數(shù)技巧

最后是實(shí)現(xiàn)模型的一個(gè)技巧,英文名是ReparameterizationTrick,我這里叫它做重參數(shù)吧。

▲重參數(shù)技巧

其實(shí)很簡單,就是我們要從p(Z|Xk)中采樣一個(gè)Zk出來,盡管我們知道了p(Z|Xk)是正態(tài)分布,但是均值方差都是靠模型算出來的,我們要靠這個(gè)過程反過來優(yōu)化均值方差的模型,但是“采樣”這個(gè)操作是不可導(dǎo)的,而采樣的結(jié)果是可導(dǎo)的,于是我們利用了一個(gè)事實(shí):

所以,我們將從N(μ,σ^2)采樣變成了從N(μ,σ^2)中采樣,然后通過參數(shù)變換得到從N(μ,σ^2)中采樣的結(jié)果。這樣一來,“采樣”這個(gè)操作就不用參與梯度下降了,改為采樣的結(jié)果參與,使得整個(gè)模型可訓(xùn)練了。

具體怎么實(shí)現(xiàn),大家把上述文字對照著代碼看一下,一下子就明白了。

后續(xù)分析

即便把上面的所有內(nèi)容都搞清楚了,面對VAE,我們可能還存有很多疑問。

本質(zhì)是什么

VAE的本質(zhì)是什么?VAE雖然也稱是AE(AutoEncoder)的一種,但它的做法(或者說它對網(wǎng)絡(luò)的詮釋)是別具一格的。

在VAE中,它的Encoder有兩個(gè),一個(gè)用來計(jì)算均值,一個(gè)用來計(jì)算方差,這已經(jīng)讓人意外了:Encoder不是用來Encode的,是用來算均值和方差的,這真是大新聞了,還有均值和方差不都是統(tǒng)計(jì)量嗎,怎么是用神經(jīng)網(wǎng)絡(luò)來算的?

事實(shí)上,我覺得VAE從讓普通人望而生畏的變分和貝葉斯理論出發(fā),最后落地到一個(gè)具體的模型中,雖然走了比較長的一段路,但最終的模型其實(shí)是很接地氣的。

它本質(zhì)上就是在我們常規(guī)的自編碼器的基礎(chǔ)上,對encoder的結(jié)果(在VAE中對應(yīng)著計(jì)算均值的網(wǎng)絡(luò))加上了“高斯噪聲”,使得結(jié)果decoder能夠?qū)υ肼曈恤敯粜?;而那個(gè)額外的KLloss(目的是讓均值為0,方差為1),事實(shí)上就是相當(dāng)于對encoder的一個(gè)正則項(xiàng),希望encoder出來的東西均有零均值。

那另外一個(gè)encoder(對應(yīng)著計(jì)算方差的網(wǎng)絡(luò))的作用呢?它是用來動態(tài)調(diào)節(jié)噪聲的強(qiáng)度的。

直覺上來想,當(dāng)decoder還沒有訓(xùn)練好時(shí)(重構(gòu)誤差遠(yuǎn)大于KLloss),就會適當(dāng)降低噪聲(KLloss增加),使得擬合起來容易一些(重構(gòu)誤差開始下降)。

反之,如果decoder訓(xùn)練得還不錯(cuò)時(shí)(重構(gòu)誤差小于KLloss),這時(shí)候噪聲就會增加(KLloss減少),使得擬合更加困難了(重構(gòu)誤差又開始增加),這時(shí)候decoder就要想辦法提高它的生成能力了。

▲VAE的本質(zhì)結(jié)構(gòu)

說白了,重構(gòu)的過程是希望沒噪聲的,而KLloss則希望有高斯噪聲的,兩者是對立的。所以,VAE跟GAN一樣,內(nèi)部其實(shí)是包含了一個(gè)對抗的過程,只不過它們兩者是混合起來,共同進(jìn)化的。

從這個(gè)角度看,VAE的思想似乎還高明一些,因?yàn)樵贕AN中,造假者在進(jìn)化時(shí),鑒別者是安然不動的,反之亦然。當(dāng)然,這只是一個(gè)側(cè)面,不能說明VAE就比GAN好。

GAN真正高明的地方是:它連度量都直接訓(xùn)練出來了,而且這個(gè)度量往往比我們?nèi)斯は氲囊茫ㄈ欢鳪AN本身也有各種問題,這就不展開了)。

正態(tài)分布?

對于p(Z|X)的分布,讀者可能會有疑惑:是不是必須選擇正態(tài)分布?可以選擇均勻分布嗎?

首先,這個(gè)本身是一個(gè)實(shí)驗(yàn)問題,兩種分布都試一下就知道了。但是從直覺上來講,正態(tài)分布要比均勻分布更加合理,因?yàn)檎龖B(tài)分布有兩組獨(dú)立的參數(shù):均值和方差,而均勻分布只有一組。

前面我們說,在VAE中,重構(gòu)跟噪聲是相互對抗的,重構(gòu)誤差跟噪聲強(qiáng)度是兩個(gè)相互對抗的指標(biāo),而在改變噪聲強(qiáng)度時(shí)原則上需要有保持均值不變的能力,不然我們很難確定重構(gòu)誤差增大了,究竟是均值變化了(encoder的鍋)還是方差變大了(噪聲的鍋)。

而均勻分布不能做到保持均值不變的情況下改變方差,所以正態(tài)分布應(yīng)該更加合理。

變分在哪里

還有一個(gè)有意思(但不大重要)的問題是:VAE叫做“變分自編碼器”,它跟變分法有什么聯(lián)系?在VAE的論文和相關(guān)解讀中,好像也沒看到變分法的存在?

其實(shí)如果讀者已經(jīng)承認(rèn)了KL散度的話,那VAE好像真的跟變分沒多大關(guān)系了,因?yàn)镵L散度的定義是:

如果是離散概率分布就要寫成求和,我們要證明:已概率分布p(x)(或固定q(x))的情況下,對于任意的概率分布q(x)(或p(x)),都有KLp(x)‖q(x))≥0,而且只有當(dāng)p(x)=q(x)時(shí)才等于零。

因?yàn)镵L(p(x)‖q(x))實(shí)際上是一個(gè)泛函,要對泛函求極值就要用到變分法,當(dāng)然,這里的變分法只是普通微積分的平行推廣,還沒涉及到真正復(fù)雜的變分法。而VAE的變分下界,是直接基于KL散度就得到的。所以直接承認(rèn)了KL散度的話,就沒有變分的什么事了。

一句話,VAE的名字中“變分”,是因?yàn)樗耐茖?dǎo)過程用到了KL散度及其性質(zhì)。

條件VAE

最后,因?yàn)槟壳暗腣AE是無監(jiān)督訓(xùn)練的,因此很自然想到:如果有標(biāo)簽數(shù)據(jù),那么能不能把標(biāo)簽信息加進(jìn)去輔助生成樣本呢?

這個(gè)問題的意圖,往往是希望能夠?qū)崿F(xiàn)控制某個(gè)變量來實(shí)現(xiàn)生成某一類圖像。當(dāng)然,這是肯定可以的,我們把這種情況叫做ConditionalVAE,或者叫CVAE(相應(yīng)地,在GAN中我們也有個(gè)CGAN)。

但是,CVAE不是一個(gè)特定的模型,而是一類模型,總之就是把標(biāo)簽信息融入到VAE中的方式有很多,目的也不一樣。這里基于前面的討論,給出一種非常簡單的VAE。

▲一個(gè)簡單的CVAE結(jié)構(gòu)

在前面的討論中,我們希望X經(jīng)過編碼后,Z的分布都具有零均值和單位方差,這個(gè)“希望”是通過加入了KLloss來實(shí)現(xiàn)的。

如果現(xiàn)在多了類別信息Y,我們可以希望同一個(gè)類的樣本都有一個(gè)專屬的均值μ^Y(方差不變,還是單位方差),這個(gè)μ^Y讓模型自己訓(xùn)練出來。

這樣的話,有多少個(gè)類就有多少個(gè)正態(tài)分布,而在生成的時(shí)候,我們就可以通過控制均值來控制生成圖像的類別。

事實(shí)上,這樣可能也是在VAE的基礎(chǔ)上加入最少的代碼來實(shí)現(xiàn)CVAE的方案了,因?yàn)檫@個(gè)“新希望”也只需通過修改KLloss實(shí)現(xiàn):

下圖顯示這個(gè)簡單的CVAE是有一定的效果的,不過因?yàn)閑ncoder和decoder都比較簡單(純MLP),所以控制生成的效果不盡完美。

用這個(gè)CVAE控制生成數(shù)字9,可以發(fā)現(xiàn)生成了多種樣式的9,并且慢慢向7過渡,所以初步觀察這種CVAE是有效的。

更完備的CVAE請讀者自行學(xué)習(xí)了,最近還出來了CVAE與GAN結(jié)合的工作CVAE-GAN:Fine-GrainedImageGenerationthroughAsymmetricTraining,模型套路千變?nèi)f化。

標(biāo)簽:

點(diǎn)贊

分享到:

上一篇:皮爾磁產(chǎn)品在機(jī)床行業(yè)的應(yīng)用

下一篇:無刷直流永磁電動機(jī)旋轉(zhuǎn)原理

中國傳動網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來源:中國傳動網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為中國傳動網(wǎng)(www.treenowplaneincome.com)獨(dú)家所有。如需轉(zhuǎn)載請與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個(gè)人轉(zhuǎn)載使用時(shí)須注明來源“中國傳動網(wǎng)”,違反者本網(wǎng)將追究其法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請保留稿件來源及作者,禁止擅自篡改,違者自負(fù)版權(quán)法律責(zé)任。

網(wǎng)站簡介|會員服務(wù)|聯(lián)系方式|幫助信息|版權(quán)信息|網(wǎng)站地圖|友情鏈接|法律支持|意見反饋|sitemap

中國傳動網(wǎng)-工業(yè)自動化與智能制造的全媒體“互聯(lián)網(wǎng)+”創(chuàng)新服務(wù)平臺

網(wǎng)站客服服務(wù)咨詢采購咨詢媒體合作

Chuandong.com Copyright ?2005 - 2024 ,All Rights Reserved 版權(quán)所有 粵ICP備 14004826號 | 營業(yè)執(zhí)照證書 | 不良信息舉報(bào)中心 | 粵公網(wǎng)安備 44030402000946號