作者丨蘇劍林
單位丨追一科技
研究方向丨NLP,神經網路
個人主頁丨kexue.fm
在對 GAN 的學習和思考過程中,我發現我不僅學習到了一種有效的生成模型,而且它全面地促進了我對各種模型各方面的理解,比如模型的最佳化和理解視角、正則項的意義、損失函式與機率分佈的聯絡、機率推斷等等。GAN不單單是一個“造假的玩具”,而是具有深刻意義的機率模型和推斷方法。
作為事後的總結,我覺得對 GAN 的理解可以粗糙地分為三個階段:
1. 樣本階段:在這個階段中,我們瞭解了 GAN 的“鑒別者-造假者”詮釋,懂得從這個原理出發來寫出基本的 GAN 公式(如原始 GAN、LSGAN),比如判別器和生成器的 loss,並且完成簡單 GAN 的訓練;同時,我們知道 GAN 有能力讓圖片更“真”,利用這個特性可以把 GAN 嵌入到一些綜合模型中。
2. 分佈階段:在這個階段中,我們會從機率分佈及其散度的視角來分析 GAN,典型的例子是 WGAN 和 f-GAN,同時能基本理解 GAN 的訓練困難問題,比如梯度消失和 mode collapse 等,甚至能基本地瞭解變分推斷,懂得自己寫出一些機率散度,繼而構造一些新的 GAN 形式。
3. 動力學階段:在這個階段中,我們開始結合最佳化器來分析 GAN 的收斂過程,試圖瞭解 GAN 是否能真的達到理論的均衡點,進而理解 GAN 的 loss 和正則項等因素如何影響的收斂過程,由此可以針對性地提出一些訓練策略,引導 GAN 模型到達理論均衡點,從而提高 GAN 的效果。
事實上,不僅僅是 GAN,對於一般的模型理解,也可以大致上分為這三個階段。當然也許有熱衷於幾何解釋或其他詮釋的讀者會不同意第二點,覺得沒必要非得機率分佈的角度來理解。但事實上幾何視角和機率視角都有一定的相通之處,而本文所寫的三個階段只是一個粗糙的總結,簡單來說就是從區域性到整體,然後再到最佳化器。
而本文主要聚焦於 GAN 的第三個階段:GAN 的動力學。
基本原理
一般情況下,GAN 可以表示為一個 min-max 過程,記作:
其中 maxDL(G,D) 這一步定義了一個機率散度而 maxG 這一步則在最小化散度,相關的討論也可以參考文章《f-GAN簡介:GAN模型的生產車間》[1] 和不用L約束又不會梯度消失的GAN,瞭解一下?。
註意,從理論上講,這個 min-max 過程是有序的,即需要徹底地、精確地完成 maxD 這一步,然後才去 minG。但是很顯然,實際訓練 GAN 時我們做不到這一點,我們都是 D,G 交替訓練的,理想情況下我們還希望 D,G 每次只各自訓練一次,這樣訓練效率最高,而這樣的訓練方法對應於一個動力系統。
動力系統
在我們的“從動力學角度看最佳化演演算法”系列中,我們將梯度下降看成是在數學求解動力系統(也就是一個常微分方程組,簡稱 ODEs)。
其中 L(θ) 是模型的 loss,而 θ 是模型的引數。如果考慮隨機性,那麼則需要加上一個噪聲項,變成一個隨機微分方程,但本文我們不考慮隨機性,這不影響我們對區域性收斂性的分析。假定讀者已經熟悉了這種轉換,下麵就來討論 GAN 對應的過程。
GAN 是一個 min-max 的過程,換句話說,一邊是梯度下降,另一邊是梯度上升,假設 φ 是判別器的引數,θ 是判別器的引數,那麼 GAN 對應的動力系統是:
當然,對於更一般的 GAN,有時候兩個 L 會稍微不一樣:
不管是哪一種,右端兩項都是一正一負,而就是因為這一正一負的差異,導致了 GAN 訓練上的困難。我們下麵就逐步認識到這一點。
相關工作
將 GAN 的最佳化過程視為一個(隨機)動力系統,基於這個觀點進行研究分析的文獻已有不少,我讀到的包括 The Numerics of GANs [2]、GANs Trained by a Two Time-Scale Update Rule Converge to a Local Nash Equilibrium [3]、Gradient descent GAN optimization is locally stable [4]、Which Training Methods for GANs do actually Converge? [5],而本文只不過是前輩大牛們的工作的一個學習總結。
在這幾篇文獻中,大家可能比較熟悉的是第二篇,因為就是第二篇提出了 TTUR 的 GAN 訓練策略以及提出了 FID 作為 GAN 的效能指標,而這篇論文的理論基礎也是將 GAN 的最佳化看成前述的隨機動力系統,然後取用了隨機最佳化中的一個定理,得出可以給生成器和判別器分別使用不同的學習率(TTUR)。
而其餘幾篇,都是直接將 GAN 的最佳化看成確定性的動力系統(ODEs),然後用分析 ODEs 的方法來分析 GAN。由於 ODEs 的理論分析/數值求解都說得上相當成熟,因此可以直接將很多 ODEs 的結論用到 GAN 中。
Dirac GAN
本文的思路和結果主要參考 Which Training Methods for GANs do actually Converge? [5],這篇論文的主要貢獻如下:
1. 提出了 Dirac GAN 的概念,藉助它可以快速地對 GAN 的性態有個基本的認識;
2. 完整地分析了帶零中心梯度懲罰的 WGAN(也是 WGAN-div)的區域性收斂性;
3. 利用零中心梯度懲罰的 WGAN 訓練了 1024 的人臉、256 的 LSUN 生成,並且不需要像 PGGAN 那樣漸進式訓練。
由於實驗裝置限制,第三點我們難以復現,而第二點涉及到比較複雜的理論分析,我們也不作過多討論,有興趣攻剋的讀者直接讀原論文即可。本文主要關心第一點:Dirac GAN。
所謂 Dirac GAN,就是考慮真樣本分佈只有一個樣本點的情況下,待研究的 GAN 模型的表現。假設真實樣本點是零向量 0,而假樣本為 θ,其實它也代表著生成器的引數;而判別器採用最簡單的線性模型,即(加啟用函式之前)為 D(x)=x⋅φ,其中 φ 代表著判別器的引數。Dirac GAN 就是考慮這樣的一個極簡模型下,假樣本最終能否收斂到真樣本,也就是說 θ 最終能否收斂到 0。
然而,原論文只考慮了樣本點的維度是一維的情形,即 0,θ,φ 都是標量,但本文後面的案例表明,對於某些例子,一維 Dirac GAN 不足以揭示它的收斂性態,一般情況下至少需要 2 維 Dirac GAN 才能較好地分析一個 GAN 的漸近收斂性。
常見GAN分析
上一節我們給出了 Dirac GAN 的基本概念,指出它可以幫助我們對 GAN 的收斂性態有個快速的認識。在這部分內容中,我們透過分析若干常見 GAN,來更詳細地表明 Dirac GAN 怎麼做到這一點。
Vanilla GAN
Vanilla GAN,或者叫做原始 GAN、標準 GAN,它就是指 Goodfellow 最早提出來的 GAN,它有 saturating 和 non-saturating 兩種形式。作為例子,我們來分析比較常用的 non-saturating 形式:
這裡的 p(x),q(x) 分別是真假樣本分佈,而 q(z) 是噪聲分佈,D(x) 用 sigmoid 啟用。對應到 Dirac GAN 下,那就簡單得多,因為真樣本只有一個點而且為 0,所以判別器的 loss 只有一項,而判別器可以完全寫出為 θ⋅φ,其中 θ 也就是假樣本,或者說生成器,最終結果是:
對應的動力系統是:
這個動力系統的均衡點(讓右端直接等於 0)是 φ=θ=0,也就是假樣本變成了真樣本。但問題是從一個初始點出發,該初始點最終能否收斂到均衡點卻是個未知數。
▲ 數值求解的non-saturating的Dirac GAN的最佳化軌跡(二維情形),可以發現它確實只是在均衡點(紅色點)周圍振蕩,不收斂
為了做出判斷,我們假設系統已經跑到了均衡點附近,即 φ≈0,θ≈0,那麼可以近似地線性展開:
最終近似地有:
學過常微分方程的同學都知道,這是最簡單的線性常微分方程之一,只要初始值不是 0,那麼它的解是一個週期解,也就是說並不會出現 θ→0 的特性。換句話說,對於 non-saturating 的 Vanilla GAN,哪怕模型的初始化已經相當接近均衡點了,但是它始終不會收斂到均衡點,而是在均衡點附近振蕩。數值模擬的結果則進一步證明瞭這一點。
事實上,類似的結果出現在任何形式的 f-GAN 中,即以 f 散度為基礎的所有 GAN 都存在同樣的問題(不計正則項),即它們會慢慢收斂到均衡點附近,最終都只是在均衡點附近振蕩,無法完全收斂到均衡點。
這裡再重覆一下邏輯:我們知道系統的理論均衡點確實是我們想要的,但是從任意一個初值(相當於模型的初始化)出發,經過迭代後最終是否能跑到理論均衡點(相當於理想地完成 GAN 的訓練),這無法很顯然地得到結果,至少需要在均衡點附近做線性展開,分析它的收斂性,這就是說所謂的區域性漸近收斂性態。
WGAN
f-GAN 敗下陣來了,那 WGAN 又如何呢?它又能否收斂到理想的均衡點呢?
WGAN 的一般形式是:
對應到 Dirac GAN,D(x)=x⋅φ,而 ‖D‖L≤1 可以由 ‖φ‖=1 來保證(‖⋅‖ 是 l2 模長),換言之,D(x) 加上 L 約束後為 D(x)=x⋅φ/‖φ‖,那麼 WGAN 對應的 Dirac GAN 為:
對應的動力系統是:
我們主要關心 θ 是否會趨於 0,可以引入類似前一節的線性展開,但是由於 ‖φ‖ 在分母,所以討論起來會比較困難。最乾脆的方法是直接數值求解這個方程組,結果如下圖:
▲ 數值求解的WGAN對應的Dirac GAN的最佳化軌跡(二維情形),可以發現它確實只是在均衡點(紅色點)周圍振蕩,不收斂
可以看到,結果依然是在均衡點附近振蕩,並沒能夠達到均衡點。這個結果表明瞭,WGAN(同時自然也包括了譜歸一化)都沒有區域性收斂性,哪怕已經跑到了均衡點附近,依然無法準確地落在均衡點上。
註:稍加分析就能得出,如果只考慮一維的 Dirac GAN,那麼將無法分析本節的 WGAN 和後面的 GAN-QP,這就是隻考慮一維情形的侷限性。
WGAN-GP
大家可能會疑惑,前面不是討論了WGAN了嗎,怎麼還要討論WGAN-GP?
事實上,從最佳化角度看,前面所說的 WGAN 和 WGAN-GP 是兩類不一樣的模型。前面的 WGAN 是指事先在判別器上加上 L 約束(比如譜歸一化),然後進行對抗學習;這裡的 WGAN-GP 指的是判別器不加 L 約束,而是透過梯度懲罰項(Gradient Penalty)來迫使判別器具有 L 約束。
這裡討論的梯度懲罰有兩種,第一種是 Improved Training of Wasserstein GANs [6] 提出來的“以1為中心的梯度懲罰”,第二種是 Wasserstein Divergence for GANs [7]、Which Training Methods for GANs do actually Converge? [5] 等文章提倡的“以 0 為中心的梯度懲罰”。下麵我們會對比這兩種梯度懲罰的不同表現。
梯度懲罰的一般形式是:
其中 c=0 或 c=1,而 r(x) 是 p(x) 和 q(x) 的某個衍生分佈,一般直接取真樣本分佈、假樣本分佈或者真假樣本插值。
對於 Dirac GAN 來說:
也就是說它跟 x 沒關係,所以 r(x) 怎麼取都不影響結果了。因此,WGAN-GP 版本的 Dirac GAN 形式為:
對應的動力系統是:
下麵我們分別觀察 c=0,c=1 時 θ 是否會趨於 0,當 c=0 時其實只是一個線性常微分方程組,可以解析求解,但 c=1 時比較複雜,因此簡單起見,我們還是直接用數值求解的方式:
▲ 數值求解的WGAN-GP(c=0)對應的Dirac GAN的最佳化軌跡(二維情形),可以發現它能夠漸近收斂到均衡點(紅色點)
▲ 數值求解的WGAN-GP(c=1)對應的Dirac GAN的最佳化軌跡(二維情形),可以發現它確實只是在均衡點(紅色點)周圍振蕩,不收斂
上圖是在同樣的初始條件(初始化)下,c=0,c=1 的梯度懲罰的不同表現,兩圖的其他引數都一樣。可以看到,加入“以1為中心的梯度懲罰”後,Dirac GAN 並沒有漸近收斂到原點,反而只是收斂到一個圓上;而加入“以 0 為中心的梯度懲罰”則可以達到這個目的。這說明早期提出的梯度懲罰項確實是存在一些缺陷的,而“以 0 為中心的梯度懲罰”在收斂性態上更好。
儘管上述僅僅對Dirac GAN做了分析,但結論具有代表性,因為關於0中心的梯度懲罰的優越性的一般證明在 Which Training Methods for GANs do actually Converge? [5] 中已經給出,並得到實驗驗證。
GAN-QP
最後來分析一下自己提出的 GAN-QP 表現如何。相比 WGAN-GP,GAN-QP 用二次型的差分懲罰項替換了梯度懲罰,並補充了一些證明。相比梯度懲罰,差分懲罰的最主要優勢是計算速度更快。
GAN-QP 可以有多種形式,一種基本形式是:
對應的 Dirac GAN 為:
對應的動力系統是:
數值結果如下圖(第一個影象):
▲ 數值求解的GAN-QP對應的Dirac GAN的最佳化軌跡(二維情形),可以發現它確實只是在均衡點(紅色點)周圍振蕩,不收斂
▲ 數值求解的帶有L2正則項的GAN-QP版本的Dirac GAN,其他條件一樣,僅加入了L2正則,這表明適當的L2正則項有可能誘導收斂
很遺憾,同大多數 GAN 一樣,GAN-QP 也是振蕩的。
緩解策略
透過上面的分析,我們得到的結論是:目前零中心的 WGAN-GP(或者稱為 WGAN-div)的理論性質最好,只有它是區域性收斂的,其餘的 GAN 變體都一定的振蕩性,無法真正做到漸近收斂。當然,實際情況可能複雜得多,Dirac GAN 的結論只能一定程度上說明問題,帶來一個直觀感知。
那麼,如果 Dirac GAN 的結論具有代表性的話(即多數 GAN 實際情況下都難以真正收斂,而是在均衡點附近振蕩),我們應該如何緩解這個問題呢?
L2正則項
第一個方案是考慮往(任意 GAN 的)判別器的權重加入 L2 正則項。綜上所述,零中心的梯度懲罰確實很好,但無奈梯度懲罰太慢,如果不願意加梯度懲罰,那麼可以考慮加入 L2 正則項。
直觀上看,GAN 在均衡點附近陷入振蕩,達到一種動態平衡(週期解,而不是靜態解),而 L2 正則項會迫使判別器的權重向零移動,從而有可能打破這種平衡,如上圖中的第二個影象。在我自己的 GAN 實驗中,往判別器加入一個輕微的 L2 正則項,能使得模型收斂更穩定,效果也有輕微提升。(當然,正則項的權重需要根據模型來調整好。)
權重滑動平均
事實上,緩解這個問題最有力的技巧,當屬權重滑動平均(EMA)。
權重滑動平均的基本概念,我們在“讓Keras更酷一些!”:中間變數、權重滑動和安全生成器已經介紹過。對於 GAN 上的應用,其實不難理解,因為可以觀察到,儘管多數 GAN 最終都是在振蕩,但它們振蕩中心就是均衡點!所以解決方法很簡單,直接將振蕩的軌跡上的點平均一下,得到近似的振蕩中心,然後就得到了一個更接近均衡點(也就是更高質量)的解!
權重滑動平均帶來的提升是非常可觀的,如下圖比較了有無權重滑動平均時,O-GAN 的生成效果圖:
▲ 沒有權重滑動平均時的隨機生成效果
▲ 權重滑動平均的衰減率為0.999時的隨機生成效果
▲ 權重滑動平均的衰減率為0.9999時的隨機生成效果
可以看到,權重滑動平均幾乎給生成效果帶來了質的提升。衰減率越大,所得到的生成結果越平滑,但同時會喪失一些細節;衰減率越小,保留的細節越多,但自然也可能保留了額外的噪聲。現在主流的 GAN 都使用了權重滑動平均,衰減率一般為 0.999。
順便說一下,在普通的監督訓練模型中,權重滑動平均一般也能帶來收斂速度的提升,比如下圖是有/無權重滑動平均時,ResNet20 模型在 cifar10 上的訓練曲線,全程採用 Adam 最佳化器訓練,學習率恆為 0.001,權重滑動平均的衰減率為 0.9999:
▲ 有無EMA時Adam預設學習率訓練ResNet20的表現
可以看到,加上權重滑動平均之後,模型以一種非常平穩、快速的姿態收斂到 90%+ 的準確率,而不加的話模型準確率一直在 86% 左右振蕩。這說明類似 GAN 的振蕩現象在深度學習訓練時是普遍存在的,透過權重平均可以得到質量更好的模型。
文章小結
本文主要從動力學角度探討了 GAN 的最佳化問題。跟本系列的其他文章一樣,將最佳化過程視為常微分方程組的求解,對於 GAN 的最佳化,這個常微分方程組稍微複雜一些。
分析的過程採用了 Dirac GAN 的思路,利用單點分佈的極簡情形對 GAN 的收斂過程形成快速認識,得到的結論是大多數 GAN 都無法真正收斂到均衡點,而只是在均衡點附近振蕩。而為了緩解這個問題,最有力的方法是權重滑動平均,它對 GAN 和普通模型訓練都有一定幫助。
本文作圖程式碼參考:
https://github.com/bojone/gan/blob/master/gan_numeric.py
參考文獻
[1] https://kexue.fm/archives/6016
[2] Lars Mescheder and Sebastian Nowozin and Andreas Geiger. “The Numerics of GANs”. Advances in Neural Information Processing Systems. 2017.
[3] Martin Heusel, Hubert Ramsauer, Thomas Unterthiner, Bernhard Nessler and Sepp Hochreiter. “GANs Trained by a Two Time-Scale Update Rule Converge to a Local Nash Equilibrium”. Advances in Neural Information Processing Systems. 2017.
[4] Vaishnavh Nagarajan, J. Zico Kolter. “Gradient descent GAN optimization is locally stable”. Advances in Neural Information Processing Systems. 2017.
[5] Lars Mescheder, Andreas Geiger and Sebastian Nowozin. “Which Training Methods for GANs do actually Converge?“. International Conference on Machine Learning 2018.
[6] Ishaan Gulrajani, Faruk Ahmed, Martin Arjovsky, Vincent Dumoulin and Aaron Courville. “Improved Training of Wasserstein GANs”. Advances in Neural Information Processing Systems. 2017.
[7] Jiqing Wu, Zhiwu Huang, Janine Thoma, Dinesh Acharya and Luc Van Gool. “Wasserstein Divergence for GANs”. The European Conference on Computer Vision (ECCV). 2018
朋友會在“發現-看一看”看到你“在看”的內容