1. 程式人生 > >生成式對抗網路(GAN)相關問題彙總(較全面)

生成式對抗網路(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網路訓練流程圖如下:  

0?wx_fmt=png

1. GAN相關問題

在Quora上的兩個問題,Ian Goodfellow(GAN的發明人)都做了解答。

原問題1:What is the advantage of generative adversarial networks compared with other generative models?

生成對抗網路相比其他生成模型的優點? 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)?

生成對抗網路(一種神經網路)的優缺點是什麼? 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)

最初Goodfellow提出GAN思想的那篇論文。

網路結構:

  1. 判別網路D(discriminative)。一個分類器。二分類,用來判別真假。
  2. 生成網路G(generative)。用來生成“逼真”樣本。 輸出一個向量,dim跟真實圖片一致。

GAN的表示式

\min_{G} \max_D V(G,D)=E_{x\sim P_{data}}[logD(x)] + E_{x\sim P_G}[log(1-D(x))]

  1. 固定G,maxV(G,D) ) ,即訓練D,讓D具有更好的辨別能力。
  2. 固定D,minmaxV(G,D),即訓練G,讓G生成的樣本和真實樣本的分佈更接近。

怎麼訓練? 一、交替訓練。

  1. 固定G時,訓練D;\max {E_{x\sim p(r)} log(D(x)) + E_{x\sim p(g)} log(1-D(x)) } (公式1) 轉化成最小形式:\min -[{E_{x\sim p(r)} log(D(x)) + E_{x\sim p(g)} log(1-D(x)) } ]
  2. 固定D時,訓練G。 可以設定超引數k, 表示訓練k次D,再訓練一次G. min Loss_G =E_{x\sim P_G}[log(1-D(x))] (公式2)

二、最優判別器D為: 令 Loss_D 關於D(x)的導數為0,得:

- \frac{P_r(x)}{D(x)} + \frac{P_g(x)}{1 - D(x)} = 0

 其中,Pr(x) 和 Pg(x) 表示真樣本和假樣本的比例。比如0.5, 0.5 化簡得最優判別器為:

D^*(x) = \frac{P_r(x)}{P_r(x) + P_g(x)}

即:如果Pr(x) = Pg(x),說明該樣本真假樣本各一半,此時最優判別器給出的概率是0.5。

看到這,有個疑問,為什麼概率是0.5還是最優判別器?

因為,分不出真假,最優的判別就是0.5 。最壞的判別是:假的被判別是真,真的被判別是假。

 loss公式分析

1,首先看D的loss. 它其實就是普通的交叉熵,特殊點是:它這裡是將真樣本的label設定為1, 將假樣本的label設定為0.

  • 對於m個真樣本(都是label=1),根據交叉熵損失函式: Loss=-[1\{y=j\}log p(y=j) ] ,由於都是y=1,所以就是 loss_r=-logD(x_i) .其中D(xi)表示p(y=1)的概率。
  • 對於m個假樣本。同理,它的 loss_f=-log(1-D(x_i)) .

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從:\min_{G} E_{x\sim P_G}[log(1-D(x))] (公式2) 變為:\min_{G} - E_{x\sim P_G}[log(D(x))] (公式3)

為什麼這麼改進?

從下圖可以看到:

  1. 在D(x)接近於0的時候,log(1−D(x))的梯度非常的小。在訓練的初期,D模型是很容易區分出“假圖片”的,也就是“假圖片”的D(x)=0,這會導致G網路的梯度變化十分的緩慢。
  2. −log(D(x)) 和log(1−D(x)) 趨勢是一樣的,都是遞減的,但是變化是“先快後慢“, 所以,G的loss 換成 :−log(D(x))

2) DCGAN(2016)

Deep Convolutional Generative Adversarial Networks。

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)

與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)

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。

5) LSGAN(2017)

最小二乘GAN,全稱是Least Squares Generative Adversarial Networks

LSGAN原理:

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

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

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

0?wx_fmt=png

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

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

6) BEGAN(2017)

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的差距,進而設計合理的損失函式拉近他們之間的距離,而是估計分佈的誤差之間的距離,作者認為只要分佈的的誤差分佈相近的話,也可以認為這些分佈是相近的。即如果我們認為兩個人非常相似,又發現這兩人中的第二個人和第三個人很相似,那麼我們就完全可以說第一個人和第三個人長的很像。

注:所有GAN的程式碼可在GitHub搜到,下面是一個GAN的zone地址:

參考網址&推薦閱讀