?譯者 | 朱先忠
審校 | 孫淑娟
紅葡萄園(作者:Vincent van Gogh)
據(jù)《紐約時(shí)報(bào)》報(bào)道,數(shù)據(jù)中心90%的能源被浪費(fèi),這是因?yàn)楣臼占拇蟛糠謹(jǐn)?shù)據(jù)從未被分析或以任何形式使用。更具體地說(shuō),這被稱為“暗數(shù)據(jù)(Dark Data)”。
“暗數(shù)據(jù)”是指通過(guò)各種計(jì)算機(jī)網(wǎng)絡(luò)操作獲取的數(shù)據(jù),但不以任何方式用于得出見(jiàn)解或進(jìn)行決策。組織收集數(shù)據(jù)的能力可能超過(guò)其分析數(shù)據(jù)的吞吐量。在某些情況下,組織甚至可能不知道正在收集數(shù)據(jù)。IBM估計(jì),大約90%的傳感器和模數(shù)轉(zhuǎn)換產(chǎn)生的數(shù)據(jù)從未被使用?!S基百科上的“暗數(shù)據(jù)”定義
從機(jī)器學(xué)習(xí)的角度來(lái)看,這些數(shù)據(jù)對(duì)于得出任何見(jiàn)解都沒(méi)有用處的關(guān)鍵原因之一是缺乏標(biāo)簽。這使得無(wú)監(jiān)督學(xué)習(xí)算法對(duì)于挖掘這些數(shù)據(jù)的潛力非常有吸引力。
生成對(duì)抗網(wǎng)絡(luò)
2014年,Ian Goodfello等人提出了一種通過(guò)對(duì)抗過(guò)程估計(jì)生成模型的新方法。它涉及同時(shí)訓(xùn)練兩個(gè)獨(dú)立的模型:一個(gè)生成器模型試圖建模數(shù)據(jù)分布,另一個(gè)鑒別器試圖通過(guò)生成器將輸入分類為訓(xùn)練數(shù)據(jù)或假數(shù)據(jù)。
該論文在現(xiàn)代機(jī)器學(xué)習(xí)領(lǐng)域樹(shù)立了一塊非常重要的里程碑,為無(wú)監(jiān)督學(xué)習(xí)開(kāi)辟了新的途徑。2015年,深度卷積Radford等人發(fā)布的??GAN論文??通過(guò)應(yīng)用卷積網(wǎng)絡(luò)的原理成功地生成了2D圖像,從而繼續(xù)構(gòu)建了論文中的這一思想。
通過(guò)本文,我試圖解釋上述論文中論述的關(guān)鍵組件,并使用PyTorch框架來(lái)實(shí)現(xiàn)它們。
GAN哪些地方引人注目?
為了理解GAN或DCGAN(深度卷積生成對(duì)抗網(wǎng)絡(luò):Deep Convolutional Generative Adversarial Networks)的重要性,首先讓我們來(lái)了解一下是什么使它們?nèi)绱肆餍小?/p>
1. 由于大部分真實(shí)數(shù)據(jù)未標(biāo)記,GAN的無(wú)監(jiān)督學(xué)習(xí)特性使其非常適合此類用例。
2. 生成器和鑒別器對(duì)于具有有限標(biāo)記數(shù)據(jù)的用例起到非常好的特征提取器的作用,或者生成附加數(shù)據(jù)以改進(jìn)二次模型訓(xùn)練,因?yàn)樗鼈兛梢陨杉贅颖径皇鞘褂迷鰪?qiáng)技術(shù)。
3. GANs提供了最大似然技術(shù)的替代方法。它們的對(duì)抗性學(xué)習(xí)過(guò)程和非啟發(fā)式成本函數(shù)使得它們對(duì)強(qiáng)化學(xué)習(xí)非常有吸引力。
4. 關(guān)于GAN的研究非常有吸引力,其結(jié)果引起了關(guān)于ML/DL影響的廣泛爭(zhēng)論。例如,Deepfake是GAN的一種應(yīng)用,它可以將人的面部覆蓋在目標(biāo)人身上,這在本質(zhì)上是非常有爭(zhēng)議的,因?yàn)樗锌赡鼙挥糜谛皭旱哪康摹?/p>
5. 最后一點(diǎn)也是最重要的一點(diǎn)是,使用這種網(wǎng)絡(luò)很酷,該領(lǐng)域的所有新研究都令人著迷。
整體架構(gòu)
深度卷積GAN的架構(gòu)
正如我們前面所討論的,我們將通過(guò)DCGAN進(jìn)行工作,DCGAN試圖實(shí)現(xiàn)GAN的核心思想,用于生成逼真圖像的卷積網(wǎng)絡(luò)。
DCGAN由兩個(gè)獨(dú)立的模型組成:一個(gè)生成器(G)嘗試將隨機(jī)噪聲向量建模為輸入并嘗試學(xué)習(xí)數(shù)據(jù)分布以生成假樣本,另一個(gè)鑒別器(D)獲取訓(xùn)練數(shù)據(jù)(真實(shí)樣本)和生成的數(shù)據(jù)(假樣本),并嘗試對(duì)它們進(jìn)行分類。這兩種模型之間的斗爭(zhēng)就是我們所說(shuō)的對(duì)抗性訓(xùn)練過(guò)程,一方的損失是另一方的利益。
生成器
生成器架構(gòu)圖
生成器是我們最感興趣的部分,因?yàn)樗且粋€(gè)生成假圖像以試圖欺騙鑒別器的生成器。
現(xiàn)在,讓我們更詳細(xì)地了解一下生成器的架構(gòu)。
- 線性層:將噪聲矢量輸入到完全連接層中,然后將其輸出變形為4D張量。
- 批量歸一化層:通過(guò)將輸入歸一化為零均值和單位方差來(lái)穩(wěn)定學(xué)習(xí),這避免了梯度消失或爆炸等訓(xùn)練問(wèn)題,并允許梯度流過(guò)網(wǎng)絡(luò)。
- 上采樣層:根據(jù)我對(duì)論文的解釋,其中提到使用上采樣(upsampling),然后在其上應(yīng)用簡(jiǎn)單的卷積層,而不是使用卷積轉(zhuǎn)置層進(jìn)行上采樣。但我見(jiàn)過(guò)一些人使用卷積轉(zhuǎn)置,所以具體應(yīng)用策略由你自己作決定。
- 二維卷積層:當(dāng)我們對(duì)矩陣進(jìn)行上采樣時(shí),我們以1的步長(zhǎng)將其通過(guò)卷積層,并使用相同的填充,使其能夠從上采樣數(shù)據(jù)中學(xué)習(xí)。
- ReLU層:本文提到使用ReLU代替LeakyReLU作為生成器,因?yàn)樗试S模型快速飽和并覆蓋訓(xùn)練分布的顏色空間。
- TanH激活層:本文建議我們使用TanH激活函數(shù)來(lái)計(jì)算生成器輸出,但沒(méi)有詳細(xì)說(shuō)明為什么。如果我們不得不作一下猜測(cè)的話,這是因?yàn)門anH的性質(zhì)允許模型更快收斂。
其中,層2至層5構(gòu)成核心生成器塊,可以重復(fù)N次以獲得所需的輸出圖像形狀。
下面是我們?nèi)绾卧赑yTorch中實(shí)現(xiàn)它的關(guān)鍵代碼(完整源碼見(jiàn)地址https://github.com/akash-agni/ReadThePaper/blob/main/DCGAN/dcgan.py)。
使用PyTorch框架的生成器實(shí)現(xiàn)關(guān)鍵代碼
鑒別器
鑒別器架構(gòu)圖
從圖中易見(jiàn),鑒別器更像是一個(gè)圖像分類網(wǎng)絡(luò),只是做了一些小的調(diào)整。例如,它沒(méi)有使用任何池層進(jìn)行下采樣,而是使用了一種稱為跨距卷積層(stride convolutional layer)的特殊卷積層,允許它學(xué)習(xí)自己的下采樣。
下面,讓我們更詳細(xì)地了解一下鑒別器架構(gòu)。
- Concat層:該層將假圖像和真實(shí)圖像組合在一個(gè)批次中,以提供給鑒別器,但這也可以單獨(dú)完成,僅用于獲得生成器損耗。
- 卷積層:我們?cè)谶@里使用跨距卷積(stride convolution),它允許我們?cè)谝淮斡?xùn)練中對(duì)圖像進(jìn)行下采樣并學(xué)習(xí)濾波器。
- LeakyReLU層:正如論文所提到的,與原始GAN論文的最大輸出函數(shù)相比,它發(fā)現(xiàn)Leakyrelus對(duì)于鑒別器非常有用,因?yàn)樗试S更容易的訓(xùn)練。
- Dropout層:僅用于訓(xùn)練,有助于避免過(guò)度擬合。該模型有記憶真實(shí)圖像數(shù)據(jù)的傾向,在這一點(diǎn)上訓(xùn)練可能崩潰,因?yàn)殍b別器不能再被生成器“愚弄”了。
- 批量歸一化層:論文提到,它在每個(gè)鑒別器塊(第一個(gè)除外)的末尾應(yīng)用批量歸一化。論文提到的原因是,在每個(gè)層上應(yīng)用批量歸一化會(huì)導(dǎo)致樣本振蕩和模型不穩(wěn)定。
- 線性層:一個(gè)完全連接層,從通過(guò)應(yīng)用的2D批次歸一化層中獲取一個(gè)重新定義形狀的向量。
- Sigmoid激活層:因?yàn)槲覀冋谔幚龛b別器輸出的二進(jìn)制分類,所以做出了Sigmoidd層邏輯選擇。
在該架構(gòu)中,層2至層5構(gòu)成鑒別器的核心塊,可以重復(fù)N次計(jì)算以使模型對(duì)于每個(gè)訓(xùn)練數(shù)據(jù)更復(fù)雜。
下面是我們?nèi)绾卧赑yTorch中實(shí)現(xiàn)它(完整源碼見(jiàn)地址https://github.com/akash-agni/ReadThePaper/blob/main/DCGAN/dcgan.py)。
用PyTorch實(shí)現(xiàn)的鑒別器關(guān)鍵代碼部分
對(duì)抗訓(xùn)練
我們訓(xùn)練鑒別器(D)以最大化將正確標(biāo)簽分配給訓(xùn)練樣本和來(lái)自生成器(G)的樣本的概率,這可以通過(guò)最小化log(D(x))來(lái)完成。我們同時(shí)訓(xùn)練G以最小化log(1 ? D(G(z))),其中z代表噪聲向量。換句話說(shuō),D和G都是使用值函數(shù)V (G, D)來(lái)玩以下兩人極小極大博弈(two-player minimax game):
對(duì)抗性成本函數(shù)計(jì)算公式
在實(shí)際應(yīng)用環(huán)境中,上述方程可能無(wú)法為G提供足夠的梯度來(lái)很好地學(xué)習(xí)。在學(xué)習(xí)的早期,當(dāng)G較差時(shí),D可以以高置信度拒絕樣本,因?yàn)樗鼈兣c訓(xùn)練數(shù)據(jù)明顯不同。在這種情況下,log(1 ? D(G(z)))函數(shù)達(dá)到飽和。我們不是訓(xùn)練G以最小化log(1 ? D(G(z))),而是訓(xùn)練G以最大化logD(G(z))。該目標(biāo)函數(shù)能夠生成動(dòng)態(tài)G和D的相同的固定點(diǎn),但在學(xué)習(xí)早期卻提供了更強(qiáng)的梯度計(jì)算。——??arxiv論文??
由于我們同時(shí)訓(xùn)練兩個(gè)模型,這可能會(huì)很棘手,而GAN是出了名的難以訓(xùn)練,我們將在后面討論的已知問(wèn)題之一稱為模式崩潰(mode collapse)。
論文建議使用學(xué)習(xí)率為0.0002的Adam優(yōu)化器,如此低的學(xué)習(xí)率表明GAN傾向于非??斓匕l(fā)散。它還使用值為0.5和0.999的一階和二階動(dòng)量來(lái)進(jìn)一步加速訓(xùn)練。模型初始化為正態(tài)加權(quán)分布,平均值為零,標(biāo)準(zhǔn)差為0.02。
下面展示的是我們?nèi)绾螢榇藢?shí)現(xiàn)一個(gè)訓(xùn)練循環(huán)(完整源碼見(jiàn)https://github.com/akash-agni/ReadThePaper/blob/main/DCGAN/dcgan.py)。
DCGAN的訓(xùn)練循環(huán)
模式崩潰(Mode Collapse)
理想情況下,我們希望生成器生成各種輸出。例如,如果它生成人臉,它應(yīng)該為每個(gè)隨機(jī)輸入生成一個(gè)新的人臉。但是,如果發(fā)生器產(chǎn)生足夠好的似是而非的輸出從而能夠欺騙鑒別器的話,它可能會(huì)一次又一次地產(chǎn)生相同的輸出。
最終,生成器會(huì)對(duì)單個(gè)鑒別器進(jìn)行過(guò)度優(yōu)化,并在一小組輸出結(jié)果之間旋轉(zhuǎn)(rotate),這種情況稱為“模式崩潰”。
以下方法可用于糾正該情況。
- Wasserstein損失函數(shù)法(Wasserstein loss):Wasserstin損失函數(shù)通過(guò)讓您將鑒別器訓(xùn)練到最優(yōu)而無(wú)需擔(dān)心梯度消失,從而減輕模式崩潰。如果鑒別器沒(méi)有陷入局部極小值,它會(huì)學(xué)習(xí)拒絕生成器穩(wěn)定的輸出。因此,生成器必須嘗試新的東西。
- 展開(kāi)GAN法(Unrolled GANs):展開(kāi)GAN使用生成器損失函數(shù),該函數(shù)不僅包含當(dāng)前鑒別器的分類,還包含未來(lái)鑒別器版本的輸出。因此,生成器不能針對(duì)單個(gè)鑒別器進(jìn)行過(guò)度優(yōu)化。
應(yīng)用
- 風(fēng)格轉(zhuǎn)換:面部修飾應(yīng)用程序現(xiàn)在都在大肆宣傳。其中,面部老化、哭臉和名人臉變形等只是當(dāng)前社交媒體上已經(jīng)廣泛流行的一部分應(yīng)用程序而已。
- 視頻游戲:3D對(duì)象的紋理生成和基于圖像的場(chǎng)景生成只是幫助視頻游戲行業(yè)更快開(kāi)發(fā)更大游戲的一部分應(yīng)用程序。
- 電影行業(yè):CGI(計(jì)算機(jī)合成圖像)已經(jīng)成為模型電影的一大組成部分,憑借GAN帶來(lái)的潛力,電影制作人現(xiàn)在可以實(shí)現(xiàn)比以往更大的夢(mèng)想。
- 語(yǔ)音生成:一些公司正在使用GAN來(lái)改進(jìn)文本到語(yǔ)音的應(yīng)用,通過(guò)使用它們來(lái)生成更真實(shí)的語(yǔ)音。
- 圖像恢復(fù):使用GANs對(duì)受損圖像進(jìn)行去噪和恢復(fù),對(duì)歷史圖像進(jìn)行著色,并通過(guò)生成缺失幀來(lái)改進(jìn)舊視頻,以提高幀率。
結(jié)論
總之,本文上面提到的有關(guān)GAN和DCGAN的論文簡(jiǎn)直稱的上是一篇里程碑式的論文,因?yàn)樗跓o(wú)監(jiān)督學(xué)習(xí)方面開(kāi)辟了一條新的途徑。其中提出的對(duì)抗式訓(xùn)練方法為訓(xùn)練模型提供了一種新的方法,該模型緊密模擬真實(shí)世界的學(xué)習(xí)過(guò)程。因此,了解一下這個(gè)領(lǐng)域是如何發(fā)展的將是一件非常有趣的事情。
最后,您可以在我的??GitHub源碼倉(cāng)庫(kù)??上找到本文示例工程完整的實(shí)現(xiàn)源碼。
譯者介紹
朱先忠,51CTO社區(qū)編輯,濰坊一所高校計(jì)算機(jī)教師,自由編程界老兵一枚。
原文標(biāo)題:??Implementing Deep Convolutional GAN??,作者:Akash Agnihotri