1. 程式人生 > >DCGAN、WGAN、WGAN-GP、LSGAN、BEGAN原理總結及對比

DCGAN、WGAN、WGAN-GP、LSGAN、BEGAN原理總結及對比


GAN系列學習(2)——前生今世

      本文已投稿至微信公眾號--機器學習演算法工程師,歡迎關注

       本文是GAN系列學習–前世今生第二篇,在第一篇中主要介紹了GAN的原理部分,在此篇文章中,主要總結了常用的GAN包括DCGAN,WGAN,WGAN-GP,LSGAN-BEGAN的詳細原理介紹以及他們對GAN的主要改進,並推薦了一些Github程式碼復現連結。

       本文旨在對GAN的變種做一些梳理工作,詳細請看下文。

1.DCGAN

【Paper】 :

            http://arxiv.org/abs/1511.06434

【github】 :

            https://github.com/Newmu/dcgan_code  theano

            https://github.com/carpedm20/DCGAN-tensorflow  tensorflow

            https://github.com/jacobgil/keras-dcgan    keras

            https://github.com/soumith/dcgan.torch  torch

DCGAN是繼GAN之後比較好的改進,其主要的改進主要是在網路結構上,到目前為止,DCGAN的網路結構還是被廣泛的使用,DCGAN極大的提升了GAN訓練的穩定性以及生成結果質量。

論文的主要貢獻是:

◆  為GAN的訓練提供了一個很好的網路拓撲結構。

◆  表明生成的特徵具有向量的計算特性。

640?wx_fmt=png&wxfrom=5&wx_lazy=1

DCGAN的生成器網路結構如上圖所示,相較原始的GAN,DCGAN幾乎完全使用了卷積層代替全連結層,判別器幾乎是和生成器對稱的,從上圖中我們可以看到,整個網路沒有pooling層和上取樣層的存在,實際上是使用了帶步長(fractional-strided)的卷積代替了上取樣,以增加訓練的穩定性。

DCGAN能改進GAN訓練穩定的原因主要有:

◆  使用步長卷積代替上取樣層,卷積在提取影象特徵上具有很好的作用,並且使用卷積代替全連線層。

◆  生成器G和判別器D中幾乎每一層都使用batchnorm層,將特徵層的輸出歸一化到一起,加速了訓練,提升了訓練的穩定性。(生成器的最後一層和判別器的第一層不加batchnorm)

◆  在判別器中使用leakrelu啟用函式,而不是RELU,防止梯度稀疏,生成器中仍然採用relu,但是輸出層採用tanh

◆  使用adam優化器訓練,並且學習率最好是0.0002,(我也試過其他學習率,不得不說0.0002是表現最好的了)

DCGAN結果圖:

向量計算:

0?wx_fmt=png

LSUN資料集上的結果:

0?wx_fmt=png

DCGAN雖然有很好的架構,但是對GAN訓練穩定性來說是治標不治本,沒有從根本上解決問題,而且訓練的時候仍需要小心的平衡G,D的訓練程序,往往是訓練一個多次,訓練另一個一次。

2.WGAN

paper】:

            https://arxiv.org/abs/1701.07875

GitHub】:

            https://github.com/hwalsuklee/tensorflow-generative-model-collections

              https://github.com/Zardinality/WGAN-tensorflow

DCGAN不同,WGAN主要從損失函式的角度對GAN做了改進,損失函式改進之後的WGAN即使在全連結層上也能得到很好的表現結果,WGANGAN的改進主要有:

  判別器最後一層去掉sigmoid

  生成器和判別器的loss不取log

  對更新後的權重強制截斷到一定範圍內,比如[-0.01,0.01],以滿足論文中提到的lipschitz連續性條件。

  論文中也推薦使用SGD, RMSprop等優化器,不要基於使用動量的優化演算法,比如adam,但是就我目前來說,訓練GAN時,我還是adam用的多一些。

