李宏毅學習筆記34.GAN.04.Theory behind GAN

簡介

本節將從GAN的提出者Ian Goodfellow在2014年的論文原文角度進行講解。
公式輸入請參考:在線Latex公式
我們根據之前學過的內容大概可以知道GAN是根據一堆樣本進行生成工作。
在這裏插入圖片描述
那麼我們從Generation來看是怎麼個生成法。假如我們要生成一張圖片,那麼用xx來代表一張圖片 an image (a highdimensional vector)。我們要產生的圖片,它有一個固定的一個分佈,記爲:Pdata(x)P_{data}(x),那麼在整個圖像空間中(圖像本來是高維的,這裏爲了可視化,用二維的來表示),只有一小部分區域中採樣出來的點才能產生人臉,其他的不行
在這裏插入圖片描述
因此,如上圖所示,在藍色區域以內的點產生人臉的機率較高,藍色區域以外產生人臉的機率較低。
我們希望機器能夠找出Pdata(x)P_{data}(x)(這個分佈長什麼樣子我們不知道)
• We want to find data distribution Pdata(x)P_{data}(x)
當我們收集了很多樣本的時候,我們知道這些樣本的位置產生人臉的機率較高,但是產生人臉的分佈我們是不知道什麼樣子。
從樣本推算分佈,在沒有GAN這個算法之前,我們用的是MLE。先簡單複習一下MLE。

MLE

Given a data distribution Pdata(x)P_{data}(x) (We can sample from it.我們能從裏面採樣,但是不知道它是啥樣子)
• We have a distribution PG(x;θ)P_{G}(x;\theta) parameterized by θ\theta
• We want to find θ\theta such that PG(x;θ)P_{G}(x;\theta) close to Pdata(x)P_{data}(x)
• E.g. PG(x;θ)P_{G}(x;\theta) is a Gaussian Mixture Model, θ\theta are means and variances of the Gaussians
Sample {x1,x2,,xm}\{x^1,x^2,\cdots,x^m\} from Pdata(x)P_{data}(x)
We can compute PG(xi;θ)P_{G}(x^i;\theta) Likelihood of generating the samples
L=i=1mPG(xi;θ)L=\prod_{i=1}^mP_{G}(x^i;\theta)
Find θ\theta^* maximizing the likelihood
意思就是下面這些數據是從Pdata(x)P_{data}(x)這個分佈sample出來的,如果用PG(x;θ)P_{G}(x;\theta)來產生下面這些數據,那麼它產生這些數據的Likelihood越大越好(計算公式如上),這個事情可以通過調整參數θ\theta來實現。
在這裏插入圖片描述
上面的數據可能是混合高斯模型,有三個分佈組成,用這個混合高斯模型來產生這些數據likelihood最大。
在這裏插入圖片描述

MLE=Minimize KL Divergence

從另外一個角度來看MLE:
θ=argmaxθi=1mPG(xi;θ)=argmaxθlogi=1mPG(xi;θ)\theta^*=arg\underset{\theta}{\text{max}}\prod_{i=1}^mP_{G}(x^i;\theta)=arg\underset{\theta}{\text{max}}log\prod_{i=1}^mP_{G}(x^i;\theta)
加log不影響求最大,然後就可以乘法變加法:
=argmaxθi=1mlogPG(xi;θ),{x1,x2,,xm} from Pdata(x)=arg\underset{\theta}{\text{max}}\sum_{i=1}^mlogP_{G}(x^i;\theta),\quad \{x^1,x^2,\cdots,x^m\} \space from\space P_{data}(x)
這個事情就相當於求從Pdata(x)P_{data}(x)採樣出xx的期望:
argmaxθExPdata[logPG(x;θ)]\approx arg\underset{\theta}{\text{max}}E_{x\sim P_{data}}[logP_{G}(x;\theta)]
把期望展開就是積分:
=argmaxθxPdata(x)logPG(x;θ)dx=arg\underset{\theta}{\text{max}}\int_xP_{data}(x)logP_{G}(x;\theta)dx
上式後面減去一個和PGP_G無關的項不影響求最大值:
=argmaxθxPdata(x)logPG(x;θ)dxxPdata(x)logPdata(x)dx=arg\underset{\theta}{\text{max}}\int_xP_{data}(x)logP_{G}(x;\theta)dx-\int_xP_{data}(x)logP_{data}(x)dx
xPdata(x)\int_xP_{data}(x)提取出來,那麼xlogPG(x;θ)dxxlogPdata(x)dx\int_xlogP_{G}(x;\theta)dx-\int_xlogP_{data}(x)dx就是求PGPdataP_{G}||P_{data}的KL Divergence,這裏把兩個分佈位置換一下,就變成求最小值:
=argminθKL(PdataPG)=arg\underset{\theta}{\text{min}}KL(P_{data}||P_{G})
但是我們的分佈PGP_G不一定是高斯分佈,因此我們如何把PGP_G進行一般化?如果PGP_G是一個NN,就沒有辦法算likelihood。因此要用GAN的Generator來解決這個問題。

