被 GANs 虐千百遍後,我總結出來的 10 條訓練經驗

dicksonjyl560101發表於2019-08-15

一年前,我決定開始探索生成式對抗網路(GANs)。自從我對深度學習產生興趣以來,我就一直對它們很著迷,主要是因為深度學習能做到很多不可置信的事情。當我想到人工智慧的時候,GAN是我腦海中最先出現的一個詞。 

被 GANs 虐千百遍後,我總結出來的 10 條訓練經驗

GANs生成的人臉(StyleGAN)  

但直到我第一次開始訓練GAN時,我才發現了這種有趣演算法的雙面性:訓練極其困難。確實,在我嘗試之前,我從論文上和其他人的嘗試中瞭解到這一點,但我一直認為他們誇大了一個本來很小但很容易克服的問題。

事實證明我錯了。

當我嘗試生成與傳統的MNIST案例不同的東西時,我發現影響GAN有很大的不穩定性問題,並且隨著我花在尋找解決方案上的時間的增加,這變得非常困擾我。

現在,在花費了無數天的時間研究已知的解決方案,並嘗試提出新的解決方案之後,我終於可以說我至少對GAN專案中收斂的穩定性有了更多的掌控,您也可以。我不奢望你僅用10分鐘就解決這個問題,並在每一個專案中達到很完美的收斂結果(或用博弈論的話語表達,即納什平衡),但我想要給你一些技巧和技術,你可以利用這些技巧讓你的GAN旅程更平坦,耗時更少,最重要的是,少一些的困惑。

  GANs 的現狀

自生成對抗性網路提出以來,研究人員對其穩定性問題進行了大量的研究。目前已有大量的文獻提出了穩定收斂的方法,除此之外,還有大量的冗長而複雜的數學證明。此外,一些實用的技巧和啟發在深度學習領域浮出水面:我注意到,這些未經證明,並沒有數學解釋的技巧,往往非常有效,不可丟棄。

隨著穩定性的提高,生成現實影象的方面也有了重大飛躍。你只需要看看來自英偉達的StyleGAN和來自谷歌的BigGAN的結果,就能真正意識到GANs已經發展到了什麼程度。

被 GANs 虐千百遍後,我總結出來的 10 條訓練經驗

由BigGAN生成的影象

在閱讀並嘗試了許多來自論文和實踐者的技巧之後,我整理了一個列表,列出了在訓練GAN時應該考慮和不應該考慮的問題,希望能讓您對這個複雜且有時冗長的主題有進一步的瞭解。  

  1. 穩定性和容量

當我開始我的第一個獨立的GAN專案時,我注意到在訓練過程的開始階段,判別器的對抗損失總是趨於零,而生成器的損失卻非常高。我立即得出結論,有一個網路沒有足夠的“容量”(或引數數量)來匹配另一個網路:所以我立馬改變了生成器的架構,在卷積層上新增了更多的濾波器,但令我驚訝的是,什麼改變都沒有。

在進一步探究網路容量變化對訓練穩定性的影響後,我沒有發現任何明顯的相關性。兩者之間肯定存在某種聯絡,但它並不像你剛開始想象的那麼重要。 

因此,如果你發現自己的訓練過程不平衡,而且也沒有出現一個網路的容量明顯超過另一個網路時,我不建議將新增或刪除濾波器作為主要解決方案。  

當然,如果您對自己網路的容量非常不確定,您可以在網上檢視一些用於類似場景的架構案例。

  2. 早停法(Early Stopping)

在GANs訓練時,您可能會遇到的另一個常見的錯誤是,當您看到生成器或鑑別器損失突然增加或減少時,立即停止訓練。我自己也這麼做過無數次:在看到損失增加之後,我立刻認為整個訓練過程都被毀了,原因在於某些調得不夠完美的超引數。

直到後來,我才意識到,損失函式往往是隨機上升或下降的,這個現象並沒有什麼問題。我取得了一些比較好的、實際的結果,而生成器的損失遠遠高於判別器的損失,這是完全正常的。因此,當你在訓練過程中遇到突然的不穩定時,我建議你多進行一些訓練,並在訓練過程中密切關注生成影象的質量,因為視覺的理解通常比一些損失數字更有意義。

  3. 損失函式的選擇

