您當前的位置:首頁 > 動漫

GAN的理解與TF的實現

作者:由 想飛的石頭 發表于 動漫時間:2017-02-10

tf功能是什麼意思啊

前言

本文會從頭瞭解生成對抗式網路的一些內容,從生成式模型開始說起,到GAN的基本原理,InfoGAN,AC-GAN的基本科普,如果有任何有錯誤的地方,請隨時噴,我 剛開始研究GAN這塊的內容,希望和大家一起學習這塊內容。

生成式模型

何為生成式模型?在很多machine learning的教程或者公開課上,通常會把machine learning的演算法分為兩類: 生成式模型、判別式模型;其區別在於: 對於輸入x,類別標籤y,在生成式模型中估計其聯合機率分佈,而判別式模型估計其屬於某類的條件機率分佈。 常見的判別式模型包括:LogisticRegression, SVM, Neural Network等等,生成式模型包括:Naive Bayes, GMM, Bayesian Network, MRF 等等

研究生成式模型的意義

生成式模型的特性主要包括以下幾個方面:

在應用數學和工程方面,生成式模型能夠有效地表徵高維資料分佈;

生成式模型能夠作為一種技術手段輔助強化學習,能夠有效表徵強化學習模型中的state狀態(這裡不擴充套件,後面會跟RL的學習筆記);

對semi-supervised learning也有比較好的效果,能夠在miss data下訓練模型,並在miss data下給出相應地輸出;

在對於一個輸入伴隨多個輸出的場景下,生成式模型也能夠有效工作,而傳統的機器學習方法透過最小化模型輸出和期望輸出的某個object function的值 無法訓練單輸入多輸出的模型,而生成式模型,尤其是GAN能夠hold住這種場景,一個典型的應用是透過場景預測video的下一幀;

生成式模型一些典型的應用:

影象的超解析度

iGAN:

Generative Visual Manipulation on the Natural Image Manifold

影象轉換

生成式模型族譜

GAN的理解與TF的實現

上圖涵蓋了基本的生成式模型的方法,主要按是否需要定義機率密度函式分為:

Explicit density models

explicit density models 又分為tractable explicit models和逼近的explicit model,怎麼理解呢,tractable explicit model通常可以直接透過數學方法來建模求解,而基於逼近的explicit model通常無法直接對資料分佈進行建模,可以利用數學裡的一些近似方法來做資料建模, 通常基於逼近的explicit model分為確定性(變分方法:如VAE的lower bound)和隨機性的方法(馬爾科夫鏈蒙特卡洛方法)。

VAE lower bound:

GAN的理解與TF的實現

馬爾科夫鏈蒙特卡洛方法(MCMC),一種經典的基於馬爾科夫鏈的抽樣方法,透過多次來擬合分佈。比較好的教程:

A Beginner’s Guide to Monte Carlo Markov Chain MCMC Analysis

An Introduction to MCMC for Machine Learning

Implicit density models

無需定義明確的機率密度函式,代表方法包括馬爾科夫鏈、生成對抗式網路(GAN),該系列方法無需定義資料分佈的描述函式。

生成對抗式網路與其他生成式網路對比

生成對抗式網路(GAN)能夠有效地解決很多生成式方法的缺點,主要包括:

並行產生samples;

生成式函式的限制少,如無需合適馬爾科夫取樣的資料分佈(Boltzmann machines),生成式函式無需可逆、latent code需與sample同維度(nonlinear ICA);

無需馬爾科夫鏈的方法(Boltzmann machines, GSNs);

相對於VAE的方法,無需variational bound;

GAN比其他方法一般來說效能更好。

GAN工作原理

GAN主要由兩部分構成:generator和discriminator,generator主要是從訓練資料中產生相同分佈的samples,而discriminator 則是判斷輸入是真實資料還是generator生成的資料,discriminator採用傳統的監督學習的方法。這裡我們可以這樣類比,generator 是一個偽造假幣的專業人士,discriminator是警察,generator的目的是製造出儘可能以假亂真的假鈔,而discriminator是為了能 鑑別是否為假鈔,最終整個gan會達到所謂的納什均衡,Goodfellow在他的paper

GAN的理解與TF的實現-小石頭的碼瘋窩

中有嚴格的數學證明,當$p_G$==$p_{data}$時達到 全域性最優:

GAN的理解與TF的實現

另一個比較明顯看得懂的圖如下:

GAN的理解與TF的實現

圖中黑色點線為真實資料分佈$p_{data}$,綠色線為generator生成的資料分佈$p_{G}$,而Discriminator就是藍色點線,其目的是為了將$p_{data}$和$p_{G}$ 區分,(a)中是初始狀態,然後會更新Discriminator中的引數,若干次step之後,Discriminator有了較大的判斷力即到了(b)的狀態,之後會更新G的模型使其生成的資料分佈(綠色線)更加趨近與真實資料分佈, 若干次G和D的模型引數更新後,理論上最終會達到(d)的狀態即G能夠產生和真實資料完全一致的分佈(證明見上一張圖),如從隨機資料分佈生成人臉像。

如何訓練GAN

