GAN原理潜析
為了后面介紹seqGAN + RL的應(yīng)用,先來(lái)介紹一下這個(gè)很火的GAN,火到似乎女?huà)z上帝都是“干”出來(lái)的…
稍提一點(diǎn)背景。統(tǒng)計(jì)機(jī)器學(xué)習(xí)中,這個(gè)世界是從分布中抽樣產(chǎn)生的(假設(shè)P(world)是產(chǎn)生這個(gè)世界的分布,那這個(gè)世界的每一個(gè)東西都是從P里面iid抽出來(lái)的),我們只要能拿到這個(gè)分布,就可創(chuàng)建一個(gè)”真實(shí)”的世界!那怎么拿到這個(gè)分布呢?建模!一般是參數(shù)模型,當(dāng)世界為無(wú)窮維的就是非參數(shù)模型。(也就是說(shuō)產(chǎn)生世界的分布還依賴于其他分布,比如產(chǎn)生宇宙的分布,宇宙依賴于….貝葉斯學(xué)派喜歡搞復(fù)雜)。很幸運(yùn)!我們有概率論來(lái)表示這些分布,有測(cè)度論來(lái)衡量他們的大小(除了連續(xù)空間中很小的邊邊角角的地方measure zero),然后又知道NN只要足夠多參數(shù)(節(jié)點(diǎn)),可以幾乎擬合任何函數(shù)!到這了,是不是覺(jué)得我們已經(jīng)可以創(chuàng)造世界了?!(扯得有點(diǎn)多了。大家也知道,其實(shí)問(wèn)題很多,這里先不講了,下面會(huì)提到一些)
再說(shuō)一點(diǎn)大家都明白的就是,世界分布其實(shí)也是不知道的,所以我們也不能通過(guò)積分逼近它,最通用的就是采樣了,然后通過(guò)MLE或者minimize cross-entropy(KL散度,衡量分布的差異)
那先來(lái)淺析一下GAN,講講這個(gè)是干嘛的。
其實(shí)上面也說(shuō)了,他就是個(gè)生成模型,可以產(chǎn)生數(shù)據(jù),比如一首歌,一張圖,一首詩(shī),但更希望產(chǎn)生”真”的數(shù)據(jù)!可以產(chǎn)生數(shù)據(jù)的模型其實(shí)很多,比如auto-encoder(AE),經(jīng)典之作VAE,通過(guò)decoder的部分就可以產(chǎn)生數(shù)據(jù),但是有一個(gè)問(wèn)題是,他們不是真的產(chǎn)生數(shù)據(jù),只是讓input和output一樣,以下列舉了生成模型的方法和AE,VAE,資料很多
那么GAN就是用來(lái)產(chǎn)生真實(shí)數(shù)據(jù)的!他的能力是通過(guò)進(jìn)化得來(lái)的!舉個(gè)通俗栗子(老王造假幣,警察打假)說(shuō)明下GAN是怎么演化的。老王想造假幣謀生,一開(kāi)始他造的假幣很快就被警察實(shí)習(xí)生識(shí)破了;然后老王回去研究一頓之后造出來(lái)的假幣,實(shí)習(xí)生分辨不出來(lái)了,但是被小警員給識(shí)破了;老王回去又開(kāi)始研究,騙過(guò)了小警員;但被警司給識(shí)破了….反復(fù)研究識(shí)破,最后老王造的假幣警察已經(jīng)識(shí)別不出來(lái)了,和真的一樣!這就是GAN的很直觀的原理,其中造假幣的老王叫generator,警察叫discriminator,他們兩個(gè)不斷博弈對(duì)抗,最后讓generator學(xué)會(huì)了以假亂真,達(dá)到所謂的納什均衡
具體到模型上,就是第一代的generator v1(G1),產(chǎn)生的數(shù)據(jù),喂給discriminator v1,被輕易地的分辨出來(lái)G1產(chǎn)生的是假的,(初始化一個(gè)G,產(chǎn)生n個(gè)隨機(jī)數(shù)喂給G1產(chǎn)生n張圖(target 0)后,從真實(shí)數(shù)據(jù)中取n張圖為真實(shí)數(shù)據(jù)(target 1),然后喂給D1訓(xùn)練);G2要變強(qiáng)騙過(guò)D1(固定D1,更新G1的參數(shù),使其產(chǎn)生的數(shù)據(jù)的標(biāo)簽為1),然后D1也要進(jìn)化為D2,可以辨別G2產(chǎn)生的假數(shù)據(jù)(G2產(chǎn)生的數(shù)據(jù)標(biāo)簽為0再訓(xùn)練)….. 最后我就得到了一個(gè)世界上最強(qiáng)的G和一個(gè)世界上最強(qiáng)的D!你不會(huì)問(wèn)我以我的G來(lái)騙我的D會(huì)怎么樣呢!(一會(huì)告訴你)
淺析之后是不是要“潛”析一下了!(公式編輯是很累哦。。還是上圖吧)
這說(shuō)明MLE等價(jià)于最小化KL divergence,這種divergence衡量了兩個(gè)分布的差異。前面也提到NN的特性,可以擬合復(fù)雜的函數(shù),那如何用NN產(chǎn)生分布呢?分布的函數(shù)還是一個(gè)分布,輸入一個(gè)分布到NN即可!(比如你可以輸入一個(gè)正太分布等)這好像似乎沒(méi)GAN什么事。。
那我們來(lái)看一下產(chǎn)生一個(gè)x的概率,通過(guò)上面的方法
Z是我們輸入的分布,G是NN很復(fù)雜,我們是沒(méi)辦法計(jì)算這個(gè)的likelihood,也就說(shuō)到這里我們就卡住了,那算不了likelihood我們?cè)趺磥?lái)調(diào)參?!GAN(干!不會(huì)弄公式輸入真的很僵!)
終于到了GAN了,先來(lái)介紹一下GAN的原理
generator和discriminator可以是任何函數(shù),只是現(xiàn)在都用NN而已,G也是和原理一樣通過(guò)一個(gè)先驗(yàn)分布產(chǎn)生復(fù)雜分布,D也差不多,output一個(gè)scalar來(lái)衡量差異。現(xiàn)在出現(xiàn)了一個(gè)V(G,D),通過(guò)它可以得到我們要的G!那就來(lái)講講它吧
先不談這個(gè)怎么來(lái)的,但這個(gè)看起來(lái)很直觀對(duì)吧。第一個(gè)式子x 從真實(shí)數(shù)據(jù)中sample來(lái),那D給他打分高(true data),第二個(gè)式子x從G中sample來(lái)就給他打分低(false data),也就是-D(x)要高,假設(shè)現(xiàn)在有一個(gè)G,我們要找一個(gè)D來(lái)maximize V,這樣才是一個(gè)合格的Discriminator!
是不是很驚!用D來(lái)maxmize V(G,D)得到的竟然是真實(shí)分布和生成分布的差異!(Divergence),既然有了衡量差異的東西,那接下來(lái)很自然就是調(diào)節(jié)G的參數(shù)來(lái)最小化這個(gè)差異就好了,也就是上上上圖中最后一個(gè)式子!順便說(shuō)一下JSD取值為[0,log2],當(dāng)兩種分布重合的時(shí)候JSD=0
好了,那現(xiàn)在就可以解這個(gè)argmin max V(G,D),來(lái)得到G,損失就是max V(G,D),用GD就可以解啦(max過(guò)程可以用抽樣來(lái)做)
這里提一點(diǎn)比較小的問(wèn)題,回想一下上述步驟,我們假設(shè)先有一個(gè)G然后找一個(gè)D得到max(V)(也就是真實(shí)和生成的差異),再來(lái)調(diào)節(jié)G找到差異最小的那個(gè)G;這時(shí)候G跟新了,那D應(yīng)該重新找最大,順應(yīng)G也應(yīng)該重新調(diào)整參數(shù)來(lái)找最小差異的分布,但這個(gè)新的分布一定比上一個(gè)分布的差異小么?其實(shí)也就如同機(jī)器學(xué)習(xí)設(shè)定學(xué)習(xí)率類似,所以實(shí)際編程的話,我們盡量小步或者少次更新G不過(guò)好像作者Goodfellow并不在乎這個(gè)(這名字老板一定喜歡!)
這里稍微提一下實(shí)際操作過(guò)程,因?yàn)槲覀儾豢赡茏鯲里面的積分,還是sample的方法
是不是很眼熟,一般二分類器的就是在maximize它!比如邏輯回歸等。
貼一張具體算法,很清晰有木有!剛才有提到G的更新要小(次數(shù)少或者步長(zhǎng)小)!D過(guò)程迭代多次是因?yàn)閿?shù)值計(jì)算不可能一次找到最大值,每次其實(shí)是在找lower bound,多迭代幾次可以找的盡可能大的
更新G的時(shí)候因?yàn)榈谝豁?xiàng)和G無(wú)關(guān),就可以不要,但是在實(shí)際操作中還有一點(diǎn)不一樣的地方,就是V
如果用原始的V,由于開(kāi)始G產(chǎn)生的數(shù)據(jù)比較假,會(huì)使D(x)值比較小(log(1-D(x))),從圖中也可以看出來(lái),D(x)值小對(duì)應(yīng)的梯度也是比較小,會(huì)導(dǎo)致在開(kāi)始訓(xùn)練的時(shí)候很慢,改進(jìn)之后的損失保證了和原來(lái)的同樣趨勢(shì)的同時(shí),解決了這個(gè)問(wèn)題,開(kāi)始訓(xùn)練比較快,之后訓(xùn)練比較慢(-log(D(x)))。這樣比較符合一般訓(xùn)練的感覺(jué)(其實(shí)這個(gè)loss是個(gè)比較奇怪的Divergence,是KLD - 2JSD,但是有一個(gè)在操作上的好處是,寫(xiě)成這樣等同于是讓G產(chǎn)生的data 作為Discriminator的positive的sample!細(xì)節(jié)就不說(shuō)了)
再稍微提一個(gè)地方!(來(lái)解釋一下最強(qiáng)的D和G誰(shuí)更厲害)先擺一張圖來(lái)自Martin的Towards Principled Methods for Training Generative Adversarial Networks, 2017
Martin Arjovsky, Leon Bottou, Towards Principled Methods for Training Generative Adversarial Networks, 2017D的loss是用來(lái)衡量JSD(JS Divergence)的,可以根據(jù)JSD來(lái)調(diào)G,但是這是理想的狀況。實(shí)際上如上圖,D的loss都趨近于0,也就是準(zhǔn)確率為100%,這篇paper告訴我們G train 25個(gè)epoch時(shí),G已經(jīng)很強(qiáng)了(他產(chǎn)生的圖已經(jīng)很真實(shí)了),但是你會(huì)發(fā)現(xiàn),這時(shí)trian一個(gè)D時(shí),它一眼就可以分辨出來(lái)!是否是說(shuō)D更厲害呢?為什么D的loss會(huì)趨近于0呢,這不是說(shuō)明JSD沒(méi)有給我們什么作用呢?(圖上表示很快就趨近于0了!)
- 我們沒(méi)辦法做上面的積分,只能用sample的方法,sample的數(shù)據(jù),就算G生成的數(shù)據(jù)和真實(shí)數(shù)據(jù)有重疊,但因?yàn)閟ample的數(shù)據(jù),總可以用一個(gè)powerful的D找到一個(gè)分類面把他們完全分開(kāi),那一個(gè)辦法是限制住D,讓它不要過(guò)擬合;但是,其實(shí)D可以量出JSD的前提是D的capacity是可以輸出任何值,也就是要它很powerful!這就出現(xiàn)了奇妙的矛盾,一方面實(shí)際操作上要它弱一點(diǎn),另一方面從理論角度又希望它強(qiáng)一點(diǎn)
- 現(xiàn)在從data的本質(zhì)上解釋,我們的data都是高維空間的manifold(實(shí)際data和G產(chǎn)生的data),這樣其實(shí)data的交際是很小的,這樣算出來(lái)的divergence就是log2,這會(huì)造成什么問(wèn)題呢?
前面提到GAN的類似演化的過(guò)程,變得越來(lái)越好!讓G產(chǎn)生的data和真實(shí)的越來(lái)越近,但是讓計(jì)算機(jī)必須要讓這個(gè)距離越來(lái)越小,但是量出來(lái)的都是log2…就沒(méi)有動(dòng)力進(jìn)化。。。怎么解決這個(gè)問(wèn)題呢!(WGAN!!!下次講,這個(gè)是重點(diǎn)!!)
那先講個(gè)trick
- 增加噪聲
讓低緯的manifold變寬,可能就有overlap,D就沒(méi)有辦法完全分開(kāi),但是noise要不斷變小,減少干擾(這是操作上應(yīng)該考慮的)
另一個(gè)問(wèn)題 Mode Collapse
也就是只產(chǎn)生一個(gè)mode,比如產(chǎn)生數(shù)據(jù)只能產(chǎn)生一種形式,比如只會(huì)畫(huà)狗,但是我們其實(shí)不知道他不會(huì)干什么。。(尷尬了吧)也就是說(shuō)G只會(huì)針對(duì)一個(gè)mode調(diào)參,Goodfellow原來(lái)以為是原因是原先的loss設(shè)定(divergence)有問(wèn)題,最初提到的MLE也就是loss是KLD,但是我們實(shí)際是上在minimize reverse KL Divergence,我們來(lái)看下圖
這里就舉例為什么會(huì)有mode collapse。我們來(lái)看reverse KL,在什么時(shí)候它取值會(huì)很大?就是真實(shí)數(shù)據(jù)不存在的時(shí)候,也就是G產(chǎn)生不像真實(shí)數(shù)據(jù)時(shí),就會(huì)產(chǎn)生很大的loss,這時(shí)候它不會(huì)冒險(xiǎn)產(chǎn)生新圖,它寧愿保守的產(chǎn)生固有的某個(gè)圖(Mode)!(KL情況類似分析即可) GoodFellow說(shuō)我們是可以直接用KL divergence,但是也不會(huì)完全解決這個(gè)問(wèn)題
好啦,這次就先解析這些希望這些內(nèi)容可以讓你對(duì)GAN有更多的了解,有些內(nèi)容也是個(gè)人觀點(diǎn), 如果有錯(cuò)誤請(qǐng)指明哦。其實(shí)GAN有很多內(nèi)容,這個(gè)GAN是不能直接做問(wèn)答機(jī)的,現(xiàn)在就不說(shuō)了,下次!會(huì)介紹一些改進(jìn)的GAN,然后就可以開(kāi)始介紹我們的圖靈問(wèn)答機(jī)了!!
如有錯(cuò)誤的地方一定要指出哦!一起進(jìn)步!!!
原文地址: https://www.jianshu.com/p/34f40b0f53ea
總結(jié)
- 上一篇: 记录一次与大神们的关于GAN应用于NLP
- 下一篇: Tutorial on Variatio