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

姓名:任子琪

學(xué)號:19021110610

轉(zhuǎn)載自:“科學(xué)空間”悔雹,原文鏈接:?https://spaces.ac.cn/archives/5253

【嵌牛導(dǎo)讀】近年,變分編碼器VAE(Variational Auto-encoder)同GAN一樣歧沪,成為無監(jiān)督復(fù)雜概率分布學(xué)習(xí)的最流行的方法。VAE之所以流行莲组,是因為它建立在標(biāo)準(zhǔn)函數(shù)逼近單元诊胞,即神經(jīng)網(wǎng)絡(luò),此外它可以利用隨機梯度下降進行優(yōu)化锹杈。本文將解釋重點介紹VAE背后的哲學(xué)思想和直觀認(rèn)識及其數(shù)學(xué)原理撵孤。

【嵌牛鼻子】變分自編碼器,無監(jiān)督學(xué)習(xí)竭望,神經(jīng)網(wǎng)絡(luò)

【嵌牛提問】什么是變分自編碼器早直?

【嵌牛正文】

By?蘇劍林?|?2018-03-18

過去雖然沒有細(xì)看,但印象里一直覺得變分自編碼器(Variational Auto-Encoder市框,VAE)是個好東西霞扬。于是趁著最近看概率圖模型的三分鐘熱度,我決定也爭取把VAE搞懂。于是乎照樣翻了網(wǎng)上很多資料喻圃,無一例外發(fā)現(xiàn)都很含糊萤彩,主要的感覺是公式寫了一大通,還是迷迷糊糊的斧拍,最后好不容易覺得看懂了雀扶,再去看看實現(xiàn)的代碼,又感覺實現(xiàn)代碼跟理論完全不是一回事啊肆汹。

終于愚墓,東拼西湊再加上我這段時間對概率模型的一些積累,并反復(fù)對比原論文《Auto-Encoding Variational Bayes》昂勉,最后我覺得我應(yīng)該是想明白了浪册。其實真正的VAE,跟很多教程說的的還真不大一樣岗照,很多教程寫了一大通村象,都沒有把模型的要點寫出來~于是寫了這篇東西,希望通過下面的文字攒至,能把VAE初步講清楚厚者。

分布變換?#

通常我們會拿VAE跟GAN比較,的確迫吐,它們兩個的目標(biāo)基本是一致的——希望構(gòu)建一個從隱變量Z生成目標(biāo)數(shù)據(jù)X的模型库菲,但是實現(xiàn)上有所不同。更準(zhǔn)確地講志膀,它們是假設(shè)了Z服從某些常見的分布(比如正態(tài)分布或均勻分布)熙宇,然后希望訓(xùn)練一個模型X=g(Z),這個模型能夠?qū)⒃瓉淼母怕史植加成涞接?xùn)練集的概率分布梧却,也就是說奇颠,它們的目的都是進行分布之間的變換。

生成模型的難題就是判斷生成分布與真實分布的相似度放航,因為我們只知道兩者的采樣結(jié)果烈拒,不知道它們的分布表達式

那現(xiàn)在假設(shè)Z服從標(biāo)準(zhǔn)的正態(tài)分布,那么我就可以從中采樣得到若干個Z_{1} ,Z_{2},…,Z_{n}广鳍,然后對它做變換得到X^1=g(Z_{1}),X^2=g(Z_{2}),…,X^n=g(Z_{n})荆几,我們怎么判斷這個通過g構(gòu)造出來的數(shù)據(jù)集,它的分布跟我們目標(biāo)的數(shù)據(jù)集分布是不是一樣的呢赊时?有讀者說不是有KL散度嗎吨铸?當(dāng)然不行,因為KL散度是根據(jù)兩個概率分布的表達式來算它們的相似度的祖秒,然而目前我們并不知道它們的概率分布的表達式诞吱,我們只有一批從構(gòu)造的分布采樣而來的數(shù)據(jù){X^1,X^2,…,X^n}舟奠,還有一批從真實的分布采樣而來的數(shù)據(jù)\left\{ X_{1},X_{2},…,X_{n} \right\} (也就是我們希望生成的訓(xùn)練集)。我們只有樣本本身房维,沒有分布表達式沼瘫,當(dāng)然也就沒有方法算KL散度。