Generator

xx來代表一張圖片 an image (a highdimensional vector)。
• A generator GG is a network. The network defines a probability distribution PGP_G
NN就是一個輸入一個輸出(現在是做圖片生成,所以輸出就是一個圖片),類似下圖
在這裏插入圖片描述
現在輸入zz是來自一個分佈(可以用Normal Distribution,也可以用uniform distribution,影響不大,因爲後面接的是NN,因此輸入很簡單的分佈,NN也可以輸出非常複雜的分佈)
在這裏插入圖片描述
如果zzsample的值不一樣,那麼輸出的值也不一樣:
在這裏插入圖片描述
如果把這些輸出集合起來就是一個非常複雜的分佈,記爲:PG(x)P_G(x)
在這裏插入圖片描述
我們希望Generator生成的分佈PG(x)P_G(x)要和目標分佈Pdata(x)P_{data}(x)越接近越好:
在這裏插入圖片描述
寫成一個優化的公式爲:
G=argminGDiv(PG,Pdata)G^*=arg\underset{G}{\text{min}}Div(P_G,P_{data})
Div(PG,Pdata)Div(P_G,P_{data})就是Divergence between distributions PGP_G and PdataP_{data}
挖坑:How to compute the divergence?
PGP_GPdataP_{data}的公式我們不知道,如果知道我們就可以代入DL的公式,然後用GD來解。

Discriminator

在講具體的數學推導,先看GAN解決這個問題的原理。
要求:
G=argminGDiv(PG,Pdata)G^*=arg\underset{G}{\text{min}}Div(P_G,P_{data})
儘管我們不知道PGP_GPdataP_{data},但是我們可以從它們裏面sample數據。
在這裏插入圖片描述
問題就變成我們怎麼從sample的數據求PGP_GPdataP_{data}
其實我們可以使用Discriminator來衡量PGP_GPdataP_{data}的Divergence
藍色星星: data sampled from PdataP_{data}
橙色星星: data sampled from PGP_G
在這裏插入圖片描述
我們可以用Discriminator來區分兩個Distribution,公式:
在這裏插入圖片描述
前面一項是表示數據sampled from PdataP_{data},值越大越好,後面一項是表示數據sampled from PGP_G ,值越小越好
上面公式的形式和訓練一個二分類Classifier的目標函數長得一樣,就是說可以把PdataP_{data}PGP_G 看成兩個分類。
訓練Discriminator就好比訓練一個二分類:
在這裏插入圖片描述
The maximum objective value is related to JS divergence.來看下爲什麼是JS divergence。
如果兩個分佈的數據很接近(small divergence),那麼Discriminator很難把數據分開,也就是上面的公式很難找到一個D,使得DD^*取得很大的值
在這裏插入圖片描述
反之:
在這裏插入圖片描述
也就是DD^*和divergence程度有關係,下面用數學來證明。

DD^*和divergence的關係證明

