GAN訓練技巧彙總

  GAN自推出以來就以訓練困難著稱,由於它的訓練過程並非尋找損失函數的最小值,而是尋找生成器和判別器之間的納什均衡。前者能夠直接經過梯度降低來完成,然後者除此以外,還須要其它的訓練技巧。算法

  下面對歷年關於GAN的論文提出的訓練技巧進行總結,這裏僅記錄技巧,具體原理請直接看論文原文。函數

WGAN和WGAN-GP

  WGAN論文將GAN原文用來度量兩個分佈之間差別的JS divergence改成了Wasserstein distance,從而有了拉近兩個分佈之間距離的「連續性」指標。通過轉換後,對模型進行的修改以下:優化

  一、判別器輸出層去掉sigmoid,且損失函數不取對數log。也就是說本來的損失是先用sigmoid映射到$(0,1)$模擬機率值,而後再取對數映射到更大的區間以便計算。如今則是直接把這兩步給取消了。實際上這兩步就是多餘的,由於不進行這兩步的輸出值就已經處於所須要的區間了。 編碼

  二、將判別器參數的絕對值截斷在常數C之內(不是特別大的數就行)。orm

  三、不要用基於動量的優化算法,推薦RMSProp,SGD也行(這是論文實驗得出的結論)。圖片

  WGAN-GP對WGAN作出了改進,且僅僅作出了一項改進:get

  一、將WGAN對判別器權重的裁剪約束,改成對判別器相對於輸入的梯度的大小的約束。以正則項的形式直接加在目標函數中。改進目標函數以下:it

$L = \mathop{\mathbb{E}}\limits_{\tilde{x}\sim \mathbb{P}_g}  \left[D(\tilde{x})\right] - \mathop{\mathbb{E}}\limits_{x\sim \mathbb{P}_r}  \left[D(x)\right] +\lambda \mathop{\mathbb{E}}\limits_{\hat{x}\sim \mathbb{P}_{\hat{x}}}  \left[(||\nabla_{\hat{x}}D(\hat{x})||_2-1)^2\right] $io

  判別器參數$w$的更新就是求$L$對$w$的梯度,而後進行梯度降低。而由於有最後一個正則項,因此一樣會把梯度限制在必定範圍內。其中$\hat{x}$是$x$和$\tilde{x}$的隨機加權和,至於爲何要用隨機加權和而不是直接求$x$和$\tilde{x}$的梯度:關於WGAN-GP中的遺留問題? - 知乎變量

  固然咱們實踐的時候,爲了方便,能夠直接使用$x$和$\tilde{x}$來對梯度的大小進行約束。也就是能夠直接在keras中添加關於每一個樣本的正則化loss。

CGAN

  相較於原始GAN,CGAN將圖像的某些特徵(好比手寫數字對應的真實數字編碼)加入生成器的輸入進行訓練。這樣訓練出來的生成器就可以以特徵生成對應的圖像,而且訓練收斂的速度會更快一些,多是由於輸入增長了肯定性。

InfoGAN

  CGAN是添加與圖像有關的特徵到本來只有隨機噪聲的輸入中加強訓練,InfoGAN則是讓生成器創建生成圖像與輸入生成器的隨機噪聲之間的映射關係,它大體看起來就像是自動編碼器與GAN的結合。 

  InfoGAN除了定義生成器與判別器以外,還定義了一個與判別器共享大部分權重的「編碼器」。相對於「編碼器」,生成器就成了一個「解碼器」。解碼器將輸入的噪聲解碼爲圖片,除了輸入判別器外,還要將圖片輸入編碼器。編碼器則要儘可能讓自身的輸出與解碼器(生成器)輸入的某一部分「噪聲」相同,這一部分「噪聲」是人爲選擇的隱變量,能夠人爲設置爲離散或連續變量。這樣一來,生成器不但要「照顧」判別器,生成儘可能真實的圖片,還要考慮讓解碼器能解碼成功,生成與輸入的噪聲編碼相關的圖片。所以生成器的輸入與其輸出就會有必定的隱式聯繫。

DCGAN

  對於深度卷積GAN,論文提出四個提升訓練穩定性的方陣:

  一、用步幅卷積層來代替全部的池化層。

  二、在生成器和判別器中使用BN(Batch Normalization),但不要在生成器的輸出與判別器的輸入層使用。

  三、對於層數較深的模型,隱層避免使用全鏈接層。

  四、對於生成器,輸出層激活函數使用Tanh,其它層激活函數都使用ReLu。生成器使用Tanh時,輸出的圖像顏色數值在$(-1,1)$內,所以訓練集圖像色值也要從$(0,1)$預處理到$(-1,1)$內。

  五、對於判別器,全部層的激活函數都使用LeakyReLu。 

NIPS 2016 Tutorial:GAN

  生成器規模比判別器小更好。

相關文章
相關標籤/搜索