GANs简介
在對GAN進行學習的過程中參考了一些好的文章,在此總結出來自己認為有意義的學習筆記。
參考原文:http://blog.csdn.net/zouxy09/article/details/8195017
http://blog.csdn.net/on2way/article/details/72773771
Generative Adversarial Nets
GAN的鼻祖之作是2014年NIPS一篇文章:Generative Adversarial Net,可以細細品味。
GAN的思想是是一種二人零和博弈思想(two-player game),博弈雙方的利益之和是一個常數,比如兩個人掰手腕,假設總的空間是一定的,你的力氣大一點,那你就得到的空間多一點,相應的我的空間就少一點,相反我力氣大我就得到的多一點,但有一點是確定的就是,我兩的總空間是一定的,這就是二人博弈。
引申到GAN里面就是可以看成,GAN中有兩個這樣的博弈者,一個人名字是生成模型(G),另一個人名字是判別模型(D)。他們各自有各自的功能。
一個簡單的例子如下圖所示:假設在訓練開始時,真實樣本分布、生成樣本分布以及判別模型分別是圖中的黑線、綠線和藍線。可以看出,在訓練開始時,判別模型是無法很好地區分真實樣本和生成樣本的。接下來當我們固定生成模型,而優化判別模型時,優化結果如第二幅圖所示,可以看出,這個時候判別模型已經可以較好的區分生成數據和真實數據了。第三步是固定判別模型,改進生成模型,試圖讓判別模型無法區分生成圖片與真實圖片,在這個過程中,可以看出由模型生成的圖片分布與真實圖片分布更加接近,這樣的迭代不斷進行,直到最終收斂,生成分布和真實分布重合。
判別網絡說,我很強,來一個樣本我就知道它是來自真樣本集還是假樣本集。生成網絡就不服了,說我也很強,我生成一個假樣本,雖然我生成網絡知道是假的,但是你判別網絡不知道呀,我包裝的非常逼真,以至于判別網絡無法判斷真假,那么用輸出數值來解釋就是,生成網絡生成的假樣本進去了判別網絡以后,判別網絡給出的結果是一個接近0.5的值,極限情況就是0.5,也就是說判別不出來了,這就是納什平衡了。
詳細的實現過程:
初始化階段:
初始化生成模型G、判別模型D。
前向傳播階段:
一. 可以有兩種輸入?1.?隨機產生一個隨機向量作為生成模型的數據,然后經過生成模型后產生一個新的向量,作為Fake Image,記作z。?
2.?從數據集中隨機選擇一張圖片,將圖片轉化成向量,作為Real Image,記作x。?
二. 將由1或者2產生的輸出,作為判別網絡的輸入,經過判別網絡后輸出一個0到1之間的數,用于表示輸入圖片為Real Image的概率,real為1,fake為0。?
根據輸入的圖片類型是Fake Image或Real Image將判別模型的輸入數據的label標記為0或者1。即判別模型的輸入類型為?或者?。
判別模型的損失函數:
當輸入的是從數據集中取出的Real Image時,只需要考慮第二部分。D(x)為判別模型的輸出,表示輸入x為real 數據的概率,目的是讓判別模型的輸出D(x)的輸出盡量靠近1。?
當輸入的是fake時,只計算第一部分,G(z)是生成模型的輸出,輸出的是一張Fake Image。我們要做的是讓D(G(z))的輸出盡可能趨向于0。這樣的判別模型是有區分力的。
生成模型的損失函數:
對于生成模型來說,我們要做的是讓G(z)產生的數據盡可能的和數據集中的數據一樣。就是所謂的同樣的數據分布。那么我們要做的就是最小化生成模型的誤差,即只將由G(z)產生的誤差傳給生成模型。?
最終的損失函數為:?
其中表示判別模型的預測類別,對預測概率取整,為0或者1。閾值可以自己設置,或者正常的話就是0.5。
優化函數:?
需要注意的是生成模型與對抗模型可以說是完全獨立的兩個模型,好比就是完全獨立的兩個神經網絡模型,他們之間沒有什么聯系。那么訓練這樣的兩個模型的大方法就是:單獨交替迭代訓練。
假設現在生成網絡模型已經有了,那么給一堆隨機數組,就會得到一堆假的樣本集,真樣本集一直都有。現在我們人為的定義真假樣本集的標簽,因為我們希望真樣本集的輸出盡可能為1,假樣本集為0,很明顯這里我們就已經默認真樣本集所有的類標簽都為1,而假樣本集的所有類標簽都為0。這樣單就判別網絡來說,此時問題就變成了一個再簡單不過的有監督的二分類問題了,直接送到神經網絡模型中訓練就完事了。假設訓練完了,下面我們來看生成網絡。
對于生成網絡,想想我們的目的,是生成盡可能逼真的樣本。那么原始的生成網絡生成的樣本你怎么知道它真不真呢?就是送到判別網絡中,所以在訓練生成網絡的時候,我們需要聯合判別網絡一起才能達到訓練的目的。所以對于生成網絡的訓練其實是對生成-判別網絡串接的訓練。
對于生成網絡的訓練,我們有了樣本集(只有假樣本集,沒有真樣本集),有了對應的label(全為1),就可以訓練了。有人說,你這樣一訓練,判別網絡的網絡參數不是也跟著變嗎?沒錯,這很關鍵,所以在訓練這個串接的網絡的時候,一個很重要的操作就是不要判別網絡的參數發生變化,也就是不讓它參數發生更新,只是把誤差一直傳,傳到生成網絡那塊后更新生成網絡的參數。這樣就完成了生成網絡的訓練了。
完成生成網絡訓練后,那么我們可以根據目前新的生成網絡再對先前的那些噪聲Z生成新的假樣本,并且訓練后的假樣本應該是更真了才對。然后又有了新的真假樣本集(其實是新的假樣本集),這樣又可以重復上述過程。我們把這個過程稱作為單獨交替訓練。我們可以實現定義一個迭代次數,交替迭代到一定次數后停止即可。這個時候我們再去看一看噪聲Z生成的假樣本會發現,原來它已經很真了。
原始論文中的目標公式吧:
上述這個公式說白了就是一個最大最小優化問題,其實對應的也就是上述的兩個優化過程。
拆解就如同下面兩個公式:
優化D:
優化G:
優化D的時候,也就是判別網絡,其實沒有生成網絡什么事,后面的G(z)這里就相當于已經得到的假樣本。優化D的公式的第一項,使的真樣本x輸入的時候,得到的結果越大越好,可以理解,因為需要真樣本的預測結果越接近于1越好。對于假樣本,需要優化是的其結果越小越好,也就是D(G(z))越小越好,因為它的標簽為0。但是呢第一項是越大,第二項是越小,這就矛盾了,所以呢把第二項改成1-D(G(z)),這樣就是越大越好,兩者合起來就是越大越好。
優化G的時候,這個時候沒有真樣本什么事,所以把第一項直接去掉了。這個時候只有假樣本,但是我們說這個時候是希望假樣本的標簽是1的,所以是D(G(z))越大越好,但是呢為了統一成1-D(G(z))的形式,那么只能是最小化1-D(G(z))。
本質上沒有區別,只是為了形式的統一。之后這兩個優化模型可以合并起來寫,就變成了最開始的那個最大最小目標函數了。
GAN強大之處在于可以自動的學習原始真實樣本集的數據分布,不管這個分布多么的復雜,只要訓練的足夠好就可以學出來。
生成模型最后可以通過噪聲生成一個完整的真實數據(比如人臉),說明生成模型已經掌握了從隨機噪聲到人臉數據的分布規律了,有了這個規律,想生成人臉還不容易。然而這個規律我們開始知道嗎?顯然不知道,如果讓你說從隨機噪聲到人臉應該服從什么分布,你不可能知道。這是一層層映射之后組合起來的非常復雜的分布映射規律。然而GAN的機制可以學習到,也就是說GAN學習到了真實樣本集的數據分布。
總結
- 上一篇: 【SQL2014】 SQL Server
- 下一篇: 明日方舟抽卡模拟器wiki_明日方舟抽卡