雖然遇到困難咙俩,但還是要想辦法解決的耿戚。GAN的思路很直接粗獷:既然沒有合適的度量,那我干脆把這個度量也用神經(jīng)網(wǎng)絡(luò)訓(xùn)練出來吧阿趁。就這樣膜蛔,WGAN就誕生了,詳細(xì)過程請參考《互懟的藝術(shù):從零直達WGAN-GP》脖阵。而VAE則使用了一個精致迂回的技巧皂股。

VAE慢談?#

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

經(jīng)典回顧?#

首先我們有一批數(shù)據(jù)樣本\left\{ {X_{1},…,X_{n}}\right\} ,其整體用XX來描述颠通,我們本想根據(jù)\left\{ {X_{1},…,X_{n}}\right\} 得到X的分布p(X)启搂,如果能得到的話牢撼,那我直接根據(jù)p(X)來采樣熏版,就可以得到所有可能的X了(包括\left\{ {X_{1},…,X_{n}}\right\} 以外的)撼短,這是一個終極理想的生成模型了饵史。當(dāng)然,這個理想很難實現(xiàn)吭露,于是我們將分布改一改

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? p(X)=\sum_{Z}^\  p(X|Z)p(Z) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(1)

這里我們就不區(qū)分求和還是求積分了弄屡,意思對了就行。此時p(X|Z)就描述了一個由Z來生成X的模型秀仲,而我們假設(shè)Z服從標(biāo)準(zhǔn)正態(tài)分布神僵,也就是p(Z)=N(0,I)覆劈。如果這個理想能實現(xiàn),那么我們就可以先從標(biāo)準(zhǔn)正態(tài)分布中采樣一個Z氓英,然后根據(jù)Z來算一個X,也是一個很棒的生成模型鹦筹。接下來就是結(jié)合自編碼器來實現(xiàn)重構(gòu),保證有效信息沒有丟失徘键,再加上一系列的推導(dǎo),最后把模型實現(xiàn)螺男。框架的示意圖如下:

vae的傳統(tǒng)理解

看出了什么問題了嗎谓媒?如果像這個圖的話淆院,我們其實完全不清楚:究竟經(jīng)過重新采樣出來的Z_{k} ,是不是還對應(yīng)著原來的X_{k} 句惯,所以我們?nèi)绻苯幼钚』?img class="math-inline" src="https://math.jianshu.com/math?formula=D(%5Chat%7BX%7D_%7Bk%7D%20%2CX_%7Bk%7D)%5E2%20" alt="D(\hat{X}_{k} ,X_{k})^2 " mathimg="1">(這里D代表某種距離函數(shù))是很不科學(xué)的土辩,而事實上你看代碼也會發(fā)現(xiàn)根本不是這樣實現(xiàn)的。也就是說抢野,很多教程說了一大通頭頭是道的話拷淘,然后寫代碼時卻不是按照所寫的文字來寫,可是他們也不覺得這樣會有矛盾~

VAE初現(xiàn)?#

其實蒙保,在整個VAE模型中辕棚,我們并沒有去使用p(Z)(隱變量空間的分布)是正態(tài)分布的假設(shè)欲主,我們用的是假設(shè)p(Z|X)(后驗分布)是正態(tài)分布5瞬蕖!

