GAN基礎知識總結

GAN基礎原理總結

GAN是由Goodfellow提出的,叫做生成對抗網絡,可以生成數據,屬於生成模型。自從2014年第一篇GAN的論文提出後,對GAN的研究和改進就一直很火熱,關於GAN的最新論文以及相關論文在The GAN Zoo中有非常全的總結。

GAN的基本結構分爲一個生成器G,和以判別器D。本文主要就是總結一下與GAN有關的基本思想和原理,分析它們是如何訓練產生數據的。數據以圖像爲例。

生成模型和判別模型

我們知道GAN屬於生成模型,但是什麼是生成模型?它是如何定義的呢?下面就用通俗的解釋它們兩者定義及區別:

  • 判別模型是學得一個分類面(即學得一個模型),該分類面可用來區分不同的數據分別屬於哪一類;
  • 生成模型是學得各個類別各自的特徵(即可看成學得多個模型),可用這些特徵數據和要進行分類的數據進行比較,看新數據和學得的模型中哪個最相近,進而確定新數據屬於哪一類。

兩者的區別就可以總結爲:判別模型學的是不同類別間的區別,但並不知道每一類是什麼;而生成模型學的是每個類是什麼,它知道每一類是什麼。

常見的判別模型:KNN,決策樹,邏輯迴歸,SVM,線性分類器。
常見的生成模型:樸素貝葉斯、高斯混合模型、隱馬爾可夫模型。

上面是兩種模型的通俗解釋,正式一點的來說:

判別模型:由數據直接學習決策函數Y=f(X)或條件概率分佈P(Y|X)作爲預測模型,即判別模型。判別方法關心的是對於給定的輸入X,應該預測什麼樣的輸出Y。

數據直接學習決策函數Y=f(X)或條件概率分佈P(Y|X)得到的預測模型,就是判別模型;

生成模型:由數據學習聯合概率分佈P(X,Y), 然後由P(Y|X)=P(X,Y)/P(X)求出概率分佈P(Y|X)作爲預測的模型。該方法表示了給定輸入X與產生輸出Y的生成關係。

兩者更加具體的區別,以及兩種模型詳細的比較,參考這篇博客

似然

但凡接觸過機器學習的人都知道極大似然,可是從來沒有人給我講過似然具體是什麼。這裏我就根據網上的介紹加一些自己的看法,解釋一下這個似然函數,順便學習一下概率。

根據我的理解,似然函數就是概率,只不過是概率的概率。看起來可能很彆扭,但是最終的道理卻很簡單。

首先, 給定輸出x時,關於參數θ的似然函數L(θ|x)(在數值上)等於給定參數θ後變量X的概率:

L(θx)=P(X=xθ)L(\theta|x) = P(X = x|\theta)

注意僅僅是在數值上和給定參數θ\theta後的概率,兩者在統計學中含義是不同的。

看看百度百科的解釋:統計學中,概率描述了已知參數時的隨機變量的輸出結果;似然則用來描述已知隨機變量輸出結果時,未知參數的可能取值。

我是這樣理解的,現在有隨機變量X, 以及它分佈的參數θ\theta。給定θ\theta,這裏我們把參數也看做變量。假設我們知道參數θ=θ1\theta = \theta_1(先驗),變量X = x(觀測結果)的概率表示爲:

P(X=xθ=θ1)P(X = x | \theta=\theta_1)

似然函數的含義爲:當知道X = x時, 參數取值爲θ=θ1\theta = \theta_1爲的概率爲多少,可以表示爲:

P(θ=θ1X=x)P(\theta=\theta_1 | X = x)

兩者的關係可以通過貝葉斯公式聯繫起來:P(θX)=P(Xθ)P(θ)P(X)P(\theta| X) = \frac{P(X | \theta)P(\theta)}{P(X)}

因爲X爲觀測變量(可以理解爲我們看到的數據),觀測數據X對於我們來說是已經存在的事實,所以認爲P(X)是不變的,因此

P(θX)P(Xθ)P(θ)P(\theta| X) \propto P(X | \theta)P(\theta)

P(θX)P(\theta| X)就是叫做參數後驗, P(Xθ)P(X | \theta)叫做似然, P(θ)P(\theta)叫做先驗。

