GAN原理,優缺點、應用總結

Candy_GL發表於2018-07-20

轉自:https://blog.csdn.net/qq_25737169/article/details/78857724

GAN原理,優缺點、應用總結


本文已投稿至微信公眾號–機器學習演算法全棧工程師,歡迎關注

 

 

 

1.GAN的 ‘前世’?

大家都知道GAN是Ian Goodfellow 2 014年放出的一篇開山之作,在深度學習界評價很高,可以說GAN的出現,給深度學習界帶來了很多的研究(shui)課(lun)題(wen)。但是如果說GAN是另外一種網路的變種,不知道你是否相信呢?但是有一個人是堅信不疑的,這個人就是德國AI科學家Jürgen Schmidhuber,說到這個人可能很多人不太瞭解,畢竟不是像Hinton Yoshua bengio, Yan lecun這樣出名的人,事實上他對AI界做出了很大的貢獻,LSTM就是他在97年發明的。其本人照片如下:

640?wx_fmt=png&wxfrom=5&wx_lazy=1

OK!Jürgen Schmidhuber之所以認為GAN是其他模型的變種,主要他在92年提出了一種PM(Predictability Minimization)模型,其與GAN有一些相似之處(起碼他自己這樣認為),所以他一直認為GAN是goodfellow在自己PM模型上的改進。他92年提出的PM模型才是“第一個對抗網路”,而GAN跟PM的主要差別僅僅在於方向反過來了,可以把GAN名字改成“inverse PM”,即反過來的PM。並且多次與goodfellow郵件往來說明這個問題,毫無疑問得到了goodfellow的否決。事情甚至發展到Jürgen Schmidhuber在2016NIPS大會上與goodfellow公開互懟。

事情是這樣子的:

2016NIPS大會上,goodfellow正在做GAN的tutorial,這時,Jürgen Schmidhuber打斷了演講,站起來首先介紹了一下自己92年提出的PM模型,其實就差直接闡明PM和GAN很相似,然後反問goodfellow,如何看待GAN和PM的相似點。

0?wx_fmt=png

外人看上去只是普通的一次提問或者辯證,但是goodfellow反應及其激烈,甚至都要發火了。原來早在GAN提出之後,他們兩人就已經互相往來郵件討論過這個問題,大概流程就是Jürgen Schmidhuber認為GAN是他的PM模型的演化,現在GAN那麼出名了,goodfellow應該承認PM對GAN的貢獻。Goodfellow當然說不,自己的成果平白無故被上了一個套,要誰誰也不幹,而且在本質上GAN和PM也有很大的不同。但是Jürgen Schmidhuber還是不死心,以至於事情鬧到了NIPS大會上,結果就是:

0?wx_fmt=png

可能是動了真怒,Goodfellow直接明說他們之前已經在郵件裡討論了這個問題,不想牽扯到NIPS大會上來做無意義的爭辯,最後結果就是goodfelllow的一番話贏得了在場大佬的多次掌聲。

題外話

Jürgen Schmidhuber已經五十多歲了,而且是Dalle Molle人工智慧研究所的聯席主任。他表示自己的早期研究常常被忽視,另外據網上傳言,LeCun教授在一封電子郵件中說道,“Jürgen太想得到大家的認可,每次別人講完話他都會站起來,說剛剛提出的東西有他的功勞,但是這種方式卻不是特別恰當。”

實際上,Jürgen Schmidhuber的確對人工智慧界做出了很大的貢獻,LSTM就是一個典型的例子。

 

接下來簡單介紹一下PM模型。可以用下圖來表示PM模型的原理,圖片來自鄭華濱的知乎文章,下文有關PM的部分均是從他的文章中總結而來,以簡單的文字形式來表述,詳情可參考連結:

https://zhuanlan.zhihu.com/p/27159510?utm_source=wechat_session&utm_medium=social

 

0?wx_fmt=png

 

