進入正題之前,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,基於下面的目標函數——
其中,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行是論文的方法)
下面主要是進行一個討論
1)關於noise的latent space的討論
作者首先介紹了一些常用的採樣的數據分佈
Data Distribution | Notes |
---|---|
標準的latent space | |
另一個標準的latent space | |
離散的隱向量,這是基於先驗“自然界的圖像並不是連續的,而是離散的(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去解決它。
基本出發點是對網絡權重做簡化。
其中的 F-範數是矩陣內所有元素的平方和開根號。
但是這個限制太強了,他直接要求矩陣對角線元素必須接近於1,然後其他元素接近於0.
作者提出了個改良版本:
我們可以看到,這麼一來就取消了對矩陣主對角線元素的限制。
總結一下這一部分:
我們證明了憑藉目前的技術,通過“放大”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),奇異值是按照從大到小排列的,即有:
所以我們只要限制 的大小即可。具體按如下操作:
- 設置某個閾值 (當 的值超過它的時候,我們就對它做截斷);
所以條件當然是下面的形式:
- 這個閾值可以這麼設:
① 取一個固定的值 ;
② 取第二奇異值的某個倍數 ,其中的 具體是什麼我也不大清楚,,- 具體如何操作於 才能作用到 呢?
我們聯繫SVD的過程:
然後考慮到 是一個對角矩陣,這說明, 的操作實際上是對應每個奇異值 對矩陣 的第 列作scaling。
那麼,如果只考慮 的話,上述操作可以等價於:;
其中 和 分別表示矩陣 和 的第一奇異向量(singular vectors)。
考慮到矩陣點乘的疊加性,就有:
但實驗結果是——
不管加不加Spectral Norm,這樣的限制確實阻止了 或者 的逐漸增長或者爆炸,但還是無法阻止崩潰的發生。
結論:即使賦予了G更多的限制條件,仍然不夠充分保證訓練的一致性。
既然從G下手無法阻止崩潰,我們轉而研究D。
我們假設:
產生振盪的原因是它定期收到了較大的梯度
我們可以更仔細地看每一個振盪,如下圖
我們有理由猜測:這是與當下GAN的訓練方式有關:d D-steps per single G-step
每次G讓D對fake data的響應值取反(原本D是希望 ),這時候梯度會突變(因爲更新的方向可以說是相反了)對D造成了擾亂;但隨着後面的幾個 D-steps ,D的梯度慢慢穩定下來。
因此一個自然的想法就是對D的梯度做懲罰(Gradient Penalty)
在D的目標函數中加入GP正則項:
我們建議讓
實驗結果
- 確實訓練變得穩定,並且提高了D的各層 的 的曲線的平滑度;
- 但是模型的性能嚴重下降(performances severely degrades)(IS分數降低了約45%);
- 發現降低 可以減緩性能的下降,但是慢慢地會出現 ill-behaved spectra(即使使用最小的 可以保證訓練穩定,IS還是降低了20%)。
結論:對D的梯度懲罰力度加大,訓練穩定性能夠被實現,但換來的是模型性能的下降。
上面是從weights的角度去看,下面我們試着從loss去看。
我們還發現,D的loss在訓練過程中趨近於0
Hinge Loss的計算如下:
當鑑別器 足夠優秀的時候,對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還是兩者都,都會導致崩潰;
② 保持 不變,只減小 ,可以延遲崩潰(有時候可以延遲100 000個iterations),但這會稍微破壞了訓練——模型的性能要麼不變要麼稍微下降;
③ 減小 ,保持 不變,導致崩潰。
** 我們認爲,當 減小後,會使得 D 的更新跟不上 G,所以才導致的崩潰,所以我們追加了實驗:, 不變,但是 ,結果也是要麼無效,要麼可以延遲崩潰但是以些許的性能下降作爲代價。
2)凍結模型
① 在崩潰發生前凍結G,看看D是否可以穩定→ D保持穩定,並且loss逐漸趨向於0;
② 在崩潰發生前凍結D,看看G是否保持穩定→ G迅速崩潰,將D的loss帶動到300,相較於正常情況下都是0~3.0之間。
結論:
1)D必須始終保持最優,這是由
決定的;
2)訓練過程中要偏袒D(可以是增大D的學習率,增加D的迭代次數等),仍舊不足以充分保證訓練的穩定性,這有兩種可能性:
① D保持了最優,但這對於穩定訓練本身是必要但不充分的;
② 訓練過程中出於某些技術上的限制,D始終未達到最優。
上面的training instabilities/collapse for large GAN的討論終於結束啦!!
Results
首先是比較簡單的例子
然後是更多例子
再者是一些插值的例子:對z或者c進行插值。
上面↑是對z和c同時插值的結果;下面↓是隻對c做差值、z保持不變的結果。
我們可以發現:
表徵的是語義、姿態;
表徵的是具體的類別與細節、紋理、顏色等。
最後則是一個非常有趣但是周到的實驗:
前面我們不是證明了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主去面壁了!