VAE萎馅、GAN双戳、Info-GAN:全解深度學(xué)習(xí)三大生成模型

摘要:在深度學(xué)習(xí)之前已經(jīng)有很多生成模型,但苦于生成模型難以描述難以建模糜芳,科研人員遇到了很多挑戰(zhàn)飒货,而深度學(xué)習(xí)的出現(xiàn)幫助他們解決了不少問題。本章介紹基于深度學(xué)習(xí)思想的生成模型——VAE和GAN耍目,以及GAN的變種模型膏斤。

在深度學(xué)習(xí)之前已經(jīng)有很多生成模型,但苦于生成模型難以描述難以建模邪驮,科研人員遇到了很多挑戰(zhàn)莫辨,而深度學(xué)習(xí)的出現(xiàn)幫助他們解決了不少問題。本章介紹基于深度學(xué)習(xí)思想的生成模型——VAE和GAN毅访,以及GAN的變種模型沮榜。

VAE

本節(jié)將為讀者介紹基于變分思想的深度學(xué)習(xí)的生成模型——Variational autoencoder,簡稱VAE喻粹。

1.1 生成式模型

前面的章節(jié)里讀者已經(jīng)看過很多判別式模型蟆融。這些模型大多有下面的規(guī)律:已知觀察變量X,和隱含變量z守呜,判別式模型對p(z|X)進(jìn)行建模型酥,它根據(jù)輸入的觀察變量x得到隱含變量z出現(xiàn)的可能性。生成式模型則是將兩者的順序反過來查乒,它要對p(X|z)進(jìn)行建模弥喉,輸入是隱含變量,輸出是觀察變量的概率玛迄。

可以想象由境,不同的模型結(jié)構(gòu)自然有不同的用途。判別模型在判別工作上更適合蓖议,生成模型在分布估計(jì)等問題上更有優(yōu)勢虏杰。如果想用生成式模型去解決判別問題,就需要利用貝葉斯公式把這個問題轉(zhuǎn)換成適合自己處理的樣子:

對于一些簡單的問題勒虾,上面的公式還是比較容易解出的纺阔,但對于一些復(fù)雜的問題,找出從隱含變量到觀察變量之間的關(guān)系是一件很困難的事情修然,生成式模型的建模過程會非常困難州弟,所以對于判別類問題钧栖,判別式模型一般更適合。

但對于“隨機(jī)生成滿足某些隱含變量特點(diǎn)的數(shù)據(jù)”這樣的問題來說婆翔,判別式模型就會顯得力不從心拯杠。如果用判別式模型生成數(shù)據(jù),就要通過類似于下面這種方式的方法進(jìn)行啃奴。

第一步潭陪,利用簡單隨機(jī)一個X。

第二步最蕾,用判別式模型計(jì)算p(z|X)概率依溯,如果概率滿足,則找到了這個觀察數(shù)據(jù)瘟则,如果不滿足黎炉,返回第一步。

這樣用判別式模型生成數(shù)據(jù)的效率可能會十分低下醋拧。而生成式模型解決這個問題就十分簡單慷嗜,首先確定好z的取值,然后根據(jù)p(X|z)的分布進(jìn)行隨機(jī)采樣就行了丹壕。

了解了兩種模型的不同庆械,下面就來看看生成式模型的建模方法。

1.2 Variational Lower bound

雖然生成模型和判別模型的形式不同菌赖,但兩者建模的方法總體來說相近缭乘,生成模型一般也通過最大化后驗(yàn)概率的形式進(jìn)行建模優(yōu)化。也就是利用貝葉斯公式:

這個公式在復(fù)雜的模型和大規(guī)模數(shù)據(jù)面前極難求解琉用。為了解決這個問題堕绩,這里將繼續(xù)采用變分的方法用一個變分函數(shù)q(z)代替p(z|X)。第9章在介紹Dense CRF時已經(jīng)詳細(xì)介紹了變分推導(dǎo)的過程邑时,而這一次的推導(dǎo)并不需要做完整的變分推導(dǎo)逛尚,只需要利用變分方法的下界將問題進(jìn)行轉(zhuǎn)換即可。

既然希望用q(z)這個新函數(shù)代替后驗(yàn)概率p(z|X)刁愿,那么兩個概率分布需要盡可能地相近,這里依然選擇KL散度衡量兩者的相近程度到逊。根據(jù)KL公式就有:

根據(jù)貝葉斯公式進(jìn)行變換铣口,就得到了:

由于積分的目標(biāo)是z,這里再將和z無關(guān)的項(xiàng)目從積分符號中拿出來觉壶,就得到了:

將等式左右項(xiàng)目交換脑题,就得到了下面的公式:

雖然這個公式還是很復(fù)雜,因?yàn)镵L散度的性質(zhì)铜靶,這個公式中還是令人看到了一絲曙光叔遂。

首先看等號左邊他炊,雖然p(X)的概率分布不容易求出,但在訓(xùn)練過程中當(dāng)X已經(jīng)給定已艰,p(X)已經(jīng)是個固定值不需要考慮痊末。如果訓(xùn)練的目標(biāo)是希望KL(q(z)||p(z|X))盡可能小,就相當(dāng)于讓等號右邊的那部分盡可能變大哩掺。等號右邊的第一項(xiàng)實(shí)際上是基于q(z)概率的對數(shù)似然期望凿叠,第二項(xiàng)又是一個負(fù)的KL散度,所以我們可以認(rèn)為嚼吞,為了找到一個好的q(z)盒件,使得它和p(z|X)盡可能相近,實(shí)現(xiàn)最終的優(yōu)化目標(biāo)舱禽,優(yōu)化的目標(biāo)將變?yōu)椋?/p>

右邊第一項(xiàng)的log似然的期望最大化:

右邊第二項(xiàng)的KL散度最小化:

右邊兩個項(xiàng)目的優(yōu)化難度相對變小了一些炒刁,下面就來看看如何基于它們做進(jìn)一步的計(jì)算。

1.3 Reparameterization Trick

為了更方便地求解上面的公式誊稚,這里需要做一點(diǎn)小小的trick工作翔始。上面提到了q(z)這個變分函數(shù),為了近似后驗(yàn)概率片吊,它實(shí)際上代表了給定某個X的情況下z的分布情況绽昏,如果將它的概率形式寫完整,那么它應(yīng)該是q(z|X)俏脊。這個結(jié)構(gòu)實(shí)際上對后面的運(yùn)算產(chǎn)生了一些障礙全谤,那么能不能想辦法把X抽離出來呢?

