訓練生成對抗網絡的一些技巧和陷阱

2019-11-03     AI公園

作者:Utkarsh Desai

編譯:ronghuaiyang

導讀

生成對抗網絡是個好東西,不過訓練比較麻煩,這裡有一些技巧和陷阱,分享給大家。

生成對抗網絡(GANs)是當前深度學習研究的熱點之一。過去一段時間,GANs上發表的論文數量有了巨大的增長。GANs已經應用於各種各樣的問題。

我讀了很多關於GANs的書,但是我自己從來沒有玩過。因此,在閱讀了一些論文和github repos之後,我決定親自動手訓練一個簡單的GAN,但很快就遇到了問題。

本文的目標讀者是剛開始學習GANs的深度學習愛好者。除非你非常幸運,否則第一次獨自訓練GAN可能是一個令人沮喪的過程,可能需要花費數小時才能正確。當然,隨著時間的推移,隨著經驗的積累,你會很好地訓練GANs,但是對於初學者來說,可能會出現一些錯誤,你甚至不知道從哪裡開始調試。我想分享我的觀察和經驗教訓,從零開始訓練GANs,希望它可能會節省一些人開始調試幾個小時的時間。

生成對抗網絡

除非你已經斷網一年左右了,否則所有參與深度學習的人——甚至一些沒有參與深度學習的人——都聽說過並談論過GANs。GANs是一種深度神經網絡,是數據的生成模型。這意味著,給定一組訓練數據,GANs可以學會估計數據的潛在機率分布。這是非常有用的,因為除了其他事情,我們現在可以從學習到的機率分布中生成樣本,這些樣本可能不會出現在原始訓練集中。

該領域的專家已經提供了一些很棒的資源來解釋GANs及其工作原理,所以我不會試圖複製他們的工作。但是為了完整起見,這裡有一個快速的概述。

生成對抗網絡實際上是兩個相互競爭的深層網絡。給定一個訓練集X(比如說幾千張貓的圖片),生成網絡G(X),使用一個隨機向量作為輸入,並試圖產生與訓練集類似的圖像。鑑別器網絡,D(X),是一個二元分類器,試圖區分真正的訓練集X中的貓圖片和生成器生成的假貓圖片。因此,生成器網絡的工作就是學習數據在X中的分布情況,從而生成真實的貓圖像,並確保識別器不能區分訓練集中的貓圖像和生成器生成的貓圖像。鑑別器需要學習跟上生成器的步伐,因為生成器一直嘗試新的技巧來生成假的貓的圖像並欺騙鑑別器。

最終,如果一切順利,生成器(或多或少)就會學習訓練數據的真實分布,並變得非常擅長生成真實的貓圖像。識別器不再能夠區分訓練集的貓圖像和生成的貓圖像。

從這個意義上說,這兩個網絡不斷地試圖確保另一個不能很好地完成他們的任務。那麼,這到底是怎麼回事呢?

另一種觀察GAN設置的方法是,鑑別器試圖通過告訴生成程序真實的貓圖像是什麼樣子來引導生成器。最終,這台機器發現了這一點,並開始生成真實的貓的圖像。GANs的訓練方法類似於博弈論中的極大極小算法,這兩個網絡試圖達到所謂的納什均衡。

GAN訓練中的挑戰

回到GANs的訓練。首先,我使用Keras和Tensorflow後端,在MNIST數據集上訓練了一個GAN(準確地說,是DC-GAN)。這並不難,經過對生成器和鑑別器網絡的一些小的調整,GAN能夠生成MNIST數字的清晰圖像。

黑色和白色的數字沒那麼有趣。物體和人的彩色圖像是所有酷傢伙玩的東西。這就是事情開始變得棘手的地方。MNIST之後,顯然下一步是生成CIFAR-10圖像。在日復一日地調整超參數、更改網絡架構、添加和刪除層之後,我終於能夠生成類似CIFAR-10的外觀不錯的圖像。

我從一個相當深的網絡開始,最終得到了一個實際有效的、簡單得多的網絡。當我開始調整網絡和訓練過程時,15個epochs後生成的圖像從現在的樣子:

到這樣:

最後是這樣:

下面是我認識到自己犯過的一些錯誤,以及我從中學到的一些東西。所以,如果你是GANs的新手,並沒有看到在訓練方面取得很大的成功,也許看看以下幾個方面會有所幫助:

1. 大卷積核和更多的濾波器

更大的卷積核覆蓋了前一層圖像中的更多像素,因此可以查看更多信息。5x5的核與CIFAR-10配合良好,在鑑別器中使用3x3核使鑑別器損耗迅速趨近於0。對於生成器,你希望在頂層的卷積層有更大的核,以保持某種平滑。在較低的層,我沒有看到改變內核大小的任何主要影響。