具體來說扁瓢,給定一個真實樣本X_{k}详恼,我們假設(shè)存在一個專屬于X_{k}的分布p(Z|X_{k})(學(xué)名叫后驗分布),并進一步假設(shè)這個分布是(獨立的引几、多元的)正態(tài)分布昧互。為什么要強調(diào)“專屬”呢?因為我們后面要訓(xùn)練一個生成器X=g(Z)X=g(Z)伟桅,希望能夠把從分布p(Z|X_{k})采樣出來的一個Z_{k}還原為X_{k}敞掘。如果假設(shè)p(Z)是正態(tài)分布,然后從p(Z)中采樣一個Z楣铁,那么我們怎么知道這個Z對應(yīng)于哪個真實的XX呢玖雁?現(xiàn)在p(Z|X_{k})專屬于X_{k},我們有理由說從這個分布采樣出來的Z應(yīng)該要還原到X_{k}中去盖腕。

事實上赫冬,在論文《Auto-Encoding Variational Bayes》的應(yīng)用部分浓镜,也特別強調(diào)了這一點:

In this case, we can let the

variational approximate posterior be a multivariate Gaussian with a diagonal covariance structure:

\log q_{?}(z|x^{(i)})=\log N(z;μ^{(i)},σ^{2(i)}I)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (9)

(注:這里是直接摘錄原論文,本文所用的符號跟原論文不盡一致劲厌,望讀者不會混淆膛薛。)

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

回到本文风范,這時候每一個X_{k}都配上了一個專屬的正態(tài)分布增淹,才方便后面的生成器做還原。但這樣有多少個X就有多少個正態(tài)分布了乌企。我們知道正態(tài)分布有兩組參數(shù):均值μ和方差σ^2(多元的話虑润,它們都是向量),那我怎么找出專屬于X_{k}的正態(tài)分布p(Z|X_{k})的均值和方差呢加酵?好像并沒有什么直接的思路拳喻。那好吧,那我就用神經(jīng)網(wǎng)絡(luò)來擬合出來吧猪腕!這就是神經(jīng)網(wǎng)絡(luò)時代的哲學(xué):難算的我們都用神經(jīng)網(wǎng)絡(luò)來擬合冗澈,在WGAN那里我們已經(jīng)體驗過一次了,現(xiàn)在再次體驗到了陋葡。

于是我們構(gòu)建兩個神經(jīng)網(wǎng)絡(luò)μ_{k}=f_{1}(X_{k}),\log σ_{k}^2=f_{2}(X_{k})來算它們了亚亲。我們選擇擬合\log ?σ_{k}^2而不是直接擬合σ_{k}^2,是因為σ_{k}^2總是非負(fù)的腐缤,需要加激活函數(shù)處理捌归,而擬合\log ?σ_{k}^2不需要加激活函數(shù),因為它可正可負(fù)岭粤。到這里惜索,我能知道專屬于X_{k}的均值和方差了,也就知道它的正態(tài)分布長什么樣了剃浇,然后從這個專屬分布中采樣一個Z_{k}出來巾兆,然后經(jīng)過一個生成器得到X_{k}=g(Z_{k}),現(xiàn)在我們可以放心地最小化D(\hat{X}_{k},X_{k})^2 虎囚,因為Z_{k}是從專屬X_{k}的分布中采樣出來的角塑,這個生成器應(yīng)該要把開始的X_{k}還原回來。于是可以畫出VAE的示意圖

事實上淘讥,vae是為每個樣本構(gòu)造專屬的正態(tài)分布圃伶,然后采樣來重構(gòu)??

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

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

首先煤惩,我們希望重構(gòu)X,也就是最小化D(\hat{X}_{k},X_{k})^2炼邀,但是這個重構(gòu)過程受到噪聲的影響魄揉,因為Z_{k}是通過重新采樣過的,不是直接由encoder算出來的拭宁。顯然噪聲會增加重構(gòu)的難度洛退,不過好在這個噪聲強度(也就是方差)通過一個神經(jīng)網(wǎng)絡(luò)算出來的,所以最終模型為了重構(gòu)得更好杰标,肯定會想盡辦法讓方差為0兵怯。而方差為0的話,也就沒有隨機性了腔剂,所以不管怎么采樣其實都只是得到確定的結(jié)果(也就是均值)媒区,只擬合一個當(dāng)然比擬合多個要容易,而均值是通過另外一個神經(jīng)網(wǎng)絡(luò)算出來的掸犬。

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

