神經網絡結構:生成式對抗網絡(GAN)

   生成對抗網絡(GAN),是深度學習模型之一,2014年lan Goodfellow的開篇之做Generative Adversarial Network,GAN是一種無監督學習方法,它巧妙地利用「對抗」的思想來學習生成式模型,一旦訓練完成後能夠生成全新的數據樣本。DCGAN將GAN的概念擴展到卷積神經網絡中,能夠生成質量較高的圖片樣本html

GAN概述

  GAN包括兩個模型,一個是生成模型 G(Generator),一個是判別模型 D(Discriminator)。他們分別的功能是:python

  • G負責生成圖片,他接收一個隨機的噪聲z,經過該噪聲生成圖片,將生成的圖片記爲G(z)
  • D負責判別一張圖片是否是「真實的」。它的輸入是$x$,$x$表明一張圖片,輸出D(x)表示x爲真實圖片的機率,若是爲1,表明是真實圖片的機率爲100%,而輸出爲0,表明不多是真實的圖片(真實實例來源於數據集,僞造實例來源於生成模型)

  在訓練過程當中,生成模型G的目標是儘可能生成看起來真的和原始數據類似的圖片去欺騙判別模型D。而判別模型D的目標是儘可能把生成模型G生成的圖片和真實的圖片區分開來。這樣,生成器試圖欺騙判別器,判別器則努力不被生成器欺騙。兩個模型通過交替優化訓練,互相提高,G和D構成了一個動態的「博弈」,這是GAN的基本思想。git

  最後博弈的結果是什麼?在最理想的狀態下,G能夠生成足以「以假亂真」的圖片G(z)。對於D來講,它難以斷定G生成的圖片到底是不是真實的,所以D(G(z))=0.5。此時獲得了一個生成式的模型G,它能夠用來生成圖片。github

圖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)$儘量的接近。app

咱們站在判別網絡的角度想問題,首先判別器要能識別真實數據,一樣也能識別出生成數據,在數學式子上的表達爲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散度的性質

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

二、當前僅當P和Q在離散型變量的狀況下是相同分佈,或者P和Q在連續型變量的狀況下是幾乎到處相等,那麼KL散度爲0。

三、由於 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 ))$$

分析推導過程:

一、咱們但願獲得最大化擬然函數L,簡化求解過程,對擬然函數取對數,那麼累乘就轉換成累加,而且這一過程並不會改變最優結果。所以咱們能夠將極大似然估計化爲求令$\log {P_G}(x;\theta )$指望最大化的$\theta $

二、指望${E_{x \sim \;{P_{data}}}}[\log {P_G}(x;\theta )]$能夠展開爲$\int_x {{P_{data}}} (x)\log {P_G}(x;\theta )dx$在 x 上的積分形式。

三、由於該最優化過程是針對 θ 的,因此咱們多減去一項$\int_x {{P_{data}}} (x)\log {P_{data}}(x)dx$,不含 θ的積分並不影響優化效果,由於這至關因而一個參數。

四、合併這兩個積分並構造相似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的優缺點

代碼實現

  咱們經過GitHub上的一個DCGAN項目介紹TensorFlow中的DCGAN實現。利用該代碼主要去完成兩件事情,一是生成MNIST手寫數字,二是在本身的數據集上訓練。

GAN生成MNIST圖像

  在實際訓練中,使用梯度降低法,對D和G交替作優化便可,詳細的步驟爲:

  1. 從已知的噪聲分佈$p_{z(z)}$中選出一些樣本$\{z^{(1)}, z^{(2)},····, z^{(m)}\}$
  2. 從訓練數據中選出一樣個數的真實圖片$\{x^{(1)}, x^{(2)},····, x^{(m)}\}$
  3. 設判別器D的參數爲$\theta_d$,求出損失關於參數的梯度$\triangledown \frac{1}{m}\sum_{i=1}^m[ln(D(x^{(i)})+ln(1-D(G(z^{(i)}))))]$,對$\theta_d$更新時加上該梯度
  4. 設生成器G的參數爲$\theta_g$,求出損失關於參數的梯度$\triangledown \frac{1}{m}\sum_{i=1}^m[ln(1-D(G(z^{(i)}))))]$,對$\theta_g$更新時減去該梯度

  在上面的步驟中,每對D的參數更新一次,便接着更新一次G的參數。有時還能夠對D的參數更新k次後再更新一次G的參數,這些要根據訓練的實際狀況進行調整。另外,要注意的是,因爲D是但願損失越大越好,G是但願損失越小越好,因此它們一個是加上梯度,一個是減去梯度。

  當訓練完成後,能夠從$P_z(z)$隨機取出一個噪聲,通過G運算後能夠生成符合P_{data}(x)的新樣本。

DCGAN

  若是要實現用DCGAN生成MNIST手寫數字,直接運行

python main.py --dataset mnist --input_height=28 --output_height=28 --train

  這一節主要講使用DCGAN生成卡通人物頭像。首先須要準備好圖片數據並將它們裁剪到統一大小。咱們把數據放在項目根目錄下的./data/anime文件夾下,

python main.py --input_height 96 --input_width 96 \
  --output_height 48 --output_width 48 \
  --dataset anime --crop -–train \
  --epoch 300 --input_fname_pattern "*.jpg"

  下面分別是訓練一、五、50個epoch以後產生的樣本效果

  

使用已經訓練好的模型進行測試的對應命令爲:

python main.py --input_height 96 --input_width 96 --output_height 48 --output_width 48 --dataset anime --crop

 

參考資料

  除了本章所講的GAN和DCGAN外,還有研究者對原始GAN的損失函數作了改進,改進後的模型能夠在某些數據集上得到更穩定的生成效果,相關的論文有:Wasserstein GAN、Least Squares GenerativeAdversarial Networks。

訓練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

相關文章
相關標籤/搜索