DCGAN對卷積神經網絡的結構做了一些改變,以提高樣本的質量和收斂的速度,這些改變有:
-
取消所有pooling層。G網絡中使用轉置卷積(transposed convolutional layer)進行上采樣,D網絡中用加入stride的卷積代替pooling。
-
在D和G中均使用batch normalization(讓數據更集中,不用擔心太大或者太小的數據,可以穩定學習,有助於處理初始化不良導致的訓練問題,也有助於梯度流向更深的網絡,防止G崩潰。同時,讓學習效率變得更高。)
-
去掉全連接層,而直接使用卷積層連接生成器和判別器的輸入層以及輸出層,使網絡變為全卷積網絡
-
G網絡中使用ReLU作為激活函數,最后一層使用tanh
-
D網絡中使用LeakyReLU作為激活函數
DCGAN中的G網絡示意:
對於BN:
(1)把BN用到每一層會導致樣本震盪和模型不穩定,不要把BN用到生成器的輸出層和判別器的輸入層。
(2)直接用 batch norm 可能是有問題的。同一批(batch)里面的數據太過相似,對一個無監督的 GAN 而言,很容易被帶偏而誤認為它們這些數據都是一樣的。也就是說,最終的生成模型的結果會混着同一個 batch 里好多其它特征。這不是我們想要的形式。可以用RBN或者VBN克服。
Reference Batch Norm:
取出一批數據(固定的)當作我們的參照數據集 R。然后把新的數據 batch 都依據 R 的平均值和標准差來做規范化。
這個方法也有一些問題:如果 R 取得不好,效果也不會好。或者,數據可能被 R 搞得過擬合。換句話說:我們最后生成的數據可能又都變得跟 R 很像。
Virtual Batch Norm:
這里,我們依舊是取出 R,但是所有的新數據 x 做規范化的時候,我們把 x 也加入到 R 中形成一個新的 virtual batch V。並用這個 V 的平均值和標准差來標准化 x。這樣就能極大減少 R 的風險。
DCGAN對抗訓練細節
訓練圖像除了縮放到tanh激活函數的[-1,1]范圍之外沒有經過其他的預處理。所有的模型都是通過小批量隨機梯度下降法(mini-batch stochastic gradient descent)進行訓練的, 小批量的大小是 128。 所有權重的初始化為均值為 0 和方差為 0.02的正態分布。在LeakyReLU, 所有模型的leak的斜率設置為0.2。之前的 GAN是使用momentum加快訓練速度,DCGAN是使用Adam優化程序調整超參數。建議使用的學習率是0.001,太高的話使用0.0002代替。此外,動量項beta1在建議的0.9訓練動盪且不穩定,但降低到0.5是有利於模型的穩定。