先把Objective函數寫出來:
V=ExPdata[logD(x)]+ExPG[log(1D(x))]V=E_{x\sim P_{data}}[logD(x)]+E_{x\sim P_G}[log(1-D(x))]
• Given GG(固定 GG), what is the optimal DD^* maximizing
V=ExPdata[logD(x)]+ExPG[log(1D(x))]=xPdata(x)logD(x)dx+xPG(x)log(1D(x))dx=x[Pdata(x)logD(x)+PG(x)log(1D(x))]dxV=E_{x\sim P_{data}}[logD(x)]+E_{x\sim P_G}[log(1-D(x))]\\ =\int_xP_{data}(x)logD(x)dx+\int_xP_G(x)log(1-D(x))dx\\ =\int_x[P_{data}(x)logD(x)+P_G(x)log(1-D(x))]dx
Assume that D(x) can be any function
• Given xx, the optimal DD^* maximizing(上面的最大化問題就變成下面的公式)
Pdata(x)logD(x)+PG(x)log(1D(x))P_{data}(x)logD(x)+P_G(x)log(1-D(x))
這裏PdataPG(x)P_{data},P_G(x)是固定的,要找一個D(x)D(x)最大化上面的式子,我們可以設:
a=Pdata(x),b=PG(x),D=D(x)(1)a=P_{data}(x),b=P_G(x),D=D(x)\tag1
最大化函數就變成:
f(D)=alog(D)+blog(1D)f(D)=alog(D)+blog(1-D)
求極值就是要先求導,並讓導數等於0:
df(D)dD=a×1D+b×11D×(1)=1\cfrac{df(D)}{dD}=a\times\cfrac{1}{D}+b\times\cfrac{1}{1-D}\times(-1)=1
a×1D=b×11Da×(1D)=b×DaaD=bDa=(a+bD)D=aa+ba\times\cfrac{1}{D^*}=b\times\cfrac{1}{1-D^*}\\ a\times(1-D^*)=b\times D^*\\ a-aD^*=bD^*\\ a=(a+bD^*)\\ D^*=\cfrac{a}{a+b}
把假設1帶回來
D(x)=Pdata(x)Pdata(x)+PG(x)D^*(x)=\cfrac{P_{data}(x)}{P_{data}(x)+P_G(x)}
然後我們把DD^*帶回二分類的目標函數:
maxDV(G,D)=V(G,D)=ExPdata[logD(x)]+ExPG[log(1D(x))]=ExPdata[logPdata(x)Pdata(x)+PG(x)]+ExPG[logPG(x)Pdata(x)+PG(x)]xPdatalogPdata(x)Pdata(x)+PG(x)dx+xPG(x)logPG(x)Pdata(x)+PG(x)dx=xPdatalog12Pdata(x)Pdata(x)+PG(x)2dx+xPG(x)log12PG(x)Pdata(x)+PG(x)2dx=log12+log12+xPdatalogPdata(x)Pdata(x)+PG(x)2dx+xPG(x)logPG(x)Pdata(x)+PG(x)2=2log12+xPdatalogPdata(x)Pdata(x)+PG(x)2dx+xPG(x)logPG(x)Pdata(x)+PG(x)2=2log2+xPdatalogPdata(x)Pdata(x)+PG(x)2dx+xPG(x)logPG(x)Pdata(x)+PG(x)2=2log2+KL(PdataPdata(x)+PG(x)2)+KL(PGPdata(x)+PG(x)2)=2log2+2JSD(PdataPG)\underset{D}{\text{max}}V(G,D)=V(G,D^*)=E_{x\sim P_{data}}[logD(x)]+E_{x\sim P_G}[log(1-D(x))]\\ =E_{x\sim P_{data}}\left[log\cfrac{P_{data}(x)}{P_{data}(x)+P_G(x)}\right ]+E_{x\sim P_G}\left[log\cfrac{P_G(x)}{P_{data}(x)+P_G(x)}\right ]\\ \int_xP_{data}log\cfrac{P_{data}(x)}{P_{data}(x)+P_G(x)}dx+\int_xP_G(x)log\cfrac{P_G(x)}{P_{data}(x)+P_G(x)}dx\\ =\int_xP_{data}log\cfrac{\cfrac{1}{2}P_{data}(x)}{\cfrac{P_{data}(x)+P_G(x)}{2}}dx+\int_xP_G(x)log\cfrac{\cfrac{1}{2}P_G(x)}{\cfrac{P_{data}(x)+P_G(x)}{2}}dx\\ =log\cfrac{1}{2}+log\cfrac{1}{2}+\int_xP_{data}log\cfrac{P_{data}(x)}{\cfrac{P_{data}(x)+P_G(x)}{2}}dx+\int_xP_G(x)log\cfrac{P_G(x)}{\cfrac{P_{data}(x)+P_G(x)}{2}}\\ =2log\cfrac{1}{2}+\int_xP_{data}log\cfrac{P_{data}(x)}{\cfrac{P_{data}(x)+P_G(x)}{2}}dx+\int_xP_G(x)log\cfrac{P_G(x)}{\cfrac{P_{data}(x)+P_G(x)}{2}}\\ =-2log2+\int_xP_{data}log\cfrac{P_{data}(x)}{\cfrac{P_{data}(x)+P_G(x)}{2}}dx+\int_xP_G(x)log\cfrac{P_G(x)}{\cfrac{P_{data}(x)+P_G(x)}{2}}\\ =-2log2+KL\left(P_{data}||\cfrac{P_{data}(x)+P_G(x)}{2}\right)+KL\left(P_G||\cfrac{P_{data}(x)+P_G(x)}{2}\right)\\ =-2log2+2JSD(P_{data}||P_G)
JSD: Jensen-Shannon divergence


KL散度、JS散度和交叉熵
三者都是用來衡量兩個概率分佈之間的差異性的指標。不同之處在於它們的數學表達。
對於概率分佈P(x)和Q(x)
1)KL散度(Kullback–Leibler divergence)
又稱KL距離,相對熵。
當P(x)和Q(x)的相似度越高,KL散度越小。
KL散度主要有兩個性質:
(1)不對稱性
儘管KL散度從直觀上是個度量或距離函數,但它並不是一個真正的度量或者距離,因爲它不具有對稱性,即D(P||Q)!=D(Q||P)。
(2)非負性
相對熵的值是非負值,即D(P||Q)>0。
2)JS散度(Jensen-Shannon divergence)
JS散度也稱JS距離,是KL散度的一種變形。
但是不同於KL主要又兩方面:
(1)值域範圍
JS散度的值域範圍是[0,1],相同則是0,相反爲1。相較於KL,對相似度的判別更確切了。
(2)對稱性
即 JS(P||Q)=JS(Q||P),從數學表達式中就可以看出。
3)交叉熵(Cross Entropy)
在神經網絡中,交叉熵可以作爲損失函數,因爲它可以衡量P和Q的相似性。

交叉熵和相對熵的關係:
以上都是基於離散分佈的概率,如果是連續的數據,則需要對數據進行Probability Density Estimate來確定數據的概率分佈,就不是求和而是通過求積分的形式進行計算了。


現在,原來的挖的坑:
G=argminGDiv(PG,Pdata)G^*=arg\underset{G}{\text{min}}Div(P_G,P_{data})
Div(PG,Pdata)Div(P_G,P_{data})就是Divergence between distributions PGP_G and PdataP_{data}
可以變化爲:
G=argminGmaxDV(G,D)G^*=arg\underset{G}{\text{min}}\underset{D}{\text{max}}V(G,D)
這個式子很複雜,就是找一個G,最小化maxDV(G,D)\underset{D}{\text{max}}V(G,D),找一個D,最大化V(G,D)V(G,D)
前面的數學推導已經找到了最好的DD^*(The maximum value is related to JS divergence.),現在找一個最好的GG^*
假設我們現在只有三個G,分別是G1,G2,G3G_1,G_2,G_3
橫座標不一樣,代表選擇了不同的Discriminator,當我們固定不同的G的時候,最大化的V(G,D)V(G,D)如下圖中的紅點所示。
在這裏插入圖片描述
從三個不同的G1,G2,G3G_1,G_2,G_3來看,從三個最大化的V(G,D)V(G,D)中取最小值,故這裏G=G3G^*=G_3
在這裏插入圖片描述
換個角度看,就是PG3P_{G_3}PdataP_{data}的Divergence最小。
在這裏插入圖片描述
黑框中的內容就是在解G=argminGmaxDV(G,D)G^*=arg\underset{G}{\text{min}}\underset{D}{\text{max}}V(G,D)

GD Algorithm for GAN

用函數L(G)L(G)替代GG^*中的maxDV(G,D)\underset{D}{\text{max}}V(G,D)
G=argminGL(G)G^*=arg\underset{G}{\text{min}}L(G)
To find the best G minimizing the loss function L(G)L(G)
θGθGηL(G)θG,θG defines G\theta_G\leftarrow\theta_G-\eta\cfrac{\partial{L(G)}}{\partial{\theta_G}},\theta_G\space \text{defines}\space G


上面的梯度下降中對L(G)L(G)求偏導有沒有問題?因爲L(G)L(G)中是有求最大值的。
回答:可以,參考之前在CNN中Max Pooling操作,也是可以做梯度下降的。例如:
f(x)=max{f1(x),f2(x),f3(x)}f(x)=\text{max}\{f_1(x),f_2(x),f_3(x)\}
f1(x),f2(x),f3(x)f_1(x),f_2(x),f_3(x)的圖像如下圖:
在這裏插入圖片描述
現在來求:df(x)dx=?\cfrac{df(x)}{dx}=?
要看x能讓f1(x),f2(x),f3(x)f_1(x),f_2(x),f_3(x)中的哪個最大,把最大那個拿出來求導即可,例如,x初始化的時候在1號點的位置,那麼這個時候是f1(x)f_1(x)最大,這個時候用df1(x)dx\cfrac{df_1(x)}{dx}來做梯度下降,並進行更新(黃色箭頭)來到2號點,這個時候f2(x)f_2(x)最大,這個時候用df2(x)dx\cfrac{df_2(x)}{dx}來做梯度下降,並進行更新(黃色箭頭)來到3號點。
在這裏插入圖片描述
也就是說函數中有max操作,也是可以做梯度下降的。
明白這個之後我們繼續來看整個GG^*如何算。


• Given G0G_0
• Find D0D_0^* maximizing V(G0,D)V(G_0,D) (這裏用梯度下降)
V(G0,D0)V(G_0,D_0^*) is the JS divergence between Pdata(x)P_{data}(x) and PG0(x)P_{G_0}(x)
θGθGηV(G,D0)θG,Obtain G1\theta_G\leftarrow\theta_G-\eta\cfrac{\partial{V(G,D_0^*)}}{\partial{\theta_G}},\text{Obtain}\space G_1
這裏的梯度下降就是減少JS divergence(坑)
• Find D1D_1^* maximizing V(G1,D)V(G_1,D) (這裏用梯度下降),這裏好比上面橫線中的講解是一樣的,當GGG0G_0變到G1G_1的時候,對應的L(G)=maxDV(G,D)L(G)=\underset{D}{\text{max}}V(G,D)可能改變了,所以要重新求D1D_1
V(G1,D1)V(G_1,D_1^*) is the JS divergence between Pdata(x)P_{data}(x) and PG1(x)P_{G_1}(x)
在這裏插入圖片描述
θGθGηV(G,D1)θG,Obtain G2\theta_G\leftarrow\theta_G-\eta\cfrac{\partial{V(G,D_1^*)}}{\partial{\theta_G}},\text{Obtain}\space G_2
這裏的梯度下降就是減少JS divergence(坑)
然後不斷循環


