CV_shortcomings of the original GAN

shortcomings of the original GAN

1.Evaluation、梯度消失及梯度不穩定

original GAN的Loss Funtion表示,D實際上是在對P_data和P_G之間做一個JSD的衡量,也就是說,在學習訓練D的過程,也就是在衡量給定的G所對應的分佈P_G與真實數據所處的分佈P_data之間的JS divergence。也正如前述,GAN和VAE使用了相同的架構,但是二者的區別在於Loss Function的不同,即GAN中使用的是D來作爲GAN中G的訓練方向的指引。所以就有必要來對這樣的引導來進行一個評估。

通過計算JSD可以知道,其值介於0和log2之間。當P_data和P_G 完全overlap時,二者的JSD值才爲0,否則二者的JSD值爲小於log2的非零值。

而在實際過程中會發現,D的Loss Function值始終爲0,即JSD始終爲log2,也就是表示爲P_data和P_G始終沒有overlap。由於D的Loss Function始終不變,這也導致了梯度消失的現象。而在使用-logD(G(x))來替代log(1-D(G(x)))作爲G的改進損失函數時,又會遇到梯度不穩定和損失函數意義不明確的問題,即在最小化一個不合理的距離度量,進一步還導致了mode collapse的問題,這點會在下一個小節內敘述。

當G的Loss Function使用<注意是G的Loss Function,即僅含V(G, D)中的唯一與G有關的一項>

時,根據Basic idea of GAN中將最佳D代入原先的Loss Function中得到的

將KL散度(注意下面是先g後r)變換成含D*的形式:

對該結果等號兩邊進行移動,並代入

得到

注意上式最後兩項不依賴於生成器G,最終得到最小化

等價於最小化

這個等價最小化目標存在兩個嚴重的問題。第一是它同時要最小化生成分佈與真實分佈的KL散度,卻又要最大化兩者的JS散度,一個要拉近,一個卻要推遠!這在直觀上非常荒謬,在數值上則會導致梯度不穩定,這是後面那個JS散度項的毛病。

因此,該G的Loss Function存在優化目標荒謬、梯度不穩定的問題。

可能的原因有:

  • 對於P_data和P_G而言,二者通常是高維空間中的一個低維的manifold,所以二者的overlap通常非常非常小,或者說根本就沒有。所以對於original GAN的Loss Function計算的用於衡量P_data和P_G之間相似度的JSD基本始終爲log2,只有在二者完全重合時,JSD才爲0。

  • b.在Loss Function的計算過程中,採用的是使用sample出來的data來進行E值的估計。正是由於採用的是sample的方式來估計E,纔會給D機會找到一個hyperplane/boundary將從P_data和P_G中sample出來的樣本很好的分開。如果是從分佈的角度來計算Loss Function,就必然會有兩個分佈交疊的情況,而無法像對樣本分類那樣找到一個hyperplane/boundary將兩個分佈完全地分開。簡而言之,由於是採用sample的方式來計算Loss Function,所以如果遇到一個很強勢的D,那麼將始終無法計算二者的overlap,也就是始終會導致JSD的值爲log2。

根據原始GAN定義的判別器loss,我們可以得到最優判別器的形式;而在最優判別器的下,我們可以把原始GAN定義的生成器loss等價變換爲最小化真實分佈Pr與生成分佈Pg之間的JS散度。我們越訓練判別器,它就越接近最優,最小化生成器的loss也就會越近似於最小化Pr和Pg之間的JS散度。

問題就出在這個JS散度上。我們會希望如果兩個分佈之間越接近它們的JS散度越小,我們通過優化JS散度就能將Pg拉向Pr,最終以假亂真。這個希望在兩個分佈有所重疊的時候是成立的,但是如果兩個分佈完全沒有重疊的部分,或者它們重疊的部分可忽略(下面解釋什麼叫可忽略),它們的JS散度是多少呢?

答案是log2,因爲對於任意一個x只有四種可能<這裏的P爲分佈,x爲隨機變量。P1和P2處於同一個空間,x爲這個空間中的隨機變量。下列式子爲x取某個值時,P1和P2的取值>:

第一種對計算JS散度無貢獻,第二種情況由於重疊部分可忽略所以貢獻也爲0,第三種情況對公式

右邊第一個項的貢獻是log2,第四種情況與之類似,所以最終JS(P1 || P2)=log2。

換句話說,無論Pr跟Pg是遠在天邊,還是近在眼前,只要它們倆沒有一點重疊或者重疊部分可忽略,JS散度就固定是常數log2,而這對於梯度下降方法意味着——梯度爲0!此時對於最優判別器來說,生成器肯定是得不到一丁點梯度信息的;即使對於接近最優的判別器來說,生成器也有很大機會面臨梯度消失的問題。