例如爷贫,有一個隨機(jī)變量a服從均值為1认然,方差為1的高斯分布,那么根據(jù)高斯分布的性質(zhì)漫萄,隨機(jī)變量b=a-1將服從均值為0卷员,方差為1的高斯分布,換句話說腾务,我們可以用一個均值為0毕骡,方差為1的隨機(jī)變量加上一個常量1來表示現(xiàn)在的隨機(jī)變量a。這樣一個隨機(jī)變量就被分成了兩部分——一部分是確定的岩瘦,一部分是隨機(jī)的未巫。

實(shí)際上,q(z|X)也可以采用上面的方法完成启昧。這個條件概率可以拆分成兩部分叙凡,一部分是一個觀察變量g?(X),它代表了條件概率的確定部分密末,它的值和一個隨機(jī)變量的期望值類似握爷;另一部分是隨機(jī)變量ε跛璧,它負(fù)責(zé)隨機(jī)的部分,基于這樣的表示方法新啼,條件概率中的隨機(jī)性將主要來自這里追城。

這樣做有什么好處呢?經(jīng)過變換师抄,如果z條件概率值完全取決于ε的概率漓柑。也就是說如果z(i)=g?(X+ε(i)),那么q(z(i))=p(ε(i))叨吮,那么上面關(guān)于變分推導(dǎo)的公式就變成了下面的公式:

這就是替換的一小步辆布,求解的一大步!這個公式已經(jīng)很接近問題最終的答案了茶鉴,既然?完全決定了z的分布锋玲,那么假設(shè)一個?服從某個分布,這個變分函數(shù)的建模就完成了涵叮。如果?服從某個分布惭蹂,那么z的條件概率是不是也服從這個分布呢?不一定割粮。z的條件分布會根據(jù)訓(xùn)練數(shù)據(jù)進(jìn)行學(xué)習(xí)盾碗,由于經(jīng)過了函數(shù)g?()的計(jì)算,z的分布有可能產(chǎn)生了很大的變化舀瓢。而這個函數(shù)廷雅,就可以用深度學(xué)習(xí)模型表示。前面的章節(jié)讀者已經(jīng)了解到深層模型的強(qiáng)大威力京髓,那么從一個簡單常見的隨機(jī)變量映射到復(fù)雜分布的變量航缀,對深層模型來說是一件很平常的事情,它可以做得很好堰怨。

于是這個假設(shè)?服從多維且各維度獨(dú)立高斯分布芥玉。同時,z的先驗(yàn)和后驗(yàn)也被假設(shè)成一個多維且各維度獨(dú)立的高斯分布备图。下面就來看看兩個優(yōu)化目標(biāo)的最終形式灿巧。

1.4 Encoder和Decoder的計(jì)算公式

回顧一下10.1.2的兩個優(yōu)化目標(biāo),下面就來想辦法求解這兩個目標(biāo)揽涮。首先來看看第二個優(yōu)化目標(biāo)抠藕,也就是讓公式右邊第二項(xiàng)KL(q(z)||p(z))最小化。剛才z的先驗(yàn)被假設(shè)成一個多維且各維度獨(dú)立的高斯分布绞吁,這里可以給出一個更強(qiáng)的假設(shè),那就是這個高斯分布各維度的均值為0唬格,協(xié)方差為單位矩陣家破,那么前面提到的KL散度公式就從:

瞬間簡化成為:

前面提到了一個用深層網(wǎng)絡(luò)實(shí)現(xiàn)的模型g?(X,?)颜说,它的輸入是一批圖像,輸出是z汰聋,因此這里需要它通過X生成z门粪,并將這一個批次的數(shù)據(jù)匯總計(jì)算得到它們的均值和方差。這樣利用上面的公式烹困,KL散度最小化的模型就建立好了玄妈。

實(shí)際計(jì)算過程中不需要將協(xié)方差表示成矩陣的形狀,只需要一個向量σ1來表示協(xié)方差矩陣的主對角線即可髓梅,公式將被進(jìn)一步簡化:

由于函數(shù)g?()實(shí)現(xiàn)了從觀測數(shù)據(jù)到隱含數(shù)據(jù)的轉(zhuǎn)變拟蜻,因此這個模型被稱為Encoder模型。

接下來是第一個優(yōu)化目標(biāo)枯饿,也就是讓公式左邊第一項(xiàng)的似然期望最大化酝锅。這一部分的內(nèi)容相對簡單,由于前面的Encoder模型已經(jīng)計(jì)算出了一批觀察變量X對應(yīng)的隱含變量z奢方,那么這里就可以再建立一個深層模型搔扁,根據(jù)似然進(jìn)行建模,輸入為隱含變量z蟋字,輸出為觀察變量X稿蹲。如果輸出的圖像和前面生成的圖像相近,那么就可以認(rèn)為似然得到了最大化鹊奖。這個模型被稱為Decoder苛聘,也就是本章的主題——生成模型。

到這里VAE的核心計(jì)算推導(dǎo)就結(jié)束了嫉入。由于模型推導(dǎo)的過程有些復(fù)雜焰盗,下面就來看看VAE實(shí)現(xiàn)的代碼,同時來看看VAE模型生成的圖像是什么樣子咒林。

1.5 實(shí)現(xiàn)

本節(jié)要介紹VAE模型的一個比較不錯的實(shí)現(xiàn)——GitHub - cdoersch/vae_tutorial: Caffe code to accompany my Tutorial on Variational Autoencoders熬拒,這個工程還配有一個介紹VAE的文章[2],感興趣的讀者可以閱讀垫竞,讀后會有更多啟發(fā)澎粟。這個實(shí)現(xiàn)使用的目標(biāo)數(shù)據(jù)集依然是MNIST,模型的架構(gòu)如圖10-1所示欢瞪。為了更好地了解模型的架構(gòu)活烙,這里將模型中的一些細(xì)節(jié)隱去,只留下核心的數(shù)據(jù)流動和Loss計(jì)算部分遣鼓。

圖10-1 VAE模型結(jié)構(gòu)圖

圖中粗框表示求解Loss的部分啸盏。虛線展現(xiàn)了兩個模塊之間數(shù)據(jù)共享的情況∑锼睿可以看出圖的上半部分是優(yōu)化Encoder的部分回懦,下面是優(yōu)化Decoder的部分气笙,除了Encoder和Decoder,圖中還有三個主要部分怯晕。

Encoder的Loss計(jì)算:KL散度潜圃。

z的重采樣生成。

Decoder的Loss計(jì)算:最大似然舟茶。

這其中最復(fù)雜的就是第一項(xiàng)谭期,Encoder的Loss計(jì)算。由于Caffe在實(shí)際計(jì)算過程中只能采用向量的計(jì)算方式吧凉,沒有廣播計(jì)算的機(jī)制隧出,所以前面的公式需要進(jìn)行一定的變換:

