GAN自推出以來就以訓練困難著稱,因為它的訓練過程並不是尋找損失函數的最小值,而是尋找生成器和判別器之間的納什均衡。前者可以直接通過梯度下降來完成,而后者除此之外,還需要其它的訓練技巧。
下面對歷年關於GAN的論文提出的訓練技巧進行總結,這里僅記錄技巧,具體原理請直接看論文原文。
WGAN和WGAN-GP
WGAN論文將GAN原文用來度量兩個分布之間差異的JS divergence改為了Wasserstein distance,從而有了拉近兩個分布之間距離的“連續性”指標。經過轉換后,對模型進行的修改如下:
1、判別器輸出層去掉sigmoid,且損失函數不取對數log。也就是說原本的損失是先用sigmoid映射到$(0,1)$模擬概率值,然后再取對數映射到更大的區間以便計算。現在則是直接把這兩步給取消了。實際上這兩步就是多余的,因為不進行這兩步的輸出值就已經處於所需要的區間了。
2、將判別器參數的絕對值截斷在常數C以內(不是特別大的數就行)。
3、不要用基於動量的優化算法,推薦RMSProp,SGD也行(這是論文實驗得出的結論)。
WGAN-GP對WGAN做出了改進,且僅僅做出了一項改進:
1、將WGAN對判別器權重的裁剪約束,改為對判別器相對於輸入的梯度的大小的約束。以正則項的形式直接加在目標函數中。改進目標函數如下:
$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] $
判別器參數$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,論文提出四個提高訓練穩定性的方針:
1、用步幅卷積層來代替所有的池化層。
2、在生成器和判別器中使用BN(Batch Normalization),但不要在生成器的輸出與判別器的輸入層使用。
3、對於層數較深的模型,隱層避免使用全連接層。
4、對於生成器,輸出層激活函數使用Tanh,其它層激活函數都使用ReLu。生成器使用Tanh時,輸出的圖像顏色數值在$(-1,1)$內,因此訓練集圖像色值也要從$(0,1)$預處理到$(-1,1)$內。
5、對於判別器,所有層的激活函數都使用LeakyReLu。
NIPS 2016 Tutorial:GAN
生成器規模比判別器小更好。
RGAN/RaGAN
將判別器的loss從向固定值優化改為擴大真實與生成圖像之間的差距,生成器則是縮小真實與生成圖像之間的差距。
SELUs
論文證明了一個幾乎對於任意層數的模型都可以使輸出均值保持在0附近的激活函數。