1. 程式人生 > >生成式對抗網路(GAN)

生成式對抗網路(GAN)

   生成對抗網路(GAN),是深度學習模型之一,2014年lan Goodfellow的開篇之作Generative Adversarial Network

GAN概述

  GAN包括兩個模型,一個是生成模型(generative model),一個是判別模型(discriminative model)。生成模型要做的事情就是生成看起來真的和原始資料相似的例項,判斷模型就是判斷給定的例項是生成的還是真實的(真實例項來源於資料集,偽造例項來源於生成模型)。

  生成器試圖欺騙判別器,判別器則努力不被生成器欺騙。兩個模型經過交替優化訓練,互相提升

圖1-1   GAN網路整體示意圖

  如上圖所示,我們有兩個網路,生成網路G(Generayor)和判別網路D(Discriminator)。生成網路接收一個(符合簡單分佈如高斯分佈或者均勻分佈的)隨機噪聲輸入,通過這個噪聲輸出圖片,記做G(z)。判別網路的輸入是x,x代表一張圖片,輸出D(x)代表x為真實圖片的概率。

GAN模型優化訓練

目的:將一個隨機高斯噪聲z通過一個生成網路G得到一個和真實資料分佈\({p_{data}}(x)\)差不多的生成資料分佈\({p_G}(x;\theta )\),其中的引數\(\theta \)是網路引數決定的,我們希望找到\(\theta \)使得\({p_G}(x;\theta )\)和\({p_{data}}(x)\)儘可能的接近。

我們站在判別網路的角度想問題,首先判別器要能識別真實資料,同樣也能識別出生成資料,在數學式子上的表達為D(x)=1和D(G(z))=0。我們通過這兩個式子,分別來構造[正類](判別出x屬於真實資料)和[負類](判別出G(z)屬於生成資料)的對數損失函式。

生成網路G的損失函式為\(\log (1 - D(G(z)))\)或者\( - \log D(G(z))\)。

判別網路D的損失函式為\( - (\log D(x) + \log (1 - D(G(z))))\)。

  我們從式子中解釋對抗,損失函式的影象是一個類似於y=log(x)函式圖形,x<0時,y>0,x=1時,y=0,生成網路和判別網路對抗(訓練)的目的是使得各自的損失函式最小,,生成網路G的訓練希望\(D(G(z))\)趨近於1,也就是正類,這樣生成網路G的損失函式\(\log (1 - D(G(z)))\)就會最小。而判別網路的訓練就是一個2分類,目的是讓真實資料x的判別概率D趨近於1,而生成資料G(z)的判別概率\(D(G(z))\)趨近於0,這是負類。

當判別網路遇到真實資料時:\({E_{x \sim {p_{data}}(x)}}[\log D(x)]\),這個期望要取最大,只有當D(x)=1的時候,也就是判別網路判別出真實資料是真的。

當判別網路遇到生成資料時:\({E_{z \sim Pz(z)}}[\log (1 - D(G(z)))]\),因為0<概率<1,且x<1的對數為負,這個數學期望要想取最大值,則需要令D(G(z))=0,D(G(z))=0是判別器發現了生成資料G(z)是假的,

  結合以上兩個概念,判別網路最大化目標函式為:\[{E_{x \sim {p_{data}}(x)}}[\log D(x)] + {E_{z \sim Pz(z)}}[\log (1 - D(G(z)))]\]

  以上的式子,是在給定生成器G,求最優的判別器\(D_G^*\),即判別網路的最大值,我們定義一個價值函式,如下\[V(G,D) = {E_{x \sim {p_{data}}(x)}}[\log D(x)] + {E_{z \sim Pz(z)}}[\log (1 - D(G(z)))]\]

  然後我們將最優化式子表述為:\(D_G^* = \arg {\max _D}V(G,D)\)

  現在劇情大反轉,對於判別網路D而言,希望目標函式(判別公式\(V(D,G)\))最大化,但對於生成網路G,希望目標函式(判別公式\(V(D,G)\))最小化,即你判別網路判別不出我是真資料還是生成資料。有趣的事情來了,那到底是希望這個目標函式最大化好呢,還是最小化好呢?來打一架吧。整個訓練的過程是一個迭代的過程,其實

  當我們求得最優的\(D_G^*\)即\(D = D_G^*\),我們反過來把\(D = D_G^*\)代入上面的式子,來求最優(最小)的G,即\(G_D^*\)。整個訓練優化過程就是一個迴圈迭代過程。在原論文中lan J.Goodfellow更喜歡求解最優化價值函式的G和D以求解極大極小博弈:

\[\mathop {\min }\limits_G \mathop {\max }\limits_D V(D,G) = {E_{x \sim {p_{data}}(x)}}[\log D(x)] + {E_{z \sim Pz(z)}}[\log (1 - D(G(z)))]\]

式中:D是判別函式,x是真實資料,D(x):判別真實資料的概率,D(G(z)):判別生成資料的概率

  最後我們將最優化問題表達為:\[G_D^* = \arg {\max _G}V(G,D_G^*)\]

  其實極小極大博弈可以分開理解,即在給定G的情況下先最大化V(D,G)而取\(D_G^*\),然後固定D,並最小化V(D,G)而得到\(G_D^*\)。其中給定G,最大化V(D,G)評估了真實資料和生成資料之間的差異或距離。

  在這樣的對抗過程中,會有幾個過程,原論文中的圖如下:

黑色線表示真實資料的分佈,綠色線表示生成資料的分佈,藍色線表示生成資料在判別器中的分佈效果

 我們對每個圖逐一進行分析

(a)、判別網路D還未經過訓練,分類能力有限,有波動,但是真實資料x和生成資料G(z)還是可以的

(b)、判別網路D訓練的比較好,可以明顯區分出生成資料G(z)。

(c)、綠色的線與黑色的線偏移了,藍色線下降了,也就是判別生成資料的概率下降了。

  由於綠色線的目標是提升提升概率,因此會往藍色線高的方向引動。那麼隨著訓練的持續,由於G網路的提升,生成網路G也反過來影響判別網路D的分佈。在不斷迴圈訓練判別網路D的過程中,判別網路的判別能力會趨於一個收斂值,從而達到最優。\[D_G^*(x) = \frac{{{p_{data}}(x)}}{{{p_{data}}(x) + {p_g}(x)}}\]

  因此隨著\({{p_g}(x)}\)趨近於\({{p_{data}}(x)}\),\(D_G^*(x)\)會趨近於\(\frac{1}{2}\),\(\frac{1}{2}\)的意思就是模稜兩可,判別器已經分不清隨是真實資料誰是生成資料,也就是圖d。

 以上只是圖文說明\({{p_g}(x)}\)最終會收斂於\({{p_{data}}(x)}\),接下來我們用演算法具體推理。

GAN的演算法推導

KL散度

  在資訊理論中,我們使用夏農熵(Shannon entropy)來對整個概率分佈中的不確定性總量進行量化:\[H(x) = {E_{x \sim p}}[I(x)] =  - {E_{x \sim p}}[\log P(x)]\]

  首先需要一點預備知識,如果我們對於同一個隨機變數x有兩個單獨的概率分佈P(x)和Q(x),我們可以使用KL散度(Kullback-Leibler divergence)也稱為相對熵,這是統計中的一個概念,是衡量兩種概率分佈的相似程度,其越小,表示兩種概率分佈越接近。

對於離散資料的概率分佈,定義如下:\[{D_{KL}}(P\parallel Q) = \sum\limits_x {P(x)\log \frac{{P(x)}}{{Q(x)}}}  = {E_{x \sim P}}[\log \frac{{P({\rm{x}})}}{{Q(x)}}] = {E_{x \sim P}}[\log P(x) - \log Q(x)]\]

對於連續資料的概率分佈,定義如下:\[{D_{KL}}(P||Q) = \smallint _{ - \infty }^\infty p(x)log\frac{{p(x)}}{{q(x)}}dx\]

  在離散變數的情況下,KL散度衡量的是:我們使用一種編碼,使得概率分佈Q產生的訊息長度最短。再用這種編碼,傳送包含由概率分佈P產生的符號的訊息時,所需要的額外資訊量。

KL散度的性質:

1、最重要的是他是非負的。

2、當前僅當P和Q在離散型變數的情況下是相同分佈,或者P和Q在連續型變數的情況下是幾乎處處相等,那麼KL散度為0。

3、因為 KL 散度是非負的並且衡量的是兩個分佈之間的差異,它經常 被用作分佈之間的某種距離。然而,它並不是真的距離因為它不是對稱的:對於某些 P 和 Q,\({D_{KL}}(P\parallel Q)\)不等於\({D_{KL}}(Q\parallel P)\)。這種非對稱性意味著選擇\({D_{KL}}(P\parallel Q)\)還是\({D_{KL}}(Q\parallel P)\)影響很大。

推導KL散度

  在李巨集毅的講解中,KL散度可以從極大擬然估計中推導而出。若給定一個真實資料的分佈\({P_{data}}(x)\)和生成資料的分佈\({P_G}(x;\theta )\),那麼GAN希望能夠找到一組引數\(\theta \)使得真實資料的分佈\({P_{data}}(x)\)和生成資料的分佈\({P_G}(x;\theta )\)之間距離最短,也就是找到一組生成器引數使得生成器能夠生成十分逼真的圖片。

  我們從真實資料分佈\({P_{data}}(x)\)裡面取樣m個點,\({x^1},{x^2}, \cdots ,{x^m}\),根據給定的引數\(\theta \)我們可以計算生成分佈中第i個樣本\({x^i}\)出現的概率\({P_G}({x^i};\theta )\),那麼生成這m個樣本資料的擬然函式就是

\[L = \mathop \Pi \limits_{i = 1}^m {P_G}({x^i};\theta )\]

L為全部真實樣本在生成分佈中出現的概率。又因為若 P_G(x;θ) 分佈和 P_data(x) 分佈相似,那麼真實資料很可能就會出現在 P_G(x;θ) 分佈中,因此 m 個樣本都出現在 P_G(x;θ) 分佈中的概率就會十分大。

下面我們可以最大化擬然函式L來求得離真實分佈最近的生成分佈(即找到最優的引數\({\theta ^*}\)):

\[{\theta ^*} = \mathop {\arg \max }\limits_\theta  \mathop \Pi \limits_{i = 1}^m {p_G}({x^i};\theta ) \Leftrightarrow \mathop {\arg \max }\limits_\theta  \log \mathop \Pi \limits_{i = 1}^m {P_G}({x^i};\theta )\]

\[ = \mathop {\arg \max }\limits_\theta  \sum\limits_{i = 1}^m {\log } {P_G}({x^i};\theta )\left\{ {{x^1},{x^2}, \cdots ,{x^m}} \right\}from{P_{data}}(x)\]

\[ \approx \mathop {\arg \max }\limits_\theta  {E_{x \sim {P_{data}}}}[\log {P_G}(x;\theta )]\]

\[ \Leftrightarrow \mathop {\arg \max }\limits_\theta  \int_x {{P_{data}}} (x)\log {P_G}(x;\theta )dx - \int_x {{P_{data}}} (x)\log {P_{data}}(x)dx\]

\[ = \mathop {\arg \max }\limits_\theta  \int_x {{P_{data}}} (x)\log \frac{{{P_G}(x;\theta )}}{{{P_{data}}(x)}}dx\]

\[ = \mathop {\arg \min }\limits_\theta  KL({P_{data}}(x)||{P_G}(x;\theta ))\]

分析推導過程:

1、我們希望得到最大化擬然函式L,簡化求解過程,對擬然函式取對數,那麼累乘就轉換成累加,並且這一過程並不會改變最優結果。因此我們可以將極大似然估計化為求令\(\log {P_G}(x;\theta )\)期望最大化的\(\theta \)

2、期望\({E_{x \sim \;{P_{data}}}}[\log {P_G}(x;\theta )]\)可以展開為\(\int_x {{P_{data}}} (x)\log {P_G}(x;\theta )dx\)在 x 上的積分形式。

3、因為該最優化過程是針對 θ 的,所以我們多減去一項\(\int_x {{P_{data}}} (x)\log {P_{data}}(x)dx\),不含 θ的積分並不影響優化效果,因為這相當於是一個引數。

4、合併這兩個積分並構造類似KL散度的形式

