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的概率:
注意僅僅是在數值上和給定參數後的概率,兩者在統計學中含義是不同的。
看看百度百科的解釋:統計學中,概率描述了已知參數時的隨機變量的輸出結果;似然則用來描述已知隨機變量輸出結果時,未知參數的可能取值。
我是這樣理解的,現在有隨機變量X, 以及它分佈的參數。給定,這裏我們把參數也看做變量。假設我們知道參數(先驗),變量X = x(觀測結果)的概率表示爲:
似然函數的含義爲:當知道X = x時, 參數取值爲爲的概率爲多少,可以表示爲:
兩者的關係可以通過貝葉斯公式聯繫起來:
因爲X爲觀測變量(可以理解爲我們看到的數據),觀測數據X對於我們來說是已經存在的事實,所以認爲P(X)是不變的,因此
就是叫做參數後驗, 叫做似然, 叫做先驗。
在極大似然中, , 因爲參數後驗和似然成正比,所以最大化似然等價於最大化參數後驗。
百度百科中有一個投硬幣的例子,這個例子可能會使我們更加理解似然和概率的關係與區別。似然函數,百度百科。
隱變量
對於隱變量的概念,根據我自己的瞭解,這個名詞是在EM算法中先提到的。關於EM算法的問題,這裏就不寫了(理解不到位)。。。
生成模型
生成模型顧名思義就是用來生成數據的。生成模型經過訓練後就可以給它一個輸入生成我們想要的數據。生成數據的技術在GAN出現之前就已經存在了,比如自動編碼器(Auto Encoder),它訓練一個編碼器和一個解碼器,編碼器將輸入的圖像轉換爲一個編碼,解碼器將編碼轉化爲image,解碼器得到的image和輸入input進行比較,讓它們越相似越好(一般用MSE衡量)。訓練完成後,將解碼器單獨拿出來,隨機輸入一個編碼,它就會生成一個圖像。當然AE生成的圖像效果質量很一般,所以後來又提出了VAE這樣的模型,效果有所提升,但是目前生成的效果還是不如GAN。
上面說的生成模型,它們和GAN相比較來說有一個很大的缺點,就是在衡量生成圖像和真實圖像的相似性上,AE和VAE是用MSE這樣的公式來衡量生成圖像的好壞,而GAN是用一個判別器D來衡量。目前的實驗結果來看,人自己定義的度量方式不如用神經網絡定義的好。
GAN原理
GAN有一個生成器G和一個判別器D,給生成器一個固定的隨機噪聲,它就會生成一張圖片樣本,判別器就是用來判別這張圖片是生成的還是真實的。
現在我們有一個圖像數據集{},假設它們之間是獨立同分布的,分佈是,如果可以知道它分佈的表達式,就可以直接從中採樣生成數據。但事實是的具體形式我們根本無法知道。
我們假設生成器生成的數據符合分佈, 其中是分佈的參數。現在我們從數據集中採樣{}, 我們只要讓這m個樣本在中同時出現的概率最大,這些數據在生成模型同時出現的概率爲:根據極大似然理論,要想最大化上面的聯合概率,找的最好的應爲:具體推導如下:
從上面的推導結果可以看到,極大似然的目標就是令和兩個分佈的KL散度最小。最好的生成器就可表示爲:但是這裏有一個問題,我們要想計算兩個分佈之間的KL散度,必須知道它們的表達式。可是我們並不知道這兩個分佈的具體形式。GAN爲了解決這個問題用一個判別器D來衡量兩個分佈之間的差異。具體是這樣做的,雖然不知道兩個分佈的形式,但是上面我們提到了可以從兩個分佈中採樣得到 {},{},前者服從後者服從。爲了衡量兩個分佈距離,最簡單的方式爲這兩個分佈的樣本之間的距離求平均。GAN用判別器去衡量,判別器的訓練可以看做爲一個二分類問題,生成樣本類別爲0,真實樣本類別爲,判別器最後爲一個sigmoid激活,輸出0-1間的值,對於生成樣本判別器希望給它一個較低的分數,對於真實樣本判別器希望給它一個較高的分數。它的目標函數可以表示爲:
最優的D可以表示爲:對於生成器來說目標是,固定D以後希望生成的樣本可以在D那裏獲得高的分數,所以最好的生成器可以表示爲:
但是原始的論文實驗使用的是如下的目標
論文中還證明了在給定生成器G的前提下,最優判別器:
在我們得到最優判別器後將其代入判別器的目標函數V(G, D)得到:
其中JSD表示JS散度。
通過上式可以知道,最優判別器D,衡量的就是真實分佈和生成分佈之間的JS散度。
在得到最優的D後(D理論上可以衡量兩個分佈的JS散度), 爲了得到最優生成器G,固定D(D目前是最優的),然後找在D中獲得最高分數的G,最優判別器可以表示爲:
其中
由上面的優化過程得到,爲了使判別器可以比較好的估計兩個分佈的JS散度,我們理論上應該將D訓練到最優以後,再去優化生成器。但是實際實驗卻往往會多次訓練生成器G(不知道爲什麼)。
綜上所述生成器G的目標和判別器D的目標可以看出,D的目標是想給生成數據低分給真實數據高分,而生成器是想D給生成數據高分,這在訓練兩者的時候就產生了對抗。具體算法如下:
算法
算法的過程上圖已經展示,具體過程如下:
- 重複迭代下面步驟:
- 重複k次下述步驟:(爲了令判別器D能夠很好的估計生成分佈和真實分佈之間的JS散度)
- 從真實的數據中採樣m個樣本。
- 從一個先驗分佈中隨機產生m個噪聲。
- 將m個噪聲通過生成器,映射到與真實數據相同的空間。
- 固定生成器,將生成的樣本和真實的樣本輸入到判別器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] 知乎, 先驗分佈、後驗分佈、似然估計這幾個概念是什麼意思,它們之間的關係是什麼?