濾波器的數量可以大量增加參數的數量,但通常需要更多的濾波器。我在幾乎所有的卷積層中都使用了128個濾波器。使用較少的濾波器,特別是在生成器中,使得最終生成的圖像過於模糊。因此,看起來更多的濾波器可以幫助捕獲額外的信息,最終為生成的圖像增加清晰度。

2. 標籤翻轉(Generated=True, Real=False)

雖然一開始看起來很傻,但對我有用的一個主要技巧是更改標籤分配。

如果你使用的是Real Images = 1,而生成的圖像= 0,則使用另一種方法會有所幫助。正如我們將在後面看到的,這有助於在早期疊代中使用梯度流,並幫助使梯度流動。

3. 使用有噪聲的標籤和軟標籤

這在訓練鑑別器時是非常重要的。硬標籤(1或0)幾乎扼殺了早期的所有學習,導致識別器非常快地接近0損失。最後,我使用0到0.1之間的隨機數表示0標籤(真實圖像),使用0.9到1.0之間的隨機數表示1標籤(生成的圖像)。在訓練生成器時不需要這樣做。

此外,增加一些噪音的訓練標籤也是有幫助的。對於輸入識別器的5%的圖像,標籤被隨機翻轉。比如真實的被標記為生成的,生成的被標記為真實的。

4. 使用批歸一化是有用的,但是需要有其他的東西也是合適的

批歸一化無疑有助於最終的結果。添加批歸一化後,生成的圖像明顯更清晰。但是,如果你錯誤地設置了卷積核或濾波器,或者識別器的損失很快達到0,添加批歸一化可能並不能真正幫助恢復。

5. 每次一個類別

為了更容易地訓練GANs,確保輸入數據具有相似的特徵是很有用的。例如,與其在CIFAR-10的所有10個類中都訓練GAN,不如選擇一個類(例如,汽車或青蛙)並訓練GANs從該類生成圖像。DC-GAN的其他變體在學習生成多個類的圖像方面做得更好。例如,以類標籤為輸入,生成基於類標籤的圖像。但是,如果你從一個普通的DC-GAN開始,最好保持事情簡單。

6. 查看梯度

如果可能的話,試著監控梯度以及網絡中的損失。這些可以幫助你更好地了解訓練的進展,甚至可以幫助你在工作不順利的情況下進行調試。

理想情況下,生成器應該在訓練的早期獲得較大的梯度,因為它需要學習如何生成真實的數據。另一方面,鑑別器並不總是在早期獲得較大的梯度,因為它可以很容易地區分真假圖像。一旦生成器得到足夠的訓練,鑑別器就很難分辨真假圖像。它會不斷出錯,並得到大的梯度。

我在CIFAR-10汽車上的最初幾個GAN版本,有許多卷積和批量規範層,沒有標籤翻轉。除了這個趨勢之外,監測梯度的規模也很重要。如果生成器層上的梯度太小,學習可能會很慢,或者根本不會發生。這在GAN的這個版本中是可見的。

生成器頂層的梯度

生成器底層的梯度

判別器頂層的梯度

判別器底層的梯度

在生成器的最下層梯度的規模太小,任何學習都無法進行。鑑別器的梯度始終是一致的,這表明鑑別器並沒有真正學到任何東西。現在,讓我們將其與GAN的梯度進行比較,GAN具有上面描述的所有變化,並生成良好的真實圖像:

生成器頂層的梯度

生成器底層的梯度

判別器頂層的梯度

判別器底層的梯度

梯度到達生成器底層的比例明顯高於前一個版本。此外,隨著訓練的進展,梯度流與預期一樣,隨著發生器在早期獲得較大的梯度,一旦訓練足夠,鑑別器在頂層獲得一致的高梯度。

7. 不要提前停止

我犯了一個愚蠢的錯誤——可能是由於我的不耐煩——當我看到損失沒有任何明顯的進展,或者生成的樣本仍然有噪聲時,在進行了幾百次小批量訓練之後,我就終止了訓練。比起等到訓練結束後才意識到網絡什麼都沒學到,重啟工作並節省時間是很誘人的。GANs的訓練時間較長,初始損失和生成的樣本值很少,幾乎從未顯示出任何趨勢或進展的跡象。在結束訓練過程並調整設置之前,等待一段時間是很重要的。

這個規則的一個例外是,如果你看到鑑別器損失迅速接近0。如果發生這種情況,幾乎沒有恢復的機會,最好重新開始訓練,最好對網絡或訓練過程做一些修改。

最後的GAN是這樣工作的:

英文原文:https://medium.com/@utk.is.here/keep-calm-and-train-a-gan-pitfalls-and-tips-on-training-generative-adversarial-networks-edd529764aa9

請長按或掃描二維碼關注本公眾號

文章來源: https://twgreatdaily.com/mFhYO24BMH2_cNUg7zJE.html