1. 程式人生 > >GAN (生成式對抗網路) (一): GAN 簡介

GAN (生成式對抗網路) (一): GAN 簡介

自從 Ian Goodfellow 在 14 年發表了 論文 Generative Adversarial Nets 以來,生成式對抗網路 GAN 廣受關注,加上學界大牛 Yann Lecun 在 Quora 答題時曾說,他最激動的深度學習進展是生成式對抗網路,使得 GAN 成為近年來在機器學習領域的新寵,可以說,研究機器學習的人,不懂 GAN,簡直都不好意思出門。

下面我們來簡單介紹一下生成式對抗網路,主要介紹三篇論文:1)Generative Adversarial Networks;2)Conditional Generative Adversarial Nets;3)Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks。

首先來看下第一篇論文,瞭解一下 GAN 的過程和原理:

GAN 啟發自博弈論中的二人零和博弈(two-player game),GAN 模型中的兩位博弈方分別由生成式模型(generative model)和判別式模型(discriminative model)充當。生成模型 G 捕捉樣本資料的分佈,用服從某一分佈(均勻分佈,高斯分佈等)的噪聲 z 生成一個類似真實訓練資料的樣本,追求效果是越像真實樣本越好;判別模型 D 是一個二分類器,估計一個樣本來自於訓練資料(而非生成資料)的概率,如果樣本來自於真實的訓練資料,D 輸出大概率,否則,D 輸出小概率。可以做如下類比:生成網路 G 好比假幣制造團伙,專門製造假幣,判別網路 D 好比警察,專門檢測使用的貨幣是真幣還是假幣,G 的目標是想方設法生成和真幣一樣的貨幣,使得 D 判別不出來,D 的目標是想方設法檢測出來 G 生成的假幣。如圖所示:

在訓練的過程中固定一方,更新另一方的網路權重,交替迭代,在這個過程中,雙方都極力優化自己的網路,從而形成競爭對抗,直到雙方達到一個動態的平衡(納什均衡),此時生成模型 G 恢復了訓練資料的分佈(造出了和真實資料一模一樣的樣本),判別模型再也判別不出來結果,準確率為 50%,約等於亂猜。

上述過程可以表述為如下公式:

當固定生成網路 G 的時候,對於判別網路 D 的優化,可以這樣理解:輸入來自於真實資料,D 優化網路結構使自己輸出 1,輸入來自於生成資料,D 優化網路結構使自己輸出 0;當固定判別網路 D 的時候,G 優化自己的網路使自己輸出儘可能和真實資料一樣的樣本,並且使得生成的樣本經過 D 的判別之後,D 輸出高概率。

第一篇文章,在 MNIST 手寫資料集上生成的結果如下圖:

 

最右邊的一列是真實樣本的影象,前面五列是生成網路生成的樣本影象,可以看到生成的樣本還是很像真實樣本的,只是和真實樣本屬於不同的類,類別是隨機的。

 

第二篇文章想法很簡單,就是給 GAN 加上條件,讓生成的樣本符合我們的預期,這個條件可以是類別標籤(例如 MNIST 手寫資料集的類別標籤),也可以是其他的多模態資訊(例如對影象的描述語言)等。用公式表示就是:

式子中的 y 是所加的條件,結構圖如下:

生成結果如下圖:

圖中所加的條件 y 是類別標籤。

 

第三篇文章,簡稱(DCGAN),在實際中是程式碼使用率最高的一篇文章,本系列文的程式碼也是這篇文章程式碼的初級版本,它優化了網路結構,加入了 conv,batch_norm 等層,使得網路更容易訓練,網路結構如下:

可以有加條件和不加條件兩種網路,論文還做了好多試驗,展示了這個網路在各種資料集上的結果。有興趣同學可以去看論文,此文我們只從程式碼的角度理解去理解它。