字型風格轉換的專案, 在 Discriminator 的輸出層加入 Sigmoid 函數,將二分類 logits 轉換為概率值, 是否有幫助?

在字型風格轉換(Noto Sans → Zen Maru Gothic)的 GAN 訓練過程中,Discriminator 的輸出層是否應該加入 Sigmoid 函數,取決於你的 損失函數選擇 以及 數值穩定性 考量:

1. 使用 Sigmoid 的影響

如果你在 Discriminator 最後一層加上 Sigmoid,那麼其輸出將是範圍在 [0,1] 之間的概率值,這會影響 損失計算

  • 常見的 Binary Cross-Entropy (BCE) 損失 需要 Sigmoid: LD=−E[log⁡D(xreal)]−E[log⁡(1−D(G(z)))]L_D = – \mathbb{E} [\log D(x_{\text{real}})] – \mathbb{E} [\log (1 – D(G(z)))]
    • SigmoidD(x_real)D(G(z)) 都在 [0,1] 之間,適合作為 BCE 損失的輸入。
  • 數值穩定性問題
    • Sigmoid 可能導致梯度消失問題,特別是在輸出 logits 絕對值過大時(例如 D(x) ≈ 10D(x) ≈ -10)。
    • 為了改善這個問題,可以使用 Stable BCE 損失(例如 PyTorch 的 BCEWithLogitsLoss),它內部會處理 log(sigmoid(x)),避免數值溢出。

2. 不使用 Sigmoid(推薦做法)

如果 不加 Sigmoid,那麼 Discriminator 會直接輸出 logits(實數值),這對於一些 GAN 變體來說可能是更好的選擇:

  • 使用 BCEWithLogitsLoss
    • PyTorch 中的 BCEWithLogitsLoss 內部會計算 sigmoid,但它數值上更穩定,避免梯度消失。
  • 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(梯度懲罰)可以進一步提升穩定性。

結論:要不要加 Sigmoid?

推薦:不加 Sigmoid,直接輸出 logits,並使用:

  • BCEWithLogitsLoss(如果用 BCE 損失)
  • WGAN/WGAN-GP(若使用 Wasserstein loss)

如果你已經使用 BCE Loss,但 Discriminator 的最後一層沒有 Sigmoid,請改用 BCEWithLogitsLoss,這樣可以避免數值問題。

這樣的選擇可以讓 GAN 訓練更穩定,並減少梯度消失問題。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *