訓練損失上升的原因
在 GAN 訓練中,Batch Size 從 64 縮減到 10 會導致梯度估計的方差大幅增加。當 Batch Size 過小時,每個步驟計算出的梯度包含過多噪聲,這會使生成器難以收斂到穩定的解。
雖然你使用的是 InstanceNorm,它不像 BatchNorm 那樣依賴 Batch 統計量,但小 Batch 仍會造成訓練不穩定。生成器的損失 g_loss 上升,通常代表判別器變得過強。在樣本數較少的情況下,判別器更容易記住少數樣本的特徵,從而輕易區分真假圖,導致生成器在對抗過程中處於劣勢,損失隨之攀升。
針對小 Batch Size 的建議解法
1. 使用梯度累積
這是最直接且有效的解法。如果你因為顯存限制必須將 Batch Size 設為 10,可以透過梯度累積來模擬大 Batch。例如,每累積 6 次迭代後才更新一次權重,這樣等效 Batch Size 就會接近 60,能顯著降低梯度噪聲並穩定損失。
2. 引入過濾機制或標籤平滑
為了防止判別器過快壓制生成器,可以對判別器的標籤進行平滑處理。例如將真實樣本的標籤從 1.0 改為 0.9。這能減緩判別器收斂速度,給予生成器更多學習空間,有助於維持損失在合理範圍。
3. 調節學習率與對抗比例
小 Batch 下應適度降低學習率。建議將生成器與判別器的學習率同步調低。此外,可以嘗試改變訓練頻率。例如每訓練一次判別器,就訓練兩次生成器,以補償生成器在小 Batch 下學習效率低下的問題。
4. 強化正則化
在判別器中加入額外的正則化項,如 R1 Regularization 或更強的 Weight Decay。這能限制判別器的鑑別能力過於敏銳,防止它在訓練初期就讓生成器的損失失控飆升。
請問你需要我為你寫出實作梯度累積(Gradient Accumulation)的 PyTorch 程式碼片段嗎?