上面的積分就是KL散度的積分形式,所以我們想要求得生成分佈和真實分佈儘可能靠近的引數θ,那麼我們只需要求令KL散度最小化的引數θ(最優的θ)。

這裡在前面新增一個負號,將log裡面的分數倒一下,就變成了KL散度(KL divergence)

但是\({P_G}(x;\theta )\)如何算出來呢?

\[{P_G}(x) = \int_z {{P_{prior}}} (z){I_{[G(z) = x]}}dz\]

裡面的I表示示性函式,也就是

\[{I_{G(z) = x}} = \left\{ {\begin{array}{*{20}{l}}0&{G(z) \ne x}\\1&{G(z) = x}\end{array}} \right.\]

這樣我們其實根本沒辦法求出這個\({P_G}(x)\)出來,這就是生成模型的基本想法。

其他人推導存在的問題

Scott Rome對原論文的推導有這麼一個觀念,他認為原論文忽略了可逆條件,原論文的推理過程不夠完美。我們開看看到底哪裡不完美:

在GAN原論文中,有一個思想和其他方法不同,即生成器G不需要滿足可逆條件,即G不可逆

scott Rome認為:在實踐過程中G就是不可逆的。

其他人:證明時使用積分換元公式,,而積分換元公式恰恰是基於G的可逆條件。

Scott認為證明只能基於以下等式成立:

\[{E_{z \sim Pz(z)}}[\log (1 - D(G(z)))] = {E_{x \sim {P_G}(x)}}[\log (1 - D(x)]\]

該等式來源於測度論中的 Radon-Nikodym 定理,它展示在原論文的命題 1 中,並且表達為以下等式:

\[\int\limits_x {{p_{data}}(x)} \log D(x)dx + \int\limits_z {p(z)} \log (1 - D(G(z)))dz\]

\[ = \int\limits_x {{p_{data}}(x)} \log D(x)dx + {p_G}(x)\log (1 - D(x))dx\]

我們這裡使用了積分換元公式,但進行積分換元就必須計算 G^(-1),而 G 的逆卻並沒有假定為存在。並且在神經網路的實踐中,它也並不存在。可能這個方法在機器學習和統計學文獻中太常見了,因此很多人忽略了它。

  滿足Radon-Nikodym 定理條件之後。我們利用積分換元變換一下之前定義的目標函式:

\[\mathop {\min }\limits_G \mathop {\max }\limits_D V(D,G) = {E_{x \sim {p_{data}}(x)}}[\log D(x)] + {E_{x \sim PG}}[\log (1 - D(x))]\]

  然後通過下面的式子求最優的生成網路模型\[{G^*} = \arg \mathop {\min }\limits_G \mathop {\max }\limits_D V(G,D)\]

最優判別器

  首先我們只考慮\(\mathop {\max }\limits_D V(G,D)\),在給定G的情況下,求一個合適的D使得V(G,D)取得最大。這是一個簡單的微積分。

\[\begin{array}{l}V = Ex \sim {P_{data}}[logD(X)] + Ex \sim {P_G}[log(1 - D(x))]\\ = \mathop \smallint \limits_x {P_{data}}(x)\log D(x)dx + \mathop \smallint \limits_x {p_G}(x)\log (1 - D(x))dx\\ = \int_x {[{P_{data}}(x)logD(X)] + {P_G}(x)log(1 - D(x))]dx} \end{array}\]

  對於這個積分,要取其最大值,只要被積函式是最大的,就能求到最大值,我們稱之為最優的判別器\({D^*}\)\[{D^*} = {P_{data}}(x)\log D(x) + {P_G}(x)\log (1 - D(x))\]

  在真實資料給定和生成資料給定的前提下,\({P_{data}}(x)\)和\({P_G}(x)\)都可以看做是常數,我們用a、b來表示他們,如此一來得到下面的式子:\[\begin{array}{*{20}{l}}{f(D) = a\log (D) + b\log (1 - D)}\\{\frac{{df(D)}}{{dD}} = a*\frac{1}{D} + b*\frac{1}{{{\rm{1}} - {\rm{D}}}}*( - 1) = 0}\\{a*\frac{1}{{{D^*}}} = b*\frac{1}{{1 - {D^*}}}}\\{ \Leftrightarrow a*(1 - {D^*}) = b*{D^{\rm{*}}}}\\{ \Leftrightarrow {D^{\rm{*}}}(x) = \frac{{{P_{data}}(x)}}{{{P_{data}}(x) + {P_G}(x)}}(while{P_{data}}(x) + {P_G}(x) \ne 0)}\end{array}\]

如果我們繼續對f(D)求二階導,並把極值點\({{D^{\rm{*}}}(x) = \frac{{{P_{data}}(x)}}{{{P_{data}}(x) + {P_G}(x)}}}\)代入:

\[\frac{{df{{(D)}^2}}}{{{d^2}D}} =  - \frac{{{P_{data}}(x)}}{{{{(\frac{{{P_{data}}(x)}}{{{P_{data}}(x) + {P_{\rm{G}}}(x)}})}^2}}} - \frac{{{P_{\rm{G}}}(x)}}{{1 - {{(\frac{{{P_{data}}(x)}}{{{P_{data}}(x) + {P_{\rm{G}}}(x)}})}^2}}} < 0\]

  其中0<a,b<1,因為一接到等於0、二階導小於0,所以\({\frac{{{P_{data}}(x)}}{{{P_{data}}(x) + {P_G}(x)}}}\)為極大值,\({{D^{\rm{*}}}(x)}\)即為最優判別器。

  這樣我們就求得了在真實資料給定和生成資料給定的前提下,能夠使得V(D)取得最大值的D,其實該最優的 D 在實踐中並不是可計算的,但在數學上十分重要。我們並不知道先驗的 P_data(x),所以我們在訓練中永遠不會用到它。另一方面,它的存在令我們可以證明最優的 G 是存在的,並且在訓練中我們只需要逼近 D。

最優生成器

當前僅當\({P_G}(x) = {P_{data}}(x)\)時,意味著\[D_G^* = \frac{{{P_{data}}(x)}}{{{P_G}(x) + {P_{data}}(x)}} = \frac{1}{2}\]

判別器已經分不清誰是真實資料誰是生成資料了,我們代入目標函式V(G,D),即進入極大極小博弈儀式的第二步,求令\(V(G,{D^*})\)最小的生成器\({G^*}\)(最優生成器)。

原論文中的這一定理是「當且僅當」宣告,所以我們需要從兩個方向證明。首先我們先從反向逼近並證明V(G,D)的取值,然後再利用由反向獲得的新知識從正向證明。設\({P_G}(x) = {P_{data}}(x)\)(反向指預先知道最優條件並做推導),我們可以反向推出:

\[V(G,D_G^*) = \int_x {{P_{data}}(x)log\frac{1}{2}] + {P_G}(x)log(1 - \frac{1}{2})dx} \]

