WGAN與WGAN-GP學習筆記

原始GAN存在訓練不穩定的情況,主要原因是JS散度的選取不太合理。我們的目標是通過神經網絡的學習,不斷地讓生成分佈 PgP_{g} 不斷接近真實分佈 PrP_{r}。但是當使用JS散度作爲兩個分佈之間的距離的度量時,如果兩個分佈之間沒有重疊,或重疊部分可忽略,則JS散度的計算值始終爲log2,即失去了指導 PgP_{g}PrP_{r} 靠攏的梯度。與此同時,PgP_{g}PrP_{r} 的支撐集屬於高維空間的低維流形,因此兩者的重疊部分可忽略不計,JS散度也始終接近於常數log2,造成了梯度的消失。

因此,要解決GAN訓練不穩定的問題,就要從改變生成分佈 PgP_{g} 與真實分佈 PrP_{r}之間的距離度量入手。在WGAN中,作者把JS散度改爲Wasserstein距離,達到的訓練效果比GAN更加穩定。

Wasserstein距離

Wasserstein距離又稱爲推土機距離(Earth-Mover),其定義如下:

W(Pr,Pg)=infγ(Pr,Pg)E(x,y)γ[xy]W(P_{r},P_{g})=\mathop{inf}\limits_{\gamma\sim\prod(P_{r},P_{g})}E_{(x,y)\sim\gamma}[||x-y||]

其中,(Pr,Pg)\prod(P_{r},P_{g})表示兩個分佈 PrP_{r}PgP_{g} 組合而成的聯合分佈集合。每一個 γ\gamma對應一個聯合分佈,在這個聯合分佈 γ\gamma 採樣出一個樣本對 (x,y)(x,y),其中 xx 爲真實樣本,yy 爲生成的數據,因此可以計算這個樣本對中 xxyy 的距離,即 xy||x-y||,進而可以得到該聯合分佈 γ\gamma 下樣本對距離的期望,在所有可能的聯合分佈中取到使期望最小的。

爲什麼Wasserstein距離又成爲Earth-Mover?因爲在上式中,相當於將生成分佈 PgP_{g} 裏面的所有樣本,移動到真實分佈 PgP_{g} 的對應位置,列舉出所有可能的移動方案,並挑選出移動代價最小的方案。

Wasserstein距離的優點是即使兩個分佈沒有重疊,仍然可以度量兩個分佈之間的距離,而非JS散度的常數log2。

WGAN

在引入Wasserstein距離後,直接將其引入到損失函數中顯然是不現實的,因爲要窮舉出所有可能的聯合分佈,直接進行求解的難度相當大。因此,需要進行一些變換來在網絡中引入Wasserstein距離。

於是WGAN的作者通過一個已經存在且非常複雜的定理,將Wasserstein距離轉化爲下式:

W(Pr,Pg)=1KsupfLKExPr[f(x)]ExPg[f(x)]W(P_{r},P_{g})=\frac{1}{K}\mathop{sup}\limits_{|||f||_{L}\leq K}E_{x\sim P_{r}}[f(x)]-E_{x\sim P_{g}}[f(x)]

上面的公式意味着要最大化 ExPr[f(x)]ExPg[f(x)]E_{x\sim P_{r}}[f(x)]-E_{x\sim P_{g}}[f(x)]。也就是說,當樣本 xx 從真實分佈 PrP_{r} 中採樣時,我們希望經過函數 f(x)f(x) 變換之後的期望值越大越好;同樣地。當樣本 xx 從生成分佈 PgP_{g} 中採樣時,我們希望經過函數 f(x)f(x) 變換之後的期望值越小越好。

但是 ExPr[f(x)]E_{x\sim P_{r}}[f(x)] 不能無止境的大,同時 ExPg[f(x)]E_{x\sim P_{g}}[f(x)] 也不能無止境的小,因爲這樣的話損失函數會越來越大,永遠無法達到收斂。因此,需要對函數 ff 做Lipschitz 連續的限制。對於 Lipschitz 連續,其定義如下:

f(x1)f(x2)Kx1x2|f(x_{1})-f(x_{2})|\leq K|x_{1}-x_{2}|

Lipschitz連續描述的是一個函數在任意點的導數都不超過常數 KK,意味着這個函數 f(x)f(x) 是平滑的,不會出現梯度的突變。這個限制會使得損失函數可以收斂。我們並不關注這個 KK 的值是多少,只要不是正無窮即可,因爲 KK 的大小並不會改變梯度的方向。