這樣不就白費力氣了嗎宙攻?說好的生成模型呢?

別急別急介褥,其實VAE還讓所有的p(Z|X)都向標(biāo)準(zhǔn)正態(tài)分布看齊座掘,這樣就防止了噪聲為零,同時保證了模型具有生成能力柔滔。怎么理解“保證了生成能力”呢溢陪?如果所有的p(Z|X)都很接近標(biāo)準(zhǔn)正態(tài)分布N(0,I),那么根據(jù)定義

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?p(Z)=\sum_{X} p(Z|X)p(X)=\sum_{X} N(0,I)p(X)=N(0,I)\sum_{X} p(X)=N(0,I)? ? ? ? ? ? ? ?(2)

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

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

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

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?L_{μ}=∥f_{1}(X_{k})∥^2和?L_{σ^2}=∥f_{2}(X_{k})∥^2? ? ? ? ? ? ? ?(3)

因為它們分別代表了均值μkμk和方差的對數(shù)\log σ^2_{k} 王财,達到N(0,I)就是希望二者盡量接近于0了卵迂。不過,這又會面臨著這兩個損失的比例要怎么選取的問題绒净,選取得不好见咒,生成的圖像會比較模糊。所以挂疆,原論文直接算了一般(各分量獨立的)正態(tài)分布與標(biāo)準(zhǔn)正態(tài)分布的KL散度KL(N(μ,σ^2)∥∥N(0,I)) 作為這個額外的loss改览,計算結(jié)果為

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?L_{μ,σ^2}=\frac{1}{2} \sum_{i=1}^d (μ^2_{(i)}+σ^2_{(i)}?\log σ^2_{(i)}?1)? ? ? ? ? ? ? ? ? (4)

這里的d是隱變量Z的維度下翎,而μ_{(i)}σ^2_{(i)}分別代表一般正態(tài)分布的均值向量和方差向量的第i個分量。直接用這個式子做補充loss宝当,就不用考慮均值損失和方差損失的相對比例問題了视事。顯然,這個loss也可以分兩部分理解:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?L_{μ,σ^2}=L_{μ}+L_{σ^2}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?L_{μ}=\frac{1}{2} \sum_{i=1}^d μ^2_{(i)} = \frac{1}{2}||f_{1}(X)||^2? ? ? ? ? ? ? ? ? ? ?(5)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?L_{σ^2}=\frac{1}{2} \sum_{i=1}^d (σ^2_{(i)}?\log σ^2_{(i)}?1)

推導(dǎo)

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

KL(N(μ,σ^2)∥∥N(0,1))

= ∫ \frac{1}{\sqrt{2πσ^2}} e^{?(x?μ)^2/2σ^2} (\log \frac{e^{?(x?μ)^2/2σ^2}/\sqrt{2πσ^2}}{e^{?x^2/2}/ \sqrt{2π}})dx

= ∫ \frac{1}{\sqrt{2πσ^2}} e^{?(x?μ)^2/2σ^2} \log \left\{ \frac{1}{\sqrt{σ^2}} exp\left\{ \frac{1}{2}[x^2?(x?μ)^2/σ^2] \right\}  \right\}dx

= \frac{1}{2}∫\frac{1}{\sqrt{2πσ^2}} e^{?(x?μ)^2/2σ^2} [? \log σ^2+x^2?(x?μ)^2/σ^2] dx

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

KL(N(μ,σ^2)∥∥N(0,1))=\frac{1}{2} (? \log σ^2+μ2+σ^2?1)

.

重參數(shù)技巧?#

重參數(shù)技巧

