1. 程式人生 > >理解與學習深度卷積生成對抗網路

理解與學習深度卷積生成對抗網路

一.GAN

引言:生成對抗網路GAN,是當今的一大熱門研究方向。在2014年,被Goodfellow大神提出來,當時的G神還是蒙特利爾大學的博士生。據有關媒體統計:CVPR2018的論文裡,有三分之一的論文與GAN有關。由此可見,GAN在視覺領域的未來多年內,將是一片沃土。而我們入坑GAN,首先需要理由,GAN能做什麼,為什麼要學GAN。

》》GAN的初衷就是生成不存在於真實世界的資料,類似於使得 AI具有創造力或者想象力。應用場景如下:

》AI作家,AI畫家等需要創造力的AI體;

》將模糊圖變清晰(去雨,去霧,去抖動,等);

》進行資料增強,根據已有資料生成更多新資料供以feed,可以減緩模型過擬合現象。

 

接下來我們對GAN進行討論:

(1)GAN的思想是是一種二人零和博弈思想(two-player game),博弈雙方的利益之和是一個常數,比如兩個人掰手腕,假設總的空間是一定的,你的力氣大一點,那你就得到的空間多一點,相應的我的空間就少一點,相反我力氣大我就得到的多一點,但有一點是確定的就是,我兩的總空間是一定的,這就是二人博弈,但是呢總利益是一定的。

引申到GAN裡面就是可以看成,GAN中有兩個這樣的博弈者,一個人名字是生成模型(G),另一個人名字是判別模型(D)。他們各自有各自的功能。比如,我們有一些真實資料,同時也有一把亂七八糟的假資料。(G)拼命地把隨手拿過來的假資料模仿成真實資料,並揉進真實資料裡。(D)則拼命地想把真實資料和假資料區分開。這裡,(G)就是一個生成模型,類似於賣假貨的,一個勁兒地學習如何騙過 (D)。而(D)則是一個判別模型,類似於警察叔叔,一個勁兒地學習如何分辨出(G)的騙人技巧。如此這般,隨著(D)的鑑別技巧越來越牛,(G)的騙人技巧也越來越純熟了。

相同點是:

這兩個模型都可以看成是一個黑匣子,接受輸入然後有一個輸出,類似一個函式,一個輸入輸出對映。

不同點是:

生成模型(G)功能:比作是一個樣本生成器,輸入一個噪聲/樣本,然後把它包裝成一個逼真的樣本,也就是輸出。

判別模型(D):比作一個二分類器(如同0-1分類器),來判斷輸入的樣本是真是假。(就是輸出值大於0.5還是小於0.5).

(2)訓練這樣的兩個模型的大方法就是:單獨交替迭代訓練.

    我們可以實現定義一個迭代次數,交替迭代到一定次數後停止即可。這個時候我們再去看一看噪聲Z生成的假樣本會發現,原來它已經很真了。看完了這個過程是不是感覺GAN的設計真的很巧妙,個人覺得最值得稱讚的地方可能在於這種假樣本在訓練過程中的真假變換,這也是博弈得以進行的關鍵之處。

 

 

 

(3)生成對抗網路的運作過程:

》》》在a圖中,初始狀態生成資料與真實資料相比具有很大的差距,判別器具備初步劃分是否是真實資料的能力,但是由於存在噪聲,效果仍有缺陷;

》》》在b圖中,通過對於判別器的訓練,判別器D開始逐漸向一個比較完善的的方向收斂;

》》》在c圖中,我們讓生成資料向真實資料移動,使得生成資料更容易被判別器判別別為真實資料;

》》》在d圖中,達到理想的p(生成)=p(真實),此時D與G都無法再更進一步優化!D(x)=1/2.我們的生成模型跟源資料擬合之後就沒法再繼續學習了(因為常數線 y = 1/2 求導永遠為 0)。

(如下圖a,b,c,d所示)

 

 (4)GAN的特點:

●  相比較傳統的模型,他存在兩個不同的網路,而不是單一的網路,並且訓練方式用的是對抗訓練方式.

●  GAN中G的梯度更新資訊來自判別器D,而不是來自資料樣本.

(5)GAN的優缺點:

》》》優點:

 ●  GAN是一種生成式模型,相比較其他生成模型(玻爾茲曼機和GSNs)只用到了向傳播,而不需要複雜的馬爾科夫鏈;

