2020年6月17日 星期三

提升 GAN 訓練模型的效率與穩定性(生成對抗網路 Generative Adversarial Network 簡介)

本篇文章主要來自兩篇 paper:
這兩篇文章的內容都是實務上訓練 GAN 時提升效率的技巧,看起來兩篇 paper 都是經過很多次實驗後得到的結果。這兩篇 paper 主要想要解決 GAN 的以下問題:
  • 訓練過程不穩定
  • Mode collapse:generator 只會生成某些固定類型的樣本,無法表示真實的資料
  • 訓練過程中 discriminator 太強

以下節錄兩篇 paper 各自的重點:

Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks

  • 使用 all convolutional net(strided convolution)來代替 pooling functions(像是 max pooling)。
  • 拿掉 convolutional feature 上 的 fully connected layers。研究發現 global average pooling 在圖像分類中取得當時最好的成績,而作者們發現 global average pooling 會讓模型訓練更穩定,但是會影響收斂的速度。
  • Batch Normalization 能增加訓練模型時的穩定性,可以避免 mode collapse。但是要注意的是每一層都加上 Batch Normalization 會使得模型訓練的過程不穩定,因此作者提出的方法是在 generator 的輸出層及 discriminator 的輸入層不要加入 Batch Normalization,這樣可以避免這個問題。
  • Discriminator 用 LeakyReLU,generator 用 ReLU,但 generator 的輸出層用 tanh。

Improved Techniques for Training GANs

  • Feature Matching:想要解決訓練模型時 discriminator 過強的問題,具體的做法是改變 loss function 的形式,變成: \[ \parallel E_{x \sim p_{data}} f(x) - E_{z \sim p_z(z)} f(G(z))\parallel_2^2 \] 上式中 f(x) 是 discriminator D 的中間層。另外作者也 提到這種方式雖然不能保證一定能達到最佳的點,但是能讓訓練過程更穩定。
  • Minibatch Discrimination:這個技巧想要解決 mode collapse 的問題。其背後想法是一次給 discriminator 一個 batch,這樣 discriminator 就能學到樣本之間的差異。具體的做法是在訓練過程中針對每一個樣本 \(x_i\) 都加入一項其與 batch 中其他樣本 \(x_j\) 的距離,將此距離與原本的向量當成下一層的輸入。
  • Historical Averaging:在 loss function 中加入這一項當成 regularization: \[ \parallel \theta - \frac{1}{t}\sum_{i=1}^{t} \theta_i \parallel^2 \] 這麼做能預防參數 \(\theta\) 變化得太劇烈。
  • One-side Label Smoothing:將 discrimator 的 0 和 1 乘以常數 \(\alpha, \beta\) 讓結果變得平滑: \[ D(x) = \frac{\alpha\ p_{data}(x) + \beta\ p_{model}(x)}{p_{data}(x) + p_{model}(x)} \] 作者提到當 \(p_{model}\) 很大的時候,常數 \(\beta\) 會使得 model 無法從錯誤的樣本中學習朝著真實的數據逼近,因此作者提出的方法是讓 \(\beta\) 為零。
  • Virtual Batch Normalization:上一篇 paper 提到用 Batch Normalization 增加模型訓練的穩定性,但是問題是每次 Batch Normalization 的輸出都會受到這個 batch 中其他樣本的影響。因此作者提出的方法是在訓練前先拿出一個 reference batch ,在訓練時算這個 batch 的平均跟標準差,但缺點是在訓練時同時得拿兩個 minibatch,會讓訓練速度變慢。

沒有留言:

張貼留言