由於神經網絡你和函數的能力非常強大,這裏的函數 f(x)f(x) 可以使用神經網絡來近似擬合。該神經網絡就是鑑別器Discriminator,我們假設他的參數爲 ww,所以訓練鑑別器時的損失函數就是在滿足Lipschitz連續的約束下,去最大化L:

L=ExPr[fw(x)]ExPg[fw(x)]L = E_{x\sim P_{r}}[f_{w}(x)]-E_{x\sim P_{g}}[f_{w}(x)]

此時這個最大化的 LL 就可以認爲是生成分佈與真實分佈之間的Wasserstein距離。

那麼問題來了,如何做Lipschitz約束?

這個問題在原始的WGAN論文中也困擾着作者,作者採用了非常簡單粗暴的方法:將參數集 ww 中所有的值 wiw_{i} 都限定在 [c,c][-c,c] 的範圍內(weight clipping),此時一定會存在一個常數 KK,使得關於輸入樣本的導數 fwx\frac{\partial f_{w}}{\partial x} 小於常數 KK,即函數fwf_{w}的局部變化幅度不超過某一個常數 KK

下面看一下WGAN中的算法步驟:

在這裏插入圖片描述

總得來說,WGAN相較於GAN來說有四點改動:

\cdot 將生成分佈與真實分佈之間的距離由JS散度改爲Waseerstein距離,在實際算法中對應上圖的第5行:原始GAN對應的損失函數取log,而WGAN不需要取log;

\cdot 每一次訓練完Discriminator後,需要將ww中的每一個wiw_{i}截斷到[c,c][-c,c]的範圍內,cc 的值通常取 0.01;

\cdot WGAN中的Discriminator最後一層要把sigmoid激活層拿掉,因爲WGAN不再是 0-1分類問題,而是變成了一個迴歸問題,讓鑑別器函數 fwf_{w} 去近似擬合Wasserstein距離;

\cdot WGAN採用RMSProp的優化方法,而並沒有採用基於動量的Adam或Momentum,這是在實驗中發現的trick。

WGAN-GP

WGAN-GP(Gradient Penalty)是WGAN的提升版本。在WGAN中,爲了滿足Lipschitz連續,作者強行採用了weight clipping 的做法,將Discriminator的參數都截斷在區間[0.01,0.01][-0.01,0.01]之間。然而鑑別器的loss試圖將真假樣本的分數拉開,由於weight clipping會獨立的限制每一個網絡參數的取值範圍,因此會使得鑑別器的參數走向兩個極端,即堆積在-0.01和+0.01,其參數取值如下圖所示:

在這裏插入圖片描述

weight clipping還存在一個問題就是關於截斷閾值 cc 的選取,太小的閾值或太大的閾值都會導致訓練中出現梯度彌散/爆炸的情況,因此需要選取一個合理的閾值 cc。而實踐中這個合理的閾值範圍較小,因此會帶來調參工作的麻煩。

基於WGAN中weight clipping上述的兩個缺點,WGAN-GP的作者通過引入一個梯度懲罰項(Gradient Penalty)來取代weight clipping,實現Lipschitz連續的約束。在引入梯度懲罰項之後,Discriminator的loss可以寫爲:

L(D)=ExPrD(x)+ExPgD(x)+λExχ[xD(x)p1]2L(D)=-E_{x\sim P_{r}}D(x)+E_{x\sim P_{g}}D(x)+\lambda E_{x\sim \chi} [||\bigtriangledown_{x}D(x)||_{p}-1]^{2}

上式中的前兩項與WGAN大同小異。目標是最小化loss,即增大真實樣本的給分,減小生成樣本的打分,同時最小化梯度懲罰項。通過第三項梯度懲罰項,我們可以看到這裏將Lipschitz的K值設定爲1。同時,不僅僅是梯度的norm不超過1都視爲一樣的,而是越接近於1越好。理由是在實踐中我們需要利用梯度信息來指導生成分佈向真實分佈靠攏,所以梯度不至於過小,可以有效的加快收斂速度。

我們可以觀察到,計算梯度懲罰項時,樣本 xx 是從分佈 χ\chi 中採樣的,這個分佈 χ\chi 屬於真實分佈(紅色區域)與生成分佈(黃色區域) 之間的一個分佈(藍色區域),如下圖所示:

在這裏插入圖片描述

也就是說,沒有必要對整個樣本空間中的區域進行Lipschitz約束,只需要針對夾在生成分佈與真實分佈中間的藍色區域進行限制即可。爲什麼要選擇這個區域?原文中作者說通過實驗,發現選擇這個區域的實驗效果較好(嗯!先實驗後理論)。其實也可以理解,我們的生成分佈需要向真實分佈靠近,而中間區域的梯度信息對兩者的拉近有一定的指導作用。

那麼這個中間的分佈如何定義?首先選取一個[0,1][0,1]之間的隨機數ϵ\epsilon,並採樣一對樣本:xrPrx_{r}\sim P_{r}xgPgx_{g}\sim P_{g},隨後在兩個樣本點的連線上進行隨機插值採樣:

x^=ϵxr+(1ϵ)xg\hat{x}=\epsilon x_{r} +(1-\epsilon) x_{g}

隨後把所有按照上述流程採樣得到的 x^\hat{x} 所滿足的分佈定義爲 Px^P_{\hat{x}},因此最終Discriminator的loss定義爲:

L(D)=ExPrD(x)+ExPgD(x)+λExPx^[xD(x)p1]2L(D)=-E_{x\sim P_{r}}D(x)+E_{x\sim P_{g}}D(x)+\lambda E_{x\sim P_{\hat{x}}} [||\bigtriangledown_{x}D(x)||_{p}-1]^{2}

通過引入Gradient Penalty,取代weight clipping,實現了Lipschitz連續的約束。其實不管是weight clipping也好,還是gradient penalty也好,他們的目的都是希望實現Lipschitz連續,即尋找梯度與常數K之間的關係,以達到函數平滑的效果。weight clipping顯然有些粗暴,而gradient penalty通過公式有了一個更直觀的度量方法。

需要注意的是,由於是對每一個樣本進行梯度的懲罰,因此不能使用Batch Normalization。

最後貼一張WGAN-GP的算法流程:
在這裏插入圖片描述

小結

GAN中衡量生成分佈與真實分佈之間距離用到的是JS散度,而JS散度在兩個分佈的重疊可忽略時,其計算值固定爲定值。而一開始隨機生成的分佈與真實分佈間很難有不可忽略的重疊,因此會出現梯度消失的狀況;再加上JS散度本身有梯度突變的特性,也會導致訓練的不穩定。

因此在WGAN中,作者用Wasserstein距離取代了GAN中的JS散度,使得兩個分佈即使在沒有重疊的時候,也可以衡量兩者之間的遠近。同時,Wasserstein距離相較於JS散度有平滑的特性,理論上可以解決梯度消失的問題。Wasserstein距離原始表達式看起來與損失函數關係不大,因此作者通過一個很複雜的理論,將Wasserstein距離轉化成了兩個期望的差值,在滿足Lipschitz連續的約束下求最大,這個最大值可近似等價於Wasserstein距離。

而對於Lipschitz連續的約束,在WGAN中採用了將Discriminator的權重參數限定到一個較小的範圍內,這樣他的梯度也相對較小,從而總會有一個常數K,使得所有的梯度值小於K,從而滿足Lipschitz連續。因此,將Wasserstein距離作爲兩個分佈之間距離的衡量,可以有效的把生成分佈向真實分佈拉近,一定程度上解決了訓練時梯度不穩定的問題,達到了更好的效果。

WGAN的weight clipping處理的有些粗暴,會導致參數走向兩極化,同時不合理的閾值設定會導致梯度消失或爆炸。此外,將所有的梯度值都設定在小於K的範圍也不太合理,因此WGAN-GP引入了一個梯度懲罰項,讓梯度越趨近於K越好,這裏的K設定爲1,因爲這樣不僅可以解決梯度不穩定的問題,還可以加速收斂。最後,不必對整個樣本空間進行Lipschitz約束,只需對夾在生成分佈和真實分佈中間的區域的樣本進行梯度懲罰即可。

如果有不妥之處,還請大家交流指正。

參考:

https://www.jianshu.com/p/e901908a1d93

https://www.cnblogs.com/Allen-rg/p/10305125.html

https://www.bilibili.com/video/av24011528?p=6

https://blog.csdn.net/weixin_41036461/article/details/82385334

https://blog.csdn.net/qq_38826019/article/details/80786061?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

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