1. 程式人生 > >GAN之父:全方位解讀生成對抗網路的原理及未來

GAN之父:全方位解讀生成對抗網路的原理及未來

GAN

Ian Goodfellow 在 NIPS 2016 上的 tutorial 演講依舊是聊他的代表作生成對抗網路(GAN/Generative Adversarial Networks),畢竟 Ian 就是「對抗生成網路之父」。這兩年,他每到大會就會講 GAN,並且每次都會有一些新的乾貨,當然這次也不例外。

可以說,這幾年在機器學習領域最亮最火最耀眼的新思想就是生成對抗網路了。這一思想不光催生了很多篇理論論文,也帶來了層出不窮的實際應用。Yann LeCun 本人也曾毫不吝嗇地稱讚過:這是這幾年最棒的想法!

大家都知道,LeCun 是無監督學習的頭號號召者。生成對抗網路這種靠資料和模型自己的內部對抗來實現無監督學習的模型正好給人工智慧的自我學習能力帶來了一線曙光!

大神 Ian Goodfellow(這姓本身就很學術)是神經網路奠基人 Yoshua Bengio 的學生(跟相聲一樣,學術界也講究個師承和門派。收不收學費就因人而異了。學校的發票應該還是有的)。繼承了 Bengio 的步伐,Ian 在 2014 年的一篇 GAN 論文也是震驚世界,被認為是帶領人類走向機器學習下一個紀元的開創性方法。Ian 在谷歌帶完這一波節奏之後,便加入了「矽谷鋼鐵俠」Elon Musk 的 OpenAI。

OpenAI 這家酷炫的研究所是非營利的,主要目標就是做深度的人工智慧研究來為人類造福,或防止人工智慧失控而滅絕人類。當然,這只是個口號,本質上其實就是有錢人撒錢養一幫學界大神來提升自己在圈內的逼格。當然,他們也不計利潤和 IP 地開源了大量程式碼和框架,這也是造福工業界和學術界的好事。GAN 作為 OpenAI 的首個高逼格成果,也在這兩年得到了長足的優化和拓展。

生成模型的概念大家應該都很熟悉,大概有兩種玩法:

  • 密度(概率)估計:就是說在不瞭解事件概率分佈的情況下,先假設隨機分佈,然後通過資料觀測來確定真正的概率密度是怎樣的。

  • 樣本生成:這個就更好理解了,就是手上有一把訓練樣本資料,通過訓練後的模型來生成類似的「樣本」。

這堂 tutorial 主要就是講生成對抗網路以及一些技巧與前沿觀點。

為什麼要學習生成模型?

我們為什麼需要生成模型?

  • 這是一種對我們處理高維資料和複雜概率分佈的能力很好的檢測;

  • 也可以為了未來的規劃或模擬型強化學習做好理論準備(所謂的 model-free RL);

  • 當然,更多的情況是,我們會面臨缺乏資料的情況,我們可以通過生成模型來補足。比如,用在半監督學習中;

  • 可以輸出多模(multimodal)結果;

  • 以及很多的一些現實的需要生成模型的問題(比如,看到一個美女的背影,猜她正面是否會讓你失望……)

接下來的幾頁幻燈片給出了一些實際的應用,比如預測影片的下一幀、去除馬賽克、神筆馬良等等……

生成模型是如何工作的?GAN 跟其它模型比較有哪些優勢?

該怎麼創造生成模型呢?這涉及到概率領域一個方法:最大似然估計。

大家都知道,一組相互獨立事件的同時發生概率是:

而現實生活中,我們可能並不知道每個 P(概率分佈模型)到底是什麼,我們已知的是我們可以觀測到的源資料。所以,最大似然估計就是這種給定了觀察資料以評估模型引數(也就是估計出分佈模型應該是怎樣的)的方法。

比如,如果校長想調查全校同學的成績,假如這個校長很懶但是統計學得很好的話,他會選擇通過取樣來估計一個靠譜的成績分佈。

首先,假設我們獨立取樣 X1,X2,......Xn 共 n 個同學的成績,並且是我們使用的是 f 模型,只是它的引數θ未知,那麼這個方程可表示為:

此刻,我們已知的是 X1......Xn,未知的是θ,那麼我們的似然就可以定義為:

兩邊取對數,得到:

log L(θ|x1...xn) 稱為對數似然,稱為平均對數似然。那麼最大的平均對數似然就是:

這就是幻燈片中那個公式的含義。

接下來幾頁幻燈片介紹了整個生成模型的大家族。

大家都同根於最大似然玩法,但是有著顯隱密度的區分。大多數你們聽過的強大的生成模型都需要用到馬爾可夫鏈,而 GAN 是目前唯一一種直接從資料觀測的一步到位的生成模型。(後面會講具體原因。)

比如 Fully Visible Belief Nets 就用到了典型的顯性密度鏈:

P(X1) 類似於一個先驗概率,然後每往後一個數據的概率都是基於前面的已知資料的條件概率。最終得到整個模型的分佈。但它的缺點也很明顯:對於 N 個數據點,你得跑 N 次。也就是,這是個 O(n) 的演算法。

同理,還有其它各種演算法,但那些不是本篇重點,在此不做贅述。

與它們不同的是,GAN 的特點是:

  • 使用了 latent code(用以表達 latent dimension、控制資料隱含關係等等);

  • 資料會逐漸統一;

  • 不需要馬爾可夫鏈;

  • 被認為可以生成最好的樣本(當然,ian 本人也說,這事兒沒法衡量什麼是「好」或「不好」)。

GAN是如何工作的?

要理解生成對抗模型(GAN),首先要知道生成對抗模型拆開來是兩個東西:一個是判別模型,一個是生成模型。

簡單打個比方就是:兩個人比賽,看是 A 的矛厲害,還是 B 的盾厲害。比如,我們有一些真實資料,同時也有一把亂七八糟的假資料。A 拼命地把隨手拿過來的假資料模仿成真實資料,並揉進真實資料裡。B 則拼命地想把真實資料和假資料區分開。

這裡,A 就是一個生成模型,類似於賣假貨的,一個勁兒地學習如何騙過 B。而 B 則是一個判別模型,類似於警察叔叔,一個勁兒地學習如何分辨出 A 的騙人技巧。

如此這般,隨著 B 的鑑別技巧的越來越牛,A 的騙人技巧也是越來越純熟。

一個造假一流的 A,就是我們想要的生成模型!

這裡就是我們的生成模型了。如圖所示,它把噪聲資料 z(也就是我們說的假資料)通過生成模型 G,偽裝成了真實資料 x。(當然,因為 GAN 依舊是一個神經網路,你的生成模型需要是可微的(differentiable))

訓練的過程也非常直觀,你可以選擇任何類 SGD 的方法(因為 A 和 B 兩個競爭者都是可微的網路)。並且你要同時訓練兩組資料:一組真實的訓練資料和一組由騙子 A 生成的資料。當然,你也可以一組訓練每跑一次時,另一組則跑 K 次,這樣可以防止其中一個跟不上節奏。

同樣,既然要用類 SGD 優化,我們就需要一個目標函式(objective function)來判斷和監視學習的成果。在這裡,J(D) 代表判別網路(也就是警察 B)的目標函式——一個交叉熵(cross entropy)函式。其中左邊部分表示 D 判斷出 x 是真 x 的情況,右邊部分則表示 D 判別出的由生成網路 G(也就是騙子)把噪音資料 z 給偽造出來的情況。

這樣,同理,J(G) 就是代表生成網路的目標函式,它的目的是跟 D 反著幹,所以前面加了個負號(類似於一個 Jensen-Shannon(JS)距離的表示式)。

這其實就是我們熟悉的最小最大博弈(minimax game):兩個人的零和博弈,一個想最大,另一個想最小。那麼,我們要找的均衡點(也就是納什均衡)就是 J(D) 的鞍點(saddle point)。

對這個過程的更直觀解釋是這樣的:

如圖所示,我們手上有真實資料(黑色點,data)和模型生成的偽資料(綠色線,model distribution,是由我們的 z 對映過去的)(畫成波峰的形式是因為它們都代表著各自的分佈,其中縱軸是分佈,橫軸是我們的 x)。而我們要學習的 D 就是那條藍色的點線,這條線的目的是把融在一起的 data 和 model 分佈給區分開。寫成公式就是 data 和 model 分佈相加做分母,分子則是真實的 data 分佈。

我們最終要達到的效果是:D 無限接近於常數 1/2。換句話說就是要 Pmodel 和 Pdata 無限相似。這個時候,我們的 D 分佈再也沒法分辨出真偽資料的區別了。這時候,我們就可以說我們訓練出了一個爐火純青的造假者(生成模型)。

於是,最終我們得到的應該是如下圖的結果:

藍色斷點線是一條常數線(1/2),黑色與綠色完美重合了。

但是,這也是有問題的:我們的生成模型跟源資料擬合之後就沒法再繼續學習了(因為常數線 y = 1/2 求導永遠為 0)。

為了解決這個問題,除了把兩者對抗做成最小最大博弈,還可以把它寫成非飽和(Non-Saturating)博弈:

也就是說用 G 自己的偽裝成功率來表示自己的目標函式(不再是直接拿 J(D) 的負數)。這樣的話,我們的均衡就不再是由損失(loss)決定的了。J(D) 跟 J(G) 沒有簡單粗暴的相互繫結,就算在 D 完美了以後,G 還可以繼續被優化。

在應用上,這套 GAN 理論最火的構架是 DCGAN(深度卷積生成對抗網路/Deep Convolutional Generative Adversarial Network)。熟悉卷積神經網路(CNN)的同學對此應該不會陌生,這其實就是一個反向的 CNN。

卷積神經網路的原理是用一個叫做 convolutinoal filter(卷積過濾器,類似於濾鏡)的東西把圖片過濾(轉化)成各種樣式(就好像美圖軟體裡面的濾鏡效果)。很多這樣的濾鏡就可以把圖片變成很多種樣式。我們假設這些樣式是原圖片各種不同的特徵表達(比如,黑白濾鏡可以把圖片變黑白,讓你可以看出更多彩色世界裡關注不到的重點;邊緣虛化濾鏡是把圖片虛化,你也許又能看到不同的端倪。一層層這樣跑下去,你就會得到原圖片的各種非常詳盡的特徵表達。注意:這個濾鏡也不是人選的,而是被慢慢學習到的,不用你操心)。

相反,DCGAN目的是創造圖片,其實就類似於把一組特徵值慢慢恢復成一張圖片。

所以兩者的比較就是:在每一個濾鏡層,CNN是把大圖片的重要特徵提取出來,一步一步地減小圖片尺寸。而DCGAN是把小圖片(小陣列)的特徵放大,並排列成新圖片。這裡,作為DCGAN的輸入的最初的那組小資料就是我們剛剛講的噪聲資料。

下面幾頁幻燈片給出了一些案例效果。

因為圖片本身就是個 RGB 的矩陣,所以我們甚至可以通過向量加減來得到一些有趣的運算結果:

戴墨鏡的男人 - 不戴墨鏡的男人 + 不戴墨鏡的女人 = 戴墨鏡的女人

熟悉 NLP 的同學可能發現了,這就很像 word2vec 裡面的:king - man + woman = queen。做個向量/矩陣加減並不難,難的是把加減後得到的向量/矩陣還原成「圖義」上代表的圖片。在 NLP 中,word2vec 是把向量對應到有意義的詞;在這裡,DCGAN 是把矩陣對應到有意義的圖片。

剛剛我們講了 J(G) 的兩種方法,它們給 GAN 帶來了兩種不同的求解方式。

除了以上提到的兩種書寫 J(G) 的方法,最近的幾篇論文又提出了一些新觀點。熟悉統計學科的同學應該都知道,說到 JS 距離(也就是剛剛在 minimax 處提到的),就會想到 KL 距離;它們都是統計學科中常用的散度(divergence)方程。

散度方程是我們用來創造目標函式的基礎。

GAN 作為一個全由神經網路構造並通過類 SGD 方法優化的模型,目標函式的選擇是至關重要的。Ian 給我們展示了一下選擇好的散度方程(並轉化成 GAN 所需的目標函式)的重要性:

這裡,Q 指的是我們手頭噪音資料的分佈,P 指的是需要找尋的目標分佈。

首先,我們要知道的是,求最大似然(Maximum Likelihood)可以被看作是使 KL 距離最小化的方法。怎麼解釋?你自己化簡一下 KL 公式就能知道:

其中 P、Q 都以 x 為變數;並且 P 是真實資料分類,

因此是個常數,

之中也只有(logQ)部分是變數,於是我們把公式化簡成:

即正比於-logQ。

在嚴肅的表示中,Q 應該寫為 P(x|θ);其中 P 是模型,θ是引數,那麼,原式也就是一個負的最大似然(詳見前面的相應部分)。

不管是 KL(Q || P) 還是 KL(P || Q),它們寫出來都是一種類 Maximal Likelihood(最大似然)的表達形式。我們會把這類 G 的目標函式的書寫方法算作一類。其實,在最近的各種論文中也提出,其實我們可以用類 GAN 的演算法來最小化任何 f-divergence 方程。

但是,在之後的幾篇論文中,很多學者(包括 Ian 本人)都提到,使用 KL(Q || P) 更能模擬出我們所面臨的情景。而本質上講,標準的 Maximum Likelihood 思維寫出來就應該是 KL(P || Q) 的形式。

這是什麼意思呢?這個過程與解釋比較複雜,高階玩家可以閱讀 GoodFellow 2016 年的新論文,我這裡給大家用簡單的語言來說明一下:

首先,不管是 Q 在前還是 P 在前,面對無限多的資料的時候,我們都可以最終學到完美符合我們心聲的真實資料分佈 P。但是問題就在於,現實生活中,我們拿到的資料是有限的。我們的學習過程可能不能持續到最後模型完美的時刻。所以這裡,區別就出現了:根據 KL 公式的理論意義,KL(P || Q) 裡的 Q 是用來擬合真實資料 P 的,它會極大地想要解釋全部 P 的內涵(overgeneralization)。這時候,遇到多模態(multimodal)的情況(比如一張圖中的雙峰,羞羞),KL(P || Q) 會想要最大地覆蓋兩座峰。如果此時資料並不夠多,它會在覆蓋到一半的路上就停了下來。

相反,KL(Q || P) 是一種 undergeneralization 的情況。一個被優化的 Q 一般會先想著去覆蓋一個比較大的峰,有空了再去看另一個峰。

再換句話說,它們倆一個是激進派一個是保守派。而因為我們資料是有限的,在複雜的社會環境下,保守派能確保至少算出來的那一部分是靠譜的,而激進派卻容易犯錯。

先不管 Q 和 P 誰前誰後,我們都把我們 G 的目標函式改造成解最大似然的形式:

此時對 J(G) 求導,得到的就是一個最大似然表達形式。(為什麼要求導?請自行搜尋 SGD(隨機梯度下降))

以上我們講到的三種生成模型目標函式的方法,效果比較如下:

其中,還是 Maximal Likelihood 最像香港記者,跑得最快。

GAN 不光可以用來生成(復刻)樣本,還可以被轉型成強化學習模型(Reinforcement Learning)

關於這方面,上海交大的 SeqGAN [Yu et al. 2016] 也是一片很有趣的論文,有興趣的同學可以閱讀。

以上便是這篇教程的前半部分內容,主要是講解了生成模型和 GAN 的一些理論知識。而後半部分則從實際運用中的技巧開始,延伸到了這個門類發展的前沿,並探索了 GAN 與其它演算法結合的可能。

Tips and Tricks 實戰技巧

第一個技巧是把資料標籤給 GAN

雖然 GAN 是一種無監督演算法。但是,如果要想提高訓練學習的效果,有點標籤還是會有很大的幫助的。也就是說,學習一個條件概率 p(y|x) 遠比一個單獨的 p(x) 容易得多。

實際運用中,我們可以只需要一部分有標籤資料(如果有的話)就能大幅提升 GAN 的訓練效果;我們稱之為半監督(semi-supervising)。當然,要注意的是,如果我們用了半監督學習,我們的資料就有三類了:真實無標籤資料、有標籤資料和由噪音資料生成的資料。它們互相之間是不能混的。同時,我們的目標函式也成了監督方法和無監督方法的結合。

跟其它機器學習演算法一樣,如果我們給了 GAN 一些有標籤的資料,這些標籤最好是平滑(smooth)過的,也就是說把要麼是 0 要麼是 1 的離散標籤變成更加平滑的 0.1 和 0.9 等等。

然而,這樣又會造成一些數學問題。因為,如果我們的真實資料被標註為 0.9(alpha),假資料被標註為 0.1(beta),那麼我們最優的判別函式就會被寫成如下圖所示的樣式。大家發現問題了嗎?這個式子的分子不純潔了,混進了以 beta 為係數的假資料分佈。所以,對於假資料,我們還是建議保留標籤為 0。一個平滑,另一個不平滑,也就稱為 one-sided label smoothing(單邊標籤平滑)。

標籤平滑化有很多好處,特別對於 GAN 而言,這能讓判別函式不會給出太大的梯度訊號(gradient signal),也能防止演算法走向極端樣本的陷阱。

第二個技巧是 Batch Norm

Batch Norm 的意思就是說,取「一批」資料,把它們給規範化(normalise)一下(減平均值,除以標準差)。它的作用就不用說了:讓資料更集中,不用擔心太大或者太小的資料,也讓學習效率更高。

不過直接用 batch norm 也有問題的。同一批(batch)裡面的資料太過相似,對一個無監督的 GAN 而言,很容易被帶偏而誤認為它們這些資料都是一樣的。也就是說,最終的生成模型的結果會混著同一個 batch 裡好多其它特徵。這不是我們想要的形式。

所以,我們可以使用 Reference Batch Norm:

取出一批資料(固定的)當作我們的參照資料集 R。然後把新的資料 batch 都依據 R 的平均值和標準差來做規範化。

這個方法也有一些問題:如果 R 取得不好,效果也不會好。或者,資料可能被 R 搞得過擬合。換句話說:我們最後生成的資料可能又都變得跟 R 很像。

所以,再進階一點,我們可以使用 Virtual Batch Norm

這裡,我們依舊是取出 R,但是所有的新資料 x 做規範化的時候,我們把 x 也加入到 R 中形成一個新的 virtual batch V。並用這個 V 的平均值和標準差來標準化 x。這樣就能極大減少 R 的風險。

第三個技巧:平衡好 G 和 D

通常,在對抗網路中,判別模型 D 會贏。並且在實際中,D 也比 G 會深很多。Ian 建議大家不要太擔心 D 會變得太聰明,我們可以用下面這些方法來達到效果最大化:

  • 就像之前說的,使用非飽和(non-saturating)博弈來寫目標函式,保證 D 學完之後,G 還可以繼續學習;

  • 使用標籤平滑化。

研究前沿

GAN 依舊面臨著幾大問題。

問題 1:不收斂

現在 GAN 面臨的最大問題就是不穩定,很多情況下都無法收斂(non-convergence)。原因是我們使用的優化方法很容易只找到一個區域性最優點,而不是全域性最優點。或者,有些演算法根本就沒法收斂。

模式崩潰(mode collapse)就是一種無法收斂的情況,這在 Ian 2014 年的首篇論文中就被提及了。比如,對於一個最小最大博弈的問題,我們把最小(min)還是最大(max)放在內迴圈?這個有點像剛剛說的 reverse KL 和 maximum likelihood 的區別(激進派和保守派)。minmax V(G,D) 不等於 maxmin V(G,D)。如果 maxD 放在內圈,演算法可以收斂到應該有的位置,如果 minG 放在內圈,演算法就會一股腦地撲向其中一個聚集區,而不會看到全域性分佈。

大家覺得這個特性是不是跟我們上面提到的什麼東西有點像?對咯,就是 reverse KL!