GAN入門

姓名:王咫毅

學(xué)號(hào):19021211150

【嵌牛導(dǎo)讀】要說最近幾年在深度學(xué)習(xí)領(lǐng)域最火的莫過于生成對抗網(wǎng)絡(luò),即 Generative Adversarial Networks(GANs)了。它是 Ian Goodfellow 在 2014 年發(fā)表的,也是這四年來出現(xiàn)的各種 GAN 的變種的開山鼻祖了,下圖表示這四年來有關(guān) GAN 的論文的每個(gè)月發(fā)表數(shù)量,可以看出在 2014 年提出后到 2016 年相關(guān)的論文是比較少的,但是從 2016 年,或者是 2017 年到今年這兩年的時(shí)間,相關(guān)的論文是真的呈現(xiàn)井噴式增長。

【嵌牛鼻子】深度學(xué)習(xí) GAN

【嵌牛提問】如何實(shí)現(xiàn)一個(gè)簡單的GAN的網(wǎng)絡(luò)搭建?

【嵌牛正文】

轉(zhuǎn)載自:http://www.itdecent.cn/p/9835612d21af

image

那么,GAN 究竟是什么呢,它為何會(huì)成為這幾年這么火的一個(gè)研究領(lǐng)域呢?

GAN,即生成對抗網(wǎng)絡(luò),是一個(gè)生成模型,也是半監(jiān)督和無監(jiān)督學(xué)習(xí)模型,它可以在不需要大量標(biāo)注數(shù)據(jù)的情況下學(xué)習(xí)深度表征。最大的特點(diǎn)就是提出了一種讓兩個(gè)深度網(wǎng)絡(luò)對抗訓(xùn)練的方法。

目前機(jī)器學(xué)習(xí)按照數(shù)據(jù)集是否有標(biāo)簽可以分為三種,監(jiān)督學(xué)習(xí)、半監(jiān)督學(xué)習(xí)和無監(jiān)督學(xué)習(xí),發(fā)展最成熟,效果最好的目前還是監(jiān)督學(xué)習(xí)的方法,但是在數(shù)據(jù)集數(shù)量要求更多更大的情況下,獲取標(biāo)簽的成本也更加昂貴了,因此越來越多的研究人員都希望能夠在無監(jiān)督學(xué)習(xí)方面有更好的發(fā)展,而 GAN 的出現(xiàn),一來它是不太需要很多標(biāo)注數(shù)據(jù),甚至可以不需要標(biāo)簽,二來它可以做到很多事情,目前對它的應(yīng)用包括圖像合成、圖像編輯、風(fēng)格遷移、圖像超分辨率以及圖像轉(zhuǎn)換等。

比如字體的轉(zhuǎn)換,在zi2zi這個(gè)項(xiàng)目中,給出了對中文文字的字體的變換,效果如下圖所示,GAN 可以學(xué)習(xí)到不同字體,然后將其進(jìn)行變換。

zi2zi_examples

除了字體的學(xué)習(xí),還有對圖片的轉(zhuǎn)換,pix2pix就可以做到,其結(jié)果如下圖所示,分割圖變成真實(shí)照片,從黑白圖變成彩色圖,從線條畫變成富含紋理、陰影和光澤的圖等等,這些都是這個(gè) pix2pixGAN 實(shí)現(xiàn)的結(jié)果。

pix2pix_examples

CycleGAN則可以做到風(fēng)格遷移,其實(shí)現(xiàn)結(jié)果如下圖所示,真實(shí)照片變成印象畫,普通的馬和斑馬的互換,季節(jié)的變換等。

cycleGAN_examples

上述是 GAN 的一些應(yīng)用例子,接下來會(huì)簡單介紹 GAN 的原理以及其優(yōu)缺點(diǎn),當(dāng)然也還有為啥等它提出兩年后才開始有越來越多的 GAN 相關(guān)的論文發(fā)表。

1. 基本原理