在完成了前面的向量級別計(jì)算后,最后一步就是完成匯總加和的過程客燕。這樣Loss計(jì)算就順利完成了鸳劳。

經(jīng)過上面對VAE理論和實(shí)驗(yàn)的介紹,相信讀者對VAE模型有了更清晰的認(rèn)識也搓。經(jīng)過訓(xùn)練后VAE的解碼器在MNIST數(shù)據(jù)庫上生成的字符如圖10-2所示赏廓。

圖10-2 VAE生成的數(shù)字圖

1.6 MNIST生成模型可視化

除了直接觀察最終生成的數(shù)字結(jié)果,實(shí)際上還有另一種觀察數(shù)據(jù)的方式傍妒,那就是站在隱變量空間的角度觀察分布的生成情況幔摸。實(shí)現(xiàn)這個效果需要完成以下兩個工作:

隱變量的維度為2,相當(dāng)于把生成的數(shù)字圖片投影到2維平面上颤练,這樣更方便可視化觀察分析既忆。

由于隱變量的維度為2,就可以從二維平面上等間距地采樣一批隱變量嗦玖,這樣這批隱變量可以代表整個二維平面上隱變量的分布患雇,然后這批隱變量經(jīng)過解碼器處理后展示,這樣就可以看到圖像的分布情況了宇挫。

上面描述的算法的流程如圖10-3所示苛吱。

圖10-3 模型可視化流程圖。上圖主要標(biāo)識了模型的修改部分器瘪,下圖介紹隱變量采樣和生成的形式

圖10-4 模型可視化結(jié)果

圖10-4所示的模型很好地完成了隱變量的建模翠储,絕大多數(shù)數(shù)字出現(xiàn)在了這個平面分布中,數(shù)字與數(shù)字一些過渡區(qū)域橡疼,這些過渡區(qū)域的圖像擁有多個數(shù)字的特征援所,而這些數(shù)字的外形確實(shí)存在著相似之處⌒莱可以明顯地感受到住拭,圖像隨著隱變量變換產(chǎn)生了變換馏锡。

VAE的內(nèi)容就介紹到這里虎敦,下面來看看另一個生成模型桶蝎。

GAN

前面我們介紹了VAE慎式,下面來看看GAN(Generative Adversarial Network)[3],這個網(wǎng)絡(luò)組是站在對抗博弈的角度展現(xiàn)生成模型和判別模型各自的威力的澈蟆,在效果上比VAE還要好些。

2.1 GAN的概念

同VAE模型類似卓研,GAN模型也包含了一對子模型趴俘。GAN的名字中包含一個對抗的概念,為了體現(xiàn)對抗這個概念奏赘,除了生成模型寥闪,其中還有另外一個模型幫助生成模型更好地學(xué)習(xí)觀測數(shù)據(jù)的條件分布。這個模型可以稱作判別模型D磨淌,它的輸入是數(shù)據(jù)空間內(nèi)的任意一張圖像x疲憋,輸出是一個概率值,表示這張圖像屬于真實(shí)數(shù)據(jù)的概率梁只。對于生成模型G來說缚柳,它的輸入是一個隨機(jī)變量z,z服從某種分布搪锣,輸出是一張圖像G(z)秋忙,如果它生成的圖像經(jīng)過模型D后的概率值很高,就說明生成模型已經(jīng)比較好地掌握了數(shù)據(jù)的分布模式构舟,可以產(chǎn)生符合要求的樣本灰追;反之則沒有達(dá)到要求,還需要繼續(xù)訓(xùn)練狗超。

兩個模型的目標(biāo)如下所示:

判別模型的目標(biāo)是最大化這個公式:Ex[D(x)]弹澎,也就是甄別出哪些圖是真實(shí)數(shù)據(jù)分布中的。

生成模型的目標(biāo)是最大化這個公式:Ez[D(G(z))]努咐,也就是讓自己生成的圖被判別模型判斷為來自真實(shí)數(shù)據(jù)分布苦蒿。

看上去兩個模型目標(biāo)聯(lián)系并不大,下面就要增加兩個模型的聯(lián)系麦撵,如果生成模型生成的圖像和真實(shí)的圖像有區(qū)別刽肠,判別模型要給它判定比較低的概率。這里可以舉個形象的例子免胃,x好比是一種商品音五,D是商品的檢驗(yàn)方,負(fù)責(zé)檢驗(yàn)商品是否是正品羔沙;G是一家山寨公司躺涝,希望根據(jù)拿到手的一批產(chǎn)品x研究出生產(chǎn)山寨商品x的方式。對于D來說,不管G生產(chǎn)出來的商品多像正品坚嗜,都應(yīng)該被判定為贗品夯膀,更何況一開始G的技術(shù)水品不高,生產(chǎn)出來的產(chǎn)品必然是漏洞百出苍蔬,所以被判定為贗品也不算冤枉诱建,只有不斷地提高技術(shù),才有可能迷惑檢驗(yàn)方碟绑。

基于上面的例子俺猿,兩個模型的目標(biāo)就可以統(tǒng)一成一個充滿硝煙味的目標(biāo)函數(shù)。

上面這個公式對應(yīng)的模型架構(gòu)如圖10-5所示格仲。

圖10-5 GAN的基本形式

對應(yīng)的模型學(xué)習(xí)算法偽代碼如下所示:

def GAN(G,D,X):

# G 表示生成模型

# D 表示判別模型

# X 表示訓(xùn)練數(shù)據(jù)

for iter in range(MAX_ITER):

for step in range(K):

x = data_sample(X)

z = noise_sample()

optimize_D(G, D, x, z)

z = noise_sample()

optimize_G(G, D, z)

上面的代碼只是從宏觀的層面介紹了模型的優(yōu)化方法押袍,其中K表示了判別模型D的迭代次數(shù),K一般大于等于1凯肋。從上面的公式可以看出谊惭,兩個模型的目標(biāo)是對立的。生成模型希望最大化自己生成圖像的似然侮东,判別模型希望最大化原始數(shù)據(jù)的似然的同時圈盔,能夠最小化G生成的圖像的似然。既然是對立的悄雅,那么兩個模型經(jīng)過訓(xùn)練產(chǎn)生的能力就可能有很多種情況药磺。它們既可能上演“魔高一尺,道高一尺”煤伟,“道高一丈癌佩,魔高十丈”的競爭戲碼,在競爭中共同成長便锨,最終產(chǎn)生兩個強(qiáng)大的模型围辙;也可能產(chǎn)生一個強(qiáng)大的模型,將另一方完全壓倒放案。