●  相比其他所有模型, GAN可以產生更加清晰,真實的樣本;

●  GAN採用的是一種無監督的學習方式訓練,可以被廣泛用在無監督學習和半監督學習領域;

●  相比於變分自編碼器, GANs沒有引入任何決定性偏置( deterministic bias),變分方法引入決定性偏置,因為他們優化對數似然的下界,而不是似然度本身,這看起來導致了VAES生成的例項比GANs更模糊;

●  相比VAE, GANs沒有變分下界,如果鑑別器訓練良好,那麼生成器可以完美的學習到訓練樣本的分佈.換句話說,GANs是漸進一致的,但是VAE是有偏差的;

●  GAN應用到一些場景上,比如圖片風格遷移,超解析度,影象補全,去噪,避免了損失函式設計的困難,不管三七二十一,只要有一個的基準,直接上判別器,剩下的就交給對抗訓練了。

  》》》缺點:

   ●  訓練GAN需要達到納什均衡,有時候可以用梯度下降法做到,有時候做不到.我們還沒有找到很好的達到納什均衡的方法,所以訓練GAN相比VAE或者PixelRNN是不穩定的,但我認為在實踐中它還是比訓練玻爾茲曼機穩定的多

●  GAN不適合處理離散形式的資料,比如文字

●  GAN存在訓練不穩定、梯度消失、模式崩潰的問題(目前已解決)

 

 二.DCGAN(深度卷積對抗網路)

 

    引言:

(1)DCGAN的創始論文發表於2015年,在GAN的基礎上提出了DCGAN,其主要的改進是在網路結構上,在訓練過程中狀態穩定,並且可以有效實現高質量圖片的生成以及相關的生成模型應用。DCGAN的生成器網路結構如下圖:

 

 

 

(2) DCGAN的改進:

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

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

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

●   使用adam優化器訓練,並且學習率最好是0.0002。(有的實驗者也試過其他學習率,但不得不說0.0002是表現最好的了)

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

(3) DCGAN的向量計算:

 

 

 (smiling woman - neutral woman + neutral man = smiling man )

 

 

 (man with glasses -man +woman = woman with glasses)

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

(4)網上關於DCGAN的實現:

》》》DCGAN實現動漫頭像生成:

    》首先需要用爬蟲爬取大量的動漫圖片;

    》我們的目標是生成動漫頭像,所以需要進行人臉檢測擷取影象;

    》搭建tensorflow框架

    》訓練,生成結果如以下圖片:

Epoch0:

 

 

 Epoch20:

 

 

 Epoch300:

 

 

 

    》結果:從以上圖片可以看到,第300個Epoch的圖片幾乎可以以假亂真。

(5)我們對於人臉圖片的生成:

》搭建並激活虛擬環境

》執行第一個.py檔案,批量轉換圖片成統一格式檔案,會生成一個設定好的資料夾,在該目錄下生成符合要求的圖片;

》開始訓練,執行另一個.py檔案,會生成設定好的資料夾,在該目錄下找到訓練好的圖片。(若因某種原因導致訓練終止,執行上述命令會在原有基礎上繼續訓練)

》結果:

Epoch0:

 

 

 Epoch25:

 

 

 Epoch100:

 

 

 

   》結果:我們使用的是6400張人臉圖片資料集進行訓練,train200-20000是我們通過DCGAN對人物頭像的生成,可以看到第1個Epoch-train200很模糊,但是train-5000可以看到有人臉生成,而train-20000幾乎可以看到清晰可辨的人臉!

   》DCGAN的缺陷以及我的收穫:

   在實際實踐中,生成資料和真實資料在空間中完美重合的概率是非常低的,大部分情況下我們可以找到一個完美的判別器加以劃分。(一句話概括,在原始GAN中的問題在於:判別器越好,生成梯度消失越嚴重)導致在網路訓練的反向傳播中,梯度更新幾乎為零,即網路很難在這過程中學到東西。

   而對於DCGAN的訓練1,10,25個epoch,生成器優化的梯度快速下降。但是修改梯度函式可以有效避免梯度消失的問題。但是呢,隨著訓練迭代次數的上升,梯度上升非常快,同時曲線的噪聲也在變大,也就是說梯度的方差也在增加,這會導致樣本質量低的情