GAN 的思想其實(shí)非常簡單,就是生成器網(wǎng)絡(luò)和判別器網(wǎng)絡(luò)的彼此博弈。

GAN 主要就是兩個(gè)網(wǎng)絡(luò)組成,生成器網(wǎng)絡(luò)(Generator)和判別器網(wǎng)絡(luò)(Discriminator),通過這兩個(gè)網(wǎng)絡(luò)的互相博弈,讓生成器網(wǎng)絡(luò)最終能夠?qū)W習(xí)到輸入數(shù)據(jù)的分布,這也就是 GAN 想達(dá)到的目的--學(xué)習(xí)輸入數(shù)據(jù)的分布。其基本結(jié)構(gòu)如下圖所示,從下圖可以更好理解G 和 D 的功能,分別為:

D 是判別器,負(fù)責(zé)對輸入的真實(shí)數(shù)據(jù)和由 G 生成的假數(shù)據(jù)進(jìn)行判斷,其輸出是 0 和 1,即它本質(zhì)上是一個(gè)二值分類器,目標(biāo)就是對輸入為真實(shí)數(shù)據(jù)輸出是 1,對假數(shù)據(jù)的輸入,輸出是 0;

G 是生成器,它接收的是一個(gè)隨機(jī)噪聲,并生成圖像。

在訓(xùn)練的過程中,G 的目標(biāo)是盡可能生成足夠真實(shí)的數(shù)據(jù)去迷惑 D,而 D 就是要將 G 生成的圖片都辨別出來,這樣兩者就是互相博弈,最終是要達(dá)到一個(gè)平衡,也就是納什均衡。

image

2. 優(yōu)點(diǎn)

(以下優(yōu)點(diǎn)和缺點(diǎn)主要來自 Ian Goodfellow 在 Quora 上的回答,以及知乎上的回答)

GAN 模型只用到了反向傳播,而不需要馬爾科夫鏈

訓(xùn)練時(shí)不需要對隱變量做推斷

理論上,只要是可微分函數(shù)都可以用于構(gòu)建 D 和 G ,因?yàn)槟軌蚺c深度神經(jīng)網(wǎng)絡(luò)結(jié)合做深度生成式模型

G 的參數(shù)更新不是直接來自數(shù)據(jù)樣本,而是使用來自 D 的反向傳播

相比其他生成模型(VAE、玻爾茲曼機(jī)),可以生成更好的生成樣本

GAN 是一種半監(jiān)督學(xué)習(xí)模型,對訓(xùn)練集不需要太多有標(biāo)簽的數(shù)據(jù);

沒有必要遵循任何種類的因子分解去設(shè)計(jì)模型,所有的生成器和鑒別器都可以正常工作

3. 缺點(diǎn)

可解釋性差,生成模型的分布Pg(G)沒有顯式的表達(dá)

比較難訓(xùn)練, D 與 G 之間需要很好的同步,例如 D 更新 k 次而 G 更新一次

訓(xùn)練 GAN 需要達(dá)到納什均衡,有時(shí)候可以用梯度下降法做到,有時(shí)候做不到.我們還沒有找到很好的達(dá)到納什均衡的方法,所以訓(xùn)練 GAN 相比 VAE 或者 PixelRNN 是不穩(wěn)定的,但我認(rèn)為在實(shí)踐中它還是比訓(xùn)練玻爾茲曼機(jī)穩(wěn)定的多.

它很難去學(xué)習(xí)生成離散的數(shù)據(jù),就像文本

相比玻爾茲曼機(jī),GANs 很難根據(jù)一個(gè)像素值去猜測另外一個(gè)像素值,GANs 天生就是做一件事的,那就是一次產(chǎn)生所有像素,你可以用 BiGAN 來修正這個(gè)特性,它能讓你像使用玻爾茲曼機(jī)一樣去使用 Gibbs 采樣來猜測缺失值

訓(xùn)練不穩(wěn)定,G 和 D 很難收斂;