最后是實現(xiàn)模型的一個技巧奕枢,英文名是reparameterization trick鹤耍,我這里叫它做重參數(shù)吧。其實很簡單验辞,就是我們要從p(Z|X_{k})中采樣一個Z_{k}出來稿黄,盡管我們知道了p(Z|X_{k})是正態(tài)分布,但是均值方差都是靠模型算出來的跌造,我們要靠這個過程反過來優(yōu)化均值方差的模型杆怕,但是“采樣”這個操作是不可導(dǎo)的,而采樣的結(jié)果是可導(dǎo)的壳贪。我們利用

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??\frac{1}{\sqrt{2πσ^2}}exp(?\frac{z?μ)^2}{2σ^2}dz = \frac{1}{\sqrt{2π}}exp[?\frac{1}{2}(\frac{ z?μ}{σ})^2]d(\frac{z?μ}{σ})? ? ?(6)

這說明(z?μ)/σ=ε是服從均值為0陵珍、方差為1的標(biāo)準(zhǔn)正態(tài)分布的,要同時把dz考慮進去违施,是因為乘上dz才算是概率互纯,去掉dz是概率密度而不是概率。這時候我們得到:

N(μ,σ^2)中采樣一個Z磕蒲,相當(dāng)于從N(0,I)中采樣一個ε留潦,然后讓Z=μ+ε×σ

于是辣往,我們將從N(μ,σ^2)采樣變成了從N(0,I)中采樣兔院,然后通過參數(shù)變換得到從N(μ,σ^2)中采樣的結(jié)果。這樣一來站削,“采樣”這個操作就不用參與梯度下降了坊萝,改為采樣的結(jié)果參與,使得整個模型可訓(xùn)練了。

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

后續(xù)分析?#

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

本質(zhì)是什么?#

VAE的本質(zhì)是什么荣刑?VAE雖然也稱是AE(AutoEncoder)的一種馅笙,但它的做法(或者說它對網(wǎng)絡(luò)的詮釋)是別具一格的。在VAE中厉亏,它的Encoder有兩個董习,一個用來計算均值,一個用來計算方差爱只,這已經(jīng)讓人意外了:Encoder不是用來Encode的皿淋,是用來算均值和方差的,這真是大新聞了恬试,還有均值和方差不都是統(tǒng)計量嗎窝趣,怎么是用神經(jīng)網(wǎng)絡(luò)來算的?

事實上训柴,我覺得VAE從讓普通人望而生畏的變分和貝葉斯理論出發(fā)哑舒,最后落地到一個具體的模型中,雖然走了比較長的一段路幻馁,但最終的模型其實是很接地氣的:它本質(zhì)上就是在我們常規(guī)的自編碼器的基礎(chǔ)上洗鸵,對encoder的結(jié)果(在VAE中對應(yīng)著計算均值的網(wǎng)絡(luò))加上了“高斯噪聲”,使得結(jié)果decoder能夠?qū)υ肼曈恤敯粜哉锑拢欢莻€額外的KL loss(目的是讓均值為0膘滨,方差為1),事實上就是相當(dāng)于對encoder的一個正則項稀拐,希望encoder出來的東西均有零均值火邓。

那另外一個encoder(對應(yīng)著計算方差的網(wǎng)絡(luò))的作用呢?它是用來動態(tài)調(diào)節(jié)噪聲的強度的德撬。直覺上來想铲咨,當(dāng)decoder還沒有訓(xùn)練好時(重構(gòu)誤差遠(yuǎn)大于KL loss),就會適當(dāng)降低噪聲(KL loss增加)砰逻,使得擬合起來容易一些(重構(gòu)誤差開始下降)鸣驱;反之,如果decoder訓(xùn)練得還不錯時(重構(gòu)誤差小于KL loss)蝠咆,這時候噪聲就會增加(KL loss減少),使得擬合更加困難了(重構(gòu)誤差又開始增加),這時候decoder就要想辦法提高它的生成能力了刚操。

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