因為GAN結構的不同,和常規訓練一個dl model方法不同, 這裡採用simultaneous SGD,每一個step中,會有兩個兩個梯度最佳化的 過程,一個是更新discriminator的引數來最小化$J_{(D)}$,一個是更新generator的引數來最小$J_{(G)}$,通常會選用Adam來作為最最佳化的最佳化器, 也有人建議可以不等次數地更新generator和discriminator(有相關工作提出,1:1的在實際中更有效:

Adam: A Method for Stochastic Optimization

) 如何訓練GAN,在Goodfellow的GAN的tutorial還有一些程式碼中有更多的描述包括不同的cost function, 這裡我就不詳細展開了。

DCGAN

GAN出來後很多相關的應用和方法都是基於DCGAN的結構,DCGAN即”Deep Convolution GAN”,通常會有一些約定俗成的規則:

GAN的理解與TF的實現

在Discriminator和generator中大部分層都使用batch normalization,而在最後一層時通常不會使用batch normalizaiton,目的 是為了保證模型能夠學習到資料的正確的均值和方差;

因為會從random的分佈生成影象,所以一般做需要增大影象的空間維度時如7

7->14

14, 一般會使用strdie為2的deconv(transposed convolution);

通常在DCGAN中會使用Adam最佳化演算法而不是SGD。

各種GAN

GAN的理解與TF的實現

這裡有個大神把各種gan的paper都做了一個統計

AdversarialNetsPapers

這裡大家有更多的興趣可以直接去看對應的paper,我接下來會盡我所能描述下infogan和AC-GAN這兩塊的內容

InfoGAN

InfoGAN是一種能夠學習disentangled representation的GAN(

https://

arxiv。org/pdf/1606。0365

7v1。pdf

),何為disentangled representation?比如人臉資料集中有各種不同的屬性特點,如臉部表情、是否帶眼睛、頭髮的風格眼珠的顏色等等,這些很明顯的相關表示, InfoGAN能夠在完全無監督資訊(是否帶眼睛等等)下能夠學習出這些disentangled representation,而相對於傳統的GAN,只需修改loss來最大化GAN的input的noise(部分fixed的子集)和最終輸出之間的互資訊。

原理

為了達到上面提到的效果,InfoGAN必須在input的noise來做一些文章,將noise vector劃分為兩部分:

z: 和原始的GAN input作用一致;

c: latent code,能夠在之後表示資料分佈中的disentangled representation

那麼如何從latent code中學到相應的disentangled representation呢? 在原始的GAN中,忽略了c這部分的影響,即GAN產生的資料分佈滿足$P_{G}(x|C)=P(x)$,為了保證能夠利用c這部分資訊, 作者提出這樣一個假設:c與generator的輸出相關程度應該很大,而在資訊理論中,兩個資料分佈的相關程度即互資訊, 即generator的輸出和input的c的$I(c;G(z,c))$應該會大。 所以,InfoGAN就變成如下的最佳化問題:

GAN的理解與TF的實現

因為互資訊的計算需要後驗機率的分佈(下圖紅線部分),在實際中很難直接使用,因此,在實際訓練中一般不會直接最大化$I(c;G(z,c))$

GAN的理解與TF的實現

這裡作者採用和VAE類似的方法,增加一個輔助的資料分佈為後驗機率的low bound: 所以,這裡互資訊的計算如下:

GAN的理解與TF的實現

這裡相關的證明就不深入了,有興趣的可以去看看paper。

實驗

我寫的一版基於TensorFlow的Info-GAN實現:

Info-GAN

burness/tensorflow-101

random的label資訊,和對應生成的影象:

GAN的理解與TF的實現

GAN的理解與TF的實現

不同random變數控制產生同一class下的不同輸出:

GAN的理解與TF的實現

AC-GAN

AC-GAN即auxiliary classifier GAN,對應的paper:

[1610。09585] Conditional Image Synthesis With Auxiliary Classifier GANs

, 如前面的示意圖中所示,AC-GAN的Discriminator中會輸出相應的class label的機率,然後更改loss fuction,增加class預測正確的機率,

ac-gan

是一個tensorflow相關的實現,基於作者自己開發的sugartensor,感覺和paper裡面在loss函式的定義上差異,看原始碼的時候注意下,我這裡有參考寫了一個基於原生tensorflow的版本

AC-GAN

實驗

各位有興趣的可以拿程式碼在其他的資料集上也跑一跑,AC-GAN能夠有效利用class label的資訊,不僅可以在G時指定需要生成的image的label,同事該class label也能在Discriminator用來擴充套件loss函式,增加整個對抗網路的效能。 random的label資訊,和對應生成的影象:

GAN的理解與TF的實現

GAN的理解與TF的實現

不同random變數控制產生同一class下的不同輸出:

GAN的理解與TF的實現

Summary

照例總結一下,本文中,我基本介紹了下生成式模型方法的各個族系派別,到GAN的基本內容,到InfoGAN、AC-GAN,大部分的工作都來自於閱讀相關的paper,自己相關的工作就是 tensorflow下參考sugartensor的內容重現了InfoGAN、AC-GAN的相關內容。 當然,本人菜鳥一枚,難免有很多理解不到位的地方,寫出來更多的是作為分享,讓更多人瞭解GAN這塊的內容,如果任何錯誤或不合適的地方,盡情在評論中指出,我們一起討論一起學習 另外我的所有相關的程式碼都在github上:

GAN

,相信讀一下無論是對TensorFlow的理解還是GAN的理解都會 有一些幫助,簡單地參考mnist。py修改下可以很快的應用到你的資料集上,如果有小夥伴在其他資料集上做出有意思的實驗效果的,歡迎分享。