訓(xùn)練還會(huì)遭遇梯度消失、模式崩潰的問題

缺乏比較有效的直接可觀的評估模型生成效果的方法

3.1 為什么訓(xùn)練會(huì)出現(xiàn)梯度消失和模式奔潰

GAN 的本質(zhì)就是 G 和 D 互相博弈并最終達(dá)到一個(gè)納什平衡點(diǎn),但這只是一個(gè)理想的情況,正常情況是容易出現(xiàn)一方強(qiáng)大另一方弱小,并且一旦這個(gè)關(guān)系形成,而沒有及時(shí)找到方法平衡,那么就會(huì)出現(xiàn)問題了。而梯度消失和模式奔潰其實(shí)就是這種情況下的兩個(gè)結(jié)果,分別對應(yīng) D 和 G 是強(qiáng)大的一方的結(jié)果。

首先對于梯度消失的情況是D 越好,G 的梯度消失越嚴(yán)重,因?yàn)?G 的梯度更新來自 D,而在訓(xùn)練初始階段,G 的輸入是隨機(jī)生成的噪聲,肯定不會(huì)生成很好的圖片,D 會(huì)很容易就判斷出來真假樣本,也就是 D 的訓(xùn)練幾乎沒有損失,也就沒有有效的梯度信息回傳給 G 讓 G 去優(yōu)化自己。這樣的現(xiàn)象叫做 gradient vanishing,梯度消失問題。

其次,對于模式奔潰(mode collapse)問題,主要就是 G 比較強(qiáng),導(dǎo)致 D 不能很好區(qū)分出真實(shí)圖片和 G 生成的假圖片,而如果此時(shí) G 其實(shí)還不能完全生成足夠真實(shí)的圖片的時(shí)候,但 D 卻分辨不出來,并且給出了正確的評價(jià),那么 G 就會(huì)認(rèn)為這張圖片是正確的,接下來就繼續(xù)這么輸出這張或者這些圖片,然后 D 還是給出正確的評價(jià),于是兩者就是這么相互欺騙,這樣 G 其實(shí)就只會(huì)輸出固定的一些圖片,導(dǎo)致的結(jié)果除了生成圖片不夠真實(shí),還有就是多樣性不足的問題。

更詳細(xì)的解釋可以參考令人拍案叫絕的Wasserstein GAN,這篇文章更詳細(xì)解釋了原始 GAN 的問題,主要就是出現(xiàn)在 loss 函數(shù)上。

3.2 為什么GAN不適合處理文本數(shù)據(jù)

文本數(shù)據(jù)相比較圖片數(shù)據(jù)來說是離散的,因?yàn)閷τ谖谋緛碚f,通常需要將一個(gè)詞映射為一個(gè)高維的向量,最終預(yù)測的輸出是一個(gè)one-hot向量,假設(shè) softmax 的輸出是(0.2, 0.3, 0.1,0.2,0.15,0.05),那么變?yōu)?onehot是(0,1,0,0,0,0),如果softmax輸出是(0.2, 0.25, 0.2, 0.1,0.15,0.1 ),one-hot 仍然是(0, 1, 0, 0, 0, 0),所以對于生成器來說,G 輸出了不同的結(jié)果, 但是 D 給出了同樣的判別結(jié)果,并不能將梯度更新信息很好的傳遞到 G 中去,所以 D 最終輸出的判別沒有意義。

GAN 的損失函數(shù)是 JS 散度,JS 散度不適合衡量不想交分布之間的距離。(WGAN 雖然使用 wassertein 距離代替了 JS 散度,但是在生成文本上能力還是有限,GAN 在生成文本上的應(yīng)用有 seq-GAN,和強(qiáng)化學(xué)習(xí)結(jié)合的產(chǎn)物)

3.3 為什么GAN中的優(yōu)化器不常用SGD

SGD 容易震蕩,容易使 GAN 的訓(xùn)練更加不穩(wěn)定,