把上面標記的坑:這裏的梯度下降就是減少JS divergence,這裏的減少是有條件的。
在這裏插入圖片描述
假設在G0G_0的時候,V(G0,D)V(G_0,D)的曲線如上圖左邊所示,然後,D0D_0^*使得V(G0,D)V(G_0,D)最大,這個時候的JSD是V(G0,D0)V(G_0,D_0^*) between Pdata(x)P_{data}(x) and PG0(x)P_{G_0}(x),然後我們用梯度下降更新G0G_0,將其變成G1G_1,這個時候由於G的值變化後,V(G1,D)V(G_1,D)的曲線發生了變化(參考上面f(x)=max{f1(x),f2(x),f3(x)}f(x)=\text{max}\{f_1(x),f_2(x),f_3(x)\}的例子),這個新曲線V(G1,D)V(G_1,D)如上圖的右邊所示,這個時候的最大值就不在D0D_0^*了,離它很遠,這個時候的JSD變成了V(G1,D1)V(G_1,D_1^*),可以看到後面的JSD明顯要變大了,這樣是不對的,因此我們做了假設,假設
D0D1D_0^*\approx D_1^*
這個時候從V(G0,D)V(G_0,D)V(G1,D)V(G_1,D)的曲線變化不會很大。也就是G這個參數只變化了一點點。
我們同樣可以用D0D_0^*來衡量變化後JSD between Pdata(x)P_{data}(x) and PG1(x)P_{G_1}(x)
也就是說GAN的訓練技巧:
Generator不要一次update太多,也不需要太多的iteration;
而Discriminator可以訓練到收斂。因爲要找到最大值才能衡量出JSD。


實作

理論上V是要取期望值,但是實際上是不可能的。只能用樣本的均值進行估計:
Given GG, how to compute maxDV(G,D)\underset{D}{\text{max}}V(G,D)
• Sample {x1,x2,,xm}\{x^1,x^2,\cdots,x^m\} from Pdata(x)P_{data}(x), Sample {x~1,x~2,,x~m}\{\tilde x^1,\tilde x^2,\cdots,\tilde x^m\} from generator PG(x)P_{G}(x)
Maximize V~=1mi=1mlogD(xi)+1mi=1mlog(1D(x~i))(2)\text{Maximize }\tilde V=\cfrac{1}{m}\sum_{i=1}^mlogD(x^i)+\cfrac{1}{m}\sum_{i=1}^mlog(1-D(\tilde x^i))\tag2
上面這個事情實際上就是在訓練一個Binary Classifier,記爲D,D後面接一個sigmoid函數,使得輸出值在[0,1]之間
我們把{x1,x2,,xm}\{x^1,x^2,\cdots,x^m\} from Pdata(x)P_{data}(x)看做Positive examples;
我們把{x~1,x~2,,x~m}\{\tilde x^1,\tilde x^2,\cdots,\tilde x^m\} from generator PG(x)P_{G}(x)看做Negative examples
目標是最小化上面兩組數據的Cross-entropy,計算這個交叉熵的公式推導出來就是公式2

Algorithm for GAN(Review)

Initialize θd\theta_d for DD and θg\theta_g for GG.
• In each training iteration:


這塊分割線內是訓練Discriminator,重複k次,這裏一定要訓練到收斂爲止,目的是找到maxDV(G,D)\underset{D}{\text{max}}V(G,D)(實作的時候一般沒有辦法真的訓練到收斂或者卡在局部最小點,因此這裏找到的是maxDV(G,D)\underset{D}{\text{max}}V(G,D)的lower bound)。
••Sample m examples {x1,x2,,xm}\{x^1,x^2,\cdots,x^m\} from data distribution Pdata(x)P_{data}(x).(找到真實對象)
••Sample m noise examples {z1,z2,,zm}\{z^1,z^2,\cdots,z^m\} from the prior Pprior(z)P_{prior}(z).(這個先驗分佈種類不是很重要)
•••Obtaining generated data {x~1,x~2,,x~m},x~i=G(zi)\{\tilde x^1,\tilde x^2,\cdots,\tilde x^m\},\tilde x^i=G(z^i).(找到生成對象)
•• Update discriminator parameters θd\theta_d to maximize
V~=1mi=1mlogD(xi)+1mi=1mlog(1D(x~i))θdθd+ηV~(θd)\tilde V=\cfrac{1}{m}\sum_{i=1}^mlogD(x^i)+\cfrac{1}{m}\sum_{i=1}^mlog(1-D(\tilde x^i))\\ \theta_d\leftarrow\theta_d+\eta\triangledown\tilde V(\theta_d)



