論文筆記:Large Scale GAN Training for High Fidelity Natural Image Synthesis

	進入正題之前,UP主想要吐槽一下,關於這篇文章的很多博客好多人都是直接記錄了前面的部分;
	即作者介紹的5個tricks用於高清圖像256×256甚至是512×512,然後給了一堆結果。
	就完了,。那後面的討論分析呢??

	本着一探究竟的蠻勁,UP主特意花了一天的時間去讀了這篇博客(這裏倒是挺好奇,其他道友讀論文的花費時長的●_●)
	進入主題,下面我們根據文章的組織路線來解讀這篇文章。

Introduction

	首先是,GAN的訓練是動態的,並且幾乎對所有的實驗設置都很敏感(有優化器參數(lr, momentum)等到模型的結構)。
	其次是,GAN用於圖像合成(傳統的基於Noise決定的基本語義(如姿態、角度),與基於Class的樣式(如類別、紋理),兩個latent vecotr/embedding)的“向量→圖像”的合成方式),存在保真度(fidelity)與多樣性(variety)的矛盾(即GAN需要在二者之間找到一個平衡)。

Contribution

 1. 證明了GANGAN的性能極大地受益於模型的放大(scale)(如每層的channels數增加,batch size增大,輸入圖像的resolution增大等)
 當然,這之間會出現一些問題,作者也討論了這些問題該如何解決。
2. 引入了一個簡單的noise的採樣技巧來權衡生成器生成樣本的fidelity與variety。
3. 討論了針對large scale GAN的訓練不穩定性(instability),提出,基於現在的技術,我們能夠降低這些不穩定性,但這回伴隨着巨大的模型性能的降低(如生成模型變差了,體現爲IS分數降低或者FID分數增大)。

Background

首先我們簡要回顧下傳功的圖像合成GAN,基於下面的目標函數——

minGmaxDExpdata(x)[logD(x)]+Ezp(z)[log(1D(G(z))] \mathop{\min}\limits_{G} \mathop{\max}\limits_{D} \mathop{\Bbb E} _{x \thicksim p_{data}(x)}[\mathop{\log}D(x)] + \Bbb{E}_{z \thicksim p(z)} [\log (1-D(G(z))]

其中,z 是一個潛在的變量,從一個隨機分佈 p(z) 中採樣得到,如正態分佈 N(0, I) 或者均勻分佈 U[-1, +1]。

現在生成模型GAN的工作主要有三個方面:
1)修改目標函數(objective function);
2)對D增加梯度懲罰(Gradient Penalty);
3)另外就是從模型結構的選擇角度去看(本文的基本結構是SA-GAN(Self-attention GAN)).
** 這裏放一張圖,讀者們應該很快就可以get到這是什麼簡單但NB的東西了。

這裏附贈鏈接:SA-GAN.

另外,這裏介紹一下conditional GAN的一些基本知識。

最開始的做法是:將class類別信息以“one-hot”向量形式與noise向量拼接在一起作爲輸入,並在目標函數中加入一個分類器模塊,這是多麼樸素的思想;
後來出現了,將class或者style的信息經過MLP變換後,得到normalization(如IN,BN等)的參數(scaling factor: γ,與bias factor: β);這主要是基於白化與着色的思想(通過μ與σ可以實現兩個數據分佈之間的相互轉換)。

Scale Up the GAN

這一部分主要講解了如何通過“放大”GAN來實現不同分辨率的圖像合成質量,得到更好地生成模型(基於ImageNet)。

首先我們介紹一些實驗的配置
以SA-GAN作爲baseline
對抗loss使用Hinge Loss
將class info 作爲BN的參數引入
對G使用Spectral Norm 譜正則化
模型使用Orthogonal Initialization或者Xavier Initialization
生成器G使用moving averages of weights的方式,其中,decay=0.9999
下面我們介紹一下作者使用的5個tricks及其對應的效果。

1. Simply increase the batch size;
** 比較下圖1、2、3、4行
2. 增加每一層的寬度(# of channels) by 50%,即爲原來的1.5倍;
** 比較4、5行
3. 共享class information的embedding(換句話說,就是每一層的BN的參數都來自於同一個class embedding的變換結果,可以是隻做一次變換,也可以對應每層做一次變換);
**比較5、6行
4. noise不單單是在第一層輸入,也在多層輸入
(有利於不同分辨率下的特徵對noise信息的直接利用)
** 比較6、7行
5. 正交正則項(下面會介紹)
** 比較7、8行
(第8行是論文的方法)

234

下面主要是進行一個討論
1)關於noise的latent space的討論