\[ \Leftrightarrow V(G,D_G^*) =  - \log 2\int\limits_x {{P_G}(x)} dx - \log 2\int\limits_x {{P_{data}}(x)} dx =  - 2\log 2 =  - \log 4\]

該值是全域性最小值的候選,因為它只有在\({P_G}(x) = {P_{data}}(x)\)的時候才出現。我們現在需要從正向證明這一個值常常為最小值,也就是同時滿足「當」和「僅當」的條件。現在放棄\({P_G}(x) = {P_{data}}(x)\)的假設,對任意一個 G,我們可以將上一步求出的最優判別器 D* 代入到V(G,D) 中,得到如下的結果\[{\max V(G,D) = V(G,{D^*})}\]

\[{ = {E_{x \sim {p_{data}}(x)}}[\log \frac{{{P_{data}}(x)}}{{{P_{data}}(x) + {P_G}(x)}}] + {E_{x \sim PG}}[\log \frac{{{P_G}(x)}}{{{P_{data}}(x) + {P_G}(x)}}]}\]

\[{ = \int\limits_x {{P_{data}}(x)\log \frac{{\frac{1}{2}{P_{data}}(x)}}{{\frac{{{P_{data}}(x) + {P_G}(x)}}{2}}}dx}  + \int\limits_x {{P_G}(x)\log \frac{{\frac{1}{2}{P_G}(x)}}{{\frac{{{P_{data}}(x) + {P_G}(x)}}{2}}}dx} }\]

