生成對抗網(wǎng)絡(luò)初學(xué)入門:一文讀懂GAN的基本原理(附資源)
生成對抗網(wǎng)絡(luò)是現(xiàn)在人工智能領(lǐng)域的當(dāng)紅技術(shù)之一。近日,Sigmoidal.io 的博客發(fā)表了一篇入門級介紹文章,對 GAN 的原理進(jìn)行了解釋說明。另外,在該文章的最后還附帶了一些能幫助初學(xué)者自己上手開發(fā)實(shí)驗(yàn)的資源(包含演講、教程、代碼和論文),其中部分資源機(jī)器之心也曾有過報(bào)道或解讀,讀者可訪問對應(yīng)鏈接查閱。
你怎么教一臺(tái)從未見過人臉的機(jī)器學(xué)會(huì)繪出人臉?計(jì)算機(jī)可以存儲(chǔ)拍字節(jié)級的照片,但它卻不知道怎樣一堆像素組合才具有與人類外表相關(guān)的含義。
多年以來,已經(jīng)出現(xiàn)了很多各種各樣旨在解決這一問題的生成模型。它們使用了各種不同的假設(shè)來建模數(shù)據(jù)的基本分布,有的假設(shè)太強(qiáng),以至于根本不實(shí)用。
對于我們目前的大多數(shù)任務(wù)來說,這些方法的結(jié)果僅僅是次優(yōu)的。使用隱馬爾可夫模型生成的文本顯得很笨拙,而且可以預(yù)料;變分自編碼器生成的圖像很模糊,而且盡管這種方法的名字里面有「變」,但生成的圖像卻缺乏變化。所有這些缺陷都需要一種全新的方法來解決,而這樣的方法最近已經(jīng)誕生了。
在這篇文章中,我們將對生成對抗網(wǎng)絡(luò)(GAN)背后的一般思想進(jìn)行全面的介紹,并向你展示一些主要的架構(gòu)以幫你很好地開始學(xué)習(xí),另外我們還將提供一些有用的技巧,可以幫你顯著改善你的結(jié)果。
GAN 的發(fā)明
生成模型的基本思想是輸入一個(gè)訓(xùn)練樣本集合,然后形成這些樣本的概率分布的表征。常用的生成模型方法是直接推斷其概率密度函數(shù)。
在我第一次學(xué)習(xí)生成模型時(shí),我就禁不住想:既然我們已經(jīng)有如此多的真實(shí)訓(xùn)練樣本了,為什么還要麻煩地做這種事呢?答案很有說服力,這里給出了幾個(gè)需要優(yōu)秀生成模型的可能的應(yīng)用:
- 模擬實(shí)驗(yàn)的可能結(jié)果,降低成本,加速研究
- 使用預(yù)測出的未來狀態(tài)來規(guī)劃行動(dòng)——比如「知道」道路下一時(shí)刻狀況的 GAN
- 生成缺失的數(shù)據(jù)和標(biāo)簽——我們常常缺乏格式正確的規(guī)整數(shù)據(jù),而這會(huì)導(dǎo)致過擬合
- 高質(zhì)量語音生成
- 自動(dòng)提升照片的質(zhì)量(圖像超分辨率)
2014 年,Ian Goodfellow 及其蒙特利爾大學(xué)的同事引入了生成對抗網(wǎng)絡(luò)(GAN)。這是一種學(xué)習(xí)數(shù)據(jù)的基本分布的全新方法,讓生成出的人工對象可以和真實(shí)對象之間達(dá)到驚人的相似度。
GAN 背后的思想非常直觀:生成器和鑒別器兩個(gè)網(wǎng)絡(luò)彼此博弈。生成器的目標(biāo)是生成一個(gè)對象(比如人的照片),并使其看起來和真的一樣。而鑒別器的目標(biāo)就是找到生成出的結(jié)果和真實(shí)圖像之間的差異。
這張圖給出了生成對抗網(wǎng)絡(luò)的一個(gè)大致概覽。目前最重要的是要理解 GAN 差不多就是把兩個(gè)網(wǎng)絡(luò)放到一起工作的方法——生成器和鑒別器都有它們自己的架構(gòu)。要更好地理解這種思想的根源,我們需要回憶一些基本的代數(shù)知識(shí)并且問我們自己一個(gè)問題:如果一個(gè)網(wǎng)絡(luò)分類圖像的能力比大多數(shù)人還好,那么我們該怎么欺騙它?
對抗樣本
在我們詳細(xì)描述 GAN 之前,我們先看看一個(gè)有些近似的主題。給定一個(gè)訓(xùn)練后的分類器,我們能生成一個(gè)能騙過該網(wǎng)絡(luò)的樣本嗎?如果我們可以,那看起來又會(huì)如何?
事實(shí)證明,我們可以。
不僅如此,對于幾乎任何給定的圖像分類器,都可以通過圖像變形的方式,在新圖像看起來和原圖像基本毫無差別的情況下,讓網(wǎng)絡(luò)得到有很高置信度的錯(cuò)誤分類結(jié)果!這個(gè)過程被稱為對抗攻擊(adversarial attack),而這種生成方式的簡單性能夠給 GAN 提供很多解釋。
對抗樣本(adversarial example)是指經(jīng)過精心計(jì)算得到的旨在誤導(dǎo)分類器的樣本。下圖是這一過程的一個(gè)示例。左邊的熊貓所屬的分類就和右邊的不一樣——右邊的圖被分類為了長臂猿。
圖片來自:Goodfellow, 2017
圖像分類器本質(zhì)上是高維空間中的一個(gè)復(fù)雜的決策邊界。當(dāng)然,在涉及到圖像分類時(shí),我們沒法畫出這樣的邊界線。但我們可以肯定地假設(shè),當(dāng)訓(xùn)練完成后,得到的網(wǎng)絡(luò)無法泛化到所有的圖像上——只能用于那些在訓(xùn)練集中的圖像。這樣的泛化很可能不能很好地近似真實(shí)情況。換句話說,它與我們的數(shù)據(jù)過擬合了——而我們可以利用這一點(diǎn)。
讓我們首先向圖像加入一些隨機(jī)噪聲,并且確保噪聲非常接近于 0。我們可以通過控制噪聲的 L2 范數(shù)來實(shí)現(xiàn)這一點(diǎn)。你不用擔(dān)心 L2 范數(shù)這個(gè)數(shù)學(xué)概念,對于大多數(shù)實(shí)際應(yīng)用而言,你可以將其看作是一個(gè)向量的長度。這里的訣竅是你的圖像中的像素越多,其平均 L2 范數(shù)就越大。所以,如果你的噪聲的范數(shù)足夠低,你就可以認(rèn)為它在視覺上是不可感知的;但是在向量空間中,加入噪聲的圖像可以與原始圖像相距非常遠(yuǎn)。
為什么會(huì)這樣呢?
如果 H×W 的圖像是一個(gè)向量,那么我們加入其中的 H×W 噪聲也是一個(gè)向量。原始圖像有各種各樣相當(dāng)密集的顏色——這會(huì)增加 L2 范數(shù)。另一方面,噪聲則從視覺上看起來是一張混亂的而且相當(dāng)蒼白的圖像——一個(gè)小范數(shù)的向量。最后我們將它們加到一起,得到的受損圖像看起來和原圖像很接近,但卻會(huì)被錯(cuò)誤地分類!
現(xiàn)在,如果原始類別「狗」的決策邊界沒有那么遠(yuǎn)(在 L2 范數(shù)角度來看),那么增加的這點(diǎn)噪聲會(huì)將新的圖像帶到?jīng)Q策邊界之外。
你不需要成為世界級的拓?fù)鋵W(xué)家,也能理解特定類別的流形或決策邊界。因?yàn)槊繌垐D像只是高維空間中的一個(gè)向量,在它們之上訓(xùn)練的分類器就是將「所有猴子」定義為「這個(gè)用隱含參數(shù)描述的高維 blob(二進(jìn)制大對象)中的所有向量」。我們將這個(gè) blob 稱為該類別的決策邊界。
好了,也就是說我們可以通過添加隨機(jī)噪聲來輕松欺騙網(wǎng)絡(luò)。那生成新圖像還必須做什么?
生成器和鑒別器
現(xiàn)在我們已經(jīng)簡單了解了對抗樣本,我們離 GAN 只有一步之遙了!那么,如果我們前面部分描述的分類器網(wǎng)絡(luò)是為二分類(真和加)設(shè)計(jì)的呢?根據(jù) Goodfellow 等人那篇原始論文的說法,我們稱之為鑒別器(Discriminator)。
現(xiàn)在讓我們增加一個(gè)網(wǎng)絡(luò),讓其可以生成會(huì)讓鑒別器錯(cuò)誤分類為「真」的圖像。這個(gè)過程和我們在對抗樣本部分使用的過程完全一樣。這個(gè)網(wǎng)絡(luò)稱為生成器(Generator)。對抗訓(xùn)練這個(gè)過程為其賦予了一些迷人的特性。
在訓(xùn)練的每一步,鑒別器都要區(qū)分訓(xùn)練集和一些假樣本的圖像,這樣它區(qū)分真假的能力就越來越強(qiáng)。在統(tǒng)計(jì)學(xué)習(xí)理論中,這本質(zhì)上就意味著學(xué)習(xí)到了數(shù)據(jù)的底層分布。
那當(dāng)鑒別器非常擅長識(shí)別真假時(shí),欺騙它能有什么好處呢?沒錯(cuò)!能用來學(xué)習(xí)以假亂真的贗品!
圖片來自:Goodfellow, 2016
有一個(gè)古老但睿智的數(shù)學(xué)結(jié)果最小最大定理(Minimax theorem)開啟了我們所知的博弈論的先河,其表明:對于零和博弈中的兩個(gè)玩家而言,最小最大解決方案與納什均衡是一樣的。
哇!這都說的啥!
簡單來說,當(dāng)兩個(gè)玩家(D 和 G)彼此競爭時(shí)(零和博弈),雙方都假設(shè)對方采取最優(yōu)的步驟而自己也以最優(yōu)的策略應(yīng)對(最小最大策略),那么結(jié)果就已經(jīng)預(yù)先確定了,玩家無法改變它(納什均衡)。
圖片來自:Goodfellow, 2017
所以,對于我們的網(wǎng)絡(luò)而言,這意味著如果我們訓(xùn)練它們足夠長時(shí)間,那么生成器將會(huì)學(xué)會(huì)如何從真實(shí)「分布」中采樣,這意味著它開始可以生成接近真實(shí)的圖像,同時(shí)鑒別器將無法將其與真實(shí)圖像區(qū)分開。
上手學(xué)習(xí)的最佳架構(gòu)
理論歸理論,當(dāng)涉及到實(shí)踐時(shí),尤其是在機(jī)器學(xué)習(xí)領(lǐng)域,很多東西就是沒法起效。幸運(yùn)的是,我們收集了一些有用的小點(diǎn)子,可以幫助得到更好的結(jié)果。在這篇文章中,我們將首先回顧一些經(jīng)典的架構(gòu),并提供一些相關(guān)鏈接。
1. 深度卷積生成對抗網(wǎng)絡(luò)(DCGAN)
在 GAN 的第一篇論文出來之后的大概一年時(shí)間里,訓(xùn)練 GAN 與其說是科學(xué),倒不如說是藝術(shù)——模型很不穩(wěn)定,需要大量調(diào)整才能工作。2015 年時(shí),Radford 等人發(fā)表了題為《使用深度卷積生成對抗網(wǎng)絡(luò)的無監(jiān)督表征學(xué)習(xí)(Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks)》的論文,描述了之后被稱為 DCGAN 的著名模型。
圖片來自:Radford et al., 2015
關(guān)于 DCGAN,最值得一提的是這個(gè)架構(gòu)在大多數(shù)情況下都是穩(wěn)定的。這是第一篇使用向量運(yùn)算描述生成器學(xué)習(xí)到的表征的固有性質(zhì)的論文:這與 Word2Vec 中的詞向量使用的技巧一樣,但卻是對圖像操作的!
圖片來自:Radford et al., 2015
DCGAN 是最簡單的穩(wěn)定可靠的模型,我們推薦從它開始上手。后面我們給出了一些訓(xùn)練和實(shí)現(xiàn)的有用技巧,并提供了代碼示例的鏈接。
2. 條件 GAN(Conditional GAN)
這是研究者提出的一種 GAN 的元架構(gòu)的擴(kuò)展,以便提升生成圖像的質(zhì)量,你也可以把它稱為一個(gè)小技巧,百分之百?zèng)]問題。其思想是,如果你的一些數(shù)據(jù)點(diǎn)有標(biāo)簽,你可以使用它們來構(gòu)建顯著的表征。這和你使用了哪種架構(gòu)無關(guān)——這個(gè)擴(kuò)展每次都是一樣的。你需要做的全部事情就是為其生成器添加另一個(gè)輸入。
圖片來自:Mirza, 2014
所以,現(xiàn)在又如何呢?現(xiàn)在假如你的模型可以生成各種各樣的動(dòng)物,但你其實(shí)喜歡貓?,F(xiàn)在你不再為生成器傳遞生成的噪聲然后期待有最好的結(jié)果,而是為第二個(gè)輸入增加一些標(biāo)簽,比如「貓」類別的 ID 或詞向量。在這種情況下,就說生成器是以預(yù)期輸入的類別為條件的。
訣竅和技巧
在真正實(shí)踐時(shí),你在上面讀到的描述可不夠用。只是介紹該算法的概況的教程也不行——通常他們的方法僅在用于演示的小數(shù)據(jù)集上才有效。在這篇文章中,我們的目標(biāo)是為你提供一整套能讓你自己上手研究 GAN 的工具,讓你能立馬開始自己開發(fā)炫酷的東西。
所以,你已經(jīng)實(shí)現(xiàn)了你自己的 GAN 或從 GitHub 上克隆了一個(gè)(說實(shí)話,這是我力挺的開發(fā)方式)。在哪種隨機(jī)梯度下降(SGD)的效果最好上,目前還不存在普遍共識(shí),所以最好就選擇你自己最喜歡的(我使用 Adam),并且在你實(shí)施長時(shí)間的訓(xùn)練之前要對學(xué)習(xí)率進(jìn)行仔細(xì)的調(diào)節(jié)——這可以節(jié)省你大量時(shí)間。一般的工作流程很簡單直接:
- 采樣訓(xùn)練樣本的一個(gè) minibatch,然后計(jì)算它們的鑒別器分?jǐn)?shù);
- 得到一個(gè)生成樣本 minibatch,然后計(jì)算它們的鑒別器分?jǐn)?shù);
- 使用這兩個(gè)步驟累積的梯度執(zhí)行一次更新。
應(yīng)該分開處理訓(xùn)練和生成的 minibatch,并且分別為不同的 batch 計(jì)算 batch norm,這是很關(guān)鍵,可以確保鑒別器有快速的初始訓(xùn)練。
有時(shí)候,當(dāng)生成器執(zhí)行一步時(shí),讓鑒別器執(zhí)行一步以上的效果更好。如果你的生成器在損失函數(shù)方面開始「獲勝」了,不妨試試這么做。
如果你在生成器中使用了 BatchNorm 層,這可能會(huì)導(dǎo)致 batch 之間出現(xiàn)很強(qiáng)的相關(guān)性,如下圖所示:
圖片來自:Goodfellow, 2016
基本而言,每一個(gè) batch 都會(huì)得到同樣的結(jié)果,其中只是稍微有些不同。你怎么防止這種情況發(fā)生?一種方法是預(yù)計(jì)算平均像素和標(biāo)準(zhǔn)差,然后每次都使用,但這常常會(huì)導(dǎo)致過擬合。作為替代,還有一種被稱為虛擬批歸一化(Virtual Batch Normalization)的妙招:在你開始訓(xùn)練之前預(yù)定義一個(gè) batch(讓我們稱其為 R),對于每一個(gè)新 batch X,都使用 R 和 X 的級聯(lián)來計(jì)算歸一化參數(shù)。
另一個(gè)有趣的技巧是從一個(gè)球體上采樣輸入噪聲,而不是從一個(gè)立方體上。我們可以通過控制噪聲向量的范數(shù)來近似地實(shí)現(xiàn)這一目標(biāo),但是從高維立方體上真正均勻地采樣會(huì)更好一點(diǎn)。
下一個(gè)訣竅是避免使用稀疏梯度,尤其是在生成器中。只需將特定的層換成它們對應(yīng)的「平滑」的類似層就可以了,比如:
- ReLU 換成 LeakyReLU
- 最大池化換成平均池化、卷積+stride
- Unpooling 換成去卷積
結(jié)論
在這篇文章中,我們解釋了生成對抗網(wǎng)絡(luò),并且給出了一些訓(xùn)練和實(shí)現(xiàn)的實(shí)用技巧。在下面的資源一節(jié)中,你可以找到一些 GAN 實(shí)現(xiàn),能幫你上手你自己的實(shí)驗(yàn)。
資源
演講
- Ian Goodfellow 在 NIPS 2016 的演講《生成對抗網(wǎng)絡(luò)》:參閱機(jī)器之心報(bào)道《獨(dú)家 | GAN 之父 NIPS 2016 演講現(xiàn)場直擊:全方位解讀生成對抗網(wǎng)絡(luò)的原理及未來》
- Ian Goodfellow 演講《對抗樣本和對抗訓(xùn)練》:https://www.youtube.com/watch?v=CIfsB_EYsVI
- Soumith Chintala 在 NIPS 2016 的演講《如何訓(xùn)練 GAN》:https://www.youtube.com/watch?v=X1mUN6dD8uE
教程
- 來自 O'Reilly 的全面教程《生成對抗網(wǎng)絡(luò)初學(xué)者》:https://www.oreilly.com/learning/generative-adversarial-networks-for-beginners
- 極簡教程,有很多可以發(fā)揮的空間:https://github.com/uclaacmai/Generative-Adversarial-Network-Tutorial
代碼庫
- TensorFlow 實(shí)現(xiàn) DCGAN:https://github.com/carpedm20/DCGAN-tensorflow
- PyTorch 實(shí)現(xiàn) DCGAN:https://github.com/pytorch/examples/tree/master/dcgan
- 使用條件 GAN 生成動(dòng)畫人物:https://github.com/m516825/Conditional-GAN
論文
- 生成對抗網(wǎng)絡(luò)(Generative Adversarial Networks):https://arxiv.org/abs/1406.2661)
- 使用深度卷積生成對抗網(wǎng)絡(luò)的無監(jiān)督表征學(xué)習(xí))Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks):https://arxiv.org/abs/1511.06434
- 條件生成對抗網(wǎng)絡(luò)(Conditional Generative Adversarial Nets):https://arxiv.org/abs/1411.1784
原文:https://sigmoidal.io/beginners-review-of-gan-architectures/
【本文是51CTO專欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)譯文,微信公眾號(hào)“機(jī)器之心( id: almosthuman2014)”】