0. 引言
GANs, 全稱 Generative Adversarial Networks, 即生成對抗網絡。
Yann LeCun 曾將 GANs 評價為 “過去 10 年在機器學習領域最有趣的想法”。 行業大牛的高度評價是對 GANs 最好的廣告。 自從 2014年 Ian J. Goodfellow 與合作者提出 GANs 以來,GANs 確實取得了巨大的成功。
那么到底什么是 GANs? 為何如此與眾不同?在這篇博文中,我們將會看到極具啟發性的對抗訓練 (adversarial training) 思想,簡約而優美,可以稱之為機器學習領域(尤其是生成模型領域)概念性的進步。其重要性可以與反向傳播(BP,backpropagation)相媲美,反向傳播也是簡單而絕妙的思想,正是由於 BP 才導致神經網絡如此流行和高效。
在深入細節之前,先來看一下 GANs 能做什么。GANs 屬於一個更大的范疇——生成模型(generative models)。這類模型具有產生新數據的能力。
下邊感受一下由 GANs 產生的新數據:
上邊左圖中,GAN 首先在 MNIST 數據集上訓練,然后用來產生新的數據,即圖中前 5 列。最后一列是實際數據集中與第 5 列最接近的樣本數據,兩者有明顯差異。由此可見,GAN 確實產生了與訓練樣本不同的新數據,而不是單純記憶訓練樣本。右圖是在 TFD (Toronto Faces Dataset) 數據集上的效果。
GANs 的這種產生新數據的能力讓它看起來很魔幻,至少乍一看起來是這樣的。在接下來的內容中,我們將穿過這些表面的魔幻,深入到 GANs 背后的思想和數學細節,一步一步推導出 GANs.
后邊的內容組織安排如下:
第 1 節討論從簡單概率分布生成更加復雜分布的方法。
第 2 節通過一個例子表明 GANs 實際上可以看作是生成概率分布的一種方法。
第 3 節討論基於匹配的生成網絡(Generative Matching Networks)以及它如何解決生成復雜分布的問題。
第 4 節詳細地介紹 GANs,尤其是它的整體架構,並與前邊幾節的內容關聯起來。
第 5 節包含 GANs 的一些數學細節。
廢話不多說,讓我們開始 GANs 的重新發現之旅吧!
1. 生成服從某種分布的隨機變量
1.1. 生成服從均勻分布的隨機變量
由於計算機中的運算操作本質上都是確定性的,理論上來說,計算機程序不可能產生真正的隨機數。但是,我們可以設計程序使它產生一系列數,這些數從統計性質上來說非常接近理論上的隨機數。尤其是,計算機可以使用一個偽隨機數生成器產生一組數近似服從 [0,1] 上的均勻隨機分布。服從均勻分布的隨機數是非常簡單的,其他更復雜的隨機數可以以它為基礎構造出來。
1.2. 通過運算構造更加復雜的隨機變量
目前存在多種構造復雜隨機變量的方式,例如逆變換方法(inverse transform),拒絕采樣方法(rejection sampling)以及 Metropolis-Hasting 算法。
盡管具體操作方式不同,但是上述方法的基本思想都是一樣的:通過對服從簡單分布的隨機變量進行運算生成服從某種特定復雜分布的隨機變量。
這里先簡要介紹一下 rejection sampling 和 Metropolis-Hasting 算法,它們與 GANs 關系不大,這部分可以直接跳過去。我們的重點是后邊的 inverse transform 方法。
rejection sampling 方法的基本思想是:首先對簡單分布進行采樣,然后基於某種規則接受或者拒絕采樣值,最后得到的采樣結果就服從某種特定分布。這里的關鍵是設計恰當的接受或者拒絕規則。
Metropolis-Hasting 算法的基本思想是:找到一個馬氏鏈,使其穩態分布對應我們希望的某種特定分布。一旦找到了這個馬氏鏈,我們就可以仿真足夠長的時間以確保該馬氏鏈達到穩態。此時采樣得到的數據就相當於從希望的分布中采樣的數據。
1.3. 逆變換方法(Inverse Transform)
基本思想:將我們希望得到的服從某個復雜分布的隨機變量表示成對均勻隨機變量的函數映射。
考慮如下的一維例子:
令
為希望得到的復雜隨機變量,
為已有的 [0,1] 上的均勻隨機變量。
我們知道由累積分布函數(cumulative distribution function, CDF)可以完全確定一個隨機變量。回憶一下 CDF 的定義:

具體到均勻隨機變量的 CDF 為:
![CDF_U(u) = P( U \le u ) = u, ~~~ \forall u \in [0,1]](/image/aHR0cHM6Ly9tYXRoLmppYW5zaHUuY29tL21hdGg_Zm9ybXVsYT1DREZfVSh1KSUyMCUzRCUyMFAoJTIwVSUyMCU1Q2xlJTIwdSUyMCklMjAlM0QlMjB1JTJDJTIwfn5+JTIwJTVDZm9yYWxsJTIwdSUyMCU1Q2luJTIwJTVCMCUyQzElNUQ=.png)
上述等式是均勻分布的一個很好的性質,后邊會用到。
為了方便分析,我們這里假設待求的復雜隨機變量
的 CDF 是可逆的,表示為
. 實際上,后續的分析方法可以借助函數廣義逆擴展到 CDF 不可逆的情形,不過這已經超過本文的討論范圍了。
下邊討論如何構造這個復雜隨機變量。
借助於均勻隨機變量累積分布函數的性質,我們有

在 CDF 可逆的條件下,上述公式等價於

即
與
具有相同的 CDF 。由於 CDF 完全確定一個隨機變量,因此
就是我們希望得到的服從特定分布的復雜隨機變量
,至此我們就得到了基於均勻隨機變量
構造復雜隨機變量
的逆變換方法。
總結一下:
逆變換方法具有相對固定的形式,它基於的簡單隨機變量必須是均勻隨機變量,從簡單隨機變量到復雜隨機變量用到的變換函數必須是復雜隨機變量 CDF 的逆函數。
逆變換實際上屬於一類更廣義的變換方法,更一般化的形式可以使用其他簡單隨機變量,相應的變換函數也不再是 CDF 的逆函數。“變換函數”,顧名思義,目的就是把原本的隨機分布變換到希望的形式,例如將相對於目標分布過高的部分變換到過低的部分。
2. 生成模型(Generative Models)
2.1. 如果我們希望生成的隨機變量非常復雜。。。
我們的目的是生成一些關於“狗”的圖片,每個圖片大小為
個像素,每個像素為黑或者白。
假設我們已經有了一些關於“狗”的圖片,這些圖片(矩陣)可以通過列堆積的形式轉化成
維的列向量。這樣一張關於“狗”的圖片就被表示成了一個向量。但是,很顯然這並不意味着任意一個隨機的向量經過還原成矩陣之后都可以表示“狗”。因此,我們可以說那些對應“狗”的圖片的向量在整個
維向量空間中具有某種特定分布,也就是說這個空間中的某些點(也就是向量)更有可能表示"狗",而另外某些點則不太可能表示“狗”。
基於以上討論,我們還可以說在這個
維向量空間中,某些點表示“貓”的概率更高,某些點表示"鳥"的概率更高。也就是說每種物體在該空間中具有某個對應的特定分布。
更進一步地,生成關於 "狗" 的圖片的問題,可以轉化為從該
維空間中依據“狗”的概率分布采樣得到新的向量(並轉化成圖片矩陣)的問題。
現在我們明確兩件事情:第一,上述例子中關於“狗”的圖片的概率分布是一個在高維空間中的非常復雜的分布(雖然不太好證明,但我們可以認為這個分布確實存在);第二,我們沒辦法用顯式表示這個復雜的分布。如果連分布都無法表示出來,那么基於這個分布來產生新的數據就更困難了。下邊我們就來看一下如何解決這個分布表示的問題。
2.2. 那么我們就求助於神經網絡吧。。。
雖然我們無法直接寫出“狗”的圖片的分布,但是通過第 1 節的介紹,我們知道了一些基於簡單分布構造復雜分布的方法。依然假設我們已經知道如何生成一個服從均勻分布的隨機變量,那么我們可以進一步得到
個獨立的均勻隨機變量,它們可以構造一個
維的均勻隨機變量。下面要做的就是用一個非常復雜的變換函數,將這個簡單的
維隨機變量變換到服從目標分布的復雜
維隨機變量。
在深度學習領域,當我們要得到一個“非常復雜的函數”時,往往意味着用神經網絡建模。具體到我們的問題,就是希望神經網絡的輸入為一個簡單的
維均勻隨機變量,輸出的是另一個
隨機變量服從“狗”的圖片的分布。如下圖所示:
當確定了神經網絡架構之后,我們需要對它進行訓練。下面介紹兩種訓練方法。
3. 生成匹配網絡(Generative Matching Networks, GMNs)
(第 3 節介紹的 GMNs 采用了與 GANs 完全不同的訓練方式,不感興趣的話可以安全跳過。)
3.1. 訓練生成網絡
訓練生成網絡的方式有兩種:直接方式和間接方式。
直接訓練方式中,直接對比真實和生成的概率分布,然后通過傳統的誤差 BP 方式訓練網絡。這就是 GMNs 中用到的訓練方式
間接訓練方式中,並不直接比較兩個分布,而是將它們送入后續的任務中,而在優化后續任務的過程中可以使得生成的分布逼近真實分布。這就是 GANs 中使用的訓練方式。
本節先介紹 GMNs 和直接訓練方法。
3.2. 通過采樣數據比較兩個概率分布
前邊提到 GMNs 中訓練生成網絡是直接比較真實分布與生成的概率分布,但是這兩個分布我們都無法顯式表示。我們能做的是通過采樣近似反映兩個概率分布。理論上來說,我們可以采用任意的能夠基於采樣比較概率分布的度量。這里采用了最大均值差異(Maximum Mean Discrepancy, MMD)作為度量指標。對 MMD 的詳細介紹超出了本文的范圍,感興趣的讀者可以參考這些資料 (參考1, 參考2,參考3)。
3.3. 分布匹配誤差反向傳播
當我們定義了基於采樣的概率分布差別比較方式之后,下一步就可以對 GMNs 進行訓練了。回顧一下我們要實現的目標:將一個服從均勻分布的隨機變量作為輸入,我們希望 GMNs 生成新的隨機變量,服從“狗”的圖片的概率分布。
GMNs 優化網絡參數的步驟總結如下:
- 從均勻分布中采樣得到一些輸入
- 將輸入送入 GMNs 得到相應的輸出
- 從真實的”狗“的圖片中采樣一些數據,采用 MMD 方法計算這些真實數據與 GMNs 生成數據概率分布的差異
- 基於上述差異采用 BP +梯度下降算法調整 GMNs 網絡參數,以降低真實數據與生成數據之間的概率分布差異
上述流程的示意圖如下:
4. 生成對抗網絡
4.1. 間接訓練方法
上述 GMNs 中用到的直接方法是(基於采樣數據)直接比較真實分布與生成分布。而 GANs 架構中一個亮點是將這兩個分布同時送入下游任務中進行間接的比較。在訓練過程中對於下游任務的優化可以迫使生成分布逐漸逼近真實分布。在 GANs 中,所謂的下游任務是對真實數據和生成數據的判別任務。或者,從生成網絡的角度來看,下游任務是盡量使生成數據不被識別出來。
總結一下,在 GANs 的架構中,我們有一個判別器,功能是盡量正確區分真實數據和生成的數據;一個生成器,功能是盡量使生成的數據瞞過判別器。
下一節我們討論,用上述間接方式訓練好的 GANs 為什么可以像直接訓練方式那樣,保證生成數據的分布逼近真實分布。
4.2. 理想情況:完美的生成器和完美的判別器
假設我們要逼近的真實分布是一維高斯分布。
另外,假設判別器是完美的,它知道真實分布和生成的分布的形式,當兩者差別明顯時,判別器有較大概率正確區分來自兩個分布的采樣數據。
如果我們要欺騙判別器,就不得不生成一個逼近真實分布的分布,此時將會給判別器制造最大的困難:對於輸入判別器的任何一個數據,它來自真實分布的概率等於來自生成分布的概率。那么判別器能做到的最好情況就是隨機猜測,正確率為 50%
下圖中,藍色曲線表示真實分布(一維高斯),黃色曲線表示生成的分布,灰色曲線(縱軸在右側)表示判別器作出正確判斷的概率。可以看出,在真實分布與生成分布差別較大的區域,判別器正確判斷的概率較高;當兩者相同時,正確的概率最低,為 50%。直觀地看,生成網絡訓練的過程,就是不斷地將“綠色區域”(生成的分布太高)向“紅色區域”(生成的分布太低)轉移。
討論到了這里,我們或許會有疑問:這種間接訓練方式是否是個好的想法?這個疑問很正常,一方面,相比於直接對比兩個分布的直接訓練方式,GANs 中的間接訓練方式看起來更復雜,因為引入了下游任務環節;另一方面,我們前邊假設判別器是完美的,它清楚的知道真實分布和生成的分布,但實際上這個假設太苛刻,我們並不能直接獲得這么一個完美的判別器。
作為回答,對於第一個方面我們可以說,直接方法中基於采樣計算分布差異的復雜性並不比 GANs 中的間接方法低;第二個方面,盡管我們不能直接得到完美的判別器,但是我們可以訓練一個神經網絡去逼近它!
4.3. 逼近的方式:對抗神經網絡
讓我們再次概括一下 GANs 的結構:GANs 包括一個生成器(generator)和一個判別器(discriminator)。
- 生成器實際上是一個神經網絡,扮演着變換函數的角色。它的輸入是一個簡單的隨機變量,(訓練之后)輸出的是新的隨機變量,服從目標分布。
- 判別器也是一個神經網絡,具有二分類功能。它的輸入是一個采樣數據(來自真實的分布或者由生成器產生的),輸出是該采樣數據來自真實分布的概率。
上述兩個神經網絡可以聯合訓練,優化目標完全相反:
- 生成器的目標是欺騙判別器,也就是最大化判別器的分類誤差
- 判別器的目標是正確區分真實數據和生成數據,也就是最小化分類誤差。
因此,在每一步訓練迭代過程中,生成網絡的權重向着增大分類誤差的方向改變,也就是誤差梯度上升的方向;而判別網絡的權重向着減小分類誤差的方向改變,也就是誤差梯度下降的方向。
訓練流程圖如下:
兩個網絡優化目標的對立性就是生成“對抗”網絡名字的由來,是以“對抗”的形式訓練兩個網絡,使它們都變得越來越好。最終理想的訓練效果是:生成器產生的數據服從真實的目標分布,而判別器以 1/2 的概率預測輸入的數據是真實的還是生成的。
5. GANs 背后的數學
這一部分包含一些數學細節,不喜歡數學的讀者可以跳過,不會影響對 GANs 的直觀理解。
神經網絡建模至少應該包含兩方面內容:網絡架構和損失函數(loss function)。我們前邊已經描述了 GANs 中的網絡架構,它包含兩個網絡:
- 生成網絡
,輸入的是
, 相應的概率密度為
,(訓練之后)輸出的是
,其中
服從希望的目標概率分布。 - 判別網絡
,輸入為
,它可能是一個真實的數據
, 概率密度為
,也可能是一個生成的數據
,概率密度為
,其中
是
經過
變換之后的概率密度。判別網絡的輸出
是
為真實數據的概率。
如果我們給判別網絡送入同樣數量的真實數據和生成數據,那么判別網絡輸出誤差的期望為
![\begin{align} E(G,D) =& \frac{1}{2} E_{x\sim p_t}[1-D(x)] + \frac{1}{2} E_{z\sim p_z}[D(G(z))] \\ =& \frac{1}{2}(E_{x\sim p_t}[1-D(x)] + E_{x\sim p_g}[D(x)]) \end{align}](/image/aHR0cHM6Ly9tYXRoLmppYW5zaHUuY29tL21hdGg_Zm9ybXVsYT0lNUNiZWdpbiU3QmFsaWduJTdEJTIwRShHJTJDRCklMjAlM0QlMjYlMjAlNUNmcmFjJTdCMSU3RCU3QjIlN0QlMjBFXyU3QnglNUNzaW0lMjBwX3QlN0QlNUIxLUQoeCklNUQlMjAlMkIlMjAlNUNmcmFjJTdCMSU3RCU3QjIlN0QlMjBFXyU3QnolNUNzaW0lMjBwX3olN0QlNUJEKEcoeikpJTVEJTIwJTVDJTVDJTIwJTNEJTI2JTIwJTVDZnJhYyU3QjElN0QlN0IyJTdEKEVfJTdCeCU1Q3NpbSUyMHBfdCU3RCU1QjEtRCh4KSU1RCUyMCUyQiUyMEVfJTdCeCU1Q3NpbSUyMHBfZyU3RCU1QkQoeCklNUQpJTIwJTVDZW5kJTdCYWxpZ24lN0Q=.png)
在訓練生成網絡時,我們希望最大化上述誤差,而在訓練判別網絡時,希望最小化上述誤差。
整體訓練目標可以表示成

下邊我們分開來看兩個網絡各自能夠達到的最佳效果。
若生成網絡
已給定,那么判別網絡能做的就是選擇一個
使得下式最小:
![E_{x\sim p_t}[1-D(x)] + E_{x\sim p_g}[D(x)] = \int_\mathbb{R}(1-D(x))p_t(x) + D(x)p_g(x) dx](/image/aHR0cHM6Ly9tYXRoLmppYW5zaHUuY29tL21hdGg_Zm9ybXVsYT1FXyU3QnglNUNzaW0lMjBwX3QlN0QlNUIxLUQoeCklNUQlMjAlMkIlMjBFXyU3QnglNUNzaW0lMjBwX2clN0QlNUJEKHgpJTVEJTIwJTNEJTIwJTVDaW50XyU1Q21hdGhiYiU3QlIlN0QoMS1EKHgpKXBfdCh4KSUyMCUyQiUyMEQoeClwX2coeCklMjBkeA==.png)
為了最小化上述積分,我們可以對於每個
最小化積分項,結果得到的最優
形式如下:

即對於每個
值,如果
,則
輸出為 1, 否則輸出為 0
再來看一下生成網絡
的尋優。在
已經取得最優 (表示為
) 的前提下,
的目標是最大化下式:

其中等號右邊的式子就是代入最優
之后的化簡形式。
為了最大化上述積分,對於每一個
我們可以最大化相應的積分項。由於我們只能改變
進而影響
,而
是無法改變的,因此我們能得到的最好結果如下:

考慮到
和
都是概率密度,都有和為 1 的限制,因此最優的
只能滿足:

至此,我們就得到了在理想情況下,
和
分別能夠達到的最佳效果,這也符合我們之前的直觀感覺。
全文總結
- 計算機可以生成簡單的偽隨機變量
- 存在多種由簡單隨機變量生成復雜隨機變量的方式,例如在變換方法(transform method)中,復雜隨機變量可以表示為簡單隨機變量的函數的形式
- 在機器學習中,生成模型的目的是生成數據服從目標分布。
- 基於深度學習的生成模型是通過神經網絡建模的,輸入一個簡單的隨機變量,輸出新的隨機變量服從目標分布
- 這些基於神經網絡的生成模型可以用直接方式訓練,即直接比較生成數據的分布與目標分布,這是 GMNs (Generative Matching Networks,生成匹配網絡) 采用的訓練方法
- 也可以用間接方式訓練,在嘗試欺騙判別網絡的過程中逐步提高生成網絡的效果,這是 GAN 的思想
即使關於 GANs 的某些宣傳可能有些誇張,但是 Ian Goodfellow 等人提出的 GANs 的思想確實非常偉大,尤其是將直接對比轉換成間接對比的方法很有啟發性。
作為總結,我們不確定 GANs 是否真的如 Yann LeCun 所說的那樣,是 “過去 10 年在機器學習領域最有趣的想法”,但是加上 “之一” 是絕對沒問題的!
轉載自:
作者:isl_qdu
鏈接:https://www.jianshu.com/p/eef6c224e376