說白了闸翅,重構(gòu)的過程是希望沒噪聲的,而KL loss則希望有高斯噪聲的菊霜,兩者是對立的坚冀。所以,VAE跟GAN一樣鉴逞,內(nèi)部其實是包含了一個對抗的過程记某,只不過它們兩者是混合起來,共同進化的构捡。從這個角度看液南,VAE的思想似乎還高明一些,因為在GAN中勾徽,造假者在進化時滑凉,鑒別者是安然不動的,反之亦然喘帚。當(dāng)然畅姊,這只是一個側(cè)面,不能說明VAE就比GAN好吹由。GAN真正高明的地方是:它連度量都直接訓(xùn)練出來了若未,而且這個度量往往比我們?nèi)斯は氲囊茫ㄈ欢鳪AN本身也有各種問題,這就不展開了)。

正態(tài)分布??#

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

估計不大可行放坏,這還是因為KL散度的計算公式:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??KL(p(x)∥∥q(x))=∫p(x)ln \frac{p(x)}{q(x)}dx? ? ? ? ? ? ? ? ? ? ? ? ? ?(7)

要是在某個區(qū)域中p(x)≠0q(x)=0的話,那么KL散度就無窮大了。對于正態(tài)分布來說甚淡,所有點的概率密度都是非負(fù)的,因此不存在這個問題捅厂。但對于均勻分布來說贯卦,只要兩個分布不一致,那么就必然存在p(x)≠0q(x)=0的區(qū)間焙贷,因此KL散度會無窮大撵割。當(dāng)然,寫代碼時我們會防止這種除零錯誤辙芍,但依然避免不了KL loss占比很大啡彬,因此模型會迅速降低KL loss羹与,也就是后驗分布p(Z|X) 迅速趨于先驗分布p(Z),而噪聲和重構(gòu)無法起到對抗作用庶灿。這又回到我們開始說的纵搁,無法區(qū)分哪個z對應(yīng)哪個x了。

當(dāng)然往踢,非得要用均勻分布也不是不可能腾誉,就是算好兩個均勻分布的KL散度,然后做好初零錯誤處理峻呕,加大重構(gòu)loss的權(quán)重利职,等等~但這樣就顯得太丑陋了。

變分在哪里?#

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

呃~其實如果讀者已經(jīng)承認(rèn)了KL散度的話哮伟,那VAE好像真的跟變分沒多大關(guān)系了~因為理論上對于KL散度(7)(7)我們要證明:

固定概率分布p(x)(或q(x))的情況下,對于任意的概率分布q(x)(或p(x))妄帘,都有KL(p(x)∥∥q(x))≥0楞黄,而且只有當(dāng)p(x)=q(x)時才等于零。

因為KL(p(x)∥∥q(x)) 實際上是一個泛函抡驼,要對泛函求極值就要用到變分法鬼廓,當(dāng)然,這里的變分法只是普通微積分的平行推廣致盟,還沒涉及到真正復(fù)雜的變分法碎税。而VAE的變分下界,是直接基于KL散度就得到的馏锡。所以直接承認(rèn)了KL散度的話雷蹂,就沒有變分的什么事了。

一句話杯道,VAE的名字中“變分”匪煌,是因為它的推導(dǎo)過程用到了KL散度及其性質(zhì)。

條件VAE?#

最后党巾,因為目前的VAE是無監(jiān)督訓(xùn)練的萎庭,因此很自然想到:如果有標(biāo)簽數(shù)據(jù),那么能不能把標(biāo)簽信息加進去輔助生成樣本呢齿拂?這個問題的意圖驳规,往往是希望能夠?qū)崿F(xiàn)控制某個變量來實現(xiàn)生成某一類圖像。當(dāng)然署海,這是肯定可以的吗购,我們把這種情況叫做Conditional VAE医男,或者叫CVAE。(相應(yīng)地巩搏,在GAN中我們也有個CGAN昨登。)

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

一個簡單的cvae結(jié)構(gòu)

