通俗理解生成对抗网络GAN
0. 引言
自2014年Ian Goodfellow提出了GAN(Generative Adversarial Network)以來,對GAN的研究可謂如火如荼。各種GAN的變體不斷涌現,下圖是GAN相關論文的發表情況:
圖1 GAN相關論文發表情況
大牛Yann LeCun甚至評價GAN為 “adversarial training is the coolest thing since sliced bread”。
那么到底什么是GAN呢?它又好在哪里?下面我們開始進行介紹。
1. GAN的基本思想
GAN全稱對抗生成網絡,顧名思義是生成模型的一種,而他的訓練則是處于一種對抗博弈狀態中的。下面舉例來解釋一下GAN的基本思想。
圖二 球員與教練員
假如你是一名籃球運動員,你想在下次比賽中得到上場機會。于是在每一次訓練賽之后你跟教練進行溝通:
你:教練,我想打球
教練:(評估你的訓練賽表現之后)... 算了吧
(你通過跟其他人比較,發現自己的運球很差,于是你苦練了一段時間)
你:教練,我想打球
教練:... 嗯 還不行
(你發現大家投籃都很準,于是你苦練了一段時間的投籃)
你:教練,我想打球
教練: ... 嗯 還有所欠缺
(你發現你的身體不夠壯,被人一碰就倒,于是你去泡健身房)
......
通過這樣不斷的努力和被拒絕,你最終在某一次訓練賽之后得到教練的贊賞,獲得了上場的機會。
值得一提的是在這個過程中,所有的候選球員都在不斷地進步和提升。因而教練也要不斷地通過對比場上球員和候補球員來學習分辨哪些球員是真正可以上場的,并且要“觀察”得比球員更頻繁。隨著大家的成長教練也會會變得越來越嚴格。
現在大家對于GAN的思想應該有了感性的認識了,下面開始進一步窺探GAN的結構和思想。
2. GAN淺析
2.1 GAN的基本結構
GAN的主要結構包括一個生成器G(Generator)和一個判別器D(Discriminator)。
在上面的例子中的球員就相當于生成器,我們需要他在球場上能有好的表現。而球員一開始都是初學者,這個時候就需要一個教練員來指導他們訓練,告訴他們訓練得怎么樣,直到真的能夠達到上場的標準。而這個教練就相當于判別器。
下面我們舉另外一個手寫字的例子來進行進一步窺探GAN的結構。
圖三 GAN基本結構
我們現在擁有大量的手寫數字的數據集,我們希望通過GAN生成一些能夠以假亂真的手寫字圖片。主要由如下兩個部分組成:
2.2 GAN的訓練方式
前面已經定義了一個生成器(Generator)來生成手寫數字,一個判別器(Discrimnator)來判別手寫數字是否是真實的,和一些真實的手寫數字數據集。那么我們怎樣來進行訓練呢?
2.2.1 關于生成器
對于生成器,輸入需要一個n維度向量,輸出為圖片像素大小的圖片。因而首先我們需要得到輸入的向量。
Tips: 這里的生成器可以是任意可以輸出圖片的模型,比如最簡單的全連接神經網絡,又或者是反卷積網絡等。這里大家明白就好。這里輸入的向量我們將其視為攜帶輸出的某些信息,比如說手寫數字為數字幾,手寫的潦草程度等等。由于這里我們對于輸出數字的具體信息不做要求,只要求其能夠最大程度與真實手寫數字相似(能騙過判別器)即可。所以我們使用隨機生成的向量來作為輸入即可,這里面的隨機輸入最好是滿足常見分布比如均值分布,高斯分布等。
Tips: 假如我們后面需要獲得具體的輸出數字等信息的時候,我們可以對輸入向量產生的輸出進行分析,獲取到哪些維度是用于控制數字編號等信息的即可以得到具體的輸出。而在訓練之前往往不會去規定它。2.2.2 關于判別器
對于判別器不用多說,往往是常見的判別器,輸入為圖片,輸出為圖片的真偽標簽。
Tips: 同理,判別器與生成器一樣,可以是任意的判別器模型,比如全連接網絡,或者是包含卷積的網絡等等。2.2.3 如何訓練
上面進一步說明了生成器和判別器,接下來說明如何進行訓練。
基本流程如下:
- 初始化判別器D的參數??和生成器G的參數??。
- 從真實樣本中采樣??個樣本 {??} ,從先驗分布噪聲中采樣??個噪聲樣本 {??} 并通過生成器獲取??個生成樣本 {??} 。固定生成器G,訓練判別器D盡可能好地準確判別真實樣本和生成樣本,盡可能大地區分正確樣本和生成的樣本。
- 循環k次更新判別器之后,使用較小的學習率來更新一次生成器的參數,訓練生成器使其盡可能能夠減小生成樣本與真實樣本之間的差距,也相當于盡量使得判別器判別錯誤。
- 多次更新迭代之后,最終理想情況是使得判別器判別不出樣本來自于生成器的輸出還是真實的輸出。亦即最終樣本判別概率均為0.5。
圖四 生成器判別器與樣本示意圖
注:圖中的黑色虛線表示真實的樣本的分布情況,藍色虛線表示判別器判別概率的分布情況,綠色實線表示生成樣本的分布。??表示噪聲,??到??表示通過生成器之后的分布的映射情況。我們的目標是使用生成樣本分布(綠色實線)去擬合真實的樣本分布(黑色虛線),來達到生成以假亂真樣本的目的。
可以看到在(a)狀態處于最初始的狀態的時候,生成器生成的分布和真實分布區別較大,并且判別器判別出樣本的概率不是很穩定,因此會先訓練判別器來更好地分辨樣本。
通過多次訓練判別器來達到(b)樣本狀態,此時判別樣本區分得非常顯著和良好。然后再對生成器進行訓練。
訓練生成器之后達到(c)樣本狀態,此時生成器分布相比之前,逼近了真實樣本分布。
經過多次反復訓練迭代之后,最終希望能夠達到(d)狀態,生成樣本分布擬合于真實樣本分布,并且判別器分辨不出樣本是生成的還是真實的(判別概率均為0.5)。也就是說我們這個時候就可以生成出非常真實的樣本啦,目的達到。
3. 訓練相關理論基礎
前面用了大白話來說明了訓練的大致流程,下面會從交叉熵開始說起,一步步說明損失函數的相關理論,尤其是論文中包含min,max的公式如下圖5形式:
圖5 minmax公式
判別器在這里是一種分類器,用于區分樣本的真偽,因此我們常常使用交叉熵(cross entropy)來進行判別分布的相似性,交叉熵公式如下圖6所示:
圖6 交叉熵公式
Tips: 公式中??和??為真實的樣本分布和生成器的生成分布。由于交叉熵是非常常見的損失函數,這里默認大家都較為熟悉,就不進行贅述了。在當前模型的情況下,判別器為一個二分類問題,因此可以對基本交叉熵進行更具體地展開如下圖7所示:
圖7 二分類交叉熵
Tips: 其中,假定??為正確樣本分布,那么對應的(??)就是生成樣本的分布。??表示判別器,則??表示判別樣本為正確的概率,??則對應著判別為錯誤樣本的概率。這里僅僅是對當前情況下的交叉熵損失的具體化。相信大家也還是比較熟悉。將上式推廣到N個樣本后,將N個樣本相加得到對應的公式如下:
圖8 N個樣本的情況時
OK,到目前為止還是基本的二分類,下面加入GAN中特殊的地方。
對于GAN中的樣本點??,對應于兩個出處,要么來自于真實樣本,要么來自于生成器生成的樣本??~??( 這里的??是服從于投到生成器中噪聲的分布)。
其中,對于來自于真實的樣本,我們要判別為正確的分布??。來自于生成的樣本我們要判別其為錯誤分布(??)。將上面式子進一步使用概率分布的期望形式寫出(為了表達無限的樣本情況,相當于無限樣本求和情況),并且讓??為 1/2 且使用??表示生成樣本可以得到如下圖8的公式:
圖8 GAN損失函數期望形式表達
OK,現在我們再回過頭來對比原本的的??公式,發現他們是不是其實就是同一個東西呢!:-D
圖9 損失函數的min max表達
我們回憶一下上面2.2.3中介紹的流程理解一下這里的??。
- 這里的?相當于表示真實樣本和生成樣本的差異程度。
- 先看??。這里的意思是固定生成器G,盡可能地讓判別器能夠最大化地判別出樣本來自于真實數據還是生成的數據。
- 再將后面部分看成一個整體令 L?=??,看?,這里是在固定判別器D的條件下得到生成器G,這個G要求能夠最小化真實樣本與生成樣本的差異。
- 通過上述min max的博弈過程,理想情況下會收斂于生成分布擬合于真實分布。
?
?
4. 總結
本文大致介紹了GAN的整體情況。但是對于GAN實際上還有更多更完善的理論相關描述,進一步了解可以看相關的論文。并且在GAN一開始提出來的時候,實際上針對于不同的情況也有存在著一些不足,后面也陸續提出了不同的GAN的變體來完善GAN。
通過一個判別器而不是直接使用損失函數來進行逼近,更能夠自頂向下地把握全局的信息。比如在圖片中,雖然都是相差幾像素點,但是這個像素點的位置如果在不同地方,那么他們之間的差別可能就非常之大。
圖10 不同像素位置的差別
比如上圖10中的兩組生成樣本,對應的目標為字體2,但是圖中上面的兩個樣本雖然只相差一個像素點,但是這個像素點對于全局的影響是比較大的,但是單純地去使用使用損失函數來判斷,那么他們的誤差都是相差一個像素點,而下面的兩個雖然相差了六個像素點的差距(粉色部分的像素點為誤差),但是實際上對于整體的判斷來說,是沒有太大影響的。但是直接使用損失函數的話,卻會得到6個像素點的差距,比上面的兩幅圖差別更大。而如果使用判別器,則可以更好地判別出這種情況(不會拘束于具體像素的差距)。
總之GAN是一個非常有意思的東西,現在也有很多相關的利用GAN的應用,比如利用GAN來生成人物頭像,用GAN來進行文字的圖片說明等等。后面我也會使用GAN來做一些簡單的實驗來幫助進一步理解GAN。
最后附上論文中的GAN算法流程,通過上面的介紹,這里應該非常好理解了。
圖11 論文中的GAN算法流程
如果您覺得有幫助就支持一下點個贊吧~(,,?? . ??,,)
5. 參考資料
[1]?Goodfellow, Ian J., Pouget-Abadie, Jean, Mirza, Mehdi, Xu, Bing, Warde-Farley, David, Ozair, Sherjil, Courville, Aaron C., and Bengio, Yoshua. Generative adversarial nets. NIPS, 2014.
[2]?Understanding Generative Adversarial Networks
[3]【 李宏毅深度學習 】Introduction of Generative Adversarial Network (GAN)(中文)
[4]?Introductory guide to Generative Adversarial Networks (GANs) and their promise!
總結
以上是生活随笔為你收集整理的通俗理解生成对抗网络GAN的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 携程基于Quasar协程的NIO实践
- 下一篇: @FeignClient 接口调用