這塊分割線內是訓練Generator,重複1次,目的是減少JSD
••Sample another m noise samples {z1,z2,,zm}\{z^1,z^2,\cdots,z^m\} from the prior Pprior(z)P_{prior}(z)
••Update generator parameters θg\theta_g to minimize
V~=1mi=1mlogD(xi)+1mi=1mlog(1D(G(zi)))θgθgηV~(θg)\tilde V=\cfrac{1}{m}\sum_{i=1}^mlogD(x^i)+\cfrac{1}{m}\sum_{i=1}^mlog(1-D(G(z^i)))\\ \theta_g\leftarrow\theta_g-\eta\triangledown\tilde V(\theta_g)
由於1mi=1mlogD(xi)\cfrac{1}{m}\sum_{i=1}^mlogD(x^i)GG函數無關,所以在求最小值的時候可以忽略:
V~=1mi=1mlog(1D(G(zi)))θgθgηV~(θg)\tilde V=\cfrac{1}{m}\sum_{i=1}^mlog(1-D(G(z^i)))\\ \theta_g\leftarrow\theta_g-\eta\triangledown\tilde V(\theta_g)


Objective Function for Generator in Real Implementation

按上面的算法:,我們可以知道Generator目標函數應該是:
V=ExPdata[logD(x)]+ExPG[log(1D(x))]V=E_{x\sim P_{data}}[logD(x)]+E_{x\sim P_G}[log(1-D(x))]
然後第一項和GG函數無關,所以在求最小值的時候可以忽略:
V=ExPG[log(1D(x))]V=E_{x\sim P_G}[log(1-D(x))]
但是,在論文原文在實作的時候把這個函數改爲:
V=ExPG[log(D(x))]V=E_{x\sim P_G}[-log(D(x))]
我們先給出這兩個函數的圖片,然後再解釋:
在這裏插入圖片描述
紅色曲線對應log(1D(x))log(1-D(x)):江湖人稱Minimax GAN (MMGAN)
藍色曲線對應log(D(x))-log(D(x)):江湖人稱Non-saturating GAN (NSGAN)
我們可以看到,紅色曲線由於剛開始的Generator 沒有訓練過,它的生成對象都很假,很容易被識破,因此剛開始log(1D(x))log(1-D(x))的值很小。
不好訓練,換成藍色曲線後,兩個曲線都是下降趨勢,沒有變,但是藍色曲線剛開始的值很大,適合做梯度下降。
其實後來實驗證明兩種結果都差不多。
老師給出了他的猜想,藍色曲線其實就是把label xx from PGP_G as positive.就是把生成對象和真實對象的標籤換一下。估計是作者懶得改code,用的同一套code訓練兩組data。。。
理論部分到此結束。下面看一些比較直覺的東西。

Intuition

Generator和Discriminator的關係:Discriminator leads the generator.
紅線:Discriminator
綠線:Data(target)distribution
藍線:Generated distribution
在這裏插入圖片描述
有兩組數據,生成對象(藍色點)、真實對象(綠色點),然後我們訓練一個Discriminator,然後Discriminator會給藍色點比較低的分數,綠色點比較高的分數(紅色曲線)。然後藍色點就會跟着Discriminator的趨勢(梯度方向)向右邊移動,要獲得高分:
在這裏插入圖片描述
移動過頭,沒關係,這個時候我們會再訓練一次Discriminator,這個時候兩個分佈比較近,所以Discriminator的loss比較大,也就是兩個分佈的JS divergence比較小。然後藍色點就會跟着Discriminator的趨勢(梯度方向)向左邊移動,直到Discriminator變成直線,就是Discriminator無法分辨生成對象(藍色點)和真實對象(綠色點)。
在這裏插入圖片描述
GAN會不會出現正負樣本不均衡的情況?
答:不會,因爲正負樣本都是我們自己sample出來的,只要不想自己和自己過不去就可以sample等量的樣本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章