天天看點

GAN生成對抗網絡學習筆記

一、簡介

GAN是Generative Adversarial Nets的縮寫,是由Ian Goodfellow14年提出的,這個東西和深度學習裡其他很多東西一樣,看表面原理其實很好了解,就是兩個網絡不斷對抗互相學習,最終得到一個比較好的結果,但是想搞清楚原理并且能從頭推一遍公式其實還是要花不少時間的,尤其是原作裡很多細節并沒有展開講,是以我覺得還是比較有必要把推導的過程記錄下來的。當然,原始的GAN存在很多問題,之後再仔細寫寫原始GAN的缺點以及原始GAN的一些變種。

我們先來建立一個感性的認識:GAN就是一個互相博弈互相提高,最終實作生成的資料的分布和真實的資料分布重合的過程。首先要牢記,我們提出GAN的目的是人工生成資料,是以,GAN的一個網絡為生成器generator,其次我們為了能生成以假亂真的資料,需要把一個啥也不會的生成器不斷提升,此時用到的就是判别器discriminator,它的功能就是去鑒定生成器生成的資料。對于一個判别器,當它無法判斷生成器生成的資料是真是假時,我們就得到了一個最優的生成器,然後再用生成器生成資料去訓練判别器,再用判别器去鑒定生成的資料以提高判别器,循環往複直至都無法提高,有點像武俠小說中左右互搏一樣,自己和自己打。

二、理論分析

我之前看過其他的部落格或者一些教程,一般上來都會介紹一些會用到的知識,但是我個人畏難情緒比較嚴重,上來講好多沒見過的概念會讓我覺得比較害怕,是以自己寫的話我會直接上公式:

GAN生成對抗網絡學習筆記

這個公式看上去很複雜,但是不要慌,問題不大,一步步來。

首先,這個公式我們隻需要了解就可以了,很多時候先了解了含義再想怎麼來的會比直接想怎麼來的更簡單。根據概念,我們先要有最優的判别器和最優的生成器,那麼我們就可以定義一個D(x)和G(x),其中D(x)是判别器,得到的是x屬于真實資料的機率,G(x)是生成器根據輸入x生成的資料。有了這兩個之後我們回頭來看式子,D(x)就是x屬于真實資料的機率,G(z)就是根據輸入z得到的生成的資料,D(G(z))得到的就是生成資料是真實資料的機率,這項越大說明判别器越挫,竟然把生成的資料判斷為是真實資料,是以對于最優判别器,logD(x)的期望要最大,D(G(z))的期望要最小,1-D(G(z))的期望要最大,V要最大;對于最優生成器,D(G(z))的期望要最大(生成器想騙過判别器),1-D(G(z))的期望要最小,V要最小,這樣我們就得到了這個函數的意義,然後再對其取對數得到GAN的損失函數。

了解了損失函數的含義,我們直接來看具體的優化過程:

GAN生成對抗網絡學習筆記

其實很簡單,就三步:1、優化判别器。2、優化生成器。3、循環

至此算是建立起了對GAN的基礎認識,對于非專業的人來講我覺得了解到這一步已經可以把不了解的人騙的一愣一楞的了,接下來的都是一些證明和公式推導的細節,其中對于為什麼pg(x)可以收斂到pdata(x),我看了很多講解的部落格都是一筆帶過,我簡單講一下我的了解。。

這張是最優判别器的值的推導,隻需要把期望化成積分的形式代入,然後就都是一些高中數學的推導。

GAN生成對抗網絡學習筆記

這張是在得到了最優的判别器後,把損失函數改寫成-log4與JS散度的和的形式,其中JS散度是用來衡量兩個機率分布的距離的一個量,大于等于0,當且僅當兩個機率分布相等時為0(具體可以看wiki),是以此時的損失函數最小為0,也就是我們的生成器的任務也完成了。順帶說一句,這個地方我試過令pdata(x) = a , pg(x)=b,想上面一樣去用初等數學的内容去進行函數分析,但是卻失敗了,我後來想了想,上面之是以能對D(x)進行求導因為那是一個判别函數,其餘兩項關于它的導數都為0,下面的式子中無論是關于pdata還是關于pg亦或是關于x求導都會出現你中有我我中有你的情況,進而無法化簡。

GAN生成對抗網絡學習筆記

到這裡為止我們就證明了GAN的最優解的存在,也就是真實資料的分布等于生成資料的分布,符合我們的感性認識,接下來就是對于該函數收斂的證明,也就是對于我們的優化過程合理性的證明。

GAN生成對抗網絡學習筆記

原文中對于收斂的證明叙述了很多,提到了次倒數啊上确界啊之類的,我開始沒看明白,後來也看了很多部落格,全部都是一筆帶過或者直接翻譯,我嘗試了解了一下這段話,個人感覺核心就是一句話:這個凸函數每個點的導數都屬于這個凸函數的導數。原因在于隻要證明了函數每個點的導數都屬于函數的導數,當G和D有了足夠的量,并且每次的更新量足夠小,也就可以保證了梯度下降了有效性,并且最終函數可以收斂。

繼續閱讀