在前面的討論中胚想,我們希望X經(jīng)過編碼后,Z的分布都具有零均值和單位方差芽隆,這個“希望”是通過加入了KL loss來實現(xiàn)的浊服。如果現(xiàn)在多了類別信息Y我們可以希望同一個類的樣本都有一個專屬的均值μ_{Y}(方差不變胚吁,還是單位方差)牙躺,這個μ_{Y}讓模型自己訓(xùn)練出來。這樣的話腕扶,有多少個類就有多少個正態(tài)分布孽拷,而在生成的時候,我們就可以通過控制均值來控制生成圖像的類別半抱。事實上脓恕,這樣可能也是在VAE的基礎(chǔ)上加入最少的代碼來實現(xiàn)CVAE的方案了,因為這個“新希望”也只需通過修改KL loss實現(xiàn):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? L_{μ,σ^2}=\frac{1}{2}\sum_{i=1}^d [(μ_{(i)}?μ_{(i)}^Y)^2+σ^2_{(i)}?logσ^2_{(i)}?1]? ? ? ? ?(8)

下圖顯示這個簡單的CVAE是有一定的效果的窿侈,不過因為encoder和decoder都比較簡單(純MLP)炼幔,所以控制生成的效果不盡完美。更完備的CVAE請讀者自行學(xué)習(xí)了史简,最近還出來了CVAE與GAN結(jié)合的工作CVAE-GAN乃秀,模型套路千變?nèi)f化啊。

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

代碼?#

我把Keras官方的VAE代碼復(fù)制了一份衙傀,然后微調(diào)并根據(jù)前文內(nèi)容添加了中文注釋抬吟,也把最后說到的簡單的CVAE實現(xiàn)了一下,供讀者參考~

代碼:https://github.com/bojone/vae

終點站?#

磕磕碰碰统抬,又到了文章的終點了火本。不知道講清楚了沒危队,希望大家多提點意見~

總的來說,VAE的思路還是很漂亮的钙畔。倒不是說它提供了一個多么好的生成模型(因為事實上它生成的圖像并不算好茫陆,偏模糊),而是它提供了一個將概率圖跟深度學(xué)習(xí)結(jié)合起來的一個非常棒的案例擎析,這個案例有諸多值得思考回味的地方簿盅。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市揍魂,隨后出現(xiàn)的幾起案子桨醋,更是在濱河造成了極大的恐慌,老刑警劉巖现斋,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喜最,死亡現(xiàn)場離奇詭異,居然都是意外死亡庄蹋,警方通過查閱死者的電腦和手機瞬内,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來限书,“玉大人虫蝶,你說我怎么就攤上這事≌岚” “怎么了秉扑?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長调限。 經(jīng)常有香客問我舟陆,道長,這世上最難降的妖魔是什么耻矮? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任秦躯,我火速辦了婚禮,結(jié)果婚禮上裆装,老公的妹妹穿的比我還像新娘踱承。我一直安慰自己,他們只是感情好哨免,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布茎活。 她就那樣靜靜地躺著,像睡著了一般琢唾。 火紅的嫁衣襯著肌膚如雪载荔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天采桃,我揣著相機與錄音懒熙,去河邊找鬼丘损。 笑死,一個胖子當(dāng)著我的面吹牛工扎,可吹牛的內(nèi)容都是我干的徘钥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肢娘,長吁一口氣:“原來是場噩夢啊……” “哼呈础!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蔬浙,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤猪落,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后畴博,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡蓝仲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年俱病,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袱结。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡亮隙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出垢夹,到底是詐尸還是另有隱情溢吻,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布果元,位于F島的核電站促王,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏而晒。R本人自食惡果不足惜蝇狼,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望倡怎。 院中可真熱鬧迅耘,春花似錦、人聲如沸监署。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钠乏。三九已至栖秕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缓熟,已是汗流浹背累魔。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工摔笤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人垦写。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓吕世,卻偏偏與公主長得像,于是被迫代替她去往敵國和親梯投。 傳聞我的和親對象是個殘疾皇子命辖,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容