GAN 的目的是在高維非凸的參數(shù)空間中找到納什均衡點(diǎn),GAN 的納什均衡點(diǎn)是一個(gè)鞍點(diǎn),但是 SGD 只會(huì)找到局部極小值,因?yàn)?SGD 解決的是一個(gè)尋找最小值的問題,但 GAN 是一個(gè)博弈問題。

對于鞍點(diǎn),來自百度百科的解釋是:

鞍點(diǎn)(Saddle point)在微分方程中,沿著某一方向是穩(wěn)定的,另一條方向是不穩(wěn)定的奇點(diǎn),叫做鞍點(diǎn)。在泛函中,既不是極大值點(diǎn)也不是極小值點(diǎn)的臨界點(diǎn),叫做鞍點(diǎn)。在矩陣中,一個(gè)數(shù)在所在行中是最大值,在所在列中是最小值,則被稱為鞍點(diǎn)。在物理上要廣泛一些,指在一個(gè)方向是極大值,另一個(gè)方向是極小值的點(diǎn)。

鞍點(diǎn)和局部極小值點(diǎn)、局部極大值點(diǎn)的區(qū)別如下圖所示:

局部極小值點(diǎn)和鞍點(diǎn)的對比

4. 訓(xùn)練的技巧

訓(xùn)練的技巧主要來自Tips and tricks to make GANs work。

1. 對輸入進(jìn)行規(guī)范化

將輸入規(guī)范化到 -1 和 1 之間

G 的輸出層采用Tanh激活函數(shù)

2. 采用修正的損失函數(shù)

在原始 GAN 論文中,損失函數(shù) G 是要

, 但實(shí)際使用的時(shí)候是采用

,作者給出的原因是前者會(huì)導(dǎo)致梯度消失問題。

但實(shí)際上,即便是作者提出的這種實(shí)際應(yīng)用的損失函數(shù)也是存在問題,即模式奔潰的問題,在接下來提出的 GAN 相關(guān)的論文中,就有不少論文是針對這個(gè)問題進(jìn)行改進(jìn)的,如 WGAN 模型就提出一種新的損失函數(shù)。

3. 從球體上采樣噪聲

不要采用均勻分布來采樣

從高斯分布中采樣得到隨機(jī)噪聲

當(dāng)進(jìn)行插值操作的時(shí)候,從大圓進(jìn)行該操作,而不要直接從點(diǎn) A 到 點(diǎn) B 直線操作,如下圖所示

image

更多細(xì)節(jié)可以參考 Tom White's 的論文Sampling Generative Networks以及代碼https://github.com/dribnet/plat

4. BatchNorm

采用 mini-batch BatchNorm,要保證每個(gè) mini-batch 都是同樣的真實(shí)圖片或者是生成圖片

不采用 BatchNorm 的時(shí)候,可以采用 instance normalization(對每個(gè)樣本的規(guī)范化操作)

可以使用虛擬批量歸一化(virtural batch normalization):開始訓(xùn)練之前預(yù)定義一個(gè) batch R,對每一個(gè)新的 batch X,都使用 R+X 的級(jí)聯(lián)來計(jì)算歸一化參數(shù)

5. 避免稀疏的梯度:Relus、MaxPool

稀疏梯度會(huì)影響 GAN 的穩(wěn)定性

在 G 和 D 中采用 LeakyReLU 代替 Relu 激活函數(shù)

對于下采樣操作,可以采用平均池化(Average Pooling) 和 Conv2d+stride 的替代方案