圖片的左邊是一個自編碼器,自編碼器對輸入輸出重構,輸入資料經過編碼解碼後得到輸出資料,輸入輸出存在一個重構誤差,當重構誤差越小時,說明自編碼器中的隱藏層越能學習到表示資料的特徵,但是我們希望不僅能學習到特徵,而且希望學習到好的特徵,於是Jürgen Schmidhuber就提出了PM模型,如何衡量好的標準,假設自編碼器隱藏層學習到的特徵是三維的向量,每一維用c來表示,有人認為,當每一維的特徵向量是相互獨立即解耦的,說明特徵就很好,那麼Jürgen Schmidhuber就提出使用一個預測器f(PM中的P部分),f根據其中兩個維度的值去預測另外一個維度的值,如果預測的很準,說明他們C之間的獨立性就很差,解耦性不好,學習到的特徵不好,如果預測的很不準,說明編碼器學習到的特徵很好。既然這樣,可以通過一個損失函式

0?wx_fmt=png

建立編碼器和f預測能力之間的對抗,自編碼器希望得到很好的特徵表示,令c相互獨立,但是f希望預測的很準,預測的準就表示c的獨立性差,所以他們之間也有一種‘對抗’,然後通過對抗得到很好的特徵表示。

 

2.PM與GAN的區別:

 

乍一看或許他們兩個很相似,都有‘對抗’機制,實際上差別還是很大的。

首先,PM種的對抗只是相當於一種對獲得好的特徵表示的輔助,但是GAN的特點就是對抗訓練,對抗訓練是GAN 的主體。

其次,PM是從複雜分佈得到的解耦分佈做對抗,而GAN直接對複雜的原始分佈做處理,得到最後的判別,所以說GAN或許是inversePM。

再者,PM判別每一個資料的維度,而GAN最後的判別是一維的,即對與錯的程度(概率)。

而且PM的作用有限,擴充性不強,而GAN可以用在很多領域,擴充性更強。

我還是很支援GAN是原創的。

有關GAN前世就簡單介紹到這裡,下文介紹GAN本身的部分,包括GAN的特點,優缺點總結,常用的訓練tricks,以及GAN的一些改進成果,有基礎的可以直接跳過這一部分。本文的第三部分會介紹一些GAN的變種以及復現很好的GitHub程式碼連結,感興趣的可以看一下。在本文的第四部分,我會列舉一些GAN的應用,介紹其原理,同時附有github程式碼連結。

0?wx_fmt=png

 

 

2

首先,囉嗦一下什麼是GAN(Generative adversarial nets),中文是生成對抗網路,他是一種生成式模型,也是一種無監督學習模型。其最大的特點是為深度網路提供了一種對抗訓練的方式,此方式有助於解決一些普通訓練方式不容易解決的問題。並且Yan lecun明確表示GAN是近幾十年除了麵包機最偉大的發明,並且希望是自己發明的GAN。

 關於GAN的入門可以參考機器學習演算法全棧工程師公眾號之前的文章:GAN入門與實踐,裡面包含了GAN的入門介紹以及生成人臉圖片的實踐tensorflow程式碼。

 

1. GAN誕生背後的故事:

學術界流傳,GAN創始人 Ian Goodfellow 在酒吧微醉後與同事討論學術問題,當時靈光乍現提出了GAN初步的想法,不過當時並沒有得到同事的認可,在從酒吧回去後發現女朋友已經睡了,於是自己熬夜寫了程式碼,發現還真有效果,於是經過一番研究後,GAN就誕生了,一篇開山之作。附上一張大神照片。

0?wx_fmt=png

 Ian goodfellow

0?wx_fmt=png

 

2. GAN的原理:

GAN的主要靈感來源於博弈論中零和博弈的思想,應用到深度學習神經網路上來說,就是通過生成網路G(Generator)和判別網路D(Discriminator)不斷博弈,進而使G學習到資料的分佈,如果用到圖片生成上,則訓練完成後,G可以從一段隨機數中生成逼真的影象。G, D的主要功能是:

●  G是一個生成式的網路,它接收一個隨機的噪聲z(隨機數),通過這個噪聲生成影象 

●  D是一個判別網路,判別一張圖片是不是“真實的”。它的輸入引數是x,x代表一張圖片,輸出D(x)代表x為真實圖片的概率,如果為1,就代表100%是真實的圖片,而輸出為0,就代表不可能是真實的圖片

訓練過程中,生成網路G的目標就是儘量生成真實的圖片去欺騙判別網路D。而D的目標就是儘量辨別出G生成的假影象和真實的影象。這樣,G和D構成了一個動態的“博弈過程”,最終的平衡點即納什均衡點.

 

3. GAN的特點:

●  相比較傳統的模型,他存在兩個不同的網路,而不是單一的網路,並且訓練方式採用的是對抗訓練方式

●  GAN中G的梯度更新資訊來自判別器D,而不是來自資料樣本

 

4. GAN 的優點:

(以下部分摘自ian goodfellow 在Quora的問答)

●  GAN是一種生成式模型,相比較其他生成模型(玻爾茲曼機和GSNs)只用到了反向傳播,而不需要複雜的馬爾科夫鏈

●  相比其他所有模型, GAN可以產生更加清晰,真實的樣本

●  GAN採用的是一種無監督的學習方式訓練,可以被廣泛用在無監督學習和半監督學習領域

●  相比於變分自編碼器, GANs沒有引入任何決定性偏置( deterministic bias),變分方法引入決定性偏置,因為他們優化對數似然的下界,而不是似然度本身,這看起來導致了VAEs生成的例項比GANs更模糊

●  相比VAE, GANs沒有變分下界,如果鑑別器訓練良好,那麼生成器可以完美的學習到訓練樣本的分佈.換句話說,GANs是漸進一致的,但是VAE是有偏差的

●  GAN應用到一些場景上,比如圖片風格遷移,超解析度,影象補全,去噪,避免了損失函式設計的困難,不管三七二十一,只要有一個的基準,直接上判別器,剩下的就交給對抗訓練了。

 

5. GAN的缺點:

●  訓練GAN需要達到納什均衡,有時候可以用梯度下降法做到,有時候做不到.我們還沒有找到很好的達到納什均衡的方法,所以訓練GAN相比VAE或者PixelRNN是不穩定的,但我認為在實踐中它還是比訓練玻爾茲曼機穩定的多

●  GAN不適合處理離散形式的資料,比如文字

●  GAN存在訓練不穩定、梯度消失、模式崩潰的問題(目前已解決)


模式崩潰(model collapse)原因

一般出現在GAN訓練不穩定的時候,具體表現為生成出來的結果非常差,但是即使加長訓練時間後也無法得到很好的改善。

具體原因可以解釋如下:GAN採用的是對抗訓練的方式,G的梯度更新來自D,所以G生成的好不好,得看D怎麼說。具體就是G生成一個樣本,交給D去評判,D會輸出生成的假樣本是真樣本的概率(0-1),相當於告訴G生成的樣本有多大的真實性,G就會根據這個反饋不斷改善自己,提高D輸出的概率值。但是如果某一次G生成的樣本可能並不是很真實,但是D給出了正確的評價,或者是G生成的結果中一些特徵得到了D的認可,這時候G就會認為我輸出的正確的,那麼接下來我就這樣輸出肯定D還會給出比較高的評價,實際上G生成的並不怎麼樣,但是他們兩個就這樣自我欺騙下去了,導致最終生成結果缺失一些資訊,特徵不全。

關於梯度消失的問題可以參考鄭華濱的令人拍案叫絕的wassertein GAN,裡面給出了詳細的解釋,不過多重複。

0?wx_fmt=png區域性極小值點

0?wx_fmt=jpeg

鞍點

 


為什麼GAN中的優化器不常用SGD

1. SGD容易震盪,容易使GAN訓練不穩定,