從上面看來,WGAN好像在程式碼上很好實現,基本上在原始GAN的程式碼上不用更改什麼,但是它的作用是巨大的

  WGAN理論上給出了GAN訓練不穩定的原因,即交叉熵(JS散度)不適合衡量具有不相交部分的分佈之間的距離,轉而使用wassertein距離去衡量生成資料分佈和真實資料分佈之間的距離,理論上解決了訓練不穩定的問題。

  解決了模式崩潰的(collapse mode)問題,生成結果多樣性更豐富。

  對GAN的訓練提供了一個指標,此指標數值越小,表示GAN訓練的越差,反之越好。可以說之前訓練GAN完全就和買彩票一樣,訓練好了算你中獎,沒中獎也不要氣餒,多買幾注吧。

有關GAN和WGAN的解釋,可以參考連結:https://zhuanlan.zhihu.com/p/25071913

總的來說GAN中交叉熵(JS散度)不適合衡量生成資料分佈和真實資料分佈的距離,如果通過優化JS散度訓練GAN會導致找不到正確的優化目標,所以,WGAN提出使用wassertein距離作為優化方式訓練GAN,但是數學上和真正程式碼實現上還是有區別的,使用Wasserteion距離需要滿足很強的連續性條件—lipschitz連續性,為了滿足這個條件,作者使用了將權重限制到一個範圍的方式強制滿足lipschitz連續性,但是這也造成了隱患,接下來會詳細說。另外說實話,雖然理論證明很漂亮,但是實際上訓練起來,以及生成結果並沒有期待的那麼好。

Lipschitz限制是在樣本空間中,要求判別器函式D(x)梯度值不大於一個有限的常數K,通過權重值限制的方式保證了權重引數的有界性,間接限制了其梯度資訊。

3.WGAN-GP (improved wgan)

paper】:

            https://arxiv.org/abs/1704.00028

GitHub】:

        https://link.zhihu.com/?target=https%3A//github.com/igul222/improved_wgan_training

            https://github.com/caogang/wgan-gp

WGAN-GP是WGAN之後的改進版,主要還是改進了連續性限制的條件,因為,作者也發現將權重剪下到一定範圍之後,比如剪下到[-0.01,+0.01]後,發生了這樣的情況,如下圖左邊表示

0?wx_fmt=png

發現大多數的權重都在-0.01 0.01上,這就意味了網路的大部分權重只有兩個可能數,對於深度神經網路來說不能充分發揮深度神經網路的擬合能力,簡直是極大的浪費。並且,也發現強制剪下權重容易導致梯度消失或者梯度爆炸,梯度消失很好理解,就是權重得不到更新資訊,梯度爆炸就是更新過猛了,權重每次更新都變化很大,很容易導致訓練不穩定。梯度消失與梯度爆炸原因均在於剪下範圍的選擇,選擇過小的話會導致梯度消失,如果設得稍微大了一點,每經過一層網路,梯度變大一點點,多層之後就會發生梯度爆炸 。為了解決這個問題,並且找一個合適的方式滿足lipschitz連續性條件,作者提出了使用梯度懲罰(gradient penalty)的方式以滿足此連續性條件,其結果如上圖右邊所示。

 梯度懲罰就是既然Lipschitz限制是要求判別器的梯度不超過K,那麼可以通過建立一個損失函式來滿足這個要求,即先求出判別器的梯度d(D(x)),然後建立與K之間的二範數就可以實現一個簡單的損失函式設計。但是注意到D的梯度的數值空間是整個樣本空間,對於圖片(既包含了真實資料集也包含了生成出的圖片集)這樣的資料集來說,維度及其高,顯然是及其不適合的計算的。作者提出沒必要對整個資料集(真的和生成的)做取樣,只要從每一批次的樣本中取樣就可以了,比如可以產生一個隨機數,在生成資料和真實資料上做一個插值

0?wx_fmt=png

於是就算解決了在整個樣本空間上取樣的麻煩。

所以WGAN-GP的貢獻是:

  提出了一種新的lipschitz連續性限制手法—梯度懲罰,解決了訓練梯度消失梯度爆炸的問題。

  比標準WGAN擁有更快的收斂速度,並能生成更高質量的樣本

  提供穩定的GAN訓練方式,幾乎不需要怎麼調參,成功訓練多種針對圖片生成和語言模型的GAN架構

但是論文提出,由於是對每個batch中的每一個樣本都做了梯度懲罰(隨機數的維度是(batchsize,1)),因此判別器中不能使用batch norm,但是可以使用其他的normalization方法,比如Layer Normalization、Weight Normalization和Instance Normalization,論文中使用了Layer Normalization,weight normalization效果也是可以的。為了比較,還是祭出了下面這張圖,可以發現WGAN-GP完爆其他GAN:

0?wx_fmt=png

4.LSGAN

最小二乘GAN

全稱是Least Squares Generative Adversarial Networks

【paper】

            https://arxiv.org/abs/1611.04076

【github】

            https://github.com/hwalsuklee/tensorflow-generative-model-collections

            https://github.com/guojunq/lsgan

LSGAN原理:

其實原理部分可以一句話概括,即使用了最小二乘損失函式代替了GAN的損失函式。

但是就這樣的改變,緩解了GAN訓練不穩定和生成影象質量差多樣性不足的問題。

事實上,作者認為使用JS散度並不能拉近真實分佈和生成分佈之間的距離,使用最小二乘可以將影象的分佈儘可能的接近決策邊界,其損失函式定義如下:

0?wx_fmt=png其中作者設定a=c=1,b=0

論文裡還是給了一些數學推導與證明,感興趣的可以去看看

生成結果展示:

0?wx_fmt=png

5.BEGAN: (不是EBGAN)

BEGAN全稱是Boundary Equilibrium GANs

【paper】:

            https://arxiv.org/abs/1703.10717

【GitHub】:

            https://github.com/carpedm20/BEGAN-tensorflow

            https://github.com/Heumi/BEGAN-tensorflow

            https://github.com/carpedm20/BEGAN-pytorch

(詳細的BEGAN解讀可以參考我的部落格:

http://blog.csdn.net/qq_25737169/article/details/77575617?locationNum=1&fps=1

BEGAN的主要貢獻:

  提出了一種新的簡單強大GAN,使用標準的訓練方式,不加訓練trick也能很快且穩定的收斂

  對於GAN中G,D的能力的平衡提出了一種均衡的概念(GAN的理論基礎就是goodfellow理論上證明了GAN均衡點的存在,但是一直沒有一個準確的衡量指標說明GAN的均衡程度)

  提出了一種收斂程度的估計,這個機制只在WGAN中出現過。作者在論文中也提到,他們的靈感來自於WGAN,在此之前只有wgan做到了

  提出了一種收斂程度的估計,這個機制只在WGAN中出現過。作者在論文中也提到,他們的靈感來自於WGAN

先說說BEGAN的主要原理,BEGAN和其他GAN不一樣,這裡的D使用的是auto-encoder結構,就是下面這種,D的輸入是圖片,輸出是經過編碼解碼後的圖片,

0?wx_fmt=png

往的GAN以及其變種都是希望生成器生成的資料分佈儘可能的接近真實資料的分佈,當生成資料分佈等同於真實資料分佈時,我們就確定生成器G經過訓練可以生成和真實資料分佈相同的樣本,即獲得了生成足以以假亂真資料的能力,所以從這一點出發,研究者們設計了各種損失函式去令G的生成資料分佈儘可能接近真實資料分佈BEGAN代替了這種估計概率分佈方法,它不直接去估計生成分佈Pg與真實分佈Px的差距,進而設計合理的損失函式拉近他們之間的距離,而是估計分佈的誤差之間的距離,作者認為只要分佈的的誤差分佈相近的話,也可以認為這些分佈是相近的。即如果我們認為兩個人非常相似,又發現這兩人中的第二個人和第三個人很相似,那麼我們就完全可以說第一個人和第三個人長的很像。

BEGAN中,第一個人相當於訓練的資料x,第二個人相當於D對x編碼解碼後的影象D(x),第三個人相當於D以G的生成為輸入的結果D(g(z)),所以,如果||D(x)-x|| - || D(x)- D(g(z)) || 不斷趨近於0,那麼隨著訓練,D(x)會不斷接近x,那麼D(g(z)) 接近於D(x),豈不是就意味著 g(z) 的資料分佈和x分佈幾乎一樣了,那麼就說明G學到了生成資料的能力。於是乎,假設圖片足夠大,畫素很多。但是問題來了,如果||D(x)-x|| - || D(x)- D(g(z)) ||剛好等於0,這時候,D(x)和x可能還差的很遠呢,那不就什麼也學不到了D(x)-x是一個圖片,假設圖片上的每一個畫素都滿足獨立同分布條件,根據中心極限定理,畫素的誤差近似滿足正太分佈,假設期望是m1,方差是μ1,同理D(x)- D(g(z)),還有m2, μ1這時候如果我們再用wassertein距離衡量m1與m2的距離,

0?wx_fmt=png

再滿足下面這個條件下,

0?wx_fmt=png

0?wx_fmt=png

即他們成正比,這時候連lipschitz連續性條件也不需要了,

但是有一個問題,當m1m2很接近是,條件1是趨於無窮的,不可能再忽略,於是,boundary(限制)就來了,

0?wx_fmt=png

0?wx_fmt=png

設定一個位於[0~1]之間的數λ,強制將m1m2劃分開界限,具體的損失函式如下:

0?wx_fmt=png

BEGAN的訓練結果:不同的γ可以在圖片的質量和生成多樣性之間做選擇。

0?wx_fmt=png

所以說BEGAN效果還是很強的,當然先不考慮最新nvidia的漸進訓練GAN,這篇之後會介紹。

這裡直介紹了一些對GAN在訓練和生成上改進的工作,具體還有很多很多很多很多沒有介紹到,這裡只是挑選了一些典型的,用的比較多的來介紹一下。感興趣的可以去看看https://github.com/hindupuravinash/the-gan-zoo

GAN動物園,上百個GAN等著被翻牌。

沒什麼不同

哪麼重點來了,那麼多GAN改進版,到底哪一個效果更好呢,最新的Google一項研究表明,GANWGANWGAN GPLS GANDRAGANBEGAN啥的,都差不多,差不多,不多,為什麼都差不多呢?因為天黑得時候他們都仰望同一片星空,忽然想起來了曲婉婷的一首歌《沒有什麼不同》

Google研究原文請見:https://arxiv.org/abs/1711.10337

0?wx_fmt=png

在此項研究中,Google此項研究中使用了minimax損失函式和用non-saturating損失函式的GAN,分別簡稱為MM GAN和NS GAN,對比了WGAN、WGAN GP、LS GAN、DRAGAN、BEGAN,除了DRAGAN上文都做了介紹,另外還對比的有VAE(變分自編碼器)。

對比細節:

為了很好的說明問題,研究者們兩個指標來對比了實驗結果,分別是FID精度precision、)、召回recall)以及兩者的平均數F1