作者首先介紹了一些常用的採樣的數據分佈
Data Distribution Notes
N(0,I)\mathcal {N}(0, I) 標準的latent space
U[1,1]\mathcal {U} [-1, 1] 另一個標準的latent space
Bernouli{0,1}Bernouli \{0, 1\} 離散的隱向量,這是基於先驗“自然界的圖像並不是連續的,而是離散的(one feature is either present or not),即latent vector某個元素的值要麼是1要麼是0” ,實驗證明這個的效果要比使用正態分佈的效果好
當然還有其他的,這裏就不列舉了。
作者提出了Truncation Trick,具體做法是:
## truncating a 'z' vector by resampling(重採樣) the values with magnitude(模長) above a chosen threshold leads to improvement in individual sample quality at the cost of reduction in overall sample variety.
顯然,由於G需要映射的範圍被縮小了,所以對於單張圖像的合成效果更好;
但由於源域的空間縮小,也使得總體的生成圖像多樣性受損。

我們看一下下面的例子:(從左到右,選擇的閾值分別是:2, 1, 0.5, 0.04)

在這裏插入圖片描述

我們還可以進一步分析:
	IS分數計算的是分佈 p(y|x) 與 p(y) 之間的KL散度,
	前者表示分類的準確性(我們希望它是一個脈衝函數,這樣說明生成的圖像更像對應某個類別的圖像),
	後者表示含有多少類(應該是一個uniform的分佈,因爲我們希望合成圖像足夠多樣化)。
	但是,當我們使用Truncation Trick的時候,一方面G的性能提高合成圖像更加自然,
	同時儘管總體多樣性減少了,但是隻要保證所有類別都可以被差不多平均地顧及到,
	至於類內部的圖像多樣性如何並不影響 p(y) 的分佈。

	因此	,Truncation Trick能夠提高IS分數。

	至於FID,其原理是考察a set of generated data之間的均值與方差,“多樣性”是針對sample而言的(相比於IS是針對class而言的),因此,FID勢必直接受到削弱。

	綜上,我們可以得到下面的圖:

在這裏插入圖片描述

但是,作者發現這個方法並不是總是行得通;上述的規律對於許多大的模型是不被服從的,相反會產生artifacts,如下圖:

我們可以反思:是不是如下面的artifacts在源域<<目標域的時候就會出現?

在這裏插入圖片描述

	爲了解決上面的問題,作者認爲,這是因爲基於大小的“超球”範圍內的限制使得模型G不夠平滑
	(我們設想一下:原先我們已經針對本次input準備好了reference(包括class info),但是這時候你使用Truncation認爲地把input調換了(就好像是一次反射取值),那麼得到的映射內部是繞來繞去的)
	所以我們需要去平滑一下它。
	
	於是作者提出了Orthogonal Regularization去解決它。
	基本出發點是對網絡權重做簡化。

Rβ(W)=βWTWIF2 R_{\beta}(W)=\beta||W^TW-I||_{F}^2

其中的 F-範數是矩陣內所有元素的平方和開根號。
但是這個限制太強了,他直接要求矩陣對角線元素必須接近於1,然後其他元素接近於0.

作者提出了個改良版本:

Rβ(W)=βWTW(1I)F2 R_{\beta}(W)=\beta||W^TW \odot (1-I)||_{F}^2

我們可以看到,這麼一來就取消了對矩陣主對角線元素的限制。

總結一下這一部分:


我們證明了憑藉目前的技術,通過“放大”GAN能夠實現生成模型性能的提高;
但是我們的大模型在訓練的時候遭遇了“training collapse”,因此我們需要在崩潰發生之前停止訓練,或者僅僅使用崩潰前的checkpoints的模型用於測試。

下面我們會討論一下,爲什麼同樣的用於之前的小模型的設置,用於大模型的時候就會出現崩潰?

Analysis of Training Collapse for Large Models

在這裏插入圖片描述

我們通過監視:range of weight, gradient, and loss statics來觀察崩潰發生時模型發生了什麼。

上圖展示了,訓練過程中,G/D的每一層卷積的權重W的第一個奇異值(σ0)的大小。
初步觀察我們可以發現:

對於G,崩潰發生時,大部分的層都保持着well-behaved spectral norms;只有少數層尤其是G的第一層是ill-behaved的。並且表現爲“explode at collapse”(爆炸性增長)。

對於D,我們發生正常訓練的過程中,每一層的spectral norms是相對noiser的。崩潰發生時,數不分層出現了spectral norms值的跳躍(躍遷),而不是像G那樣增長。