\[ = \int\limits_x {{P_{data}}(x)( - \log 2 + \log \frac{{{P_{data}}(x)}}{{\frac{{{P_{data}}(x) + {P_G}(x)}}{2}}})}  + {P_G}(x)( - \log 2 + \log \frac{{{P_G}(x)}}{{\frac{{{P_{data}}(x) + {P_G}(x)}}{2}}})dx\]

\[ =  - \log 2\int\limits_x {{P_{data}}(x) + } {P_G}(x)dx + \int\limits_x {{P_{data}}(x)(\log \frac{{{P_{data}}(x)}}{{\frac{{{P_{data}}(x) + {P_G}(x)}}{2}}})} dx + \int\limits_x {{P_G}(x)(\log \frac{{{P_G}(x)}}{{\frac{{{P_{data}}(x) + {P_G}(x)}}{2}}})dx} \]

因為概率密度的定義,\({{P_{data}}(x)}\)和\({P_G}(x)\)在它們積分域上的積分等於1,結合之前介紹的KL散度,推理出下式:

\[{ =  - 2log2 + KL({P_{data}}(x)||\frac{{{P_{data}}(x) + {P_G}(x)}}{2}) + KL({P_G}(x)||\frac{{{P_{data}}(x) + {P_G}(x)}}{2})}\]

KL 散度是非負的,所以我們馬上就能看出來 -log4 為V(G,D)的全域性最小值。

  之所以當 P_G(x)=P_data(x) 可以令價值函式最小化,是因為這時候兩個分佈的 JS 散度 [JSD(P_data(x) || P_G(x))] 等於零,看到這裡我們其實就已經推匯出了為什麼這麼衡量是有意義的,因為我們取D使得V(G,D)取得min值,這個時候這個min值是由兩個KL divergence構成的,相當於這個min的值就是衡量\({P_G}(x)\)與\({P_{data}}(x)\)的差異程度就能夠取到G使得這兩種分佈的差異最小,這樣自然就能夠生成一個和原分佈儘可能接近得分佈。

  還沒有結束,哇!證明好累呀,快結束了那就再堅持一下吧。

  我們還要進一步證明有且僅有一個G能夠達到這個最小值。

我們來介紹一下JS散度,

\[JSD(P\parallel Q) = \frac{1}{2}[D(P\parallel M) + D(Q\parallel M)]\]

\[M = \frac{1}{2}(P + Q)\]

假設存在兩個分佈 P 和 Q,且這兩個分佈的平均分佈 M=(P+Q)/2,那麼這兩個分佈之間的 JS 散度為 P 與 M 之間的 KL 散度加上 Q 與 M 之間的 KL 散度再除以 2。這裡P為\({P_{data}}(x)\),Q為\({P_G}(x)\)。

JS 散度的取值為 0 到 log2。若兩個分佈完全沒有交集,那麼 JS 散度取最大值 log2;若兩個分佈完全一樣,那麼 JS 散度取最小值 0。

因此V(G,D)可以根據JS散度的定義改寫為:\[V(G,D) =  - \log 4 + 2*JSD({P_{data}}(x)|{P_G}(x))\]

這一散度其實就是Jenson-Shannon距離度量的平方。根據他的屬性:當\({P_G}(x) = {P_{data}}(x)\)時,\(JSD({P_{data}}(x)|{P_G}(x))\)為0。綜上所述,生成分佈當前僅當等於真實資料分散式時,我們可以取得最優生成器。

原論文還有額外的證明白表示:給定足夠的訓練資料和正確的環境,訓練過程將收斂到最優 G,我們並不詳細討論這一塊。

實現

 

 

 

GAN的優缺點

 

參考資料:

這篇部落格以下內容我以後再完善

知乎GAN數學推導

機器之心:GAN推理與實現

Scott Rome GAN 推導:http://srome.github.io//An-Annotated-Proof-of-Generative-Adversarial-Networks-with-Implementation-Notes/

Goodfellow NIPS 2016 Tutorial:https://arxiv.org/abs/1701.00160

李弘毅MLDS17:http://speech.ee.ntu.edu.tw/~tlkagk/courses_MLDS17.html