0
本文作者: AI研習(xí)社-譯站 | 2019-08-14 10:34 |
一年前,我決定開始探索生成式對抗網(wǎng)絡(luò)(GANs)。自從我對深度學(xué)習(xí)產(chǎn)生興趣以來,我就一直對它們很著迷,主要是因?yàn)樯疃葘W(xué)習(xí)能做到很多不可置信的事情。當(dāng)我想到人工智能的時(shí)候,GAN是我腦海中最先出現(xiàn)的一個(gè)詞。
GANs生成的人臉(StyleGAN)
但直到我第一次開始訓(xùn)練GAN時(shí),我才發(fā)現(xiàn)了這種有趣算法的雙面性:訓(xùn)練極其困難。確實(shí),在我嘗試之前,我從論文上和其他人的嘗試中了解到這一點(diǎn),但我一直認(rèn)為他們夸大了一個(gè)本來很小但很容易克服的問題。
事實(shí)證明我錯(cuò)了。
當(dāng)我嘗試生成與傳統(tǒng)的MNIST案例不同的東西時(shí),我發(fā)現(xiàn)影響GAN有很大的不穩(wěn)定性問題,并且隨著我花在尋找解決方案上的時(shí)間的增加,這變得非常困擾我。
現(xiàn)在,在花費(fèi)了無數(shù)天的時(shí)間研究已知的解決方案,并嘗試提出新的解決方案之后,我終于可以說我至少對GAN項(xiàng)目中收斂的穩(wěn)定性有了更多的掌控,您也可以。我不奢望你僅用10分鐘就解決這個(gè)問題,并在每一個(gè)項(xiàng)目中達(dá)到很完美的收斂結(jié)果(或用博弈論的話語表達(dá),即納什平衡),但我想要給你一些技巧和技術(shù),你可以利用這些技巧讓你的GAN旅程更平坦,耗時(shí)更少,最重要的是,少一些的困惑。
自生成對抗性網(wǎng)絡(luò)提出以來,研究人員對其穩(wěn)定性問題進(jìn)行了大量的研究。目前已有大量的文獻(xiàn)提出了穩(wěn)定收斂的方法,除此之外,還有大量的冗長而復(fù)雜的數(shù)學(xué)證明。此外,一些實(shí)用的技巧和啟發(fā)在深度學(xué)習(xí)領(lǐng)域浮出水面:我注意到,這些未經(jīng)證明,并沒有數(shù)學(xué)解釋的技巧,往往非常有效,不可丟棄。
隨著穩(wěn)定性的提高,生成現(xiàn)實(shí)圖像的方面也有了重大飛躍。你只需要看看來自英偉達(dá)的StyleGAN和來自谷歌的BigGAN的結(jié)果,就能真正意識到GANs已經(jīng)發(fā)展到了什么程度。
由BigGAN生成的圖像
在閱讀并嘗試了許多來自論文和實(shí)踐者的技巧之后,我整理了一個(gè)列表,列出了在訓(xùn)練GAN時(shí)應(yīng)該考慮和不應(yīng)該考慮的問題,希望能讓您對這個(gè)復(fù)雜且有時(shí)冗長的主題有進(jìn)一步的了解。
當(dāng)我開始我的第一個(gè)獨(dú)立的GAN項(xiàng)目時(shí),我注意到在訓(xùn)練過程的開始階段,判別器的對抗損失總是趨于零,而生成器的損失卻非常高。我立即得出結(jié)論,有一個(gè)網(wǎng)絡(luò)沒有足夠的“容量”(或參數(shù)數(shù)量)來匹配另一個(gè)網(wǎng)絡(luò):所以我立馬改變了生成器的架構(gòu),在卷積層上添加了更多的濾波器,但令我驚訝的是,什么改變都沒有。
在進(jìn)一步探究網(wǎng)絡(luò)容量變化對訓(xùn)練穩(wěn)定性的影響后,我沒有發(fā)現(xiàn)任何明顯的相關(guān)性。兩者之間肯定存在某種聯(lián)系,但它并不像你剛開始想象的那么重要。
因此,如果你發(fā)現(xiàn)自己的訓(xùn)練過程不平衡,而且也沒有出現(xiàn)一個(gè)網(wǎng)絡(luò)的容量明顯超過另一個(gè)網(wǎng)絡(luò)時(shí),我不建議將添加或刪除濾波器作為主要解決方案。
當(dāng)然,如果您對自己網(wǎng)絡(luò)的容量非常不確定,您可以在網(wǎng)上查看一些用于類似場景的架構(gòu)案例。
在GANs訓(xùn)練時(shí),您可能會遇到的另一個(gè)常見的錯(cuò)誤是,當(dāng)您看到生成器或鑒別器損失突然增加或減少時(shí),立即停止訓(xùn)練。我自己也這么做過無數(shù)次:在看到損失增加之后,我立刻認(rèn)為整個(gè)訓(xùn)練過程都被毀了,原因在于某些調(diào)得不夠完美的超參數(shù)。
直到后來,我才意識到,損失函數(shù)往往是隨機(jī)上升或下降的,這個(gè)現(xiàn)象并沒有什么問題。我取得了一些比較好的、實(shí)際的結(jié)果,而生成器的損失遠(yuǎn)遠(yuǎn)高于判別器的損失,這是完全正常的。因此,當(dāng)你在訓(xùn)練過程中遇到突然的不穩(wěn)定時(shí),我建議你多進(jìn)行一些訓(xùn)練,并在訓(xùn)練過程中密切關(guān)注生成圖像的質(zhì)量,因?yàn)橐曈X的理解通常比一些損失數(shù)字更有意義。
在選擇用于訓(xùn)練GAN的損失函數(shù)時(shí),我們應(yīng)該選擇哪一個(gè)呢?
近期的一篇論文解決了這個(gè)問題(論文地址:https://arxiv.org/abs/1811.09567),該論文對所有不同的損失函數(shù)進(jìn)行了基準(zhǔn)測試和比較:出現(xiàn)了一些非常有趣的結(jié)果。顯然,選擇哪個(gè)損失函數(shù)并不重要:沒有哪個(gè)函數(shù)絕對優(yōu)于其他函數(shù),GAN能夠在每種不同的情況下學(xué)習(xí)。
論文結(jié)果:損失較少的即為更好的(https://arxiv.org/abs/1811.09567)
因此,我的建議是從最簡單的損失函數(shù)開始,留下一個(gè)更具體和“最先進(jìn)”的選擇作為可能的最后一步,正如我們從文獻(xiàn)中了解到的那樣,您很可能會得到更糟糕的結(jié)果。
4.平衡發(fā)生器和判別器的權(quán)重更新
在許多GAN論文中,特別是一些早期的論文中,在實(shí)現(xiàn)部分中經(jīng)??梢钥吹?,作者更新一次判別器時(shí),都更新兩次或三次生成器。
在我的第一次嘗試中,我注意到在不平衡訓(xùn)練的情況下,判別器網(wǎng)絡(luò)幾乎每次都超過生成器(損失函數(shù)大大減少)。因此,當(dāng)我知道到即使是極其優(yōu)秀的論文作者也會有類似的問題,并采用了一個(gè)非常簡單的解決方案來解決它時(shí),我對自己所做的事情充滿信心。
但在我看來,通過不同的網(wǎng)絡(luò)權(quán)重更新來平衡訓(xùn)練是一個(gè)目光短淺的解決方案。幾乎從不改變生成器更新其權(quán)重的頻率,成為了我穩(wěn)定訓(xùn)練過程的最終解決方案:它有時(shí)可以推遲不穩(wěn)定性的出現(xiàn),但直到收斂都無法解決它。當(dāng)我注意到這種策略無效時(shí),我甚至試圖使它更加動態(tài)化,根據(jù)兩個(gè)網(wǎng)絡(luò)的當(dāng)前丟失狀態(tài)來改變權(quán)值更新進(jìn)度;直到后來我才發(fā)現(xiàn),我并不是唯一一個(gè)試圖走這條路的人,和其他許多人一樣,我也沒有成功地克服不穩(wěn)定性。
直到后來我才明白,其他技術(shù)(稍后在本文中解釋)對提高訓(xùn)練穩(wěn)定性的作用要大得多。
如果您正在訓(xùn)練GANs,您將肯定知道什么是Mode Collapse。這個(gè)問題在于生成器“崩潰”了,并且總是將每一個(gè)輸入的隱向量生成單一的樣本 。在GAN的訓(xùn)練過程中,這是一個(gè)相當(dāng)常見的阻礙,在某些情況下,它會變得相當(dāng)麻煩。
Mode Collapse的例子
如果你遇到這種情況,我建議你最直接的解決方案是嘗試調(diào)整GAN的學(xué)習(xí)速度,因?yàn)楦鶕?jù)我的個(gè)人經(jīng)驗(yàn),我總是能夠通過改變這個(gè)特定的超參數(shù)來克服這個(gè)阻礙。根據(jù)經(jīng)驗(yàn),當(dāng)處理Mode Collapse問題時(shí),嘗試使用較小的學(xué)習(xí)率,并從頭開始訓(xùn)練。
學(xué)習(xí)速度是最重要的超參數(shù)之一,即使不是最重要的超參數(shù),即使是它微小變化也可能導(dǎo)致訓(xùn)練過程中的根本性變化。通常,當(dāng)使用更大的Batch Size時(shí),您可以設(shè)置更高的學(xué)習(xí)率,但在我的經(jīng)驗(yàn)中,保守一點(diǎn)幾乎總是一個(gè)安全的選擇。
還有其他方法可以緩解Mode Collapse問題,比如我從未在自己的代碼中實(shí)現(xiàn)過的特征匹配(Feature Matching)和小批量判別(Minibatch Discrimination),因?yàn)槲铱偸悄苷业搅硪环N方法來避免這種困難,但如果需要,請自行關(guān)注這些方法。
眾所周知,提高判別器的訓(xùn)練難度有利于提高系統(tǒng)的整體穩(wěn)定性。其中一種提高判別器訓(xùn)練復(fù)雜度的方法是在真實(shí)數(shù)據(jù)和合成數(shù)據(jù)(例如由生成器生成的圖像)中添加噪聲;在數(shù)學(xué)領(lǐng)域中,這應(yīng)該是有效的,因?yàn)樗兄跒閮蓚€(gè)相互競爭的網(wǎng)絡(luò)的數(shù)據(jù)分布提供一定的穩(wěn)定性。我推薦嘗試使用這種方法,因?yàn)樗趯?shí)踐中一般比較有效(即使它不能神奇地解決您可能遇到的任何不穩(wěn)定問題),而且設(shè)置起來只需要很少代價(jià)。話雖如此,我開始會使用這種技術(shù),但過了一段時(shí)間后就放棄了,而是更喜歡其他一些在我看來更有效的技術(shù)。
達(dá)到相同目的的另一種方法是標(biāo)簽平滑,這種方法更容易理解和實(shí)現(xiàn):如果真實(shí)圖像的標(biāo)簽設(shè)置為1,我們將它更改為一個(gè)低一點(diǎn)的值,比如0.9。這個(gè)解決方案阻止判別器對其分類標(biāo)簽過于確信,或者換句話說,不依賴非常有限的一組特征來判斷圖像是真還是假。我完全贊同這個(gè)小技巧,因?yàn)樗趯?shí)踐中表現(xiàn)得非常好,并且只需要更改代碼中的一兩個(gè)字符。
當(dāng)處理不是太小的圖像(如MNIST中的圖像)時(shí),您需要關(guān)注多尺度梯度。這是一種特殊的GAN實(shí)現(xiàn),由于兩個(gè)網(wǎng)絡(luò)之間的多個(gè)跳連接,梯度流從判別器流向生成器,這與傳統(tǒng)的用于語義分割的U-Net類似。
MSG-GAN架構(gòu)
多尺度梯度論文的作者能夠通過訓(xùn)練GAN直接生成高清晰度的1024x1024圖像,沒有任何特別大的問題(Mode Collapse等),而在此之前,只有Progressively-Growing GAN(英偉達(dá),ProGAN)才有可能。我已經(jīng)在我的項(xiàng)目中實(shí)現(xiàn)了它,我得到了到一個(gè)更穩(wěn)定的訓(xùn)練過程以及更有說服力的結(jié)果。查看論文(https://arxiv.org/abs/1903.06048)以獲得更多的細(xì)節(jié),并嘗試它!
當(dāng)我說雙時(shí)間尺度的更新規(guī)則(TTUR)時(shí),您可能認(rèn)為我說的是GAN訓(xùn)練中使用的一種復(fù)雜而清晰的技術(shù),但是完全不是這樣。這種技術(shù)只是為了讓生成器和鑒別器選擇不同的學(xué)習(xí)率,僅此而已。在首次引入TTUR的論文中(https://arxiv.org/abs/1706.08500),作者提供了一個(gè)該算法收斂于納什平衡的數(shù)學(xué)證明,并證明了使用不同的學(xué)習(xí)率實(shí)現(xiàn)了一些較有名的GAN(DCGAN, WGAN-GP),并取得了最先進(jìn)的結(jié)果。
但是當(dāng)我說到“使用不同的學(xué)習(xí)速率”時(shí),我在實(shí)踐中真正的應(yīng)該怎么做呢?一般來說,我建議為判別器選擇一個(gè)更高的學(xué)習(xí)率,而為生成器選擇一個(gè)更低的學(xué)習(xí)率:這樣一來,生成器必須用更小的更新幅度來欺騙判別器,并且不會選擇快速、不精確和不現(xiàn)實(shí)的方式來贏得博弈。為了給出一個(gè)實(shí)際的例子,我經(jīng)常將判別器的學(xué)習(xí)率選為0.0004,將生成器的學(xué)習(xí)率選為0.0001,我發(fā)現(xiàn)這些值在我的一些項(xiàng)目中表現(xiàn)得很好。請記住,在使用TTUR時(shí),您可能會注意到生成器有更大的損失量。
10. 譜歸一化
在一些論文中,如介紹SAGAN(或Self - Attention GAN)的論文中,表明譜歸一化是應(yīng)用于卷積核的一種特殊的歸一化,它可以極大地提高訓(xùn)練的穩(wěn)定性。它最初只在判別器中使用,后來被證明如果用于生成器的卷積層也是有效的,我可以完全贊同這個(gè)策略!
我?guī)缀蹩梢哉f,發(fā)現(xiàn)和實(shí)現(xiàn)譜歸一化使我的GAN旅程出現(xiàn)了方向性的改變,直率地講,我沒有看到任何理由不使用這種技術(shù):我可以保證它會給你一個(gè)更好和更穩(wěn)定的訓(xùn)練結(jié)果,同時(shí)讓您關(guān)注其他更加有趣的方面的深度學(xué)習(xí)項(xiàng)目!(詳見這篇論文:https://arxiv.org/abs/1802.05957)
結(jié)論
許多其他技巧,更復(fù)雜的技術(shù)和體系結(jié)構(gòu)都有望解決GANs的訓(xùn)練問題:在本文中,我想告訴您我個(gè)人的發(fā)現(xiàn)并實(shí)現(xiàn)了哪些方法來克服遇到的障礙。
因此,如果您在學(xué)習(xí)這里介紹的每種方法和技巧時(shí),發(fā)現(xiàn)自己陷入了困境,那么還有更多的資料需要研究。我只能說,在花了無數(shù)的時(shí)間研究和嘗試了所有可能的解決GAN相關(guān)問題的方法之后,我對我的項(xiàng)目更加自信了,我真的希望你們也能這樣做。
最后,衷心感謝您閱讀并關(guān)注這篇文章,希望您能獲得一些有價(jià)值的東西。
想要查看相關(guān)介紹和參考文獻(xiàn)?
點(diǎn)擊【被 GANs 虐千百遍后,我總結(jié)出來的 10 條訓(xùn)練經(jīng)驗(yàn)】即可訪問~
AI研習(xí)社全網(wǎng)獨(dú)家直播 IJCAI 2019,以下是今天的具體直播場次及日程,歡迎大家關(guān)注收看~
14日:
08:30-09:20: Invited Talk
11:00-12:30:Panel:50 years of IJCAI
14:00-14:50:Invited Talk
直播地址:https://ai.yanxishe.com/page/meeting/47
雷鋒網(wǎng)雷鋒網(wǎng)雷鋒網(wǎng)
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。