我們希望知道,G和D的這兩種表現是不是就是大型GAN訓練不穩定的充要條件。

對於G,我們通過下面的實驗:
直接限制spectral norm的爆炸性增長,看看這樣collapse是否還會發生

首先我們知道,對矩陣作奇異值分解(SVD),奇異值是按照從大到小排列的,即有:
σ0>>σ1>>σ2>>...\sigma_0 >> \sigma_1 >> \sigma_2 >> ...


所以我們只要限制 σ0\sigma_0 的大小即可。具體按如下操作:

  • 設置某個閾值 σclamp\sigma_{clamp} (當 σ0\sigma_0 的值超過它的時候,我們就對它做截斷);
    所以條件當然是下面的形式:
    max(0,σ0σclamp)\max (0, \sigma_{0}-\sigma_{clamp})
  • 這個閾值可以這麼設:
    ① 取一個固定的值 σreg\sigma_{reg}
    ② 取第二奇異值的某個倍數 r×sg(σ1)r \times sg(\sigma_1) ,其中的 sgsg 具體是什麼我也不大清楚,,
  • 具體如何操作於 WW 才能作用到 σ0\sigma_0 呢?
    我們聯繫SVD的過程:
    W=UΣVTW=U\Sigma V^T
    然後考慮到 Σ\Sigma 是一個對角矩陣,這說明,UΣU\Sigma 的操作實際上是對應每個奇異值 σi\sigma_i 對矩陣 UU 的第 ii 列作scaling。
    那麼,如果只考慮 σ0\sigma_0 的話,上述操作可以等價於:σ0u0v0Rm×n\sigma_0u_0v_0 \in \R^{m\times n};
    其中 u0u_0v0v_0 分別表示矩陣 UUVV 的第一奇異向量(singular vectors)。
    考慮到矩陣點乘的疊加性,就有:
    W=Wmax(0,σ0σclamp).u0v0W=W-\max (0, \sigma_0-\sigma_{clamp}) . u_0v_0

但實驗結果是——
不管加不加Spectral Norm,這樣的限制確實阻止了 σ0\sigma_0 或者 σ0σ1{\sigma_0}\over{\sigma_1} 的逐漸增長或者爆炸,但還是無法阻止崩潰的發生。
結論:即使賦予了G更多的限制條件,仍然不夠充分保證訓練的一致性。

既然從G下手無法阻止崩潰,我們轉而研究D。