如果判別模型太過強(qiáng)大姚建,那么生成模型會產(chǎn)生兩種情況:一種情況是發(fā)現(xiàn)自己完全被針對,模型參數(shù)無法優(yōu)化吱殉;另外一種情況是發(fā)現(xiàn)判別模型的一些漏洞后掸冤,它的模型將退化,不管輸入是什么樣子友雳,輸出統(tǒng)一變成之前突破了判別模型防線的那幾類結(jié)果稿湿。這種情況被稱為“Mode Collapse”,有點(diǎn)像一個復(fù)雜強(qiáng)大的模型崩塌成一個簡單弱小的模型押赊,這樣的模型即使優(yōu)化結(jié)果很好饺藤,也不能拿去使用。

如果判別模型不夠強(qiáng)大,它的判別不夠精準(zhǔn)涕俗,而生成模型又是按照它的判別結(jié)果生產(chǎn)罗丰,那么生產(chǎn)出的產(chǎn)品不會很穩(wěn)定,這同樣不是我們想看到的結(jié)果再姑。

總而言之萌抵,對抗是GAN這個模型要面對的一個大問題。雖然論文中作者試圖將兩個模型共同優(yōu)化的問題轉(zhuǎn)換成類似Coordinate Ascent那樣的優(yōu)化問題元镀,并證明像Coordinate Ascent這樣的算法可以收斂谜嫉,那么GAN這個模型也可以。不過作者在完成證明后立刻翻臉凹联,說證明結(jié)果和實(shí)驗(yàn)結(jié)果不符。所以這個問題在當(dāng)時也就變成了一個懸案哆档。

2.2 GAN的訓(xùn)練分析

關(guān)于GAN訓(xùn)練求解的過程蔽挠,作者用了十分?jǐn)?shù)學(xué)化的方式進(jìn)行了推演。我們首先來證明第一步:當(dāng)生成模型固定時瓜浸,判別模型的最優(yōu)形式澳淑。

首先將目標(biāo)函數(shù)做變換:

由于組成式子的兩部分積分的區(qū)域不同,會對后面的計(jì)算造成困難插佛,我們首先將兩個積分區(qū)域統(tǒng)一杠巡。我們將生成圖像G(z)的分布與真實(shí)圖像x的分布做一個投射,只要判別式能夠在真實(shí)數(shù)據(jù)出現(xiàn)的地方保證判別正確最大化即可雇寇,于是公式就變成了:

只要讓積分內(nèi)部的公式最大化氢拥,整個公式就可以實(shí)現(xiàn)最大化。這樣問題就轉(zhuǎn)變?yōu)樽畲蠡旅娴墓剑?/p>

對它進(jìn)行求導(dǎo)取極值锨侯,可以得到:

令上面的式子為0嫩海,我們可以得到結(jié)果:

這就是理論上判別式的預(yù)測結(jié)果,如果一張圖像在真實(shí)分布中出現(xiàn)的概率大而在生成分布中出現(xiàn)的概率小囚痴,那么最優(yōu)的判別模型會認(rèn)為它是真實(shí)圖像叁怪,反之則認(rèn)為不是真實(shí)圖

像。如果生成模型已經(jīng)達(dá)到了完美的狀態(tài)深滚,也就是說對每一幅圖像都有:

接下來就可以利用上面的結(jié)果奕谭,計(jì)算當(dāng)生成模型達(dá)到完美狀態(tài)時,損失函數(shù)的值痴荐。我們將D*(x)=1/2的結(jié)果代入血柳,可以得到:

也就是說生成模型損失函數(shù)的理論最小值為-2log2。那么生兆,一般情況下它的損失函數(shù)是什么樣子呢混驰?我們假設(shè)在某一時刻判別式經(jīng)過優(yōu)化已經(jīng)達(dá)到最優(yōu),所以

我們將這個公式代入之前的公式,可以得到:

后面的兩個KL散度的計(jì)算公式可以轉(zhuǎn)化為Jenson-Shannon散度栖榨,也就是:

這其實(shí)是生成模型真正的優(yōu)化目標(biāo)函數(shù)昆汹。在介紹VAE時,讀者已經(jīng)了解了KL散度婴栽,也了解了它的一些基本知識满粗,那么這個JS散度又是什么?它又有什么特性和優(yōu)勢愚争?從最直觀的角度映皆,讀者可以發(fā)現(xiàn)一個KL散度不具備的性質(zhì)——JS散度是對稱的:

對稱又能帶來什么好處呢?它能讓散度度量更準(zhǔn)確轰枝。接下來將用一段代碼展示這其中的道理捅彻。首先給出兩個離散隨機(jī)變量的KL散度和JS散度的計(jì)算方法:

import numpy as np

import math

def KL(p, q):

# p,q為兩個list,里面存著對應(yīng)的取值的概率鞍陨,整個list相加為1

if 0 in q:

raise ValueError

return sum(_p * math.log(_p/_q) for (_p,_q) in zip(p, q) if _p != 0)

def JS(p, q):

M = [0.5 * (_p + _q) for (_p, _q) in zip(p, q)]

return 0.5 * (KL(p, M) + KL(q, M))

下面將用3組實(shí)驗(yàn)看看兩個散度的計(jì)算結(jié)果步淹。首先選定一個簡單的離散分布,然后求出它的KL散度和JS散度诚撵。在此基礎(chǔ)上缭裆,把兩個分布分別做一定的調(diào)整。首先是基礎(chǔ)的分布:

def exp(a, b):

a = np.array(a, dtype=np.float32)

b = np.array(b, dtype=np.float32)

a /= a.sum()

b /= b.sum()

print a

print b

print KL(a,b)

print JS(a,b)

# exp 1

exp([1,2,3,4,5],[5,4,3,2,1])

#以下為運(yùn)行結(jié)果顯示

[ 0.066 ?0.133 ?0.2 ? ? ? ? 0.266 ?0.333]

[ 0.333 ?0.266 ?0.2 ? ? ? ? 0.133 ?0.066]

0.521

0.119

接下來把公式中第二個分布做修改寿烟,假設(shè)這個分布中有某個值的取值非常小澈驼,就有可能增加兩個分布的散度值,它的代碼如下所示:

# exp 2

exp([1,2,3,4,5],[1e-12,4,3,2,1])

exp([1,2,3,4,5],[5,4,3,2,1e-12])

#以下為運(yùn)行結(jié)果顯示

[ 0.066 ?0.133 ?0.2 ? ? ? ? 0.266 ?0.333]

[ 9.999e-14 ? 4.000e-01 ? 3.000e-01 ? 2.000e-01 ? 1.000e-01]

2.06550201846

0.0985487692551

