1. 程式人生 > >個人總結:Generative Adversarial Nets GAN原始公式的得來與推導

個人總結:Generative Adversarial Nets GAN原始公式的得來與推導

根據文章所述,x_{i} 為原始資料,z_{i} 使用的噪聲資料,i\in [1, m],  m 為batch_size的大小。

而 G(z_{i}) 為通過生成器生成的資料,也就是說x_{i} 與G(z_{i})是能夠互相對立的競爭對手。生成器生成了G(z_{i})妄圖模擬到x_{i}的效果達到“欺騙”判別器的目的。


x_{i}\rightleftharpoons G(z_{i})   ............................(1)

對於判別器來說,其中D(x_{i})是判別器認定為真假的概率,在0到1之間,這個地方大家很容易理所當然,一定要記住記住記住,因為對於後續公式的理解很重要。它認為越“真”的資料,給出的概率就越接近1,所以對(1)式左邊,它有兩個目的 \max_D D(x_{i})

 以及 \min_DD(G(z_{i})),這很容易理解,判別器希望認定“真”的概率越大,接近1;“假”的概率越小,接近0。

對於(1)式右邊,生成器的目的和判別器相悖,它希望\max_G D(G(z_{i})),也就是希望自己生成的資料越接近真實資料。


所以我們現在可以寫成

D: 1.\max_D D(x_{i}) .....2.\min_D D(G(z_{i}))     .........................(2) //中間的點為空格,1和2為序號

G: \max_GD(G(z_{i}))      ...............................(3)

可以很明顯地看到(2)的2與(3)相矛盾,對啊,這就是博弈的過程,minmax。


接下來,我們可以對(2)式的2,以及(3)進行等價調整,我們將min通過將1進行減法就得到等價變換

D: 1.\max_D D(x_{i}) .....2.\max_D 1 - D(G(z_{i}))     .........................(4)

G: \min_G 1 - D(G(z_{i}))      ...............................(5)

這樣變換的原因原始論文中的表述是能夠得到更加穩健的梯度。


接下來,我們將公式再進行升級,由於我們前面得到的所有都是概率,為方便後續求梯度,我們在所有公式前面加上Log

D: 1.\max_D log(D(x_{i})) .....2.\max_D log(1 - D(G(z_{i}))) .......................(6)

G: \min_G log(1 - D(G(z_{i})))...................(7)


好的,接下來我們可以將(6)式進行合併了,得到

D:\max_D log(D(x_{i}))+log(1 - D(G(z_{i})))   ........................(8)


公式推導到這裡就差不多了,接下來就是交替訓練的過程,論文中提示的是訓練k次判別器,然後訓練一次生成器。

我們將(7)(8)進行結合,就得到了更加接近論文原始公式的東西

\min_G\max_D log(D(x_{i}))+log(1 - D(G(z_{i})))..........................(9)

這裡可能需要仔細看一下,因為已經變成了一個minmax公式了。公式的前半部分和後半部分是判別器用到的部分,而生成器只用到了後半部分。


好勒,現在還記得我之前提到的i\in [1, m],  m 為batch_size的大小嗎。

我們將minibatch裡面所有的資料相加,再對其取均值。這裡我們使用(9)。

\min_G\max_D \frac{1}{m}\sum_{i=1}^{m} log(D(x_{i}))+log(1 - D(G(z_{i}))).....................(10)

咦,是不是有點眼熟呢?對啊,這樣我們就求取了一個Minibatch的期望!


此時我們已經可以將(10)等價寫成

\min_G\max_D E_{x\sim p_{data}} log(D(x))+E_{z\sim p_z(z))}log(1 - D(G(z)))........................(11)

是的,這就是論文中的原始公式了,要注意 x_{i} 和 z_{i} 已經變成了 {\color{Magenta} }x 和 z 哦,代表的是一個minibatch。


好的,接下來,我們使用(10)中只涉及到判別器的部分,也就是

\max_D \frac{1}{m}\sum_{i=1}^{m} log(D(x_{i}))+log(1 - D(G(z_{i}))).......................(12)

我們想使判別器得到“滿足”,也就是\max_D,通過這樣來更新判別器的引數,我們就需要求(12)的梯度。

\bigtriangledown_{\theta_d} \frac{1}{m}\sum_{i=1}^{m} log(D(x_{i}))+log(1 - D(G(z_{i}))).........................(13)

對啦,這就是論文中的那個求判別器梯度的公式了。


同理,我們使用(10)中只涉及到生成器的部分,也就是

\min_G \frac{1}{m}\sum_{i=1}^{m} log(1 - D(G(z_{i})))............................(14)

然後也是同樣的

\bigtriangledown_{\theta_g} \frac{1}{m}\sum_{i=1}^{m}log(1 - D(G(z_{i}))).................................(15)

這樣就得到論文中求生成器的梯度的公式啦。

我們將得到的生成器和判別器的梯度用於隨機梯度下降法(當然也有其他種優化方法),我們就可以更新它們的引數,使我們的矛更加鋒利,我們的盾更加堅固,以己之矛,攻己之盾,在不斷的交替更新下,我們的生成器和判別器得到了不斷的改良和優化。最終,我們能得到“近似”真實資料分佈的“假資料”。這就是GAN的思想啦。

PS:如果有說的不對的地方,歡迎各路大神指正。感謝觀看!