簡介
GAN的基本原理其實非常簡單,這里以生成圖片為例進行說明。假設我們有兩個網(wǎng)絡,G(Generator)和D(Discriminator)。正如名字那樣,生成網(wǎng)絡負責生成,辨別網(wǎng)絡負責分辨生成的質(zhì)量,然后不斷的生成與辨別,最后達到效果。GAN第一篇要看的paper當然是Ian Goodfellow大牛的Generative Adversarial Networks(arxiv:https://arxiv.org/abs/1406.2661),這篇paper算是這個領域的開山之作。當然GAN是誰最新發(fā)明的我們不做爭論。
生成與對抗
GAN在訓練過程中,生成網(wǎng)絡G的目標就是盡量生成真實的圖片去欺騙判別網(wǎng)絡D。而D的目標就是盡量把G生成的圖片和真實的圖片分別開來。這樣,G和D構(gòu)成了一個動態(tài)的“博弈過程”。
最后博弈的結(jié)果是什么?以圖片為例,在最理想的狀態(tài)下,G可以生成足以“以假亂真”的圖片G(z)。對于D來說,它難以判定G生成的圖片究竟是不是真實的,因此D(G(z)) = 0.5。但是實際訓練的時候這個狀態(tài)一般是不可達的。上面的過程使用數(shù)學公式來表達:

分析這個公式:
- 整個式子由兩項構(gòu)成。x表示真實輸入,z表示輸入G網(wǎng)絡的噪聲,而G(z)表示G網(wǎng)絡生成
- D(x)表示D網(wǎng)絡判斷真實圖片是否真實的概率(因為x就是真實的,所以對于D來說,這個值越接近1越好)。而D(G(z))是D網(wǎng)絡判斷G生成的圖片的是否真實的概率
- G的目的:上面提到過,D(G(z))是D網(wǎng)絡判斷G生成的圖片是否真實的概率,G應該希望自己生成的圖片“越接近真實越好”。也就是說,G希望D(G(z))盡可能得大,這時V(D, G)會變小。因此我們看到式子的最前面的記號是min_G(G在min的下面)
- D的目的:D的能力越強,D(x)應該越大,D(G(x))應該越小。這時V(D,G)會變大。因此式子對于D來說是求最大max_D(D在max的下面)
上面的過程使用圖來描述:

如何訓練GAN
首先看論文給出的方法:

尤其注意紅方框的標注,我們分為兩步:
- 首先訓練D,D是希望V(G, D)越大越好,所以是加上梯度(ascending)
- 然后訓練G時,V(G, D)越小越好,所以是減去梯度(descending),整個訓練過程交替進行
損失函數(shù)
這點有些許不同,以往的深度神經(jīng)網(wǎng)絡都是一個損失函數(shù)。但是GAN是類似于encoder-decoder模型,生成網(wǎng)絡一個損失函數(shù),對抗網(wǎng)絡一個損失函數(shù)。這兩個損失函數(shù)可以是一樣的,也可以分別定義成不同的函數(shù)。但是這兩個函數(shù)在訓練的時候會有一些問題:


可以提高訓練速度。在實際中還可以開始的學習率較高,訓練進行中,逐步減少學習率。
CNN與GAN的結(jié)合
在圖像領域我們知道CNN是最好的深度模型,所以早早的就有人做了嘗試,如:DCGAN是這方面最好的嘗試之一(論文地址:[1511.06434] Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks)
DCGAN的基本原理和GAN是一樣的,它只是把上述的G和D換成了兩個卷積神經(jīng)網(wǎng)絡(CNN)。但不是直接換就可以了,DCGAN對卷積神經(jīng)網(wǎng)絡的結(jié)構(gòu)做了一些改變,以提高樣本的質(zhì)量和收斂的速度,這些改變有:
- 取消所有pooling層。G網(wǎng)絡中使用轉(zhuǎn)置卷積(transposed convolutional layer)進行上采樣,D網(wǎng)絡中用加入stride的卷積代替pooling
- 在D和G中均使用batch normalization
- 去掉FC層,使網(wǎng)絡變?yōu)槿矸e網(wǎng)絡
- G網(wǎng)絡中使用ReLU作為激活函數(shù),最后一層使用tanh
- D網(wǎng)絡中使用LeakyReLU作為激活函數(shù)
至于為什么是這些改變,可以自己動手做一下實驗,看看效果,或許自己做的實驗改變的地方比論文還要好。而且現(xiàn)在的GAN網(wǎng)絡在隨機噪聲輸入方面,使用先驗的圖片,當然這也是跟GAN的任務有關。如果任務是一種風格的圖片到另外一種圖片的生成,那么預先的輸入就不是隨機噪聲,而是預先的風格圖片。
優(yōu)秀的GAN網(wǎng)絡
目前在圖像領域有幾個我關注比較優(yōu)秀的GAN項目如下:
CycleGAN
CycleGAN可謂是大名鼎鼎,風靡一時。項目:https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix
CycleGAN是非結(jié)對的訓練,訓練集分為兩個集合,A和B訓練過程可以是A->B,也可以是B->A。不論哪一種,結(jié)果都是可以互轉(zhuǎn)的。例如A集合可以是線條的貓圖畫,B集合是實物貓的圖片,那么訓練完成之后,就可以將手繪的貓圖片轉(zhuǎn)成真實的貓圖片。StyleGAN
項目:https://github.com/NVlabs/stylegan
StyleGAN是一種圖像生成器,取決于你的輸入。然后可以在生成的lacent space上修改向量方向,最后達到編輯圖片的效果??梢跃庉媹D片的嘴部笑、年齡、性別等等。pix2pixHD
項目:https://github.com/NVIDIA/pix2pixHD
pix2pixHD是pix2pix改進超級加強版,有些效果與CycleGAN相似。但是pix2pixHD是結(jié)對訓練的,必須要一一對應的數(shù)據(jù)。pix2pixHD的代碼結(jié)構(gòu)與CycleGAN的代碼都是相似的。其實在CycleGAN中就有pix2pix模型的訓練代碼,可以說他們是出自一波人之手。CycleGAN的作者Jun-Yan Zhu也是pix2pix和pix2pixHD的核心參與者。
GAN論文與代碼實現(xiàn)
- GAN論文匯總,包含code:zhangqianhui/AdversarialNetsPapers