[ 0.066 ?0.133 ?0.2 ? ? ? ? 0.266 ?0.333]

[ 3.571e-01 ? 2.857e-01 ? 2.142e-01 ? 1.428e-01 ? 7.142e-14]

9.662

0.193

可以看出KL散度的波動比較大筛武,而JS的波動相對小缝其。

最后修改前面的分布,代碼如下所示:

# exp 3

exp([1e-12,2,3,4,5],[5,4,3,2,1])

exp([1,2,3,4,1e-12],[5,4,3,2,1])

這回得到的結(jié)果是這樣的:

[ 7.142e-14 ? 1.428e-01 ? 2.142e-01 ? 2.857e-01 ? 3.571e-01]

[ 0.333 ?0.266 ?0.2 ? ? ? ? 0.133 ?0.0666]

0.742

0.193

[ 1.000e-01 ? 2.000e-01 ? 3.000e-01 ? 4.000e-01 ? 9.999e-14]

[ 0.333 ?0.266 ?0.2 ? ? ? ? 0.133 ?0.066]

0.383

0.098

如果將第二個實(shí)驗(yàn)和第三個實(shí)驗(yàn)做對比徘六,就可以發(fā)現(xiàn)KL散度在衡量兩個分布的差異時具有很大的不對稱性氏淑。如果后面的分布在某一個值上缺失,就會得到很大的散度值硕噩;但是如果前面的分布在某一個值上缺失假残,最終的KL散度并沒有太大的波動。這個例子可以很清楚地看出KL不對稱性帶來的一些小問題炉擅。而JS具有對稱性辉懒,所以第二個實(shí)驗(yàn)和第三個實(shí)驗(yàn)的JS散度實(shí)際上是距離相等的分布組。

從這個小例子我們可以看出谍失,有時KL散度下降的程度和兩個分布靠近的程度不成比例眶俩,而JS散度靠近的程度更令人滿意,這也是GAN模型的一大優(yōu)勢快鱼。

2.3 GAN實(shí)戰(zhàn)

看完了前面關(guān)于GAN的理論分析颠印,下面我們開始實(shí)戰(zhàn)纲岭。在實(shí)戰(zhàn)之前目標(biāo)函數(shù)還要做一點(diǎn)改動。從前面的公式中可以看出這個模型和VAE一樣都是有嵌套關(guān)系的模型线罕,那么生成模型G要想完成前向后向的計(jì)算止潮,要先將計(jì)算結(jié)果傳遞到判別模型計(jì)算損失函數(shù),然后將梯度反向傳播回來钞楼。那么不可避免地我們會遇到一個問題喇闸,如果梯度在判別模型那邊消失了,生成模型豈不是沒法更新了询件?生成模型的目標(biāo)函數(shù)如下所示:

如果判別模型非常厲害燃乍,成功地讓D(G(z))等于一個接近0的數(shù)字,那么這個損失函數(shù)的梯度就消失了宛琅。其實(shí)從理論上分析這個結(jié)果很正常刻蟹,生成模型的梯度只能從判別模型這邊傳過來,這個結(jié)果接近0對于判別模型來說是滿意的嘿辟,所以它不需要更新舆瘪,梯度就沒有了,于是生成模型就沒法訓(xùn)練了仓洼。所以作者又設(shè)計(jì)了新的函數(shù)目標(biāo):

這樣一來梯度又有了,生成模型也可以繼續(xù)訓(xùn)練堤舒。當(dāng)然色建,這個目標(biāo)函數(shù)也有不足的地方。

下面來看一個具體的基于深層模型的實(shí)現(xiàn)——DC-GAN舌缤。全稱是Deep Convolution GAN箕戳。也就是用深度卷積網(wǎng)絡(luò)進(jìn)行對抗生成網(wǎng)絡(luò)的建模。在此之前国撵,也有一些基于卷積神經(jīng)網(wǎng)絡(luò)的GAN實(shí)現(xiàn)陵吸,但是相對來說,DC-GAN的最終表現(xiàn)與同期的模型相比更優(yōu)秀介牙,在介紹它的論文中壮虫,作者也詳細(xì)介紹了模型的一些改進(jìn)細(xì)節(jié)。

將Pooling層替換成帶有stride的卷積層

使用Batch Normalization

放棄使用全連接層

將卷積層的非線性部分換成ReLU或者Leaky ReLU

下面將使用DC-GAN的模型進(jìn)行實(shí)驗(yàn)环础,這個實(shí)驗(yàn)使用的數(shù)據(jù)集還是MNIST囚似。由于Caffe并不是十分適合構(gòu)建GAN這樣的模型,因此這里使用另外一個十分流行且簡單易懂的框架——Keras來展示DC-GAN的一些細(xì)節(jié)线得。代碼來自https://github.com/jacobgil/keras-dcgan饶唤。由于Keras的代碼十分直觀,這里就直接給出源碼贯钩。首先是生成模型:

def generator_model():

model = Sequential()

model.add(Dense(input_dim=100, output_dim=1024))

model.add(Activation('tanh'))

model.add(Dense(out_dim=128*7*7))

model.add(BatchNormalization())

model.add(Activation('tanh'))

model.add(Reshape((128, 7, 7), input_shape=(128*7*7,)))

model.add(UpSampling2D(size=(2, 2)))

model.add(Convolution2D(out_channel=64, kernel_height=5, kernel_width=5, border_mode='same'))

model.add(Activation('tanh'))

model.add(UpSampling2D(size=(2, 2)))

model.add(Convolution2D(out_channel=1, kernel_height=5, kernel_width=5, border_mode='same'))

model.add(Activation('tanh'))

return model

這里需要說明的一點(diǎn)是募狂,這個實(shí)現(xiàn)和論文中的描述有些不同办素,不過對于MNIST這樣的小數(shù)據(jù)集,這樣的模型差異不影響效果祸穷。

判別模型的結(jié)構(gòu)如下所示性穿,仔細(xì)地讀一遍就可以理解,這里不再贅述粱哼。

def discriminator_model():

model = Sequential()

model.add(Convolution2D(64, 5, 5, border_mode='same', input_shape=(1, 28, 28)))

model.add(Activation('tanh'))

model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Convolution2D(128, 5, 5))

model.add(Activation('tanh'))

model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())

model.add(Dense(1024))

model.add(Activation('tanh'))

model.add(Dense(1))

model.add(Activation('sigmoid'))

return model

完成訓(xùn)練后季二,生成模型生成的手寫數(shù)字如圖10-6所示。

圖10-6 GAN生成的圖像