在選擇用於訓練GAN的損失函式時,我們應該選擇哪一個呢?

近期的一篇論文解決了這個問題(論文地址:https://arxiv.org/abs/1811.09567),該論文對所有不同的損失函式進行了基準測試和比較:出現了一些非常有趣的結果。顯然,選擇哪個損失函式並不重要:沒有哪個函式絕對優於其他函式,GAN能夠在每種不同的情況下學習。  

被 GANs 虐千百遍後,我總結出來的 10 條訓練經驗

論文結果:損失較少的即為更好的( https://arxiv.org/abs/1811.09567

因此,我的建議是從最簡單的損失函式開始,留下一個更具體和“最先進”的選擇作為可能的最後一步,正如我們從文獻中瞭解到的那樣,您很可能會得到更糟糕的結果。

  4.平衡發生器和判別器的權重更新

在許多GAN論文中,特別是一些早期的論文中,在實現部分中經常可以看到,作者更新一次判別器時,都更新兩次或三次生成器。

在我的第一次嘗試中,我注意到在不平衡訓練的情況下,判別器網路幾乎每次都超過生成器(損失函式大大減少)。因此,當我知道到即使是極其優秀的論文作者也會有類似的問題,並採用了一個非常簡單的解決方案來解決它時,我對自己所做的事情充滿信心。

但在我看來,通過不同的網路權重更新來平衡訓練是一個目光短淺的解決方案。幾乎從不改變生成器更新其權重的頻率,成為了我穩定訓練過程的最終解決方案:它有時可以推遲不穩定性的出現,但直到收斂都無法解決它。當我注意到這種策略無效時,我甚至試圖使它更加動態化,根據兩個網路的當前丟失狀態來改變權值更新進度;直到後來我才發現,我並不是唯一一個試圖走這條路的人,和其他許多人一樣,我也沒有成功地克服不穩定性。

直到後來我才明白,其他技術(稍後在本文中解釋)對提高訓練穩定性的作用要大得多。  

  5. Mode Collapse問題和學習率

如果您正在訓練GANs,您將肯定知道什麼是Mode Collapse。這個問題在於生成器“崩潰”了,並且總是將每一個輸入的隱向量生成單一的樣本 。在GAN的訓練過程中,這是一個相當常見的阻礙,在某些情況下,它會變得相當麻煩。

被 GANs 虐千百遍後,我總結出來的 10 條訓練經驗

Mode Collapse的例子

如果你遇到這種情況,我建議你最直接的解決方案是嘗試調整GAN的學習速度,因為根據我的個人經驗,我總是能夠通過改變這個特定的超引數來克服這個阻礙。根據經驗,當處理Mode Collapse問題時,嘗試使用較小的學習率,並從頭開始訓練。 

學習速度是最重要的超引數之一,即使不是最重要的超引數,即使是它微小變化也可能導致訓練過程中的根本性變化。通常,當使用更大的Batch Size時,您可以設定更高的學習率,但在我的經驗中,保守一點幾乎總是一個安全的選擇。  

還有其他方法可以緩解Mode Collapse問題,比如我從未在自己的程式碼中實現過的特徵匹配(Feature Matching)和小批量判別(Minibatch Discrimination),因為我總是能找到另一種方法來避免這種困難,但如果需要,請自行關注這些方法。  

  6. 新增噪聲

眾所周知,提高判別器的訓練難度有利於提高系統的整體穩定性。其中一種提高判別器訓練複雜度的方法是在真實資料和合成資料(例如由生成器生成的影象)中新增噪聲;在數學領域中,這應該是有效的,因為它有助於為兩個相互競爭的網路的資料分佈提供一定的穩定性。我推薦嘗試使用這種方法,因為它在實踐中一般比較有效(即使它不能神奇地解決您可能遇到的任何不穩定問題),而且設定起來只需要很少代價。話雖如此,我開始會使用這種技術,但過了一段時間後就放棄了,而是更喜歡其他一些在我看來更有效的技術。  

被 GANs 虐千百遍後,我總結出來的 10 條訓練經驗

  7. 標籤平滑

達到相同目的的另一種方法是標籤平滑,這種方法更容易理解和實現:如果真實影象的標籤設定為1,我們將它更改為一個低一點的值,比如0.9。這個解決方案阻止判別器對其分類標籤過於確信,或者換句話說,不依賴非常有限的一組特徵來判斷影象是真還是假。我完全贊同這個小技巧,因為它在實踐中表現得非常好,並且只需要更改程式碼中的一兩個字元。  

  8. 多尺度梯度

當處理不是太小的影象(如MNIST中的影象)時,您需要關注多尺度梯度。這是一種特殊的GAN實現,由於兩個網路之間的多個跳連線,梯度流從判別器流向生成器,這與傳統的用於語義分割的U-Net類似。  

被 GANs 虐千百遍後,我總結出來的 10 條訓練經驗

MSG-GAN架構 

多尺度梯度論文的作者能夠通過訓練GAN直接生成高清晰度的1024x1024影象,沒有任何特別大的問題(Mode Collapse等),而在此之前,只有Progressively-Growing GAN(英偉達,ProGAN)才有可能。我已經在我的專案中實現了它,我得到了到一個更穩定的訓練過程以及更有說服力的結果。檢視論文(https://arxiv.org/abs/1903.06048)以獲得更多的細節,並嘗試它!

  9. 雙時間尺度更新規則

當我說雙時間尺度的更新規則(TTUR)時,您可能認為我說的是GAN訓練中使用的一種複雜而清晰的技術,但是完全不是這樣。這種技術只是為了讓生成器和鑑別器選擇不同的學習率,僅此而已。在首次引入TTUR的論文中(https://arxiv.org/abs/1706.08500),作者提供了一個該演算法收斂於納什平衡的數學證明,並證明了使用不同的學習率實現了一些較有名的GAN(DCGAN, WGAN-GP),並取得了最先進的結果。  

但是當我說到“使用不同的學習速率”時,我在實踐中真正的應該怎麼做呢?一般來說,我建議為判別器選擇一個更高的學習率,而為生成器選擇一個更低的學習率:這樣一來,生成器必須用更小的更新幅度來欺騙判別器,並且不會選擇快速、不精確和不現實的方式來贏得博弈。為了給出一個實際的例子,我經常將判別器的學習率選為0.0004,將生成器的學習率選為0.0001,我發現這些值在我的一些專案中表現得很好。請記住,在使用TTUR時,您可能會注意到生成器有更大的損失量。 

  10. 譜歸一化

在一些論文中,如介紹SAGAN(或Self - Attention GAN)的論文中,表明譜歸一化是應用於卷積核的一種特殊的歸一化,它可以極大地提高訓練的穩定性。它最初只在判別器中使用,後來被證明如果用於生成器的卷積層也是有效的,我可以完全贊同這個策略!

我幾乎可以說,發現和實現譜歸一化使我的GAN旅程出現了方向性的改變,直率地講,我沒有看到任何理由不使用這種技術:我可以保證它會給你一個更好和更穩定的訓練結果,同時讓您關注其他更加有趣的方面的深度學習專案!(詳見這篇論文: https://arxiv.org/abs/1802.05957

  結論

許多其他技巧,更復雜的技術和體系結構都有望解決GANs的訓練問題:在本文中,我想告訴您我個人的發現並實現了哪些方法來克服遇到的障礙。  

因此,如果您在學習這裡介紹的每種方法和技巧時,發現自己陷入了困境,那麼還有更多的資料需要研究。我只能說,在花了無數的時間研究和嘗試了所有可能的解決GAN相關問題的方法之後,我對我的專案更加自信了,我真的希望你們也能這樣做。  

最後,衷心感謝您閱讀並關注這篇文章,希望您能獲得一些有價值的東西。

via  https://towardsdatascience.com/10-lessons-i-learned-training-generative-adversarial-networks-gans-for-a-year-c9071159628


https://www.cnblogs.com/DicksonJYL/p/11355893.html



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29829936/viewspace-2653736/,如需轉載,請註明出處,否則將追究法律責任。

相關文章