我們假設:
產生振盪的原因是它定期收到了較大的梯度
我們可以更仔細地看每一個振盪,如下圖
在這裏插入圖片描述
我們有理由猜測:這是與當下GAN的訓練方式有關:d D-steps per single G-step
每次G讓D對fake data的響應值取反(原本D是希望D(xfake=0.0D(x_{fake}=0.0 ),這時候梯度會突變(因爲更新的方向可以說是相反了)對D造成了擾亂;但隨着後面的幾個 D-steps ,D的梯度慢慢穩定下來。
因此一個自然的想法就是對D的梯度做懲罰(Gradient Penalty)
在D的目標函數中加入GP正則項:
R1:=γ2EpD(x)[D(x)F2]R_1:={{\gamma}\over2}\Bbb E_{p_{\mathcal D}(x)}[||\nabla D(x)||_F^2]
我們建議讓 γ=10\gamma=10
實驗結果

  • 確實訓練變得穩定,並且提高了D的各層 WWσ0\sigma_0 的曲線的平滑度;
  • 但是模型的性能嚴重下降(performances severely degrades)(IS分數降低了約45%);
  • 發現降低 γ\gamma 可以減緩性能的下降,但是慢慢地會出現 ill-behaved spectra(即使使用最小的 γ\gamma 可以保證訓練穩定,IS還是降低了20%)。
    結論:對D的梯度懲罰力度加大,訓練穩定性能夠被實現,但換來的是模型性能的下降。
上面是從weights的角度去看,下面我們試着從loss去看。

我們還發現,D的loss在訓練過程中趨近於0


Hinge Loss的計算如下:
LDHingeGAN=ExrP[max(0,1D(xr))]+ExfQ[max(0,1+D(xf))] L_{D}^{HingeGAN}=\Bbb E_{x_r \sim \Bbb P}[\max(0, 1-D(x_r))]+\Bbb E_{x_f \sim \Bbb Q}[\max(0, 1+D(x_f))]
LGHingeGAN=ExfQ[D(xf)] L_G^{HingeGAN}=-\Bbb E_{x_f\sim \Bbb Q}[D(x_f)]


當鑑別器 DD 足夠優秀的時候,對real data輸出爲1,對fake data輸出爲-1,那麼loss就是0.0了。
當崩潰發生的時候,loss會產生驟然的跳躍。
因此我們猜測:會不會是D過擬合了?
於是,鑑於鑑別器D本身是一個二分類器,我們將崩潰前訓練好的D拿出來,對訓練數據和測試數據分別作real與fake的二分類,結果是:在訓練數據上準確率是98%,但是到了驗證集上就只有50%-55%了,這就好比隨機猜測。
顯然D過擬合了,記住了訓練數據集,那這對於G沒有影響,因爲此時D是optimal的,能夠總是爲G產生有用的梯度引導。

總結一下這一部分:


我們發現訓練的不穩定性不僅僅與G、D有關,還與他們之間的對抗訓練的過程有關。
基於目前的技術,我們可以通過限制D來保證訓練的穩定性,但是會導致模型G性能的嚴重下降。
因此,沃恩只能夠允許崩潰的存在,並且在崩潰之前儘可能保存最優的模型。


到這裏,我們自然而然會產生一個問題(Appendix G):
	既然崩潰無法阻止,那是否可以延遲它?
	或者是在快要崩潰的時候保存模型,然後修改參數後再繼續訓練?

我們發現:
1)修改學習率
① 增大學習率 lr ,不管是在G還是D還是兩者都,都會導致崩潰;
② 保持 lrDlr_D 不變,只減小 lrGlr_G,可以延遲崩潰(有時候可以延遲100 000個iterations),但這會稍微破壞了訓練——模型的性能要麼不變要麼稍微下降;
③ 減小 lrDlr_D ,保持 lrGlr_G 不變,導致崩潰。
** 我們認爲,當 lrDlr_D 減小後,會使得 D 的更新跟不上 G,所以才導致的崩潰,所以我們追加了實驗:lrDlr_D \downarrowlrGlr_G 不變,但是 d Dsteps/Gstepd ~D_{steps}/G_{step} \uparrow,結果也是要麼無效,要麼可以延遲崩潰但是以些許的性能下降作爲代價。
2)凍結模型
① 在崩潰發生前凍結G,看看D是否可以穩定→ D保持穩定,並且loss逐漸趨向於0;
② 在崩潰發生前凍結D,看看G是否保持穩定→ G迅速崩潰,將D的loss帶動到300,相較於正常情況下都是0~3.0之間。

結論:
1)D必須始終保持最優,這是由

minG{maxDV(G,D)}\mathop{\min}\limits_{G} \{\mathop{\max}\limits_{D}V(G,D)\}

決定的;
2)訓練過程中要偏袒D(可以是增大D的學習率,增加D的迭代次數等),仍舊不足以充分保證訓練的穩定性,這有兩種可能性:
	① D保持了最優,但這對於穩定訓練本身是必要但不充分的;
	② 訓練過程中出於某些技術上的限制,D始終未達到最優。

上面的training instabilities/collapse for large GAN的討論終於結束啦!!

Results

首先是比較簡單的例子

在這裏插入圖片描述

然後是更多例子

在這裏插入圖片描述

再者是一些插值的例子:對z或者c進行插值。

在這裏插入圖片描述

上面↑是對z和c同時插值的結果;下面↓是隻對c做差值、z保持不變的結果。

在這裏插入圖片描述

我們可以發現:


zz 表徵的是語義、姿態;
cc 表徵的是具體的類別與細節、紋理、顏色等。

最後則是一個非常有趣但是周到的實驗:
前面我們不是證明了D在訓練過程中過擬合了嗎?那麼,會不會G也過擬合了?
於是作者做了下面的實驗:
	對訓練好的G合成的圖像,經過在image-level或者feature-level(由某些預訓練好的模型)去原來的訓練集中尋找最近鄰。
	如果找到的圖像是極其相似的,說明我們的G也過擬合了;否則則沒有過擬合,G可信。

下圖是使用VGG-16的fc7層輸出進行匹配的↓
在這裏插入圖片描述
下圖是根據pixel匹配的↓
在這裏插入圖片描述
下圖是根據ResNet-50 avgpooling輸出匹配的↓
在這裏插入圖片描述

結論:G沒有過擬合,G可信!

結束語

好吧,爲了徹底弄懂這篇文章,尤其是GAN的內部,我整整畫了1,5天的時間,這也是近來花時間最多的一篇論文了,CAI is the original sin ٩(●̮̃•)۶!
UP主去面壁了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章