除了個別數(shù)字外揭措,大多數(shù)數(shù)字生成得和真實(shí)數(shù)據(jù)很像胯舷。將圖10-6和圖10-2進(jìn)行對比,我們可以發(fā)現(xiàn)绊含,GAN模型生成的數(shù)字相對而言更為“清晰”桑嘶,而VAE模型的數(shù)字略顯模糊,這和兩個模型的目標(biāo)函數(shù)有很大的關(guān)系躬充。另外逃顶,兩個模型在訓(xùn)練過程中的Loss曲線如圖10-7所示。

圖10-7 GAN中生成模型和判別模型的損失函數(shù)

其中上面的曲線表示生成模型的Loss充甚,下面的曲線是判別模型的Loss以政,雖然這兩個Loss的絕對數(shù)值看上去不能說明什么問題,但是相信讀者還是可以看出兩個模型的Loss存在著強(qiáng)相關(guān)的關(guān)系伴找,這也算是對抗過程中的此消彼長盈蛮。

最終生成的數(shù)據(jù)還算令人滿意,我們還很好奇技矮,在模型優(yōu)化過程中生成模型生成的圖像都是什么樣的呢抖誉?接下來就來觀察生成圖像的演變過程。在優(yōu)化開始時衰倦,隨機(jī)生成的圖像如圖10-8所示袒炉。

圖10-8 GAN生成模型的初始圖像

其實(shí)就是噪聲圖片,一點(diǎn)都不像數(shù)字樊零。經(jīng)過400輪的迭代我磁,生成模型可以生成的圖像如圖10-9所示。

圖10-9 GAN生成模型400輪迭代訓(xùn)練后的圖像

可以看出數(shù)字的大體結(jié)構(gòu)已經(jīng)形成驻襟,但是能夠表征數(shù)字細(xì)節(jié)的特征還沒有出現(xiàn)十性。

經(jīng)過10個Epoch后,生成模型的作品如圖10-10所示塑悼。

圖10-10 GAN生成模型經(jīng)過10個Epoch迭代訓(xùn)練后的圖像

這時有些數(shù)字已經(jīng)成形劲适,但是還有一些數(shù)字仍然存在欠缺。

20輪Epoch后的結(jié)果如圖10-11所示厢蒜。

圖10-11 GAN生成模型經(jīng)過20個Epoch迭代訓(xùn)練后的圖像

這時的數(shù)字已經(jīng)具有很強(qiáng)的辨識度霞势,但與此同時烹植,我們發(fā)現(xiàn)生成的數(shù)字中有大量的“1”。

當(dāng)完成了所有的訓(xùn)練愕贡,取出生成模型在最后一輪生成的圖像草雕,如圖10-12所示。

圖10-12 GAN生成模型最終生成的圖像

可以看出這里面的數(shù)字質(zhì)量更高一些固以,但是里面的“1”更多了墩虹。

從模型的訓(xùn)練過程中可以看出,一開始生成的數(shù)字質(zhì)量都很差憨琳,但生成數(shù)字的多樣性比較好诫钓,后來的數(shù)字質(zhì)量比較高但數(shù)字的多樣性逐漸變差,模型的特性在不斷發(fā)生變化篙螟。這個現(xiàn)象和兩個模型的對抗有關(guān)系菌湃,也和增強(qiáng)學(xué)習(xí)中的“探索—利用”困境很類似。

站在生成模型的角度思考遍略,一開始生成模型會盡可能地生成各種各樣形狀的數(shù)字惧所,而判別模型會識別出一些形狀較差的模型,而放過一些形狀較好的模型绪杏,隨著學(xué)習(xí)的進(jìn)程不斷推進(jìn)下愈,判別模型的能力也在不斷地加強(qiáng),生成模型慢慢發(fā)現(xiàn)有一些固定的模式比較容易通過蕾久,而其他的模式不那么容易通過势似,于是它就會盡可能地增大這些正確模式出現(xiàn)的概率,讓自己的Loss變小腔彰。這樣叫编,一個從探索為主的模型變成了一個以利用為主的模型辖佣,因此它的數(shù)據(jù)分布已經(jīng)不像剛開始那么均勻了霹抛。

如果這個模型繼續(xù)訓(xùn)練下去,生成模型有可能進(jìn)一步地利用這個模式卷谈,這和機(jī)器學(xué)習(xí)中的過擬合也有很相近的地方杯拐。

Info-GAN

本節(jié)將要介紹GAN模型的一個變種——InfoGAN,它要解決隱變量可解釋性的問題世蔗。前面提到GAN的隱變量服從某種分布端逼,但是這個分布背后的含義卻不得而知。雖然經(jīng)過訓(xùn)練的GAN可以生成新的圖像污淋,但是它卻無法解決一個問題——生成具有某種特征的圖像顶滩。例如,對于MNIST的數(shù)據(jù)寸爆,生成某個具體數(shù)字的圖像礁鲁,生成筆畫較粗盐欺、方向傾斜的圖像等,這時就會發(fā)現(xiàn)經(jīng)典的GAN已經(jīng)無法解決這樣的問題仅醇,想要解決就需要想點(diǎn)別的辦法冗美。

首先想到的方法就是生成模型建模的方法:挑出幾個隱變量,強(qiáng)制指定它們用來表示這些特性的屬性析二,例如數(shù)字名稱和方向粉洼。這樣看上去似乎沒有解決問題,但這種方法需要提前知道可以建模的隱變量內(nèi)容叶摄,還要為這些隱變量設(shè)置好獨(dú)立的分布假設(shè)属韧,實(shí)際上有些麻煩又不夠靈活。本節(jié)的主角——InfoGAN准谚,將從信息論角度挫剑,嘗試解決GAN隱變量可解釋性問題。

3.1 互信息

介紹算法前要簡單回顧機(jī)器學(xué)習(xí)中的信息論基本知識柱衔。第2章已經(jīng)介紹了熵和“驚喜度”這些概念樊破,熵衡量了一個隨機(jī)變量帶來的“驚喜度”。本節(jié)要介紹的概念叫做互信息唆铐,它衡量了隨機(jī)變量之間的關(guān)聯(lián)關(guān)系哲戚。假設(shè)隨機(jī)事件A的結(jié)果已經(jīng)知道,現(xiàn)在要猜測某個事件B的結(jié)果艾岂,那么知道A的取值對猜測B有多大幫助顺少?這就是互信息要表達(dá)的東西。

我們以擲骰子為例王浴,如果我們知道手中的骰子是不是“韋小寶特制”骰子這件事脆炎,那么它會對我們猜測最終投擲的點(diǎn)數(shù)有幫助嗎?當(dāng)然有幫助氓辣,因?yàn)橐坏┐_定這個骰子是“韋小寶特制”秒裕,那么骰子點(diǎn)數(shù)是幾這個信息就變得沒有“驚喜”了。同理钞啸,“美國第45屆總統(tǒng)是誰”這個消息對我們手中骰子投擲出的點(diǎn)數(shù)這個事情就沒那么多幫助了几蜻,所以這兩件事情的互信息就低,甚至可以說這兩個事件是相互獨(dú)立的体斩。

