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

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

       本文是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=0, c=1, b=1

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

生成結果展示:

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



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

2. GAN入門與實踐

3. 手把手教你實現GAN半監督

4. 機器學習/深度學習入門資料彙總






----------

對機器學習和人工智能感興趣,請掃碼關注微信公衆號!
![這裏寫圖片描述](https://img-blog.csdn.net/20171021234338341?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzcwOTI3MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章