在極大似然中, argmaxL(θX)=P(Xθ)\arg\max L(\theta | X) = P(X | \theta), 因爲參數後驗和似然成正比,所以最大化似然等價於最大化參數後驗。

百度百科中有一個投硬幣的例子,這個例子可能會使我們更加理解似然和概率的關係與區別。似然函數,百度百科

隱變量

對於隱變量的概念,根據我自己的瞭解,這個名詞是在EM算法中先提到的。關於EM算法的問題,這裏就不寫了(理解不到位)。。。

生成模型

生成模型顧名思義就是用來生成數據的。生成模型經過訓練後就可以給它一個輸入生成我們想要的數據。生成數據的技術在GAN出現之前就已經存在了,比如自動編碼器(Auto Encoder),它訓練一個編碼器和一個解碼器,編碼器將輸入的圖像轉換爲一個編碼,解碼器將編碼轉化爲image,解碼器得到的image和輸入input進行比較,讓它們越相似越好(一般用MSE衡量)。訓練完成後,將解碼器單獨拿出來,隨機輸入一個編碼,它就會生成一個圖像。當然AE生成的圖像效果質量很一般,所以後來又提出了VAE這樣的模型,效果有所提升,但是目前生成的效果還是不如GAN。

上面說的生成模型,它們和GAN相比較來說有一個很大的缺點,就是在衡量生成圖像和真實圖像的相似性上,AE和VAE是用MSE這樣的公式來衡量生成圖像的好壞,而GAN是用一個判別器D來衡量。目前的實驗結果來看,人自己定義的度量方式不如用神經網絡定義的好。

GAN原理

GAN有一個生成器G和一個判別器D,給生成器一個固定的隨機噪聲,它就會生成一張圖片樣本,判別器就是用來判別這張圖片是生成的還是真實的。

現在我們有一個圖像數據集{x(1),x(2),...,x(n)x^{(1)},x^{(2)},...,x^{(n)}},假設它們之間是獨立同分布的,分佈是Pdata(x)P_{data}(x),如果可以知道它分佈的表達式,就可以直接從Pdata(x)P_{data}(x)中採樣生成數據。但事實是Pdata(x)P_{data}(x)的具體形式我們根本無法知道。
我們假設生成器生成的數據符合分佈PG(x;θ)P_{G}(x; \theta), 其中θ\theta是分佈的參數。現在我們從數據集中採樣{x(1),x(2),...,x(m)x^{(1)},x^{(2)},...,x^{(m)}}, 我們只要讓這m個樣本在PG(x;θ)P_{G}(x; \theta)中同時出現的概率最大,這些數據在生成模型同時出現的概率爲:i=1mPG(x(i);θ)\prod_{i=1}^{m}P_{G}(x^{(i)};\theta)根據極大似然理論,要想最大化上面的聯合概率,找的最好的θ\theta應爲:θ=argmaxθi=1mPG(x(i);θ)\theta^* = arg\max_{\theta} \prod_{i=1}^{m}P_{G}(x^{(i)};\theta)具體推導如下:

在這裏插入圖片描述

從上面的推導結果可以看到,極大似然的目標就是令Pdata(x)P_{data}(x)PG(x)P_{G}(x)兩個分佈的KL散度最小。最好的生成器就可表示爲:G=argminGDiv(PG,Pdata)G^* = arg\min_GDiv(P_G, P_{data})但是這裏有一個問題,我們要想計算兩個分佈之間的KL散度,必須知道它們的表達式。可是我們並不知道這兩個分佈的具體形式。GAN爲了解決這個問題用一個判別器D來衡量兩個分佈之間的差異。具體是這樣做的,雖然不知道兩個分佈的形式,但是上面我們提到了可以從兩個分佈中採樣得到 {x(1),x(2),...,x(m)x^{(1)},x^{(2)},...,x^{(m)}},{z(1),z(2),...,z(m)z^{(1)},z^{(2)},...,z^{(m)}},前者服從Pdata(x)P_{data}(x)後者服從PG(x)P_{G}(x)。爲了衡量兩個分佈距離,最簡單的方式爲這兩個分佈的樣本之間的距離求平均。GAN用判別器去衡量,判別器的訓練可以看做爲一個二分類問題,生成樣本類別爲0,真實樣本類別爲,判別器最後爲一個sigmoid激活,輸出0-1間的值,對於生成樣本判別器希望給它一個較低的分數,對於真實樣本判別器希望給它一個較高的分數。它的目標函數可以表示爲:

V(G,D)=ExPdata[logD(X)]+ExPG[log(1D(X))]V(G,D) = E_{x -P_{data}}[logD(X)] + E_{x -P_{G}}[log(1-D(X))]

最優的D可以表示爲:D=argmaxDV(G,D)D^* = arg\max_D V(G, D)對於生成器來說目標是,固定D以後希望生成的樣本可以在D那裏獲得高的分數,所以最好的生成器可以表示爲:

G=argminGExPG[log(1D(X))]G^* = arg\min_G E_{x -P_{G}}[log(1-D(X))]

但是原始的論文實驗使用的是如下的目標G=argminGExPG[log(D(X))]G^* = arg\min_G -E_{x -P_{G}}[log(D(X))]

論文中還證明了在給定生成器G的前提下,最優判別器:D(x)=PdataPdata+PGD^*(x) = \frac{P_{data}}{P_{data} +P_{G}}

在我們得到最優判別器後將其代入判別器的目標函數V(G, D)得到:

V(G,D)=2log2+2JSD(PdataPG)V(G, D^*) = -2log2 + 2JSD(P_{data} || P_{G})

其中JSD表示JS散度。
通過上式可以知道,最優判別器D,衡量的就是真實分佈PdataP_{data}和生成分佈PGP_{G}之間的JS散度。
在得到最優的D後(D理論上可以衡量兩個分佈的JS散度), 爲了得到最優生成器G,固定D(D目前是最優的),然後找在D中獲得最高分數的G,最優判別器可以表示爲:argminGmaxDV(G,D)arg\min_G\max_D V(G,D)
其中D=maxDV(G,D)D^* = \max \limits_{D}V(G, D)

由上面的優化過程得到,爲了使判別器可以比較好的估計兩個分佈的JS散度,我們理論上應該將D訓練到最優以後,再去優化生成器。但是實際實驗卻往往會多次訓練生成器G(不知道爲什麼)。
綜上所述生成器G的目標和判別器D的目標可以看出,D的目標是想給生成數據低分給真實數據高分,而生成器是想D給生成數據高分,這在訓練兩者的時候就產生了對抗。具體算法如下:

算法

在這裏插入圖片描述

算法的過程上圖已經展示,具體過程如下:

  • 重複迭代下面步驟:
  • 重複k次下述步驟:(爲了令判別器D能夠很好的估計生成分佈PGP_G和真實分佈PdataP_{data}之間的JS散度)
  1. 從真實的數據中採樣m個樣本。
  2. 從一個先驗分佈中隨機產生m個噪聲。
  3. 將m個噪聲通過生成器,映射到與真實數據相同的空間。
  4. 固定生成器,將生成的樣本和真實的樣本輸入到判別器D中,優化D,讓D給真實樣本高分,給生成樣本低分。
 >>* 在D訓練好後,從一個先驗分佈中隨機產生m個噪聲樣本。
 >>* 將噪聲樣本通過生成器映射到真實樣本空間。
 >>* 固定判別器D,優化生成器G,使判別器能夠給生成樣本高的分數。

實驗

代碼地址:https://github.com/jiaxingqi/DeepLearning/tree/master/GAN
生成器和判別器都使用的是MLP。數據集使用的mnist數據集,最後迭代40次後結果如下:
在這裏插入圖片描述

訓練過程中的Loss曲線如下圖,藍色爲判別器,綠色爲生成器。我們可以看到,兩者隨着迭代次數的增加達到一種平衡。

在這裏插入圖片描述

參考資料

[1] Machine Learning and having it deep and structured (2018,Spring). 李宏毅,臺灣大學.
[2] Goodfellow, Ian J., et al. “Generative Adversarial Networks.” Advances in Neural Information Processing Systems 3(2014):2672-2680.
[3] 生成模型 VS 判別模型 (含義、區別、對應經典算法) CSDN博客
[4] 百度百科, 似然函數
[5] 知乎, 先驗分佈、後驗分佈、似然估計這幾個概念是什麼意思,它們之間的關係是什麼?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章