摘要:在深度學(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)的模型疗琉。