但是Pr與Pg不重疊或重疊部分可忽略的可能性有多大?不嚴謹的答案是:非常大。比較嚴謹的答案是:Pr與Pg的支撐集(support)是高維空間中的低維流形(manifold)時,Pr與Pg重疊部分測度(measure)爲0的概率爲1。

不用被奇怪的術語嚇得關掉頁面,雖然論文給出的是嚴格的數學表述,但是直觀上其實很容易理解。首先簡單介紹一下這幾個概念:

  • 支撐集(support)其實就是函數的非零部分子集,比如ReLU函數的支撐集就是(0, ∞),一個概率分佈的支撐集就是所有概率密度非零部分的集合。
  • 流形(manifold)是高維空間中曲線、曲面概念的拓廣,我們可以在低維上直觀理解這個概念,比如我們說三維空間中的一個曲面是一個二維流形,因爲它的本質維度(intrinsic dimension)只有2,一個點在這個二維流形上移動只有兩個方向的自由度。同理,三維空間或者二維空間中的一條曲線都是一個一維流形。
  • 測度(measure)是高維空間中長度、面積、體積概念的拓廣,可以理解爲“超體積”。

回過頭來看第一句話,“當Pr與Pg的支撐集是高維空間中的低維流形時”,基本上是成立的。原因是GAN中的生成器一般是從某個低維(比如100維)的隨機分佈中採樣出一個編碼向量,再經過一個神經網絡生成出一個高維樣本(比如64x64的圖片就有4096維)。當生成器的參數固定時,生成樣本的概率分佈雖然是定義在4096維的空間上,但它本身所有可能產生的變化已經被那個100維的隨機分佈限定了,其本質維度就是100,再考慮到神經網絡帶來的映射降維,最終可能比100還小,所以生成樣本分佈的支撐集就在4096維空間中構成一個最多100維的低維流形,“撐不滿”整個高維空間。

“撐不滿”就會導致真實分佈與生成分佈難以“碰到面”,這很容易在二維空間中理解:一方面,二維平面中隨機取兩條曲線,它們之間剛好存在重疊線段的概率爲0;另一方面,雖然它們很大可能會存在交叉點,但是相比於兩條曲線而言,交叉點比曲線低一個維度,長度(測度)爲0,可忽略。三維空間中也是類似的,隨機取兩個曲面,它們之間最多就是比較有可能存在交叉線,但是交叉線比曲面低一個維度,面積(測度)是0,可忽略。從低維空間拓展到高維空間,就有了如下邏輯:因爲一開始生成器隨機初始化,所以Pg幾乎不可能與Pr有什麼關聯,所以它們的支撐集之間的重疊部分要麼不存在,要麼就比Pr和Pg的最小維度還要低至少一個維度,故而測度爲0。所謂“重疊部分測度爲0”,就是上文所言“不重疊或者重疊部分可忽略”的意思。

我們就得到了WGAN前作中關於生成器梯度消失的第一個論證:在(近似)最優判別器下,最小化生成器的loss等價於最小化Pr與Pg之間的JS散度,而由於Pr與Pg幾乎不可能有不可忽略的重疊,所以無論它們相距多遠JS散度都是常數log2,最終導致生成器的梯度(近似)爲0,梯度消失。

接着作者寫了很多公式定理從第二個角度進行論證,但是背後的思想也可以直觀地解釋:

  • 首先,Pr與Pg之間幾乎不可能有不可忽略的重疊,所以無論它們之間的“縫隙”多狹小,都肯定存在一個最優分割曲面把它們隔開,最多就是在那些可忽略的重疊處隔不開而已。
  • 由於判別器作爲一個神經網絡可以無限擬合這個分隔曲面,所以存在一個最優判別器,對幾乎所有真實樣本給出概率1,對幾乎所有生成樣本給出概率0,而那些隔不開的部分就是難以被最優判別器分類的樣本,但是它們的測度爲0,可忽略。
  • 最優判別器在真實分佈和生成分佈的支撐集上給出的概率都是常數(1和0),導致生成器的loss梯度爲0,梯度消失。

有了這些理論分析,原始GAN不穩定的原因就徹底清楚了:判別器訓練得太好,生成器梯度消失,生成器loss降不下去;判別器訓練得不好,生成器梯度不準,四處亂跑。只有判別器訓練得不好不壞纔行,但是這個火候又很難把握,甚至在同一輪訓練的前後不同階段這個火候都可能不一樣,所以GAN才那麼難訓練。

