GAN 為什麼需要如此多的噪聲?

GAN 為什麼需要如此多的噪聲?

文 | Conor Lazarou

譯 | Mr Bear


對抗生成網絡(GAN)是一種在給定一組舊的「真實」樣本的情況下,生成新的「人造」樣本的工具。這些樣本幾乎可以是任何的東西:手寫數字、人臉圖片、表現主義繪畫作品,等等所有你能想出的物體。

為了實現這一點,GAN 會學習到原始數據集背後的底層數據分佈。在整個訓練過程中,生成器會近似這個分佈,而判別器將會告訴它哪裡產生了錯誤,在這種博弈中,二者交替地得到提升。

為了從分佈中抽取出隨機的樣本,我們將會把隨機噪聲作為生成器的輸入。然而,你是否曾經想過:為什麼 GAN 需要隨機輸入呢?

一種廣為接受的答案是:這樣,GAN 就不會每次生成相同的結果。這確實是事實,但這個問題的真正答案實際上還暗藏玄機!


1、隨機採樣


在我們繼續討論 GAN 之前,不妨先宕開一筆,討論一下從正態分佈中採樣的問題。

假設你想要在 Python 環境下做到這一點,而你從未閱讀過有關「numpy」庫的文件,也不知道「np.random.normal()」方法的存在,此時你只能利用「random.random()」(該方法會均勻地生成(0,1)區間內的值)。

GAN 為什麼需要如此多的噪聲?

圖 1:從我們的輸入中採樣得到 100,000 個樣本的直方圖,藍色為均勻分佈,橙色為我們的目標:正態分佈。


簡而言之,我們希望將圖 1 中藍色的分佈轉換為橙色的分佈。幸運的是,有一種函數可以做到這一點:逆累積分佈函數(又稱分位函數)。

(非逆的)累積分佈函數(CDF)如圖二所示,它描述了從所討論的分佈中任意抽取出的值小於等於特定的 x 值的概率。

GAN 為什麼需要如此多的噪聲?

圖 2:標準正態分佈的 CDF 曲線


舉例而言,如圖 2 所示,在 x = 0 時,y = 0.5;這意味著 50% 的分佈落在 x = 0 左側。CDF的一個方便的特性是:輸出的範圍在 0 到 1 之間,這正是我們可以通過「random.random()」函數得到的輸入!如果我們對 CDF 求反函數(將其座標軸翻轉),我們就可以得到分位函數:

GAN 為什麼需要如此多的噪聲?

圖 3:標準正態分佈的分位函數


該函數為我們給出了確切的分位數(範圍在 0 到 1 之間的 x)和相應的正態分佈中的值的對應關係,讓我們可以直接從正態分佈中採樣。也就是說「 f(random.random()) ~ N(0, 1)」,其中輸入空間中的每個點都對應於輸出空間中的唯一一個點。

GAN 為什麼需要如此多的噪聲?

圖 4:使用分位函數將均勻分佈(藍色)映射到正態分佈(橙色)的示意圖。


2、這與 GAN 有何關係?

在上述場景下,我們在處理過程中使用了分位函數。但如果我們不這麼做,並且必須學習一個從輸入空間到輸出空間的映射,那該怎麼辦呢?這正是 GAN 旨在解決的問題。

在《Training a GAN to Sample from the Normal Distribution》一文中,我們解釋了在數據緊缺、並且沒有可以使用的分位函數的情況下,如何使用 GAN 從正態分佈中採樣。

閱讀鏈接:https://towardsdatascience.com/training-a-gan-to-sample-from-the-normal-distribution-4095a11e78de

從這個角度看來,我們發現不將 GAN 看做隨機採樣的工具,而是將 k 維潛在(輸入)空間映射到 p 維採樣(輸出)空間是很有益的,後者可以被用來將潛在空間中的樣本變換為採樣空間中的樣本。這樣看的話,正如分位函數一樣,就不會涉及到隨機性的問題。

在這種映射下,我們不妨考慮一下如何只將 0 到 1 之間的一維隨機樣本作為輸入,從一個二維的正態分佈中抽取隨機樣本。