對于上采樣操作,可以使用 PixelShuffle(https://arxiv.org/abs/1609.05158), ConvTranspose2d + stride

6. 標(biāo)簽的使用

標(biāo)簽平滑。也就是如果有兩個(gè)目標(biāo)標(biāo)簽,假設(shè)真實(shí)圖片標(biāo)簽是 1,生成圖片標(biāo)簽是 0,那么對每個(gè)輸入例子,如果是真實(shí)圖片,采用 0.7 到 1.2 之間的一個(gè)隨機(jī)數(shù)字來作為標(biāo)簽,而不是 1;一般是采用單邊標(biāo)簽平滑

在訓(xùn)練 D 的時(shí)候,偶爾翻轉(zhuǎn)標(biāo)簽

有標(biāo)簽數(shù)據(jù)就盡量使用標(biāo)簽

7. 使用 Adam 優(yōu)化器

8. 盡早追蹤失敗的原因

D 的 loss 變成 0,那么這就是訓(xùn)練失敗了

檢查規(guī)范的梯度:如果超過 100,那出問題了

如果訓(xùn)練正常,那么 D loss 有低方差并且隨著時(shí)間降低

如果 g loss 穩(wěn)定下降,那么它是用糟糕的生成樣本欺騙了 D

9. 不要通過統(tǒng)計(jì)學(xué)來平衡 loss

10. 給輸入添加噪聲

給 D 的輸入添加人為的噪聲

http://www.inference.vc/instance-noise-a-trick-for-stabilising-gan-training/

https://openreview.net/forum?id=Hk4_qw5xe

給 G 的每層都添加高斯噪聲

11. 對于 Conditional GANs 的離散變量

使用一個(gè) Embedding 層

對輸入圖片添加一個(gè)額外的通道

保持 embedding 低維并通過上采樣操作來匹配圖像的通道大小

12 在 G 的訓(xùn)練和測試階段使用 Dropouts

以 dropout 的形式提供噪聲(50%的概率)

訓(xùn)練和測試階段,在 G 的幾層使用

https://arxiv.org/pdf/1611.07004v1.pdf

參考文章:

Goodfellow et al., “Generative Adversarial Networks”. ICLR 2014.

GAN系列學(xué)習(xí)(1)——前生今世

干貨 | 深入淺出 GAN·原理篇文字版(完整)

令人拍案叫絕的Wasserstein GAN

生成對抗網(wǎng)絡(luò)(GAN)相比傳統(tǒng)訓(xùn)練方法有什么優(yōu)勢?

the-gan-zoo

What-is-the-advantage-of-generative-adversarial-networks-compared-with-other-generative-models

What-are-the-pros-and-cons-of-using-generative-adversarial-networks-a-type-of-neural-network-Could-they-be-applied-to-things-like-audio-waveform-via-RNN-Why-or-why-not

Tips and tricks to make GANs work

作者:材才才

鏈接:http://www.itdecent.cn/p/9835612d21af

來源:簡書

著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

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

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

  • 本文大約 3800 字,閱讀大約需要 8 分鐘 要說最近幾年在深度學(xué)習(xí)領(lǐng)域最火的莫過于生成對抗網(wǎng)絡(luò),即 Gener...
    城市中迷途小書童閱讀 1,559評論 0 5
  • 保留初心,砥礪前行 這次并沒有標(biāo)題黨,說一文精通GAN什么的。因?yàn)楫吘筽aper才是基礎(chǔ)。以下內(nèi)容只是輔助作用,相...
    加勒比海鮮王閱讀 7,395評論 0 4
  • 3 GANs 如何工作? 我們現(xiàn)在已經(jīng)看過了幾種其他的生成式模型,并解釋了 GANs 與他們的不同原理。但是 GA...
    朱小虎XiaohuZhu閱讀 1,809評論 0 4
  • (轉(zhuǎn))生成對抗網(wǎng)絡(luò)(GANs)最新家譜:為你揭秘GANs的前世今生 生成對抗網(wǎng)絡(luò)(GAN)一...
    Eric_py閱讀 4,515評論 0 4
  • 以前以為多么重要的也在某得一刻放下一切,獨(dú)自離開。我沒想到放下一段感情那么難也那么容易。就在清明節(jié)那天埋藏了我們所...
    二貨說看見老鼠吃泡面閱讀 249評論 0 0

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