在字型風格轉換(Noto Sans → Zen Maru Gothic)的 GAN 訓練過程中,Discriminator 的輸出層是否應該加入 Sigmoid 函數,取決於你的 損失函數選擇 以及 數值穩定性 考量:
1. 使用 Sigmoid 的影響
如果你在 Discriminator 最後一層加上 Sigmoid
,那麼其輸出將是範圍在 [0,1]
之間的概率值,這會影響 損失計算:
- 常見的 Binary Cross-Entropy (BCE) 損失 需要
Sigmoid
: LD=−E[logD(xreal)]−E[log(1−D(G(z)))]L_D = – \mathbb{E} [\log D(x_{\text{real}})] – \mathbb{E} [\log (1 – D(G(z)))]Sigmoid
讓D(x_real)
和D(G(z))
都在[0,1]
之間,適合作為 BCE 損失的輸入。
- 數值穩定性問題
Sigmoid
可能導致梯度消失問題,特別是在輸出 logits 絕對值過大時(例如D(x) ≈ 10
或D(x) ≈ -10
)。- 為了改善這個問題,可以使用 Stable BCE 損失(例如 PyTorch 的
BCEWithLogitsLoss
),它內部會處理log(sigmoid(x))
,避免數值溢出。
2. 不使用 Sigmoid(推薦做法)
如果 不加 Sigmoid,那麼 Discriminator 會直接輸出 logits(實數值),這對於一些 GAN 變體來說可能是更好的選擇:
- 使用 BCEWithLogitsLoss
- PyTorch 中的
BCEWithLogitsLoss
內部會計算sigmoid
,但它數值上更穩定,避免梯度消失。
- PyTorch 中的
- WGAN/WGAN-GP(推薦)
- 如果你採用 Wasserstein GAN (WGAN),則 Discriminator(稱為 Critic)應該輸出 無約束的實數值,並使用 Wasserstein loss: LD=E[D(G(z))]−E[D(xreal)]L_D = \mathbb{E} [D(G(z))] – \mathbb{E} [D(x_{\text{real}})]
- 這樣做能夠 避免 Sigmoid 導致的梯度消失問題,並且 WGAN-GP(梯度懲罰)可以進一步提升穩定性。
- 如果你採用 Wasserstein GAN (WGAN),則 Discriminator(稱為 Critic)應該輸出 無約束的實數值,並使用 Wasserstein loss: LD=E[D(G(z))]−E[D(xreal)]L_D = \mathbb{E} [D(G(z))] – \mathbb{E} [D(x_{\text{real}})]
結論:要不要加 Sigmoid?
✅ 推薦:不加 Sigmoid,直接輸出 logits,並使用:
BCEWithLogitsLoss
(如果用 BCE 損失)- WGAN/WGAN-GP(若使用 Wasserstein loss)
⚠ 如果你已經使用 BCE Loss,但 Discriminator 的最後一層沒有 Sigmoid,請改用 BCEWithLogitsLoss
,這樣可以避免數值問題。
這樣的選擇可以讓 GAN 訓練更穩定,並減少梯度消失問題。