生成式对抗网络(GAN)相关问题汇总(较全面)
今年暑假在北京大學參加了一個月的人工智能DeeCamp訓練營培訓,期間實踐課題是:基于文本的圖像生成,用到了各種GAN網絡對比試驗結果。當時只是想著實驗各種GAN看效果,對于每一個GAN都有什么改進一知半解。接下來還要指導一篇基于GAN的水下圖像生成本科生畢設,現在整理一下網上的資源,慢慢學習。
0.?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構成了一個動態的“博弈過程”,最終的平衡點即納什均衡點.(納什均衡(Nash equilibrium)及經典案例)
GAN網絡訓練流程圖如下:
?
?
1. GAN相關問題
在Quora上的兩個問題,Ian Goodfellow(GAN的發明人)都做了解答。
原問題1:What is the advantage of generative adversarial networks compared with other generative models?
原鏈接:GAN與其他生成模型相比有什么優勢
生成對抗網絡相比其他生成模型的優點?
Ian Goodfellow回答:
—————————————————————————————————–
相比其他所有模型,我認為
- 從實際結果來看,GAN看起來能產生更好的生成樣本
- GAN框架可以訓練任何生成網絡(理論上,然而在實踐中,很難使用增強學習去訓練有離散輸出的生成器),大多數其他架構需要生成器有一些特定的函數形式,就像輸出層必須是高斯化的. 另外所有其他框架需要生成器整個都是非零權值(put non-zero mass everywhere),然而,GANs可以學習到一個只在靠近真實數據的地方(神經網絡層)產生樣本點的模型( GANs can learn models that generate points only on a thin manifold that goes near the data.)
- 沒有必要遵循任何種類的因子分解去設計模型,所有的生成器和鑒別器都可以正常工作
- 相比PixelRNN, GAN生成采樣的運行時間更短,GANs一次產生一個樣本,然而PixelRNNs需要一個像素一個像素的去產生樣本;
- 相比VAE, GANs沒有變分下界,如果鑒別器訓練良好,那么生成器可以完美的學習到訓練樣本的分布.換句話說,GANs是漸進一致的,但是VAE是有偏差的
- 相比深度玻爾茲曼機, GANs沒有變分下界,也沒有棘手的配分函數,樣本是一次生成的,而不是重復的應用馬爾科夫鏈來生成的
- 相比GSNs, GANs產生的樣本是一次生成的,而不是重復的應用馬爾科夫鏈來生成的;
- 相比NICE和Real NVE,GANs沒有對潛在變量(生成器的輸入值)的大小進行限制;
說實話, 我認為其他的方法也都是很了不起的,他們相比GANs也有相應的優勢.
—————————————————————————————————–
原問題2: What are the pros and cons of using generative adversarial networks (a type of neural network)?
原鏈接:GANs的優缺點是什么?,?
生成對抗網絡(一種神經網絡)的優缺點是什么?
It is known that facebook has developed a means of generating realistic-looking images via a neural network. They used “GAN” aka “generative adversarial networks”. Could this be applied generation of other things, such as audio waveform via RNN? Why or why not?
facebook基于神經網絡開發了一種可以生成現實圖片的方法,他們使用GAN,又叫做生成對抗網絡,它能應用到其他事物的生成嗎,例如通過RNN生成音頻波形,可以嗎?為什么?
Ian Goodfellow回答:
—————————————————————————————————–
優勢
- GANs是一種以半監督方式訓練分類器的方法,可以參考我們的NIPS paper和相應代碼.在你沒有很多帶標簽的訓練集的時候,你可以不做任何修改的直接使用我們的代碼,通常這是因為你沒有太多標記樣本.我最近也成功的使用這份代碼與谷歌大腦部門在深度學習的隱私方面合寫了一篇論文
- GANs可以比完全明顯的信念網絡(NADE,PixelRNN,WaveNet等)更快的產生樣本,因為它不需要在采樣序列生成不同的數據.
- GANs不需要蒙特卡洛估計來訓練網絡,人們經常抱怨GANs訓練不穩定,很難訓練,但是他們比訓練依賴于蒙特卡洛估計和對數配分函數的玻爾茲曼機簡單多了.因為蒙特卡洛方法在高維空間中效果不好,玻爾茲曼機從來沒有拓展到像ImgeNet任務中.GANs起碼在ImageNet上訓練后可以學習去畫一些以假亂真的狗
- 相比于變分自編碼器, GANs沒有引入任何決定性偏置( deterministic bias),變分方法引入決定性偏置,因為他們優化對數似然的下界,而不是似然度本身,這看起來導致了VAEs生成的實例比GANs更模糊.
- 相比非線性ICA(NICE, Real NVE等,),GANs不要求生成器輸入的潛在變量有任何特定的維度或者要求生成器是可逆的.
- 相比玻爾茲曼機和GSNs,GANs生成實例的過程只需要模型運行一次,而不是以馬爾科夫鏈的形式迭代很多次.
劣勢
- 訓練GAN需要達到納什均衡,有時候可以用梯度下降法做到,有時候做不到.我們還沒有找到很好的達到納什均衡的方法,所以訓練GAN相比VAE或者PixelRNN是不穩定的,但我認為在實踐中它還是比訓練玻爾茲曼機穩定的多.
- 它很難去學習生成離散的數據,就像文本
- 相比玻爾茲曼機,GANs很難根據一個像素值去猜測另外一個像素值,GANs天生就是做一件事的,那就是一次產生所有像素, 你可以用BiGAN來修正這個特性,它能讓你像使用玻爾茲曼機一樣去使用Gibbs采樣來猜測缺失值,我在伯克利大學的課堂上前二十分鐘講到了這個問題.課程鏈接,油管視頻,請自帶梯子~
待解決問題:
GAN網絡輸入圖像為什么要求是64*64?
?
2.?一些GAN網絡介紹
1)?GAN(2014)
Paper:https://arxiv.org/abs/1406.2661
最初Goodfellow提出GAN思想的那篇論文。
網絡結構:
GAN的表達式
怎么訓練?
一、交替訓練。
?(公式1)
轉化成最小形式:
min??(公式2)
二、最優判別器D為:
令??關于D(x)的導數為0,得:
?其中,Pr(x) 和 Pg(x) 表示真樣本和假樣本的比例。比如0.5, 0.5
化簡得最優判別器為:
即:如果Pr(x) = Pg(x),說明該樣本真假樣本各一半,此時最優判別器給出的概率是0.5。
看到這,有個疑問,為什么概率是0.5還是最優判別器?
因為,分不出真假,最優的判別就是0.5 。最壞的判別是:假的被判別是真,真的被判別是假。
?loss公式分析
1,首先看D的loss.
它其實就是普通的交叉熵,特殊點是:它這里是將真樣本的label設置為1, 將假樣本的label設置為0.
- 對于m個真樣本(都是label=1),根據交叉熵損失函數:??,由于都是y=1,所以就是??.其中D(xi)表示p(y=1)的概率。
- 對于m個假樣本。同理,它的??.
2,再看G的loss
網絡G的目標是讓網絡D分辨不清,準確說,就是讓label=0的假樣本,被D認為是真(lable=1).
也就是說,對于假樣本,d(x)=1時(被認為是真)loss最小,d(x)=0時loss最大。
所以,loss_g=log(1?D(xi)) ,與D網絡的 lossf 相反。
網絡G 的loss的改進
這里將網絡G的loss從:
?(公式2)
變為:
?(公式3)
為什么這么改進?
從下圖可以看到:
?
2)?DCGAN(2016)
Deep Convolutional Generative Adversarial Networks。
paper:http://arxiv.org/abs/1511.06434
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
DCGAN雖然有很好的架構,但是對GAN訓練穩定性來說是治標不治本,沒有從根本上解決問題,而且訓練的時候仍需要小心的平衡G,D的訓練進程,往往是訓練一個多次,訓練另一個一次。
3)?WGAN(2017)
Paper:https://arxiv.org/abs/1701.07875
與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(2017)
Paper:https://arxiv.org/abs/1704.00028
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(2017)
最小二乘GAN,全稱是Least Squares Generative Adversarial Networks
Paper:https://arxiv.org/abs/1611.04076
LSGAN原理:
其實原理部分可以一句話概括,即使用了最小二乘損失函數代替了GAN的損失函數。
但是就這樣的改變,緩解了GAN訓練不穩定和生成圖像質量差多樣性不足的問題。
事實上,作者認為使用JS散度并不能拉近真實分布和生成分布之間的距離,使用最小二乘可以將圖像的分布盡可能的接近決策邊界,其損失函數定義如下:
其中作者設置a=c=1,b=0
論文里還是給了一些數學推導與證明,感興趣的可以去看看
6)?BEGAN(2017)
Paper:https://arxiv.org/abs/1703.10717
BEGAN的主要貢獻:
- 提出了一種新的簡單強大GAN,使用標準的訓練方式,不加訓練trick也能很快且穩定的收斂
- 對于GAN中G,D的能力的平衡提出了一種均衡的概念(GAN的理論基礎就是goodfellow理論上證明了GAN均衡點的存在,但是一直沒有一個準確的衡量指標說明GAN的均衡程度)
- 提出了一種收斂程度的估計,這個機制只在WGAN中出現過。作者在論文中也提到,他們的靈感來自于WGAN,在此之前只有wgan做到了
- 提出了一種收斂程度的估計,這個機制只在WGAN中出現過。作者在論文中也提到,他們的靈感來自于WGAN
先說說BEGAN的主要原理,BEGAN和其他GAN不一樣,這里的D使用的是auto-encoder結構,就是下面這種,D的輸入是圖片,輸出是經過編碼解碼后的圖片,
以往的GAN以及其變種都是希望生成器生成的數據分布盡可能的接近真實數據的分布,當生成數據分布等同于真實數據分布時,我們就確定生成器G經過訓練可以生成和真實數據分布相同的樣本,即獲得了生成足以以假亂真數據的能力,所以從這一點出發,研究者們設計了各種損失函數去令G的生成數據分布盡可能接近真實數據分布。BEGAN代替了這種估計概率分布方法,它不直接去估計生成分布Pg與真實分布Px的差距,進而設計合理的損失函數拉近他們之間的距離,而是估計分布的誤差之間的距離,作者認為只要分布的的誤差分布相近的話,也可以認為這些分布是相近的。即如果我們認為兩個人非常相似,又發現這兩人中的第二個人和第三個人很相似,那么我們就完全可以說第一個人和第三個人長的很像。
?
注:所有GAN的代碼可在GitHub搜到,下面是一個GAN的zone地址:
https://github.com/hindupuravinash/the-gan-zoo
講了這么多,2018年Google新的研究表明,這些GAN都差不多,Google研究原文:https://arxiv.org/abs/1711.10337
?
參考網址&推薦閱讀
帶你進入GAN(一)原始GAN
DCGAN、WGAN、WGAN-GP、LSGAN、BEGAN原理總結及對比
生成對抗網絡(GAN)相比傳統訓練方法有什么優勢?
深入淺出 GAN·原理篇文字版(完整)| 干貨(推薦)
總結
以上是生活随笔為你收集整理的生成式对抗网络(GAN)相关问题汇总(较全面)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FPGA仿锆石代码风格组合电路时序电路严
- 下一篇: muma