了解了上面比較直觀的例子梭稚,下面就可以給出連續(xù)隨機(jī)變量X,Y互信息的計(jì)算公式:

上面的公式可以做如下變換:

就可以發(fā)現(xiàn)互信息的進(jìn)一步解釋:它可以變?yōu)殪睾蜅l件熵的差。同樣地絮吵,這個公式還可以轉(zhuǎn)變?yōu)椋篒(X;Y)=H(X)-H(X|Y)

最終表示為熵和條件熵的差距弧烤。用通俗的話解釋,兩個隨機(jī)變量的互信息就是在知道和不知道一個隨機(jī)變量取值的情況下蹬敲,另一個隨機(jī)變量“驚喜度”的變化暇昂∠牖茫互信息的計(jì)算方法的代碼如下所示:

import numpy as np

import math

def mutual_info(x_var, y_var):

sum = 0.0

x_set = set(x_var)

y_set = set(y_var)

for x_val in x_set:

px = float(np.sum(x_var == x_val)) / x_var.size

x_idx = np.where(x_var == x_val)[0]

for y_val in y_set:

py = float(np.sum(y_var == y_val)) / y_var.size

y_idx = np.where(y_var == y_val)[0]

pxy = float(np.intersect1d(x_idx, y_idx).size) / x_var.size

if pxy > 0.0:

sum += pxy * math.log((pxy / (px * py)), 10)

return sum

下面隨意給出一對隨機(jī)變量和它們的概率分布,并用上面的代碼分析這對變量的互信息:

a = np.array([0,0,5,6,0,4,4,3,1,2])

b = np.array([3,4,5,5,3,7,7,6,5,1])

print mutual_info(a,b)

# 0.653

a = np.array([0,0,5,6,0,4,4,3,1,2])

b = np.array([3,3,5,6,3,7,7,9,4,8])

print mutual_info(a,b)

# 0.796

很明顯话浇,下面一組數(shù)據(jù)的相關(guān)性更強(qiáng)脏毯,知道其中一個隨機(jī)變量的取值,就會非常容易猜出同一時刻另外一個隨機(jī)變量的采樣值幔崖。如果我們進(jìn)一步觀察第二組數(shù)據(jù)食店,會發(fā)現(xiàn)任意一組數(shù)據(jù)的熵都是0.796,也就是說當(dāng)知道其中一個隨機(jī)變量的值后赏寇,它們的條件熵就變成了0吉嫩,另一個隨機(jī)變量變得完全“驚喜”了。雖然條件熵為0這個信息并沒有展現(xiàn)在互信息的數(shù)值中嗅定,但互信息實(shí)際上就是在衡量一個相對的信息差距自娩,并不像熵那樣衡量信息絕對量。

其實(shí)數(shù)學(xué)包含了很多人生哲理和智慧渠退。人的一生實(shí)際上一直在和熵作斗爭忙迁,每個人的人生軌跡的熵意味著什么?一個人未來的不確定性碎乃?一個人未來的“驚喜”程度姊扔?有的人說自己“一輩子也就這樣了”的時候,是不是表示這個人的未來已經(jīng)從一個隨機(jī)變量變成了常量梅誓,它的熵變成了0恰梢?為什么人們總是向往青春,是不是因?yàn)槟切┠耆A充滿了各種不確定性與精彩梗掰,可以理解為熵很大嵌言?

“身體和靈魂,總有一個在路上”及穗,是不是標(biāo)榜追求最大熵的一個口號摧茴?“公務(wù)員這種穩(wěn)定工作才是好工作”是不是一種追求最小化熵的行為呢?那么對于一個人來說拥坛,究竟是熵越大越好蓬蝶,還是熵越小越好尘分?

回到問題猜惋,互信息在這個問題中有什么用?如果說隱變量的確定對確定生成圖像的樣子有幫助培愁,那么隱變量和最終的圖像之間的互信息就應(yīng)該很大:當(dāng)知道了隱變量這個信息著摔,圖像的信息對變得更確定了。所以InfoGAN這個算法就是要通過約束互信息使隱變量“更有價值”定续。

3.2 InfoGAN模型

那么谍咆,InfoGAN模型的具體形式是什么樣的呢禾锤?如果把互信息定義為損失函數(shù)的一部分,這部分損失函數(shù)就是InfoGAN中基于經(jīng)典GAN修改的部分摹察。前面的小節(jié)已經(jīng)推導(dǎo)出了互信息的公式恩掷,那么在具體計(jì)算時要使用哪個公式計(jì)算呢?

I(X;Z)=H(X)-H(X|Z)

I(X;Z)=H(Z)-H(Z|X)

最終的選擇是后者供嚎,因?yàn)閳D像X的分布太難確定黄娘,求解它的熵肯定相當(dāng)困難,所以前者的第一項(xiàng)非常難計(jì)算克滴。當(dāng)然逼争,即使選擇了第二項(xiàng),這個公式也不是很好優(yōu)化劝赔,因?yàn)槠渲羞€有一個后驗(yàn)項(xiàng)P(Z|X)需要求解誓焦,這也是個大麻煩,不過這里可以使用本書多次提到的方法——Variational Inference求解這個后驗(yàn)項(xiàng)着帽。

在介紹VAE時我們曾經(jīng)運(yùn)用過Reparameterization Trick這個方法杂伟,這里將再次采用類似的方法。在VAE中仍翰,Trick公式是z(i)=g?(X+ε(i))稿壁,在Encoder的過程中,輸入部分被分解成確定部分和不確定部分歉备,然后利用一個高維非線性模型擬合輸入到輸出的映射傅是。這里要求出的X,和VAE正好相反蕾羊,需要的是這樣的一個公式:X=g?([c,z]+?)

其中c表示與圖像有相關(guān)關(guān)系的隱變量喧笔,z表示與圖像無關(guān)的隱變量。于是互信息計(jì)算公式就變成了:

從實(shí)踐上講龟再,?項(xiàng)可以忽略书闸,于是公式可以做進(jìn)一步簡化:

接下來將期望用蒙特卡羅方法代替,訓(xùn)練時可以通過計(jì)算大量樣本求平均來代替期望值利凑,于是公式又變成了:

這個方程變簡單了很多浆劲。當(dāng)然,我們也看出上面的公式中我們有一個Q哀澈,這個Q函數(shù)可以理解為一個Encoder牌借,這部分模型在經(jīng)典GAN中并不存在,但是在實(shí)際建模過程中割按,由于Encoder和判別模型的輸入相同膨报,且模型目標(biāo)比較相近,因此二者部分網(wǎng)絡(luò)結(jié)構(gòu)可以共享。論文的作者提供了InfoGAN的源碼现柠,代碼的鏈接在https://github.com/openai/InfoGAN院领,代碼使用的框架為TensorFlow,感興趣的讀者可以自行閱讀够吩。模型實(shí)現(xiàn)的結(jié)構(gòu)如圖10-13所示比然。

圖10-13 InfoGAN模型結(jié)構(gòu)圖

虛線部分表示的就是計(jì)算互信息的目標(biāo)函數(shù),這部分內(nèi)容看似比較復(fù)雜周循,實(shí)則不然谈秫。由于InfoGAN模型中定義了兩種類型的隨機(jī)變量——服從Categorical分布、用于表示數(shù)字內(nèi)容的離散類型變量鱼鼓,和服從均勻分布用于表示其他連續(xù)特征的連續(xù)型變量拟烫,而兩種類型的變量在計(jì)算熵的方法不同,因此上面的計(jì)算圖對它們進(jìn)行分情況處理迄本。

互信息計(jì)算起始于如下兩個變量硕淑。

reg_z:表示了模型開始隨機(jī)生成的隱變量萍倡。

fake_ref_z_dist_info:表示了經(jīng)過Encoder計(jì)算后的隱變量分布信息戚篙。

接下來锰扶,根據(jù)連續(xù)型和離散型的分類词顾,兩個變量分成了以下四個變量。

cont_reg_z:reg_z的連續(xù)變量部分

cont_reg_dist_info:fake_ref_z_dist_info的連續(xù)變量部分

disc_reg_z:reg_z的離散變量部分

disc_reg_dist_info:fake_ref_z_dist_info的連續(xù)變量部分

接下來贝攒,四個變量兩兩組隊(duì)完成了后驗(yàn)公式P(c)logQ(c|g?([c,z])的計(jì)算:

cont_log_q_c_given_x:連續(xù)變量的后驗(yàn)

disc_log_q_c_given_x:離散變量的后驗(yàn)

同時幻赚,輸入的隱變量也各自完成先驗(yàn)P(c)logP(c)的計(jì)算:

cont_log_q_c:連續(xù)變量的先驗(yàn)

disc_log_q_c:離散變量的后驗(yàn)

由于上面的運(yùn)算全部是元素級的計(jì)算覆享,還要把向量求出的內(nèi)容匯總靶橱,得到∑P(c)logQ(c|g?([c,z])和∑P(c)logP(c) 寥袭。

cont_cross_ent:連續(xù)變量的交叉熵

cont_ent:連續(xù)變量的熵

disc_cross_ent:離散變量的交叉熵

disc_ent:離散變量的熵

接下來,根據(jù)互信息公式兩兩相減关霸,得到各自的互信息損失传黄。

cont_mi_est:連續(xù)變量的互信息

disc_mi_est:離散變量的互信息

最后將兩者相加就得到了最終的互信息損失。

模型在訓(xùn)練前定義了12個和圖像有強(qiáng)烈互信息的隨機(jī)變量队寇,其中10個變量表示顯示的數(shù)字膘掰,它們組成一個Categorical的離散隨機(jī)向量;另外2個是服從范圍為[-1,1]的連續(xù)隨機(jī)變量佳遣。訓(xùn)練完成后识埋,調(diào)整離散隨機(jī)變量輸入并生成圖像,得到如圖10-14所示的數(shù)字圖像零渐。

圖10-14 10個離散隨機(jī)變量對生成數(shù)字的影響

可以看出模型很好地識別了這些數(shù)字窒舟。調(diào)整另外兩個連續(xù)隨機(jī)變量,可以生成如圖10-15所示的數(shù)字圖像相恃。

圖10-15 2個連續(xù)隨機(jī)變量對生成數(shù)字的影響

可以看出辜纲,這兩個連續(xù)隨機(jī)變量學(xué)到了數(shù)字粗細(xì)和傾斜的特征,而且這是在完全沒有暗示的情況下完成的拦耐「冢可見InfoGAN模型的能力。

到此InfoGAN的介紹就結(jié)束了杀糯。從這個模型可以看出扫俺,在經(jīng)典GAN模型基礎(chǔ)上添加更多的內(nèi)容會產(chǎn)生更多意想不到的效果。

總結(jié)

本章主要介紹了基于深度學(xué)習(xí)的生成模型固翰,它們在生成圖像上有著很強(qiáng)的能力狼纬。

VAE:基于變分下界約束得到的Encoder-Decoder模型對。

GAN:基于對抗的Generator-Discriminator模型對骂际。

InfoGAN:挖掘GAN模型隱變量特點(diǎn)的模型疗琉。

原文鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市歉铝,隨后出現(xiàn)的幾起案子盈简,更是在濱河造成了極大的恐慌,老刑警劉巖太示,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柠贤,死亡現(xiàn)場離奇詭異,居然都是意外死亡类缤,警方通過查閱死者的電腦和手機(jī)臼勉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來餐弱,“玉大人宴霸,你說我怎么就攤上這事「囹荆” “怎么了猖败?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長降允。 經(jīng)常有香客問我恩闻,道長,這世上最難降的妖魔是什么剧董? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任幢尚,我火速辦了婚禮,結(jié)果婚禮上翅楼,老公的妹妹穿的比我還像新娘尉剩。我一直安慰自己,他們只是感情好毅臊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布理茎。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪皂林。 梳的紋絲不亂的頭發(fā)上朗鸠,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機(jī)與錄音础倍,去河邊找鬼烛占。 笑死,一個胖子當(dāng)著我的面吹牛沟启,可吹牛的內(nèi)容都是我干的忆家。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼德迹,長吁一口氣:“原來是場噩夢啊……” “哼芽卿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起胳搞,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤蹬竖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后流酬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體币厕,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年芽腾,在試婚紗的時候發(fā)現(xiàn)自己被綠了旦装。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡摊滔,死狀恐怖阴绢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情艰躺,我是刑警寧澤呻袭,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站腺兴,受9級特大地震影響左电,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜页响,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一篓足、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闰蚕,春花似錦栈拖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽索赏。三九已至,卻和暖如春贴彼,著一層夾襖步出監(jiān)牢的瞬間潜腻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工锻弓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留砾赔,地道東北人蝌箍。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓青灼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親妓盲。 傳聞我的和親對象是個殘疾皇子杂拨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評論 2 353

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