其中FID(Fréchet distance(弗雷歇距離) )是法國數學家Maurice René Fréchet在1906年提出的一種路徑空間相似形描述,直觀來說是狗繩距離:主人走路徑A,狗走路徑B,各自走完這兩條路徑過程中所需要的最短狗繩長度,如下圖所示,所以說,FID與生成影象的質量呈負相關。

0?wx_fmt=png

為了更容易說明對比的結果,研究者們自制了一個類似mnist的資料集,資料集中都是灰度圖,影象中的目標是不同形狀的三角形。

0?wx_fmt=png

具體比較細節就不詳細展開了,這裡做一個結論總結

在影象生成方面,發現了VAE生成結果最差,其他的GAN等等生成質量都差不多,也很好理解其實,個人認為VAE更適合於對資料進行重構,對資料降維或者生成要求不是很高的資料上很方便(填補缺失資料),但是生成資料上還是GAN更勝一籌。

最後,研究者們也在精度(precision、)、召回率(recall)以及兩者的平均數F1上做了測試,測試細節請看論文,也並沒有發現其他GAN比原始GAN更突出的地方。

結語:

但是個人認為,雖然得出的結論是沒有明顯的證據說明其他GAN比原始GAN好,但是我想說,有本事你用原始GAN生成一個2K的高清圖給我看看,此時BEGAN和PG-GAN相視一笑,默默不說話。大部分情況來說,還是wgan-gp用的更多一些。生成高清影象BEGAN最簡單合適。

參考文獻:

https://www.zhihu.com/question/56171002/answer/148593584

http://www.inference.vc/instance-noise-a-trick-for-stabilising-gan-training/

https://github.com/soumith/ganhacks

https://github.com/hindupuravinash/the-gan-zoo

https://zhuanlan.zhihu.com/p/25071913

對機器學習和人工智慧感興趣,請掃碼關注微信公眾號!
這裡寫圖片描述