2. GAN的目的是在高維非凸的引數空間中找到納什均衡點,GAN的納什均衡點是一個鞍點,但是SGD只會找到區域性極小值,因為SGD解決的是一個尋找最小值的問題,GAN是一個博弈問題。

 


為什麼GAN不適合處理文字資料

1. 文字資料相比較圖片資料來說是離散的,因為對於文字來說,通常需要將一個詞對映為一個高維的向量,最終預測的輸出是一個one-hot向量,假設softmax的輸出是(0.2, 0.3, 0.1,0.2,0.15,0.05)那麼變為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輸出了不同的結果但是D給出了同樣的判別結果,並不能將梯度更新資訊很好的傳遞到G中去,所以D最終輸出的判別沒有意義。

2. 另外就是GAN的損失函式是JS散度,JS散度不適合衡量不想交分佈之間的距離。

(WGAN雖然使用wassertein距離代替了JS散度,但是在生成文字上能力還是有限,GAN在生成文字上的應用有seq-GAN,和強化學習結合的產物)

 


訓練GAN的一些技巧

1. 輸入規範化到(-1,1)之間,最後一層的啟用函式使用tanh(BEGAN除外)

2. 使用wassertein GAN的損失函式,

3. 如果有標籤資料的話,儘量使用標籤,也有人提出使用反轉標籤效果很好,另外使用標籤平滑,單邊標籤平滑或者雙邊標籤平滑

4. 使用mini-batch norm, 如果不用batch norm 可以使用instance norm 或者weight norm

5. 避免使用RELU和pooling層,減少稀疏梯度的可能性,可以使用leakrelu啟用函式

6. 優化器儘量選擇ADAM,學習率不要設定太大,初始1e-4可以參考,另外可以隨著訓練進行不斷縮小學習率,

7. 給D的網路層增加高斯噪聲,相當於是一種正則

 


GAN的變種

自從GAN出世後,得到了廣泛研究,先後幾百篇不同的GANpaper橫空出世,國外有大神整理了一個GAN zoo(GAN動物園),連結如下,感興趣的可以參考一下:

https://github.com/hindupuravinash/the-gan-zoo

GitHub上已經1200+star了,順便附上一張GAN的成果圖,可見GAN的研究火熱程度:

0?wx_fmt=png

由於GAN的變種實在太多,這裡我只簡單介紹幾種比較常常用的成果,包括DCGAN,, WGAN, improved-WGAN,BEGAN,並附有詳細的程式碼github連結。

 


GAN的廣泛應用

1. GAN本身是一種生成式模型,所以在資料生成上用的是最普遍的,最常見的是圖片生成,常用的有DCGAN WGAN,BEGAN,個人感覺在BEGAN的效果最好而且最簡單。

2. GAN本身也是一種無監督學習的典範,因此它在無監督學習,半監督學習領域都有廣泛的應用,比較好的論文有

Improved Techniques for Training GANs

Bayesian GAN(最新)

Good Semi-supervised Learning

3. 不僅在生成領域,GAN在分類領域也佔有一席之地,簡單來說,就是替換判別器為一個分類器,做多分類任務,而生成器仍然做生成任務,輔助分類器訓練。

4. GAN可以和強化學習結合,目前一個比較好的例子就是seq-GAN

5. 目前比較有意思的應用就是GAN用在影象風格遷移,影象降噪修復,影象超解析度了,都有比較好的結果,詳見pix-2-pix GAN 和cycle GAN。但是GAN目前在視訊生成上和預測上還不是很好。

6. 目前也有研究者將GAN用在對抗性攻擊上,具體就是訓練GAN生成對抗文字,有針對或者無針對的欺騙分類器或者檢測系統等等,但是目前沒有見到很典範的文章。

注:配圖來自網路

 

參考文獻:

https://www.zhihu.com/question/56171002/answer/148593584

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

https://github.com/soumith/ganhacks

https://github.com/hindupuravinash/the-gan-zoo

https://zhuanlan.zhihu.com/p/25071913

 

後續連載。。

~敬請期待~

相關文章