GAN总结
1.原始GAN
1.GAN的原理:
GAN的主要靈感來源于博弈論中零和博弈的思想,應用到深度學習神經網絡上來說,就是通過生成網絡G(Generator)和判別網絡D(Discriminator)不斷博弈,進而使G學習到數據的分布,如果用到圖片生成上,則訓練完成后,G可以從一段隨機數中生成逼真的圖像。G, D的主要功能是:
●? G是一個生成式的網絡,它接收一個隨機的噪聲z(隨機數),通過這個噪聲生成圖像?
●? D是一個判別網絡,判別一張圖片是不是“真實的”。它的輸入參數是x,x代表一張圖片,輸出D(x)代表x為真實圖片的概率,如果為1,就代表100%是真實的圖片,而輸出為0,就代表不可能是真實的圖片
訓練過程中,生成網絡G的目標就是盡量生成真實的圖片去欺騙判別網絡D。而D的目標就是盡量辨別出G生成的假圖像和真實的圖像。這樣,G和D構成了一個動態的“博弈過程”,最終的平衡點即納什均衡點.
2. GAN的特點:
●? 相比較傳統的模型,他存在兩個不同的網絡,而不是單一的網絡,并且訓練方式采用的是對抗訓練方式
●? GAN中G的梯度更新信息來自判別器D,而不是來自數據樣本
3.?GAN 的優點:
(以下部分摘自ian?goodfellow 在Quora的問答)
●? GAN是一種生成式模型,相比較其他生成模型(玻爾茲曼機和GSNs)只用到了反向傳播,而不需要復雜的馬爾科夫鏈
●? 相比其他所有模型, GAN可以產生更加清晰,真實的樣本
●? GAN采用的是一種無監督的學習方式訓練,可以被廣泛用在無監督學習和半監督學習領域
●? 相比于變分自編碼器, GANs沒有引入任何決定性偏置( deterministic bias),變分方法引入決定性偏置,因為他們優化對數似然的下界,而不是似然度本身,這看起來導致了VAEs生成的實例比GANs更模糊
●? 相比VAE, GANs沒有變分下界,如果鑒別器訓練良好,那么生成器可以完美的學習到訓練樣本的分布.換句話說,GANs是漸進一致的,但是VAE是有偏差的
●? GAN應用到一些場景上,比如圖片風格遷移,超分辨率,圖像補全,去噪,避免了損失函數設計的困難,不管三七二十一,只要有一個的基準,直接上判別器,剩下的就交給對抗訓練了。
4.?GAN的缺點:
●? 訓練GAN需要達到納什均衡,有時候可以用梯度下降法做到,有時候做不到.我們還沒有找到很好的達到納什均衡的方法,所以訓練GAN相比VAE或者PixelRNN是不穩定的,但我認為在實踐中它還是比訓練玻爾茲曼機穩定的多
●? GAN不適合處理離散形式的數據,比如文本
●? GAN存在訓練不穩定、梯度消失、模式崩潰的問題(目前已解決)
模式崩潰(model collapse)原因
一般出現在GAN訓練不穩定的時候,具體表現為生成出來的結果非常差,但是即使加長訓練時間后也無法得到很好的改善。
具體原因可以解釋如下:GAN采用的是對抗訓練的方式,G的梯度更新來自D,所以G生成的好不好,得看D怎么說。具體就是G生成一個樣本,交給D去評判,D會輸出生成的假樣本是真樣本的概率(0-1),相當于告訴G生成的樣本有多大的真實性,G就會根據這個反饋不斷改善自己,提高D輸出的概率值。但是如果某一次G生成的樣本可能并不是很真實,但是D給出了正確的評價,或者是G生成的結果中一些特征得到了D的認可,這時候G就會認為我輸出的正確的,那么接下來我就這樣輸出肯定D還會給出比較高的評價,實際上G生成的并不怎么樣,但是他們兩個就這樣自我欺騙下去了,導致最終生成結果缺失一些信息,特征不全。
關于梯度消失的問題可以參考鄭華濱的令人拍案叫絕的wassertein?GAN,里面給出了詳細的解釋,不過多重復。
局部極小值點
原始GAN中判別器要最小化如下損失函數,盡可能把真實樣本分為正例,生成樣本分為負例:
?(公式1 )
其中是真實樣本分布,是由生成器產生的樣本分布。對于生成器,Goodfellow一開始提出來一個損失函數,后來又提出了一個改進的損失函數,分別是
?(公式2)
?(公式3)
為什么GAN不適合處理文本數據
1.?文本數據相比較圖片數據來說是離散的,因為對于文本來說,通常需要將一個詞映射為一個高維的向量,最終預測的輸出是一個one-hot向量,假設softmax的輸出是(0.2, 0.3, 0.1,0.2,0.15,0.05)那么變為onehot是(0,1,0,0,0,0),如果softmax輸出是(0.2, 0.25, 0.2, 0.1,0.15,0.1 ),one-hot仍然是(0, 1, 0, 0, 0, 0),所以對于生成器來說,G輸出了不同的結果但是D給出了同樣的判別結果,并不能將梯度更新信息很好的傳遞到G中去,所以D最終輸出的判別沒有意義。
2.?另外就是GAN的損失函數是JS散度,JS散度不適合衡量不想交分布之間的距離。
(WGAN雖然使用wassertein距離代替了JS散度,但是在生成文本上能力還是有限,GAN在生成文本上的應用有seq-GAN,和強化學習結合的產物)
訓練GAN的一些技巧
1.?輸入規范化到(-1,1)之間,最后一層的激活函數使用tanh(BEGAN除外)
2.?使用wassertein GAN的損失函數,
3.?如果有標簽數據的話,盡量使用標簽,也有人提出使用反轉標簽效果很好,另外使用標簽平滑,單邊標簽平滑或者雙邊標簽平滑
4.?使用mini-batch norm, 如果不用batch?norm?可以使用instance?norm?或者weight?norm
5.?避免使用RELU和pooling層,減少稀疏梯度的可能性,可以使用leakrelu激活函數
6.?優化器盡量選擇ADAM,學習率不要設置太大,初始1e-4可以參考,另外可以隨著訓練進行不斷縮小學習率,
7.?給D的網絡層增加高斯噪聲,相當于是一種正則
2.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的訓練提供了一個很好的網絡拓撲結構。
◆??表明生成的特征具有向量的計算特性。
DCGAN的生成器網絡結構如上圖所示,相較原始的GAN,DCGAN幾乎完全使用了卷積層代替全鏈接層,判別器幾乎是和生成器對稱的,從上圖中我們可以看到,整個網絡沒有pooling層和上采樣層的存在,實際上是使用了帶步長(fractional-strided)的卷積代替了上采樣,以增加訓練的穩定性。
DCGAN能改進GAN訓練穩定的原因主要有:
◆??使用步長卷積代替上采樣層,卷積在提取圖像特征上具有很好的作用,并且使用卷積代替全連接層。
◆??生成器G和判別器D中幾乎每一層都使用batchnorm層,將特征層的輸出歸一化到一起,加速了訓練,提升了訓練的穩定性。(生成器的最后一層和判別器的第一層不加batchnorm)
◆??在判別器中使用leakrelu激活函數,而不是RELU,防止梯度稀疏,生成器中仍然采用relu,但是輸出層采用tanh
◆? 使用adam優化器訓練,并且學習率最好是0.0002,(我也試過其他學習率,不得不說0.0002是表現最好的了)
?主要改進總結:
1.將pooling層用convolutions替代。(對于判別模型,允許網絡學習自己的空間下采樣;対于生成模型,允許它學習自己的空間上采樣)
2.在generator和discriminator上都使用batchnorm:
解決初始化差的問題
幫助梯度傳播到每一層
防止generator把所有的樣本都收斂到同一個點
3.在CNN中移除全連接層
4.在generator的除了輸出層外的所有層使用ReLU,輸出層采用tanh
5.在discriminator的所有層上使用LeakyReLU.
問題:
DCGAN雖然有很好的架構,但是對GAN訓練穩定性來說是治標不治本,沒有從根本上解決問題,而且訓練的時候仍需要小心的平衡G,D的訓練進程,往往是訓練一個多次,訓練另一個一次。
3.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即使在全鏈接層上也能得到很好的表現結果,WGAN對GAN的改進主要有:
◆? 判別器最后一層去掉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,通過權重值限制的方式保證了權重參數的有界性,間接限制了其梯度信息。
4.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.01?和0.01上,這就意味了網絡的大部分權重只有兩個可能數,對于深度神經網絡來說不能充分發揮深度神經網絡的擬合能力,簡直是極大的浪費。并且,也發現強制剪切權重容易導致梯度消失或者梯度爆炸,梯度消失很好理解,就是權重得不到更新信息,梯度爆炸就是更新過猛了,權重每次更新都變化很大,很容易導致訓練不穩定。梯度消失與梯度爆炸原因均在于剪切范圍的選擇,選擇過小的話會導致梯度消失,如果設得稍微大了一點,每經過一層網絡,梯度變大一點點,多層之后就會發生梯度爆炸 。為了解決這個問題,并且找一個合適的方式滿足lipschitz連續性條件,作者提出了使用梯度懲罰(gradient penalty)的方式以滿足此連續性條件,其結果如上圖右邊所示。
?梯度懲罰就是既然Lipschitz限制是要求判別器的梯度不超過K,那么可以通過建立一個損失函數來滿足這個要求,即先求出判別器的梯度d(D(x)),然后建立與K之間的二范數就可以實現一個簡單的損失函數設計。但是注意到D的梯度的數值空間是整個樣本空間,對于圖片(既包含了真實數據集也包含了生成出的圖片集)這樣的數據集來說,維度及其高,顯然是及其不適合的計算的。作者提出沒必要對整個數據集(真的和生成的)做采樣,只要從每一批次的樣本中采樣就可以了,比如可以產生一個隨機數,在生成數據和真實數據上做一個插值
????????????????于是就算解決了在整個樣本空間上采樣的麻煩。
所以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:
5.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散度并不能拉近真實分布和生成分布之間的距離,使用最小二乘可以將圖像的分布盡可能的接近決策邊界,其損失函數定義如下:
其中作者設置a=c=1,b=0
論文里還是給了一些數學推導與證明,感興趣的可以去看看
生成結果展示:
6.BEGAN:
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的主要貢獻:
◆? 提出了一種新的簡單強大GAN,使用標準的訓練方式,不加訓練trick也能很快且穩定的收斂
◆? 對于GAN中G,D的能力的平衡提出了一種均衡的概念(GAN的理論基礎就是goodfellow理論上證明了GAN均衡點的存在,但是一直沒有一個準確的衡量指標說明GAN的均衡程度)
◆? 提出了一種收斂程度的估計,這個機制只在WGAN中出現過。作者在論文中也提到,他們的靈感來自于WGAN,在此之前只有wgan做到了
◆??提供了一個超參數,這個超參數可以在圖像的多樣性和生成質量之間做均衡(熟悉GAN的小伙伴就知道這又多難得)?
先說說BEGAN的主要原理,BEGAN和其他GAN不一樣,這里的D使用的是auto-encoder結構,就是下面這種,D的輸入是圖片,輸出是經過編碼解碼后的圖片,
為了估計分布的誤差,作者使用了auto-encoder作為D,D的輸入是圖像V,維度為RNx,輸出的也是維度為RNx的圖片,本文中n=1,自編碼器的模型如下?
,
之前的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,?μ2這時候如果我們再用wassertein距離衡量m1與m2的距離,
trace是求跡操作。
再滿足下面這個條件下,
即他們成正比,這時候連lipschitz連續性條件也不需要了,
令D不斷的最大化m2,最小化m1,而G則不斷最小化m2,當m2 接近m1的時候我們就認為GAN完成了訓練。?
分析到這里我們得出結論,我們可以去估計誤差的分布而不是直接估計分布去擬合GAN,但是損失函數究竟是怎么樣的呢?
有一個問題,當m1和m2很接近是,條件1是趨于無窮的,不可能再忽略,于是,boundary(限制)就來了,
設置一個位于[0~1]之間的數λ,強制將m1和m2劃分開界限,具體的損失函數如下:
BEGAN的訓練結果:不同的γ可以在圖片的質量和生成多樣性之間做選擇。
7.SRGAN
SRGAN (Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network, arxiv, 21 Nov, 2016)將生成式對抗網絡(GAN)用于SR問題。其出發點是傳統的方法一般處理的是較小的放大倍數,當圖像的放大倍數在4以上時,很容易使得到的結果顯得過于平滑,而缺少一些細節上的真實感。因此SRGAN使用GAN來生成圖像中的細節。
傳統的方法使用的代價函數一般是最小均方差(MSE),即
該代價函數使重建結果有較高的信噪比,但是缺少了高頻信息,出現過度平滑的紋理。SRGAN認為,應當使重建的高分辨率圖像與真實的高分辨率圖像無論是低層次的像素值上,還是高層次的抽象特征上,和整體概念和風格上,都應當接近。整體概念和風格如何來評估呢?可以使用一個判別器,判斷一副高分辨率圖像是由算法生成的還是真實的。如果一個判別器無法區分出來,那么由算法生成的圖像就達到了以假亂真的效果。
因此,該文章將代價函數改進為
第一部分是基于內容的代價函數,第二部分是基于對抗學習的代價函數。基于內容的代價函數除了上述像素空間的最小均方差以外,又包含了一個基于特征空間的最小均方差,該特征是利用VGG網絡提取的圖像高層次特征: 對抗學習的代價函數是基于判別器輸出的概率: 其中 是一個圖像屬于真實的高分辨率圖像的概率。 是重建的高分辨率圖像。SRGAN使用的生成式網絡和判別式網絡分別如下: 該方法的實驗結果如下 從定量評價結果上來看,PSNR和SSIM這兩個指標評價的是重建結果和金標準在像素值空間的差異。SRGAN得到的評價值不是最高。但是對于MOS(mean opinion score)的評價顯示,SRGAN生成的高分辨率圖像看起來更真實。這里直介紹了一些對GAN在訓練和生成上改進的工作,具體還有很多很多很多很多沒有介紹到,這里只是挑選了一些典型的,用的比較多的來介紹一下。感興趣的可以去看看https://github.com/hindupuravinash/the-gan-zoo
GAN動物園,上百個GAN等著被翻牌。
Google研究原文請見:https://arxiv.org/abs/1711.10337
在此項研究中,Google此項研究中使用了minimax損失函數和用non-saturating損失函數的GAN,分別簡稱為MM GAN和NS GAN,對比了WGAN、WGAN GP、LS GAN、DRAGAN、BEGAN,除了DRAGAN上文都做了介紹,另外還對比的有VAE(變分自編碼器)。
?
結語:
雖然得出的結論是沒有明顯的證據說明其他GAN比原始GAN好,但是,有本事你用原始GAN生成一個2K的高清圖給我看看,此時BEGAN和PG-GAN相視一笑,默默不說話。大部分情況來說,還是wgan-gp用的更多一些。生成高清圖像BEGAN最簡單合適。
?
參考文獻:
1.https://zhuanlan.zhihu.com/p/27159510?utm_source=wechat_session&utm_medium=social
2. https://www.zhihu.com/question/56171002/answer/148593584
3. http://www.inference.vc/instance-noise-a-trick-for-stabilising-gan-training/
4. https://github.com/soumith/ganhacks
5. https://github.com/hindupuravinash/the-gan-zoo
6. https://zhuanlan.zhihu.com/p/25071913
7. https://zhuanlan.zhihu.com/p/25071913
8.https://zhuanlan.zhihu.com/p/25532538?utm_medium=social&utm_source=weibo
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
- 上一篇: MOSS 2007 / WSS 3.0
- 下一篇: 火热的数据中台对企业的价值是什么?