GAN - 生成對抗網(wǎng)絡

簡介

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ù)學公式來表達:


分析這個公式:

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

上面的過程使用圖來描述:


如何訓練GAN

首先看論文給出的方法:


尤其注意紅方框的標注,我們分為兩步:

  1. 首先訓練D,D是希望V(G, D)越大越好,所以是加上梯度(ascending)
  2. 然后訓練G時,V(G, D)越小越好,所以是減去梯度(descending),整個訓練過程交替進行

損失函數(shù)

這點有些許不同,以往的深度神經(jīng)網(wǎng)絡都是一個損失函數(shù)。但是GAN是類似于encoder-decoder模型,生成網(wǎng)絡一個損失函數(shù),對抗網(wǎng)絡一個損失函數(shù)。這兩個損失函數(shù)可以是一樣的,也可以分別定義成不同的函數(shù)。但是這兩個函數(shù)在訓練的時候會有一些問題:

在訓練的初期,G 想要騙過 D,變化十分的緩慢,而上面的函數(shù),趨勢和下面的是一樣的,都是遞減的。但是它的優(yōu)勢是在 D(x) 接近 0 的時候,梯度很大,有利于訓練,在 D(x) 越來越大之后,梯度減小,這也很符合實際,在初期應該訓練速度更快,到后期速度減慢。于是優(yōu)化修改的損失函數(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ì)量和收斂的速度,這些改變有:

  1. 取消所有pooling層。G網(wǎng)絡中使用轉(zhuǎn)置卷積(transposed convolutional layer)進行上采樣,D網(wǎng)絡中用加入stride的卷積代替pooling
  2. 在D和G中均使用batch normalization
  3. 去掉FC層,使網(wǎng)絡變?yōu)槿矸e網(wǎng)絡
  4. G網(wǎng)絡中使用ReLU作為激活函數(shù),最后一層使用tanh
  5. 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也是pix2pixpix2pixHD的核心參與者。

GAN論文與代碼實現(xiàn)

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容