生成對抗網絡(GAN),是深度學習模型之一,2014年lan Goodfellow的開篇之作Generative Adversarial Network,GAN是一種無監督學習方法,它巧妙地利用“對抗”的思想來學習生成式模型,一旦訓練完成后可以生成全新的數據樣本。DCGAN將GAN的概念擴展到卷積神經網絡中,可以生成質量較高的圖片樣本
GAN概述
GAN包括兩個模型,一個是生成模型 G(Generator),一個是判別模型 D(Discriminator)。他們分別的功能是:
- G負責生成圖片,他接收一個隨機的噪聲z,通過該噪聲生成圖片,將生成的圖片記為G(z)
- D負責判別一張圖片是不是“真實的”。它的輸入是$x$,$x$代表一張圖片,輸出D(x)表示x為真實圖片的概率,如果為1,代表是真實圖片的概率為100%,而輸出為0,代表不可能是真實的圖片(真實實例來源於數據集,偽造實例來源於生成模型)
在訓練過程中,生成模型G的目標是盡量生成看起來真的和原始數據相似的圖片去欺騙判別模型D。而判別模型D的目標是盡量把生成模型G生成的圖片和真實的圖片區分開來。這樣,生成器試圖欺騙判別器,判別器則努力不被生成器欺騙。兩個模型經過交替優化訓練,互相提升,G和D構成了一個動態的“博弈”,這是GAN的基本思想。
最后博弈的結果是什么?在最理想的狀態下,G可以生成足以“以假亂真”的圖片G(z)。對於D來說,它難以判定G生成的圖片究竟是不是真實的,因此D(G(z))=0.5。此時得到了一個生成式的模型G,它可以用來生成圖片。
圖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的優缺點
代碼實現
我們通過GitHub上的一個DCGAN項目介紹TensorFlow中的DCGAN實現。利用該代碼主要去完成兩件事情,一是生成MNIST手寫數字,二是在自己的數據集上訓練。
GAN生成MNIST圖像
在實際訓練中,使用梯度下降法,對D和G交替做優化即可,詳細的步驟為:
- 從已知的噪聲分布$p_{z(z)}$中選出一些樣本$\{z^{(1)}, z^{(2)},····, z^{(m)}\}$
- 從訓練數據中選出同樣個數的真實圖片$\{x^{(1)}, x^{(2)},····, x^{(m)}\}$
- 設判別器D的參數為$\theta_d$,求出損失關於參數的梯度$\triangledown \frac{1}{m}\sum_{i=1}^m[ln(D(x^{(i)})+ln(1-D(G(z^{(i)}))))]$,對$\theta_d$更新時加上該梯度
- 設生成器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"
下面分別是訓練1、5、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。
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