這就會導致什麼問題:

  • a.無法從loss值中去判斷現在已經訓練到什麼程度了,或者說loss值並無法反映P_data和P_G的接近、相似程度,因爲P_data和P_G的JSD值在絕大多數時候值都爲log2,所以僅從由JSD構成的loss值中是無法反映二者的相似程度的。

  • b.很難達到收斂

solution:

  • a.不需要那麼強的D,找一個相對弱的D即可。
  • b.加入噪聲,使得P_data和P_G二者有更大的overlap的可能。

對生成樣本和真實樣本加噪聲,直觀上說,使得原本的兩個低維流形“彌散”到整個高維空間,強行讓它們產生不可忽略的重疊。而一旦存在重疊,JS散度就能真正發揮作用,此時如果兩個分佈越靠近,它們“彌散”出來的部分重疊得越多,JS散度也會越小而不會一直是一個常數,於是(在第一種原始GAN形式下)梯度消失的問題就解決了。在訓練過程中,我們可以對所加的噪聲進行退火(annealing),慢慢減小其方差,到後面兩個低維流形“本體”都已經有重疊時,就算把噪聲完全拿掉,JS散度也能照樣發揮作用,繼續產生有意義的梯度把兩個低維流形拉近,直到它們接近完全重合。以上是對原文的直觀解釋。

2.Mode Collapse

也就是說,真實的數據分佈中可能有多個mode,但是生成的分佈中卻只有一個mode。換言之,雖然training dataset中的數據的mode很豐富,並且生成的數據也很逼真,但是多次生成G_data後會發現,每次生成的data都只有相同的一個mode。根據生成分佈你可以知道他能做什麼,但是你無法得知他不能夠做什麼。他可能可以做更多的事,也可能不能,但是你不知道,因爲他並沒有表現出來。

然而使用MLL的方式來估計模型並不容易出現mode collapse的情況。

假設P_data中有多個mode。但是在學習G所對應的分佈時,當G對應分佈逼近P_data的一個mode時,發現能夠很好地被D判別出來,這時G可能就會放棄這個mode轉向逼近下一個mode…而不是同時去學習逼近多個P_data中對應的mode,因爲這種行爲可能反而更容易被D給判別出來,也就是說,讓G去學習多個mode,相比之下G不如去只學習一個mode能夠更好地從Loss Function中得到好的反饋(或者是更好地欺騙D)。這是由於Loss Funtion的所決定的。所以去思考Loss Function背後的含義以及Loss Function是如何引導G去學習的很重要。

更具體地從數學的角度去分析一下這個原因。在basic idea of GAN中提到,MLL相當於是在求P_data和P_G之間的KL散度。

而目標是讓KL—>0。從式中可知,當P_G=0且P_data有值時,KL—>∞,當P_data=0時,KL=0

所以爲了避免KL—>∞,P_G就會趨向在P_data有值時也有值,即不趨向於0。

這種情況下,反而使得P_G能夠學得P_data中的多個mode。

而在reverse KL中

當P_data=0且P_G有值時,reverse KL—>∞,所以這就會導致P_G害怕跨過P_data=0處或者P_data很小的地方去逼近P_data中的多個mode,這就導致了mode collapse。

因爲original GAN在D*=argmax_D V(G, D)下,對應的V(G, D*)表示的是JS divergence。而JS divergence

可以展開成下式

所以JSD中是包含reverse KL的,這可能是original GAN中出現mode collapse情況的原因。

當G的Loss Function使用<注意是G的Loss Function,即僅含V(G, D)中的唯一與G有關的一項>

時,由前述內容

可知,對其進行最小化等價於對

進行最小化。其中第一項的KL散度項是導致mode collapse的原因。因爲KL散度不是一個對稱的衡量。其中KL(Pr || Pg)和KL(Pg || Pr)是有差別的。以KL(Pg || Pr)爲例:

換言之,KL(Pg || Pr)對於上面兩種錯誤的懲罰是不一樣的,第一種錯誤對應的是“生成器沒能生成真實的樣本”,懲罰微小;第二種錯誤對應的是“生成器生成了不真實的樣本” ,懲罰巨大。第一種錯誤對應的是缺乏多樣性,第二種錯誤對應的是缺乏準確性。這一放一打之下,生成器寧可多生成一些重複但是很“安全”的樣本,也不願意去生成多樣性的樣本,因爲那樣一不小心就會產生第二種錯誤,得不償失。這種現象就是大家常說的collapse mode。

 

Reference

臺大深度學習_李宏毅

令人拍案叫絕的Wasserstein GAN:https://zhuanlan.zhihu.com/p/25071913?columnSlug=f00cb0979b57ab6d7f70e287b0cba55d

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