1.輸入Normalize
- 將輸入圖片Normalize到 之間。
- 生成器最後一層的輸出使用Tanh激活函數。
Normalize非常重要,沒有處理過的圖片是沒辦法收斂的。圖片規範化中一種簡單的方法是(images-127.5)/127.5,然後送到判別器去訓練。同理生成的圖片也要經過判別器,即生成器的輸出也是-1到1之間,所以要使用Tanh激活函數。
2.使用修正的損失函數
-
在GAN論文中用來優化D,實際上更好。
因爲第一個公式在實際中會造成訓練早期梯度消失的問題。 -
實際工程中用反轉標籤來訓練G更加方便,即把生成的圖片當成real的標籤來訓練,把真實的圖片當成fake來訓練。
3.使用具有球形結構的隨機噪聲Z
-
不要使用均勻分佈進行採樣
-
使用高斯分佈進行採樣
When doing interpolations, do the interpolation via a great circle, rather than a straight line from point A to point B(博主不是很懂,尷尬)
4.BatchNorm
- 一個mini-batch中必須只有real數據或者fake數據,不要把他們混在一起訓練。
- 如果能用BatchNorm就用BatchNorm,如果不能用則用instance normalization。(對於每個樣本,減去平均值除以標準差)
5.避免引入稀疏梯度:ReLU,MaxPool
- GAN的穩定性會因爲引入稀疏梯度受到很大影響。
- 最好使用LeakyReLU作爲激活函數。(D和G中都使用)
- 對於下采樣,最好使用:Average Pooling或者卷積+stride。
- 對於上採樣,最好使用:PixelShuffle或者轉置卷積+stride。
最好連Pooling也不用,因爲使用Pooling會損失信息,這對於GAN訓練沒有益處。
6.使用Soft和Noisy的標籤
- Label平滑,如果你設real=1,fake=0,那麼我們在實際中可以進行一些改動,對於real,我們可以用一個0.7-1.2之間的隨機值來代替,對於fake,用0-0.3這個區間來代替。
- 用real batch訓練D的時候,不要一次性都給標籤1,設一個小概率進行標籤反轉,也就是會有很小一部分爲0,當然這些標籤是噪聲。
7.DCGAN/混合模型
- 如果可以用DCGAN爲Baseline,使用它!
- 如果我們可以使用DCGAN但是沒有模型是穩定的,那我們就可以用混合模型:KL+GAN或者VAE+GAN。
8.使用RL中的穩定技巧
Experience Replay
- Keep a replay buffer of past generations and occassionally show them.
- Keep checkpoints from the past of G and D and occassionaly swap them out for a few iterations.
All stability tricks that work for deep deterministic policy gradients.
9.使用Adam優化器
- Adam優化器對於GAN來說非常有用。
- 在生成器中使用Adam,在判別器中使用SGD。
10.追蹤訓練失敗的信號
- D的損失=0:模型訓練失敗。
- 檢查梯度的標準:如果超過100,事情就會搞砸。
- 訓練時,D損失的方差很低,並且隨着時間的推移而下降。或者方差和峯值都很大。
- 如果生成器的損失穩步下降,說明它愚弄了判別器。
11.不通過統計平衡損失
- 不要試圖找到一個(G的數量/D的數量)計劃來展開訓練。
- 很難,我們都試過了。
- 如果你真的嘗試了,就要有原則的方法,而不是直覺。
12.如果我們有類別標籤,那就使用他們
如果我們有數據的類別標籤,則在訓練判別器的時候對樣本進行分類。
13.在輸入端添加噪聲,隨着時間衰減
- 在D的輸入中加入一些人工噪聲。
- 在生成器的每層中都加入高斯噪聲。
14.多訓練判別器
- 尤其是我們有噪聲的時候。
- 難以尋找到合適的規則去多訓練判別器的時機。
15.條件GANs中的離散變量
- 使用嵌入層。
- 作爲附加通道添加到圖像。
- 保持嵌入維度低和上採樣以匹配圖像通道大小。
16.在訓練和測試階段都使用Dropout
- 使用Dropout也是爲了因爲一定的噪聲。(50%)
- 在生成器的某幾層中使用Dropout,而且測試和訓練階段都要做。