4 建議和技巧
實(shí)踐者們會(huì)使用一些提升 GANs 性能的技巧。我們很難去判斷這些技巧會(huì)發(fā)揮什么樣的作用了;很多技巧會(huì)在一些環(huán)境中有幫助但在另外一些環(huán)境中卻又起到反作用。
NIPS 2016 同樣包含一個(gè)關(guān)于對(duì)抗訓(xùn)練的 workshop,由 Soumith Chintala 給了稱為“How to train a GAN”的邀請報(bào)告。這個(gè)報(bào)告和本文部分內(nèi)容的目標(biāo)類似,不過兩者內(nèi)容選擇上有一定差異。想要了解本課程中沒有的建議和技巧,請參考 GitHub 相關(guān)項(xiàng)目:https://github.com/soumith/ganhacks
4.1 帶標(biāo)簽訓(xùn)練
以任意方式使用標(biāo)簽,形狀或者形式總會(huì)給模型生成樣本的主觀判斷的質(zhì)量帶來顯著提升。這個(gè)首先由 Denton et al. (2015) 發(fā)現(xiàn),他構(gòu)建了一個(gè) class-conditional GANs 相比自由生成任意類別的 GANs 能夠生成更加好的樣本。后來,Salimans et al. (2016) 發(fā)現(xiàn)即使生成器沒有顯式地利用類別信息也能讓樣本質(zhì)量有所提升;訓(xùn)練這個(gè)判別器來識(shí)別真實(shí)對(duì)象的特定類別就足夠了。
當(dāng)然對(duì)這個(gè)技巧工作原理大家還不是完全清楚??赡苁穷悇e信息的引入給于訓(xùn)練過程有用的線索可以幫助優(yōu)化。同時(shí)也可能是該技巧在樣本質(zhì)量上沒有客觀的提升,但是產(chǎn)生了一些樣本在人類視覺系統(tǒng)關(guān)注的性質(zhì)上的偏差。如果是后面這個(gè)情況,那么這個(gè)技巧并不會(huì)帶來更好的數(shù)據(jù)產(chǎn)生分布模型,但是仍然對(duì)創(chuàng)造人類觀眾更享受的媒體有幫助,也可能幫助 RL 智能體執(zhí)行依賴對(duì)環(huán)境的跟人類更相關(guān)的某些方面的知識(shí)的任務(wù)。
我們在比較不同結(jié)果時(shí)確保所有的情況都是在用這個(gè)技巧下進(jìn)行的是非常重要的,利用標(biāo)簽訓(xùn)練的模型必須和同樣使用標(biāo)簽訓(xùn)練的其他模型一起比較,class-conditional 模型也是要和其他 class-conditional 模型放在一起比較。否則就是不公平和沒意思的 benchmark,因?yàn)檫@就像在圖像任務(wù)上用一個(gè)卷積模型通常會(huì)超過非卷積模型一樣。
4.2 單邊標(biāo)簽平滑
GANs 在判別器估計(jì)兩個(gè)密度的比例時(shí)工作,但是深度神經(jīng)網(wǎng)絡(luò)更易會(huì)產(chǎn)生高置信度的輸出,輸出的是正確的類別但是太極端的概率。這情況尤其在輸入是對(duì)抗構(gòu)造出來的時(shí)候格外常見;分類器傾向于線性 推斷 extrapolate 并產(chǎn)生置信度特別高的預(yù)測(Goodfellow et al., 2014a)。
為了鼓勵(lì)判別器估計(jì)出軟一些的概率,我們可以采取一種稱為單邊標(biāo)簽平滑(Salimans et al., 2016)。
通常我們使用(8)公式來訓(xùn)練判別器。我們可以將其用 TensorFlow (Abadi et al., 2015)代碼寫出來:
d_on_data = discriminator_logits(data_minibatch)
d_on_samples = discriminator_logits(samples_minibatch)
loss = tf.nn.sigmoid_cross_entropy_with_logits(d_on_data, 1.) + tf.nn.sigmoid_cross_entropy_with_logits(d_on_samples, 0.)
單邊標(biāo)簽平滑的想法是將真實(shí)樣本的目標(biāo)用一個(gè)稍微小于 1 的值代替,比如說 .9:
loss = tf.nn.sigmoid_cross_entropy_with_logits(d_on_data, .9) + \ tf.nn.sigmoid_cross_entropy_with_logits(d_on_samples, 0.)
這樣會(huì)防止判別器的極端推斷行為;如果它學(xué)會(huì)預(yù)測特別大的 logits 對(duì)應(yīng)于一個(gè)達(dá)到 1 的概率,這樣的方式能進(jìn)行懲罰并鼓勵(lì)將 logits 拉回到稍小的值。
不過對(duì)偽造樣本的標(biāo)簽不需要平滑。假設(shè)我們對(duì)真實(shí)數(shù)據(jù)用一個(gè) 1-α 目標(biāo)函數(shù)而偽造數(shù)據(jù)是 0+β 。那么最優(yōu)的判別器函數(shù)就是
當(dāng) β 為 0 時(shí),按照 α 去平滑并不會(huì)有什么影響,同時(shí)還降低了判別器的最優(yōu)值的尺度。當(dāng) β 非 0 時(shí),最優(yōu)判別器函數(shù)的形狀會(huì)變化。特別在 pdata(x) 非常小且 pmodel(x) 大一些的時(shí)候,D*(x) 會(huì)在 pmodel(x) 的偽造眾數(shù)處有一個(gè)峰值。判別器將會(huì)在生成器中強(qiáng)化不正確的行為;生成器將會(huì)被訓(xùn)練成或者產(chǎn)生樣本類似數(shù)據(jù)或者產(chǎn)生和其產(chǎn)生過的樣本類似的樣本。
單邊標(biāo)簽平滑是一個(gè)更早的平滑標(biāo)簽技術(shù)的簡單變化,可以追溯到 1980 年代。Szegedy et al. 2015 展示了標(biāo)簽平滑是一個(gè)在用于對(duì)象識(shí)別的卷積網(wǎng)絡(luò)很好的正則化子 regularizer。這樣的原因是它不會(huì)鼓勵(lì)模型在訓(xùn)練集上選擇不正確的類別,而僅會(huì)降低在正確類別的置信度。其他的正則化子如權(quán)重下降如果參數(shù)設(shè)置得過高通常會(huì)導(dǎo)致一些誤分類的情況出現(xiàn)。Warde-Farley 和 Goodfellow (2016)揭示了標(biāo)簽平滑可以幫助降低對(duì)抗樣本的影響,這表明標(biāo)簽平滑應(yīng)該能幫助判別器更加有效地學(xué)會(huì)抵擋生成器的“進(jìn)攻”。
4.3 虛擬批規(guī)范化 Virtual batch Normalisation
因?yàn)?DCGAN 的引入,大多數(shù) GAN 架構(gòu)包含了某種形式的 BN。BN 的主要作用是提升模型的優(yōu)化,通過重參數(shù)化模型使得每個(gè)特征的均值和方差由和那個(gè)特征關(guān)聯(lián)的單個(gè)均值參數(shù)和單個(gè)方差參數(shù)控制,而不是有一個(gè)復(fù)雜的由所有抽取特征的層的所有權(quán)重來確定。這個(gè)重參數(shù)化通過在一個(gè) minibatch 上減去那個(gè)特征的均值并除上其標(biāo)準(zhǔn)差實(shí)現(xiàn)。規(guī)范化操作其實(shí)是模型的一部分,所有反向傳播計(jì)算那些被定義為總是被規(guī)范化的特征的梯度。用這個(gè)方法,如果沒有將規(guī)范化作為模型的一部分定義的話,特征頻繁重規(guī)范化會(huì)降低效率。
BN 是很有用的,但是對(duì) GANs 其實(shí)有一些不好的副作用。使用數(shù)據(jù)的不同的 minibatch 在每個(gè)訓(xùn)練步中計(jì)算規(guī)范化統(tǒng)計(jì)量會(huì)產(chǎn)生這些規(guī)范化常量的波動(dòng)。當(dāng) minibatch 很小時(shí)(通常在嘗試用有限的 GPU 內(nèi)存來擬合大生成式模型的時(shí)候)這些波動(dòng)會(huì)變得過大使得能夠?qū)ι傻膱D像產(chǎn)生比輸入 z 更大影響。參考圖 21。
Salimans et al., (2016) 引入了技術(shù)來減輕這個(gè)問題。引用BN(Reference Batch Normalisation)運(yùn)行網(wǎng)絡(luò)兩次:第一次在一個(gè)在訓(xùn)練開始時(shí)采樣且不會(huì)被替換的 reference examples 的 minibatch 上,還有一個(gè)在當(dāng)前要用來訓(xùn)練的 minibatch 上。每個(gè)特征的均值和標(biāo)準(zhǔn)差使用引用batch進(jìn)行計(jì)算。每個(gè) batch 的特征然后使用這些計(jì)算得到的統(tǒng)計(jì)量進(jìn)行規(guī)范化。引用 BN 的缺點(diǎn)就是這個(gè)模型會(huì)對(duì)這個(gè)引用 batch 過匹配。為了稍微降低這個(gè)問題的影響,大家可以使用 virtual batch Normalisation,其中對(duì)每個(gè)樣本的規(guī)范化統(tǒng)計(jì)量使用那個(gè)樣本和引用 batch 的并集來計(jì)算。引用BN 和虛擬BN 獨(dú)立處理,由生成器產(chǎn)生所有樣本都是獨(dú)立同分布的(除了那些定義了引用batch)。
4.4 我們能夠保持 G 和 D 的平衡么?
很多人有一種直覺就是很有必要來平衡這兩個(gè)參與人使得一方不要過強(qiáng)。如果這樣的平衡是值得的并且易解,那么還沒有一種有說服力的形式出現(xiàn)。
作者本人現(xiàn)在的相信 GANs 通過估計(jì)數(shù)據(jù)密度和模型密度的比例工作。這個(gè)比例僅會(huì)在判別器最優(yōu)的時(shí)候被正確估計(jì),所以對(duì)判別器來說超過生成器其實(shí)是很好的。
有時(shí)候生成器的梯度會(huì)在判別器太準(zhǔn)確的時(shí)候消失。解決這個(gè)問題的正確方式是不去限制判別器的力量,但是可以使用參數(shù)化博弈使得梯度不會(huì)消失(參見 3.2.3 節(jié))
有時(shí)候如果判別器置信度太高時(shí)生成器的梯度過大。與其讓判別器準(zhǔn)確度降低,更好的方式是使用單邊標(biāo)簽平滑(4.2節(jié))。
判別器應(yīng)該總是最優(yōu)來最好地估計(jì)比例意味著生成器訓(xùn)練每步則以 k > 1 步驟來訓(xùn)練判別器。實(shí)踐中這種方式不一定有明顯提升。
我們同樣還能夠通過選擇模型大小來平衡生成器和判別器。實(shí)踐中,判別器通常會(huì)更深,有時(shí)候有更多的過濾器。這個(gè)可能是因?yàn)閷?duì)判別器來說正確估計(jì)兩個(gè)密度之間的比值更加重要,但是也可能是眾數(shù)坍縮問題——因?yàn)樯善髟诂F(xiàn)在的訓(xùn)練方法下不能使出所有能力,實(shí)踐者們也沒看到提升生成器容量得到的好處。如果眾數(shù)坍縮問題可以被解決,生成器的大小會(huì)增大。我們也不知道判別器的大小是否會(huì)按照比例同樣增長。