今天的文章應該是最後一篇與 GAN 有關的介紹~
關於 GAN 的研究主題實在非常多,也持續跟隨著深度學習領域的突破而演進,很難在幾篇文章中涵蓋所有的內容(就算三十篇文章都在介紹 GAN 也介紹不完啊~
在先前的文章中,已經介紹了 GAN 的架構與原理、背後的理論與演算法,以及如何評估 GAN 的效能。除了以上的內容我還很想瞭解的是:都說 GAN 的訓練不容易,有沒有一些能讓訓練更順利的技巧呢?
Tim Salimans 和 Ian Goodfellow 等人在 GAN 提出了幾年以後發表了 Improved Techniques for Training GANs,包括對 GAN 模型架構的改良,以及訓練方法的優化,這裡主要整理了這篇 paper 的內容:
在提出改良方法以前,先來談談 GAN 很難訓練的原因~
GAN 和大多數的深度學習演算法很不同的是,它沒有一個可學習的標準答案(ground truth)。其他深度學習演算法例如影像分類模型,就是按照人工標註好的圖片和類別標籤進行學習,透過 gradient descent 的方式讓模型輸出和類別標籤越一致越好,是個最佳化的問題。然而如同之前提到的,我們並沒有 GAN 應該生成什麼影像的標準答案,所以我們是透過 generator 和 discriminator 的對抗讓兩者都表現得越來越好,並期望最後達到平衡(Nash equilibrium)。
然而,當我們還是用解決最佳化問題的方式試圖尋找 GAN 之中 generator 和 discriminator 的平衡,是否真的合適呢?這就是這篇 paper 所提出的疑慮。
由於 generator 和 discriminator 學習的目標是完全相反的,有一種可能的結果是當我們訓練 generator 時,generator 的表現就變好一點,但 discriminator 的表現就變差一點;反之,在訓練 discriminator 時,discriminator 的表現變好了,但 generator 的表現就變差了。於是,generator 就和 discriminator 就陷入無限的拉鋸,沒有辦法達到平衡。
特徵匹配是減少 GAN 不穩定性的方法,它為 generator 設定了一個新的學習目標:生成影像的特徵要和真實影像的特徵匹配。
原本,generator 的學習目標是讓它產生的影像通過 discriminator 得到的輸出要越大越好,也就是容易被 discriminator 判定為真實影像,但是新的做法則是讓 generator 產生的影像要和真實影像有相似的「特徵」。這裡的特徵指的是影像通過 discriminator 時,從 discriminator 中間層取得的比較低維度的向量,可以想成它是輸入影像壓縮後資訊,這樣的特徵會帶有影像比較深層且抽象的資訊,比起 discriminator 單純判斷「真實/生成」更能引導 generator 的學習。
不過於此同時,discriminator 還是以讓真實影像的輸出分數高、生成影像的輸出分數低為學習的目標~
還記得之前提過 GAN 容易有 mode collapse 的問題嗎?也就是 generator 或依照 discriminator 的盲點總是產生非常相近的影像。
由於在原本的 GAN,discriminator 會獨立判別每一張影像的真實性,所以儘管 generator 每次都產生相似但足夠逼真的影像,discriminator 並不會參考其他生成影像的狀況,就會持續的誤判。
而解決的辦法就是讓 discriminator 一次考慮多張影像的資訊,paper 中提出一個可能的做法是取出一批輸入影像在 discriminator 中間層的特徵,讓特徵經過一些轉換後,計算兩兩特徵間的距離,最後,將影像間的特徵距離資訊和特徵本身結合起來,繼續通過 discriminator,得到影像真實性的判別結果。
Discriminator 的任務依然是要區分個別輸入影像的真實性,但是這樣的做法讓它不只能參考單張影像的特徵,更能結合那一張影像和其他影像的差異進行判別,因此也有助於 generator 產生比較多樣的影像。
這個方法簡單來說就是 GAN 學習的方向不只會參考當下 generator 生成和 discriminator 判別的結果,也會考慮過去生成和判別的狀況,而距離當下越近的結果,對於 GAN 的訓練影響越大,反之如果是比較久以前的結果,對於 GAN 的訓練就不會有太大的影響。
Label smoothing 是一種訓練分類模型的技巧,例如將原本 0 和 1 的分類標籤「軟化」為 0.1 和 0.9,有助於減少模型 overfitting 的情況。
而在這篇 paper 則提出只「軟化」真實影像的標籤,這是因為作者認為當真實影像和生成影像分布差異太大時,會無法引導 generator 學習怎麼讓生成分布和真實分布接近,而軟化真實影像的標籤可以為 generator 提供一些學習的線索。
Batch normalization 是一種輸入的資訊分布保持一致,讓深度模型訓練更穩定、收斂更快速的方法。但因為它是對每次輸入的一批樣本進行 normalization,對於個別樣本的影響會高度取決於同一批的其他樣本。換句話說,雖然我們輸入給 generator 的是同一個樣本,但只要和它同一批一起輸入的其他樣本不同,得到的生成影像也會不同。
至於改良方式就是選擇一個固定的 reference batch,依照這個 batch 的統計值進行 normalization,就能解決相同輸入不同輸出的問題了。
以上就是關於訓練 GAN 的一些改良的方法~不過由於參考的 paper 已經是好幾年前(2017 年)發表的,相信後續一定還有更多研究試圖提出其他的改良方法,這部分就有待持續追蹤~
假日能慢慢看 paper 好悠哉啊~(?