簡介
GAN的基本原理其實(shí)非常簡單,這里以生成圖片為例進(jìn)行說明拧粪。假設(shè)我們有兩個(gè)網(wǎng)絡(luò)修陡,G(Generator)和D(Discriminator)。正如名字那樣可霎,生成網(wǎng)絡(luò)負(fù)責(zé)生成魄鸦,辨別網(wǎng)絡(luò)負(fù)責(zé)分辨生成的質(zhì)量,然后不斷的生成與辨別癣朗,最后達(dá)到效果号杏。GAN第一篇要看的paper當(dāng)然是Ian Goodfellow大牛的Generative Adversarial Networks(arxiv:https://arxiv.org/abs/1406.2661),這篇paper算是這個(gè)領(lǐng)域的開山之作斯棒。當(dāng)然GAN是誰最新發(fā)明的我們不做爭論盾致。
生成與對抗
GAN在訓(xùn)練過程中,生成網(wǎng)絡(luò)G的目標(biāo)就是盡量生成真實(shí)的圖片去欺騙判別網(wǎng)絡(luò)D荣暮。而D的目標(biāo)就是盡量把G生成的圖片和真實(shí)的圖片分別開來庭惜。這樣,G和D構(gòu)成了一個(gè)動(dòng)態(tài)的“博弈過程”穗酥。
最后博弈的結(jié)果是什么护赊?以圖片為例惠遏,在最理想的狀態(tài)下,G可以生成足以“以假亂真”的圖片G(z)骏啰。對于D來說节吮,它難以判定G生成的圖片究竟是不是真實(shí)的,因此D(G(z)) = 0.5判耕。但是實(shí)際訓(xùn)練的時(shí)候這個(gè)狀態(tài)一般是不可達(dá)的透绩。上面的過程使用數(shù)學(xué)公式來表達(dá):
分析這個(gè)公式:
- 整個(gè)式子由兩項(xiàng)構(gòu)成。x表示真實(shí)輸入壁熄,z表示輸入G網(wǎng)絡(luò)的噪聲帚豪,而G(z)表示G網(wǎng)絡(luò)生成
- D(x)表示D網(wǎng)絡(luò)判斷真實(shí)圖片是否真實(shí)的概率(因?yàn)閤就是真實(shí)的,所以對于D來說草丧,這個(gè)值越接近1越好)狸臣。而D(G(z))是D網(wǎng)絡(luò)判斷G生成的圖片的是否真實(shí)的概率
- G的目的:上面提到過,D(G(z))是D網(wǎng)絡(luò)判斷G生成的圖片是否真實(shí)的概率昌执,G應(yīng)該希望自己生成的圖片“越接近真實(shí)越好”烛亦。也就是說,G希望D(G(z))盡可能得大懂拾,這時(shí)V(D, G)會變小此洲。因此我們看到式子的最前面的記號是min_G(G在min的下面)
- D的目的:D的能力越強(qiáng),D(x)應(yīng)該越大委粉,D(G(x))應(yīng)該越小呜师。這時(shí)V(D,G)會變大。因此式子對于D來說是求最大max_D(D在max的下面)
上面的過程使用圖來描述:
如何訓(xùn)練GAN
首先看論文給出的方法:
尤其注意紅方框的標(biāo)注贾节,我們分為兩步:
- 首先訓(xùn)練D汁汗,D是希望V(G, D)越大越好,所以是加上梯度(ascending)
- 然后訓(xùn)練G時(shí)栗涂,V(G, D)越小越好知牌,所以是減去梯度(descending),整個(gè)訓(xùn)練過程交替進(jìn)行
損失函數(shù)
這點(diǎn)有些許不同斤程,以往的深度神經(jīng)網(wǎng)絡(luò)都是一個(gè)損失函數(shù)角寸。但是GAN是類似于encoder-decoder
模型,生成網(wǎng)絡(luò)一個(gè)損失函數(shù)忿墅,對抗網(wǎng)絡(luò)一個(gè)損失函數(shù)扁藕。這兩個(gè)損失函數(shù)可以是一樣的,也可以分別定義成不同的函數(shù)疚脐。但是這兩個(gè)函數(shù)在訓(xùn)練的時(shí)候會有一些問題:
可以提高訓(xùn)練速度框全。在實(shí)際中還可以開始的學(xué)習(xí)率較高察绷,訓(xùn)練進(jìn)行中,逐步減少學(xué)習(xí)率津辩。
CNN與GAN的結(jié)合
在圖像領(lǐng)域我們知道CNN是最好的深度模型拆撼,所以早早的就有人做了嘗試,如:DCGAN是這方面最好的嘗試之一(論文地址:[1511.06434] Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks)
DCGAN的基本原理和GAN是一樣的喘沿,它只是把上述的G和D換成了兩個(gè)卷積神經(jīng)網(wǎng)絡(luò)(CNN)闸度。但不是直接換就可以了,DCGAN對卷積神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)做了一些改變蚜印,以提高樣本的質(zhì)量和收斂的速度莺禁,這些改變有:
- 取消所有pooling層。G網(wǎng)絡(luò)中使用轉(zhuǎn)置卷積(transposed convolutional layer)進(jìn)行上采樣窄赋,D網(wǎng)絡(luò)中用加入stride的卷積代替pooling
- 在D和G中均使用batch normalization
- 去掉FC層哟冬,使網(wǎng)絡(luò)變?yōu)槿矸e網(wǎng)絡(luò)
- G網(wǎng)絡(luò)中使用ReLU作為激活函數(shù),最后一層使用tanh
- D網(wǎng)絡(luò)中使用LeakyReLU作為激活函數(shù)
至于為什么是這些改變忆绰,可以自己動(dòng)手做一下實(shí)驗(yàn)浩峡,看看效果,或許自己做的實(shí)驗(yàn)改變的地方比論文還要好错敢。而且現(xiàn)在的GAN網(wǎng)絡(luò)在隨機(jī)噪聲輸入方面翰灾,使用先驗(yàn)的圖片,當(dāng)然這也是跟GAN的任務(wù)有關(guān)稚茅。如果任務(wù)是一種風(fēng)格的圖片到另外一種圖片的生成纸淮,那么預(yù)先的輸入就不是隨機(jī)噪聲,而是預(yù)先的風(fēng)格圖片亚享。
優(yōu)秀的GAN網(wǎng)絡(luò)
目前在圖像領(lǐng)域有幾個(gè)我關(guān)注比較優(yōu)秀的GAN項(xiàng)目如下:
CycleGAN
CycleGAN可謂是大名鼎鼎萎馅,風(fēng)靡一時(shí)。項(xiàng)目:https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix
CycleGAN是非結(jié)對的訓(xùn)練虹蒋,訓(xùn)練集分為兩個(gè)集合糜芳,A和B訓(xùn)練過程可以是A->B飒货,也可以是B->A。不論哪一種峭竣,結(jié)果都是可以互轉(zhuǎn)的塘辅。例如A集合可以是線條的貓圖畫,B集合是實(shí)物貓的圖片皆撩,那么訓(xùn)練完成之后扣墩,就可以將手繪的貓圖片轉(zhuǎn)成真實(shí)的貓圖片。StyleGAN
項(xiàng)目:https://github.com/NVlabs/stylegan
StyleGAN是一種圖像生成器扛吞,取決于你的輸入呻惕。然后可以在生成的lacent space
上修改向量方向,最后達(dá)到編輯圖片的效果滥比⊙谴啵可以編輯圖片的嘴部笑、年齡盲泛、性別等等濒持。pix2pixHD
項(xiàng)目:https://github.com/NVIDIA/pix2pixHD
pix2pixHD是pix2pix改進(jìn)超級加強(qiáng)版,有些效果與CycleGAN相似寺滚。但是pix2pixHD是結(jié)對訓(xùn)練的柑营,必須要一一對應(yīng)的數(shù)據(jù)。pix2pixHD的代碼結(jié)構(gòu)與CycleGAN的代碼都是相似的村视。其實(shí)在CycleGAN中就有pix2pix模型的訓(xùn)練代碼官套,可以說他們是出自一波人之手。CycleGAN的作者Jun-Yan Zhu也是pix2pix
和pix2pixHD
的核心參與者蚁孔。
GAN論文與代碼實(shí)現(xiàn)
- GAN論文匯總虏杰,包含code:zhangqianhui/AdversarialNetsPapers