GAN 為什麼需要如此多的噪聲?

圖 5:一個二維的正態分佈(橙色)和一維的均勻分佈(藍色)的示意圖,樣本量為 100,000。


我們如何將藍色直線中的 100,000 份樣本映射到橙色部分中的 100,000 分樣本中去呢?貌似沒有很好的方法能做到這一點。

當然,我們可以使用 Peano 曲線,但是這樣我們就會失去某種很有用的特性,即:令數據點在輸入空間中距離相近,也會使數據點在輸出空間中接近,反之亦然。

正因為如此,GAN 的潛在空間的維度必須大於或等於其採樣空間的維度。這樣的話,函數就有足夠的自由度將輸入映射到輸出上。

出於興趣,讓我們將只擁有一維輸入的 GAN 學習多維分佈的過程可視化出來。也許你不會對這些結果感到驚訝,但它們仍然非常有趣,值得一看。

3、二維高斯分佈

首先,讓我們討論一下如圖 5 所示的問題:將 0 到 1 之前的數據映射到二維正態(又稱「高斯」)分佈上。我們在這裡將使用一個典型的原始 GAN 架構(代碼鏈接見文末)。

GAN 為什麼需要如此多的噪聲?

圖 6:一個潛在空間維數為 1 的 GAN 試圖學習二維高斯分佈。灰色的點是從真實分佈中抽樣得到的樣本,紅色的

如你所見,這種糟糕的辦法並不知道應該要做什麼。由於只有一個自由度,它很難探索採樣空間。

更糟糕的是,由於生成的樣本被密集地包圍在一個一維的流形中(實際上,這個動圖中灰色的點和紅色點的數量是一樣的!),判別器就可以懈怠了,永遠不用努力地將真實點和生成的點區分開來,這樣一來生成器就不會得到非常有用的信息(即使它有能力,也不足以學習一個空間填充曲線)。

圖 6 展示了前 600 個訓練步的情況。三萬步後,結果如下圖所示:

GAN 為什麼需要如此多的噪聲?

圖 7:在 30,000 個訓練步後,圖 6 中的 GAN 學到的分佈。


這個塗鴉一樣的曲線很可愛,但它幾乎與高斯分佈無關。GAN 在 30,000 步後完全沒有學習到映射。在這種背景下,讓我們考慮一下具有相同架構和訓練例程的 GAN 在給定二維、三維、十維,以及一百維潛在空間時,映射到上述分佈時的表現:

GAN 為什麼需要如此多的噪聲?

圖 8:擁有二維、三維、十維,以及一百維潛在空間的 GAN 在訓練了 30,000 訓練步後的輸出。


擁有二維潛在空間的 GAN 的性能要遠優於一維潛在空間的 GAN,但是仍然與目標分佈差距很大,存在一些明顯的扭結。擁有三維和十維潛在空間的 GAN 生成了具有視覺說服力的結果,而一百維的 GAN 生成了似乎具有正確方差但是均值錯誤的高斯分佈。

但是我們要注意到,高維 GAN 在輸出空間為高斯分佈的前提下,實際上是有一定特殊性的,因為大量均勻分佈的均值近似於正態分佈(中心極限定理)。


4、八個高斯分佈

GAN 為什麼需要如此多的噪聲?

圖 9:八個高斯分佈

顧名思義,圖 9 中的八個高斯分佈指的是:八個二維高斯分佈圍繞原點排列成一個圓圈,每個高斯分佈的方差足夠小、幾乎沒有重疊,協方差為零。

雖然樣本空間是二維的,但這種分佈的合理編碼需要三個維度:第一個維度是離散的,描述了模式(編號為 1 到 8),另外的兩個維度分別描述了該模式的 x 和 y 座標。我將「latent_dim」設置為 1,在八個高斯分佈上將 GAN 訓練了 600 步,結果如下:

GAN 為什麼需要如此多的噪聲?

圖 10:潛在維度為 1 的 GAN 試圖學習八個高斯分佈。灰色的點是從真實分佈中抽取出來的樣本,紅色的點代表

