為了后面介紹seqGAN + RL的應(yīng)用其垄,先來介紹一下這個很火的GAN,火到似乎女媧上帝都是“干”出來的...
稍提一點背景。統(tǒng)計機(jī)器學(xué)習(xí)中祸憋,這個世界是從分布中抽樣產(chǎn)生的(假設(shè)P(world)是產(chǎn)生這個世界的分布吐咳,那這個世界的每一個東西都是從P里面iid抽出來的)逻悠,我們只要能拿到這個分布,就可創(chuàng)建一個"真實"的世界韭脊!那怎么拿到這個分布呢童谒?建模!一般是參數(shù)模型沪羔,當(dāng)世界為無窮維的就是非參數(shù)模型饥伊。(也就是說產(chǎn)生世界的分布還依賴于其他分布,比如產(chǎn)生宇宙的分布蔫饰,宇宙依賴于....貝葉斯學(xué)派喜歡搞復(fù)雜)琅豆。很幸運!我們有概率論來表示這些分布篓吁,有測度論來衡量他們的大小(除了連續(xù)空間中很小的邊邊角角的地方measure zero)茫因,然后又知道NN只要足夠多參數(shù)(節(jié)點),可以幾乎擬合任何函數(shù)杖剪!到這了冻押,是不是覺得我們已經(jīng)可以創(chuàng)造世界了?J⒑佟(扯得有點多了洛巢。大家也知道,其實問題很多次兆,這里先不講了稿茉,下面會提到一些)
再說一點大家都明白的就是,世界分布其實也是不知道的,所以我們也不能通過積分逼近它漓库,最通用的就是采樣了恃慧,然后通過MLE或者minimize cross-entropy(KL散度,衡量分布的差異)
那先來淺析一下GAN米苹,講講這個是干嘛的糕伐。
其實上面也說了,他就是個生成模型蘸嘶,可以產(chǎn)生數(shù)據(jù)良瞧,比如一首歌,一張圖训唱,一首詩褥蚯,但更希望產(chǎn)生"真"的數(shù)據(jù)!可以產(chǎn)生數(shù)據(jù)的模型其實很多况增,比如auto-encoder(AE)赞庶,經(jīng)典之作VAE,通過decoder的部分就可以產(chǎn)生數(shù)據(jù)澳骤,但是有一個問題是歧强,他們不是真的產(chǎn)生數(shù)據(jù),只是讓input和output一樣为肮,以下列舉了生成模型的方法和AE摊册,VAE,資料很多
那么GAN就是用來產(chǎn)生真實數(shù)據(jù)的颊艳!他的能力是通過進(jìn)化得來的茅特!舉個通俗栗子(老王造假幣,警察打假)說明下GAN是怎么演化的棋枕。老王想造假幣謀生白修,一開始他造的假幣很快就被警察實習(xí)生識破了;然后老王回去研究一頓之后造出來的假幣重斑,實習(xí)生分辨不出來了兵睛,但是被小警員給識破了;老王回去又開始研究绸狐,騙過了小警員卤恳;但被警司給識破了....反復(fù)研究識破,最后老王造的假幣警察已經(jīng)識別不出來了寒矿,和真的一樣!這就是GAN的很直觀的原理若债,其中造假幣的老王叫generator符相,警察叫discriminator,他們兩個不斷博弈對抗,最后讓generator學(xué)會了以假亂真啊终,達(dá)到所謂的納什均衡
具體到模型上镜豹,就是第一代的generator v1(G1),產(chǎn)生的數(shù)據(jù),喂給discriminator v1蓝牲,被輕易地的分辨出來G1產(chǎn)生的是假的趟脂,(初始化一個G,產(chǎn)生n個隨機(jī)數(shù)喂給G1產(chǎn)生n張圖(target 0)后例衍,從真實數(shù)據(jù)中取n張圖為真實數(shù)據(jù)(target 1)昔期,然后喂給D1訓(xùn)練);G2要變強(qiáng)騙過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)練)..... 最后我就得到了一個世界上最強(qiáng)的G和一個世界上最強(qiáng)的D般贼!你不會問我以我的G來騙我的D會怎么樣呢!(一會告訴你)
淺析之后是不是要"潛"析一下了奥吩!(公式編輯是很累哦哼蛆。。還是上圖吧)
這說明MLE等價于最小化KL divergence霞赫,這種divergence衡量了兩個分布的差異腮介。前面也提到NN的特性,可以擬合復(fù)雜的函數(shù)绩脆,那如何用NN產(chǎn)生分布呢萤厅?分布的函數(shù)還是一個分布,輸入一個分布到NN即可靴迫!(比如你可以輸入一個正太分布等)這好像似乎沒GAN什么事惕味。。
那我們來看一下產(chǎn)生一個x的概率玉锌,通過上面的方法
Z是我們輸入的分布名挥,G是NN很復(fù)雜,我們是沒辦法計算這個的likelihood主守,也就說到這里我們就卡住了禀倔,那算不了likelihood我們怎么來調(diào)參?参淫!GAN(干救湖!不會弄公式輸入真的很僵!)
終于到了GAN了涎才,先來介紹一下GAN的原理
generator和discriminator可以是任何函數(shù)鞋既,只是現(xiàn)在都用NN而已力九,G也是和原理一樣通過一個先驗分布產(chǎn)生復(fù)雜分布,D也差不多邑闺,output一個scalar來衡量差異〉埃現(xiàn)在出現(xiàn)了一個V(G,D),通過它可以得到我們要的G陡舅!那就來講講它吧
先不談這個怎么來的抵乓,但這個看起來很直觀對吧。第一個式子x 從真實數(shù)據(jù)中sample來靶衍,那D給他打分高(true data)灾炭,第二個式子x從G中sample來就給他打分低(false data),也就是-D(x)要高摊灭,假設(shè)現(xiàn)在有一個G咆贬,我們要找一個D來maximize V,這樣才是一個合格的Discriminator帚呼!
是不是很驚掏缎!用D來maxmize V(G,D)得到的竟然是真實分布和生成分布的差異!(Divergence),既然有了衡量差異的東西煤杀,那接下來很自然就是調(diào)節(jié)G的參數(shù)來最小化這個差異就好了眷蜈,也就是上上上圖中最后一個式子!順便說一下JSD取值為[0,log2]沈自,當(dāng)兩種分布重合的時候JSD=0
好了酌儒,那現(xiàn)在就可以解這個argmin max V(G,D),來得到G,損失就是max V(G,D)枯途,用GD就可以解啦(max過程可以用抽樣來做)
這里提一點比較小的問題忌怎,回想一下上述步驟,我們假設(shè)先有一個G然后找一個D得到max(V)(也就是真實和生成的差異),再來調(diào)節(jié)G找到差異最小的那個G酪夷;這時候G跟新了榴啸,那D應(yīng)該重新找最大,順應(yīng)G也應(yīng)該重新調(diào)整參數(shù)來找最小差異的分布晚岭,但這個新的分布一定比上一個分布的差異小么鸥印?其實也就如同機(jī)器學(xué)習(xí)設(shè)定學(xué)習(xí)率類似,所以實際編程的話坦报,我們盡量小步或者少次更新G不過好像作者Goodfellow并不在乎這個(這名字老板一定喜歡搀玖!)
這里稍微提一下實際操作過程款侵,因為我們不可能做V里面的積分菇存,還是sample的方法
是不是很眼熟拴疤,一般二分類器的就是在maximize它!比如邏輯回歸等字管。
貼一張具體算法夏块,很清晰有木有疏咐!剛才有提到G的更新要小(次數(shù)少或者步長小)纤掸!D過程迭代多次是因為數(shù)值計算不可能一次找到最大值脐供,每次其實是在找lower bound,多迭代幾次可以找的盡可能大的
更新G的時候因為第一項和G無關(guān)借跪,就可以不要政己,但是在實際操作中還有一點不一樣的地方,就是V
如果用原始的V掏愁,由于開始G產(chǎn)生的數(shù)據(jù)比較假歇由,會使D(x)值比較小(log(1-D(x))),從圖中也可以看出來果港,D(x)值小對應(yīng)的梯度也是比較小沦泌,會導(dǎo)致在開始訓(xùn)練的時候很慢,改進(jìn)之后的損失保證了和原來的同樣趨勢的同時辛掠,解決了這個問題谢谦,開始訓(xùn)練比較快,之后訓(xùn)練比較慢(-log(D(x)))萝衩。這樣比較符合一般訓(xùn)練的感覺(其實這個loss是個比較奇怪的Divergence回挽,是KLD - 2JSD,但是有一個在操作上的好處是猩谊,寫成這樣等同于是讓G產(chǎn)生的data 作為Discriminator的positive的sample千劈!細(xì)節(jié)就不說了)
再稍微提一個地方!(來解釋一下最強(qiáng)的D和G誰更厲害)先擺一張圖來自Martin的Towards Principled Methods for Training Generative Adversarial Networks, 2017
D的loss是用來衡量JSD(JS Divergence)的牌捷,可以根據(jù)JSD來調(diào)G墙牌,但是這是理想的狀況。實際上如上圖暗甥,D的loss都趨近于0喜滨,也就是準(zhǔn)確率為100%,這篇paper告訴我們G train 25個epoch時淋袖,G已經(jīng)很強(qiáng)了(他產(chǎn)生的圖已經(jīng)很真實了)鸿市,但是你會發(fā)現(xiàn),這時trian一個D時即碗,它一眼就可以分辨出來焰情!是否是說D更厲害呢?為什么D的loss會趨近于0呢剥懒,這不是說明JSD沒有給我們什么作用呢内舟?(圖上表示很快就趨近于0了!)
- 我們沒辦法做上面的積分初橘,只能用sample的方法验游,sample的數(shù)據(jù)充岛,就算G生成的數(shù)據(jù)和真實數(shù)據(jù)有重疊,但因為sample的數(shù)據(jù)耕蝉,總可以用一個powerful的D找到一個分類面把他們完全分開崔梗,那一個辦法是限制住D,讓它不要過擬合垒在;但是蒜魄,其實D可以量出JSD的前提是D的capacity是可以輸出任何值,也就是要它很powerful场躯!這就出現(xiàn)了奇妙的矛盾谈为,一方面實際操作上要它弱一點,另一方面從理論角度又希望它強(qiáng)一點
- 現(xiàn)在從data的本質(zhì)上解釋踢关,我們的data都是高維空間的manifold(實際data和G產(chǎn)生的data)伞鲫,這樣其實data的交際是很小的,這樣算出來的divergence就是log2签舞,這會造成什么問題呢秕脓?
前面提到GAN的類似演化的過程,變得越來越好瘪菌!讓G產(chǎn)生的data和真實的越來越近撒会,但是讓計算機(jī)必須要讓這個距離越來越小,但是量出來的都是log2...就沒有動力進(jìn)化师妙。诵肛。。怎么解決這個問題呢默穴!(WGAN!!!下次講怔檩,這個是重點!蓄诽!)
那先講個trick
-
增加噪聲
讓低緯的manifold變寬薛训,可能就有overlap,D就沒有辦法完全分開仑氛,但是noise要不斷變小乙埃,減少干擾(這是操作上應(yīng)該考慮的)
另一個問題 Mode Collapse
也就是只產(chǎn)生一個mode,比如產(chǎn)生數(shù)據(jù)只能產(chǎn)生一種形式锯岖,比如只會畫狗介袜,但是我們其實不知道他不會干什么。出吹。(尷尬了吧)也就是說G只會針對一個mode調(diào)參遇伞,Goodfellow原來以為是原因是原先的loss設(shè)定(divergence)有問題,最初提到的MLE也就是loss是KLD捶牢,但是我們實際是上在minimize reverse KL Divergence鸠珠,我們來看下圖
這里就舉例為什么會有mode collapse巍耗。我們來看reverse KL,在什么時候它取值會很大渐排?就是真實數(shù)據(jù)不存在的時候炬太,也就是G產(chǎn)生不像真實數(shù)據(jù)時,就會產(chǎn)生很大的loss飞盆,這時候它不會冒險產(chǎn)生新圖娄琉,它寧愿保守的產(chǎn)生固有的某個圖(Mode)!(KL情況類似分析即可) GoodFellow說我們是可以直接用KL divergence,但是也不會完全解決這個問題
好啦吓歇,這次就先解析這些希望這些內(nèi)容可以讓你對GAN有更多的了解,有些內(nèi)容也是個人觀點票腰, 如果有錯誤請指明哦城看。其實GAN有很多內(nèi)容,這個GAN是不能直接做問答機(jī)的杏慰,現(xiàn)在就不說了测柠,下次!會介紹一些改進(jìn)的GAN缘滥,然后就可以開始介紹我們的圖靈問答機(jī)了:湫病!
如有錯誤的地方一定要指出哦朝扼!一起進(jìn)步T叻А!擎颖!