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