正如所料,GAN 很難學習到有效的映射。在 30,000 個訓練步後,學到的分佈如下:

GAN 為什麼需要如此多的噪聲?

圖 11:圖 10 中的 GAN 經過了 30,000 個訓練步後學到的分佈。


顯然,GAN 很難將一維潛在空間映射到這個三維分佈中:最右邊的模式被忽略掉了,模式之間的區域生成了大量的樣本,而且這些樣本也並不服從正態分佈。

作為對比,我們不妨再考慮下面四個 GAN,他們的潛在維度分別為 2,3,10,以及100,在經過了 30,000 個訓練步後,結果如下所示:

GAN 為什麼需要如此多的噪聲?

圖 12:潛在空間為二維、三維、十維以及一百維的 GAN,在經歷了 30,000 個訓練步後的輸出。


在沒有實際度量真實分佈和學習到的分佈之間的 KL 散度時,很難說上面哪種情況是最好的,但是潛在空間維度較低的 GAN 似乎在模式之間的負空間內生成的樣本更少。

更有趣的是,二維的 GAN 並沒有展現出模式崩潰的問題,三維和十維的 GAN 僅僅顯示出了輕微的模式崩潰,而一百維的 GAN 在兩個模式上並未能生成樣本。


5、螺旋式分佈

GAN 為什麼需要如此多的噪聲?

圖 13:螺旋式分佈。隨著螺旋從圓心向外擴展,分佈的密度在減小,在懸臂上橫向的密度是均勻的。


如圖 13 所示的螺旋式分佈,從某種程度上來說比八個高斯分佈的問題更簡單。螺旋式分佈只有一種模式(儘管被拉長和扭曲了),GAN 不會被迫將其連續輸入離散化。它可以被高效地描述為兩個維度:一個維度描述沿著螺旋的位置,另一個維度描述在螺旋內橫向的位置。

我將 「latent_dim」設置為 1,對 GAN 訓練了 600 步,結果如下:

GAN 為什麼需要如此多的噪聲?

圖 14:潛在維度為 1 的 GAN 試圖擬合螺旋分佈。灰色的點是從真實分佈中抽取出的樣本,紅色的點是生成的樣

相同的,GAN 也難以學到有效的映射。在經歷了 30,000 個訓練步後,學到的分佈如下:

GAN 為什麼需要如此多的噪聲?

圖 15:圖 14 中的 GAN 學到的分佈,在經歷了 30,000 個訓練步後的結果。


與「八個高斯分佈」一節中的情況相類似,GAN 在映射螺旋式分佈時性能很差。螺旋中有兩個區域沒有能夠被擬合,而且在負空間內生成了許多樣本。

我在文章《GANs and Inefficient Mappings》中詳細地討論了這個低效率的映射問題,因此這裡不再贅述。

閱讀鏈接:https://towardsdatascience.com/gans-and-inefficient-mappings-f185fdd62a78

相反,我們不妨再考慮下面四個 GAN,他們的潛在維度分別為 2,3,10,以及100,在經過了 30,000 個訓練步後,結果如下所示:

GAN 為什麼需要如此多的噪聲?

圖 16:潛在空間為二維、三維、十維和一百維的 GAN 在經歷了 30,000 個訓練步後的輸出。


同樣的,在沒有真正度量 KL 散度的情況下,很難說上面哪種情況是最好的,但是覆蓋率、均勻性、在負空間內的樣本是很值得研究的問題。


6、結語

人們很容易陷入對 GAN 的狂熱中,把它們當作“魔法機器”,用隨機數作為燃料來創造出新的樣本。瞭解一個工具如何工作的基本原理,對於有效地使用它以及在它損壞時進行故障排除是至關重要的。

對於 GAN 來說,這就意味著理解生成器所做的是學習從一些潛在空間到一些採樣空間的映射,並理解學習是如何進行的。將一維分佈映射到高維分佈的極端情況清晰地說明了這種任務有多複雜。

本項目使用的所有代碼可以從下面的 GitHub 代碼倉庫中獲取:

https://github.com/ConorLazarou/medium/tree/master/12020/visualizing_gan_dimensions


分享到:


相關文章: