0
GAN 系列模型強(qiáng)大的生成能力有目共睹。然而,為什么我們使用一組白噪聲作為輸入就可以生成逼真的樣本呢?在這個生成的過程中,GAN 是如何擬合數(shù)據(jù)分布的呢?且看本文從統(tǒng)計(jì)的視角為大家揭秘 GAN 生成模型背后的那些事。
對抗生成網(wǎng)絡(luò)(GAN)是一種在給定一組舊的「真實(shí)」樣本的情況下,生成新的「人造」樣本的工具。這些樣本幾乎可以是任何的東西:手寫數(shù)字、人臉圖片、表現(xiàn)主義繪畫作品,等等所有你能想出的物體。
為了實(shí)現(xiàn)這一點(diǎn),GAN 會學(xué)習(xí)到原始數(shù)據(jù)集背后的底層數(shù)據(jù)分布。在整個訓(xùn)練過程中,生成器會近似這個分布,而判別器將會告訴它哪里產(chǎn)生了錯誤,在這種博弈中,二者交替地得到提升。
為了從分布中抽取出隨機(jī)的樣本,我們將會把隨機(jī)噪聲作為生成器的輸入。然而,你是否曾經(jīng)想過:為什么 GAN 需要隨機(jī)輸入呢?
一種廣為接受的答案是:這樣,GAN 就不會每次生成相同的結(jié)果。這確實(shí)是事實(shí),但這個問題的真正答案實(shí)際上還暗藏玄機(jī)!
在我們繼續(xù)討論 GAN 之前,不妨先宕開一筆,討論一下從正態(tài)分布中采樣的問題。
假設(shè)你想要在 Python 環(huán)境下做到這一點(diǎn),而你從未閱讀過有關(guān)「numpy」庫的文件,也不知道「np.random.normal()」方法的存在,此時你只能利用「random.random()」(該方法會均勻地生成(0,1)區(qū)間內(nèi)的值)。
圖 1:從我們的輸入中采樣得到 100,000 個樣本的直方圖,藍(lán)色為均勻分布,橙色為我們的目標(biāo):正態(tài)分布。
簡而言之,我們希望將圖 1 中藍(lán)色的分布轉(zhuǎn)換為橙色的分布。幸運(yùn)的是,有一種函數(shù)可以做到這一點(diǎn):逆累積分布函數(shù)(又稱分位函數(shù))。
(非逆的)累積分布函數(shù)(CDF)如圖二所示,它描述了從所討論的分布中任意抽取出的值小于等于特定的 x 值的概率。
圖 2:標(biāo)準(zhǔn)正態(tài)分布的 CDF 曲線
舉例而言,如圖 2 所示,在 x = 0 時,y = 0.5;這意味著 50% 的分布落在 x = 0 左側(cè)。CDF
的一個方便的特性是:輸出的范圍在 0 到 1 之間,這正是我們可以通過「random.random()」函數(shù)得到的輸入!如果我們對 CDF 求反函數(shù)(將其坐標(biāo)軸翻轉(zhuǎn)),我們就可以得到分位函數(shù):
圖 3:標(biāo)準(zhǔn)正態(tài)分布的分位函數(shù)
該函數(shù)為我們給出了確切的分位數(shù)(范圍在 0 到 1 之間的 x)和相應(yīng)的正態(tài)分布中的值的對應(yīng)關(guān)系,讓我們可以直接從正態(tài)分布中采樣。也就是說「 f(random.random()) ~ N(0, 1)」,其中輸入空間中的每個點(diǎn)都對應(yīng)于輸出空間中的唯一一個點(diǎn)。
圖 4:使用分位函數(shù)將均勻分布(藍(lán)色)映射到正態(tài)分布(橙色)的示意圖。
在上述場景下,我們在處理過程中使用了分位函數(shù)。但如果我們不這么做,并且必須學(xué)習(xí)一個從輸入空間到輸出空間的映射,那該怎么辦呢?這正是 GAN 旨在解決的問題。
在《Training a GAN to Sample from the Normal Distribution》(https://towardsdatascience.com/training-a-gan-to-sample-from-the-normal-distribution-4095a11e78de)中,我們解釋了在數(shù)據(jù)緊缺、并且沒有可以使用的分位函數(shù)的情況下,如何使用 GAN 從正態(tài)分布中采樣。
從這個角度看來,我們發(fā)現(xiàn)不將 GAN 看做隨機(jī)采樣的工具,而是將 k 維潛在(輸入)空間映射到 p 維采樣(輸出)空間是很有益的,后者可以被用來將潛在空間中的樣本變換為采樣空間中的樣本。這樣看的話,正如分位函數(shù)一樣,就不會涉及到隨機(jī)性的問題。
在這種映射下,我們不妨考慮一下如何只將 0 到 1 之間的一維隨機(jī)樣本作為輸入,從一個二維的正態(tài)分布中抽取隨機(jī)樣本。
圖 5:一個二維的正態(tài)分布(橙色)和一維的均勻分布(藍(lán)色)的示意圖,樣本量為 100,000。
我們?nèi)绾螌⑺{(lán)色直線中的 100,000 份樣本映射到橙色部分中的 100,000 分樣本中去呢?貌似沒有很好的方法能做到這一點(diǎn)。
當(dāng)然,我們可以使用 Peano 曲線,但是這樣我們就會失去某種很有用的特性,即:令數(shù)據(jù)點(diǎn)在輸入空間中距離相近,也會使數(shù)據(jù)點(diǎn)在輸出空間中接近,反之亦然。
正因?yàn)槿绱耍珿AN 的潛在空間的維度必須大于或等于其采樣空間的維度。這樣的話,函數(shù)就有足夠的自由度將輸入映射到輸出上。
出于興趣,讓我們將只擁有一維輸入的 GAN 學(xué)習(xí)多維分布的過程可視化出來。也許你不會對這些結(jié)果感到驚訝,但它們?nèi)匀环浅S腥?,值得一看?/p>
首先,讓我們討論一下如圖 5 所示的問題:將 0 到 1 之前的數(shù)據(jù)映射到二維正態(tài)(又稱「高斯」)分布上。我們在這里將使用一個典型的原始 GAN 架構(gòu)(代碼鏈接見文末)。
圖 6:一個潛在空間維數(shù)為 1 的 GAN 試圖學(xué)習(xí)二維高斯分布?;疑狞c(diǎn)是從真實(shí)分布中抽樣得到的樣本,紅色的點(diǎn)是生成的樣本。每一幀都是一個訓(xùn)練步。
如你所見,這種糟糕的辦法并不知道應(yīng)該要做什么。由于只有一個自由度,它很難探索采樣空間。
更糟糕的是,由于生成的樣本被密集地包圍在一個一維的流形中(實(shí)際上,這個動圖中灰色的點(diǎn)和紅色點(diǎn)的數(shù)量是一樣的?。?,判別器就可以懈怠了,永遠(yuǎn)不用努力地將真實(shí)點(diǎn)和生成的點(diǎn)區(qū)分開來,這樣一來生成器就不會得到非常有用的信息(即使它有能力,也不足以學(xué)習(xí)一個空間填充曲線)。
圖 6 展示了前 600 個訓(xùn)練步的情況。三萬步后,結(jié)果如下圖所示:
圖 7:在 30,000 個訓(xùn)練步后,圖 6 中的 GAN 學(xué)到的分布。
這個涂鴉一樣的曲線很可愛,但它幾乎與高斯分布無關(guān)。GAN 在 30,000 步后完全沒有學(xué)習(xí)到映射。在這種背景下,讓我們考慮一下具有相同架構(gòu)和訓(xùn)練例程的 GAN 在給定二維、三維、十維,以及一百維潛在空間時,映射到上述分布時的表現(xiàn):
圖 8:擁有二維、三維、十維,以及一百維潛在空間的 GAN 在訓(xùn)練了 30,000 訓(xùn)練步后的輸出。
擁有二維潛在空間的 GAN 的性能要遠(yuǎn)優(yōu)于一維潛在空間的 GAN,但是仍然與目標(biāo)分布差距很大,存在一些明顯的扭結(jié)。擁有三維和十維潛在空間的 GAN 生成了具有視覺說服力的結(jié)果,而一百維的 GAN 生成了似乎具有正確方差但是均值錯誤的高斯分布。
但是我們要注意到,高維 GAN 在輸出空間為高斯分布的前提下,實(shí)際上是有一定特殊性的,因?yàn)榇罅烤鶆蚍植嫉木到朴谡龖B(tài)分布(中心極限定理)。
圖 9:八個高斯分布
顧名思義,圖 9 中的八個高斯分布指的是:八個二維高斯分布圍繞原點(diǎn)排列成一個圓圈,每個高斯分布的方差足夠小、幾乎沒有重疊,協(xié)方差為零。
雖然樣本空間是二維的,但這種分布的合理編碼需要三個維度:第一個維度是離散的,描述了模式(編號為 1 到 8),另外的兩個維度分別描述了該模式的 x 和 y 坐標(biāo)。我將「latent_dim」設(shè)置為 1,在八個高斯分布上將 GAN 訓(xùn)練了 600 步,結(jié)果如下:
圖 10:潛在維度為 1 的 GAN 試圖學(xué)習(xí)八個高斯分布?;疑狞c(diǎn)是從真實(shí)分布中抽取出來的樣本,紅色的點(diǎn)代表生成的樣本。每一幀都是一個訓(xùn)練步。
正如所料,GAN 很鬧學(xué)習(xí)到有效的映射。在 30,000 個訓(xùn)練步后,學(xué)到的分布如下:
圖 11:圖 10 中的 GAN 經(jīng)過了 30,000 個訓(xùn)練步后學(xué)到的分布。
顯然,GAN 很難將一維潛在空間映射到這個三維分布中:最右邊的模式被忽略掉了,模式之間的區(qū)域生成了大量的樣本,而且這些樣本也并不服從正態(tài)分布。
作為對比,我們不妨再考慮下面四個 GAN,他們的潛在維度分別為 2,3,10,以及100,在經(jīng)過了 30,000 個訓(xùn)練步后,結(jié)果如下所示:
圖 12:潛在空間為二維、三維、十維以及一百維的 GAN,在經(jīng)歷了 30,000 個訓(xùn)練步后的輸出。
在沒有實(shí)際度量真實(shí)分布和學(xué)習(xí)到的分布之間的 KL 散度時,很難說上面哪種情況是最好的,但是潛在空間維度較低的 GAN 似乎在模式之間的負(fù)空間內(nèi)生成的樣本更少。
更有趣的是,二維的 GAN 并沒有展現(xiàn)出模式崩潰的問題,三維和十維的 GAN 僅僅顯示出了輕微的模式崩潰,而一百維的 GAN 在兩個模式上并未能生成樣本。
圖 13:螺旋式分布。隨著螺旋從圓心向外擴(kuò)展,分布的密度在減小,在懸臂上橫向的密度是均勻的。
如圖 13 所示的螺旋式分布,從某種程度上來說比八個高斯分布的問題更簡單。螺旋式分布只有一種模式(盡管被拉長和扭曲了),GAN 不會被迫將其連續(xù)輸入離散化。它可以被高效地描述為兩個維度:一個維度描述沿著螺旋的位置,另一個維度描述在螺旋內(nèi)橫向的位置。
我將 「latent_dim」設(shè)置為 1,對 GAN 訓(xùn)練了 600 步,結(jié)果如下:
圖 14:潛在維度為 1 的 GAN 試圖擬合螺旋分布。灰色的點(diǎn)是從真實(shí)分布中抽取出的樣本,紅色的點(diǎn)是生成的樣本。每一幀都是一個訓(xùn)練步。
相同的,GAN 也難以學(xué)到有效的映射。在經(jīng)歷了 30,000 個訓(xùn)練步后,學(xué)到的分布如下:
圖 15:圖 14 中的 GAN 學(xué)到的分布,在經(jīng)歷了 30,000 個訓(xùn)練步后的結(jié)果。
與「八個高斯分布」一節(jié)中的情況相類似,GAN 在映射螺旋式分布時性能很差。螺旋中有兩個區(qū)域沒有能夠被擬合,而且在負(fù)空間內(nèi)生成了許多樣本。
我在文章《GANs and Inefficient Mappings》(https://towardsdatascience.com/gans-and-inefficient-mappings-f185fdd62a78)中詳細(xì)地討論了這個低效率的映射問題,因此這里不再贅述;相反,我們不妨再考慮下面四個 GAN,他們的潛在維度分別為 2,3,10,以及100,在經(jīng)過了 30,000 個訓(xùn)練步后,結(jié)果如下所示:
圖 16:潛在空間為二維、三維、十維和一百維的 GAN 在經(jīng)歷了 30,000 個訓(xùn)練步后的輸出。
同樣的,在沒有真正度量 KL 散度的情況下,很難說上面哪種情況是最好的,但是覆蓋率、均勻性、在負(fù)空間內(nèi)的樣本是很值得研究的問題。雷鋒網(wǎng)雷鋒網(wǎng)雷鋒網(wǎng)
人們很容易陷入對 GAN 的狂熱中,把它們當(dāng)作“魔法機(jī)器”,用隨機(jī)數(shù)作為燃料來創(chuàng)造出新的樣本。了解一個工具如何工作的基本原理,對于有效地使用它以及在它損壞時進(jìn)行故障排除是至關(guān)重要的。
對于 GAN 來說,這就意味著理解生成器所做的是學(xué)習(xí)從一些潛在空間到一些采樣空間的映射,并理解學(xué)習(xí)是如何進(jìn)行的。將一維分布映射到高維分布的極端情況清晰地說明了這種任務(wù)有多復(fù)雜。
本項(xiàng)目使用的所有代碼可以從下面的 GitHub 代碼倉庫中獲取:
https://github.com/ConorLazarou/medium/tree/master/12020/visualizing_gan_dimensions
Via https://towardsdatascience.com/why-do-gans-need-so-much-noise-1eae6c0fb177
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。