您當前的位置:首頁 > 攝影

生成對抗網路 Generative Adversarial Nets(GAN)詳解

作者:由 LonglongaaaGo 發表于 攝影時間:2022-01-30

生成對抗網路 Generative Adversarial Nets(GAN)詳解

近幾年的很多演算法創新,尤其是生成方面的task,很大一部分的文章都是結合GAN來完成的,比如,影象生成、影象修復、風格遷移等等。今天主要聊一聊GAN的原理和推導。

github:

http://www。

github。com/goodfeli/adv

ersarial

論文:

https://

arxiv。org/abs/1406。2661

背景介紹

在GAN演算法出來之前,關於生成的task表現一直都不太好,因為之前的方法由於在最大似然估計和相關策略中出現的許多棘手的機率計算難以近似。而GAN呢,直接繞過了這些問題,用兩個對抗的網路對資料進行生成對抗學習,透過零和遊戲的形式來直接用網路來擬合數據的分佈,從而對資料進行生成。(統計學裡,任何資料都可以看成分佈,任何資料都是同不同的分佈中進行取樣得到)

零和遊戲的概念主要出現在博弈論裡面,核心思想就是,兩個玩家進行對抗遊戲,最後會陷入一個那納什均衡的狀態。什麼是納什均衡?就是說最後兩個玩家,他們都會選擇最優的策略進行遊戲,但是當兩個玩家只要有一個人的決策從這個“最優決策”裡跳出來,那麼他就得不到最多的好處。透過這種方式,實現最終的平衡。而這一思想也深深的滲透到這個演算法之中。

這兩個網路,一個是生成器(generator)一個是判別器(discriminator),生成器G的角色就是要學習到資料的分佈,能夠實現生成以假亂真的資料。而鑑別器D的目的就是要鑑別資料的來源是真實的樣本分佈還是透過生成得到的。G和D之間的對抗,主要是:1。G想要騙過D,就是讓D分辨不出來這個資料是從真實樣本里來的還是從G生成的;2。D的目標就是分辨這個資料到底是G生成的還是真實的樣本。

目標函式

生成對抗網路的核心就是極小極大遊戲( two-player minimax game),這裡G是生成器,生成假資料,D是鑑別器,可以理解為二分類的分類器(當然後面有很多變體,這裡不討論),對應的目標函式如下:

\min _{G} \max _{D} V(D, G)=\mathbb{E}_{\boldsymbol{x} \sim p_{\text {data }}(\boldsymbol{x})}[\log D(\boldsymbol{x})]+\mathbb{E}_{\boldsymbol{z} \sim p_{\boldsymbol{z}}(\boldsymbol{z})}[\log (1-D(G(\boldsymbol{z})))]

\mathbb{E}_{\boldsymbol{x} \sim p_{\text {data }}(\boldsymbol{x})}[\log D(\boldsymbol{x})]

的意思就是對真實的資料分佈進行取樣,然後求函式

\log D(\boldsymbol{x})

的期望。

\mathbb{E}_{\boldsymbol{z} \sim p_{\boldsymbol{z}}(\boldsymbol{z})}[\log (1-D(G(\boldsymbol{z})))]

同理,從高斯噪聲中進行取樣,並且求

\log (1-D(G(\boldsymbol{z})))

的期望。

整個目標函式是透過交替迭代最佳化的形式,來對G和D進行更新,很像就是兩個人下棋一樣,你一下我一下。這樣想就會比較好理解。 這裡首先更新D,所以我們將G的引數都看成常數,那麼目標函式就變成:

\max _{D} V(D, G)=\mathbb{E}_{\boldsymbol{x} \sim p_{\text {data }}(\boldsymbol{x})}[\log D(\boldsymbol{x})]+\mathbb{E}_{\boldsymbol{z} \sim p_{\boldsymbol{z}}(\boldsymbol{z})}[\log (1-D(G(\boldsymbol{z})))]

目的是最佳化能夠讓這個目標函式最大化的D的引數,所以是

\max _{D}

。那既然是max這個目標函式,那麼我們就可以知道

D(\boldsymbol{x})

越接近1越好,對應的

D(G(\boldsymbol{z}))

就是越接近0越好。那麼咱就可以理解了,這個時候G是不動的,看成常數,對應的就是更新D的引數,D呢就是要分出真實資料和生成的資料,分的越開越好。 然後我們再更新G,那麼對應的目標函式,現在變成這樣:

\min _{G}  V(D, G)=\mathbb{E}_{\boldsymbol{x} \sim p_{\text {data }}(\boldsymbol{x})}[\log D(\boldsymbol{x})]+\mathbb{E}_{\boldsymbol{z} \sim p_{\boldsymbol{z}}(\boldsymbol{z})}[\log (1-D(G(\boldsymbol{z})))]

這裡同樣的,就把D看成常數,咱只更新G的引數,所以這回G是主角。這個目標函式就是說優化出最小化目標函式下,對應G的引數。由於D在這是常數,所以咱就把前面半個公式撇了,可得:

\min _{G}  V(D, G)=\mathbb{E}_{\boldsymbol{z} \sim p_{\boldsymbol{z}}(\boldsymbol{z})}[\log (1-D(G(\boldsymbol{z})))]

為了最小化這個目標函式,這個時候,G就要最佳化自己,讓

G(\boldsymbol{z})

的生成結果儘可能的得到較高的分數,及

D(G(\boldsymbol{z}))

越接近1越好,所以對應的你會發現

\log (1-D(G(\boldsymbol{z})))

被最小化,如果

D(G(\boldsymbol{z}))

趨近於1。 然後兩個模型繼續迴圈往復迭代,你一下,我一下。。。。

那麼如果是這樣訓練下來,這個過程中他們的分佈是怎樣變化的呢? 理想狀態下,他們的關係如下:

生成對抗網路 Generative Adversarial Nets(GAN)詳解

這裡直接放了論文裡的圖,

\boldsymbol{z}

是高斯噪聲的域domain,

\boldsymbol{x}

是真實樣本的域。黑色的點表示真實樣本的分佈

p_{\boldsymbol{x}}

,藍色的點表示分類器分類的表現;綠色的線表示生成資料的分佈

p_{\boldsymbol{g}}

,由噪聲

\boldsymbol{z}

透過

\boldsymbol{x}=G(\boldsymbol{z})

對映而來。(a)一開始分類器的表現,好像能夠大概分開兩個分佈的樣子。(b)對D進行最佳化,那麼D達到了最優的分類狀態

D^{*}(\boldsymbol{x})=\frac{p_{\text {data }}(\boldsymbol{x})}{p_{\text {data }}(\boldsymbol{x})+p_{g}(\boldsymbol{x})}

。(c)這個時候G透過D的引數,進一步對自身最佳化,然後往真實樣本進行靠近。(d)最終,生成模型生成的資料和真實樣本一致,鑑別器D無法準確劃分,

D^{*}(\boldsymbol{x})=\frac{1}{2}

訓練虛擬碼

生成對抗網路 Generative Adversarial Nets(GAN)詳解

這裡的虛擬碼已經在目標函式上進行了解釋,主要這裡更加詳細,實際上就是目標函式部分解釋的內容,

\nabla_{\theta_{d}}

就是對應鑑別器引數的梯度,這裡用隨機梯度下降法對模型引數進行更新,根據目標函式。

\nabla_{\theta_{g}}

同理,是生成器G的引數梯度,結合上述

目標函式

進行理解。

理論推導

咱這裡直接順著論文的順序,進行進一步的梳理。首先是上面提到的,為什麼當G固定的時候,最優的D應該是如下形式:

D_{G}^{*}(\boldsymbol{x})=\frac{p_{\text {data }}(\boldsymbol{x})}{p_{\text {data }}(\boldsymbol{x})+p_{g}(\boldsymbol{x})}

論文也給出了對應的證明,這裡著重給出對應的解釋: 首先我們回看

目標函式

,求期望實際上也可以寫成這種積分的形式:

\begin{aligned} V(G, D) &=\int_{\boldsymbol{x}} p_{\text {data }}(\boldsymbol{x}) \log (D(\boldsymbol{x})) d x+\int_{z} p_{\boldsymbol{z}}(\boldsymbol{z}) \log (1-D(g(\boldsymbol{z}))) d z \\ &=\int_{\boldsymbol{x}} p_{\text {data }}(\boldsymbol{x}) \log (D(\boldsymbol{x}))+p_{g}(\boldsymbol{x}) \log (1-D(\boldsymbol{x})) d x \end{aligned}

這裡可以看到後半部分稍稍改動了一下,就是說直接將

x=g(\boldsymbol{z})

進行替代,對

p_{\boldsymbol{z}}

進行取樣等價於對

\boldsymbol{x}

進行取樣,所以就可以寫成下面的式子,這裡需要注意的是我們並不知道

p_{\boldsymbol{g}}

p_{\boldsymbol{data}}

的真實分佈。不過我們能夠知道

p_{\boldsymbol{g}}

p_{\boldsymbol{data}}

都是屬於[0,1]之間的值,我們要求的就是

D(\boldsymbol{x})

的值,這個公式下,我們將其替換成如下形式:

f(y) = a \log (y)+b \log (1-y)

我們把

a=p_{data},b=p_{g},y=D(x)

,然後這裡就變成關於

y

的一個函式。然後我們要記得的是,在G固定的時候,為了求得最大化下的D的引數,所以就是最大化這個

f(y)

。可以知道這個

f(y)

是一個凸函式:

f^{\prime}(y)=\frac{a}{y}-\frac{b}{1-y}

f^{\prime\prime}(y)=-\frac{a}{y^{2}}-\frac{b}{(1-y)^{2}} \leq 0

有個定理就是說,如果

f^{\prime\prime}(y)

是正定矩陣,那麼他就一定是凸函式。這裡就是把向量簡化成了標量。注意因為我們這裡是求極大值,加上一個負號就是求極小,這個二階導加一個負號就是正定矩陣(原本是負定)。說了那麼多直接畫個圖好了:

生成對抗網路 Generative Adversarial Nets(GAN)詳解

這裡可以看到假設

a=0.8,b=1

出來的圖就是這副樣子。 令

f^{\prime}(y)=0

,可得

y=\frac{a}{a+b}

,相當於極值就是這個。這裡就是說明了當給定任意的G,在這一步最優的D的最優解就應該是

y=\frac{a}{a+b}

,即

D(x)=\frac{p_{data}}{p_{data}+p_{g}}

。 好的,這裡已經證明在最佳化D的時候,D應該是什麼樣子,接著我們再看看如果是再最小化目標函式是,固定D的時候,G應該是多少呢?先給出公式

\begin{aligned} C(G) &=\max _{D} V(G, D) \\ &=\mathbb{E}_{\boldsymbol{x} \sim p_{\text {data }}}\left[\log D_{G}^{*}(\boldsymbol{x})\right]+\mathbb{E}_{\boldsymbol{z} \sim p_{\boldsymbol{z}}}\left[\log \left(1-D_{G}^{*}(G(\boldsymbol{z}))\right)\right] \\ &=\mathbb{E}_{\boldsymbol{x} \sim p_{\text {data }}}\left[\log D_{G}^{*}(\boldsymbol{x})\right]+\mathbb{E}_{\boldsymbol{x} \sim p_{g}}\left[\log \left(1-D_{G}^{*}(\boldsymbol{x})\right)\right] \\ &=\mathbb{E}_{\boldsymbol{x} \sim p_{\text {data }}}\left[\log \frac{p_{\text {data }}(\boldsymbol{x})}{P_{\text {data }}(\boldsymbol{x})+p_{g}(\boldsymbol{x})}\right]+\mathbb{E}_{\boldsymbol{x} \sim p_{g}}\left[\log \frac{p_{g}(\boldsymbol{x})}{p_{\text {data }}(\boldsymbol{x})+p_{g}(\boldsymbol{x})}\right] \end{aligned}

這裡公式的意思就是假定

\max _{D} V(G, D)

已經算完了,那麼接下來要繼續最小化

C(G)

,G的應該是什麼樣子的呢? 上面的公式已經將

D_{G}^{*}(\boldsymbol{x})

給帶掉了,就是假定我們已經最佳化過了D,直接將上面的結果帶入就可以得到最後一條公式:

C(G)=\mathbb{E}_{\boldsymbol{x} \sim p_{\text {data }}}\left[\log \frac{p_{\text {data }}(\boldsymbol{x})}{P_{\text {data }}(\boldsymbol{x})+p_{g}(\boldsymbol{x})}\right]+\mathbb{E}_{\boldsymbol{x} \sim p_{g}}\left[\log \frac{p_{g}(\boldsymbol{x})}{p_{\text {data }}(\boldsymbol{x})+p_{g}(\boldsymbol{x})}\right]

咱現在就是要最小化這個公式(最佳化G),這裡再把它寫成積分的形式:

C(G)=\int_{\boldsymbol{x}} p_{\text {data }}(\boldsymbol{x}) \log \frac{p_{\text {data }}(\boldsymbol{x})}{P_{\text {data }}(\boldsymbol{x})+p_{g}(\boldsymbol{x})}+\int_{\boldsymbol{x}}p_{g}(\boldsymbol{x}) \log \frac{p_{\text {data }}(\boldsymbol{x})}{P_{\text {data }}(\boldsymbol{x})+p_{g}(\boldsymbol{x})} d x

因為

{P_{\text {data }}(\boldsymbol{x})+p_{g}(\boldsymbol{x})}

並不是一個分佈,求積分=2,所以這裡要改成如下形式,才能套到KL散度的公式中:

C(G)=\int_{\boldsymbol{x}} p_{\text {data }}(\boldsymbol{x}) \log \frac{p_{\text {data }}(\boldsymbol{x})}{\frac{1}{2}(P_{\text {data }}(\boldsymbol{x})+p_{g}(\boldsymbol{x}))}\frac{1}{2}+\int_{\boldsymbol{x}}p_{g}(\boldsymbol{x}) \log \frac{p_{\text {data }}(\boldsymbol{x})}{\frac{1}{2}(P_{\text {data }}(\boldsymbol{x})+p_{g}(\boldsymbol{x}))}\frac{1}{2} d x

然後把

\frac{1}{2}

提出來:

C(G)=-\log (4)+K L\left(p_{\text {data }} \| \frac{p_{\text {data }}+p_{g}}{2}\right)+K L\left(p_{g} \| \frac{p_{\text {data }}+p_{g}}{2}\right)

這裡就可以看到兩個KL散度,KL散度是大於等於0的,只有當兩個分佈完全一樣的時候,KL散度才等於0。這裡又可以進一步轉化變成對稱的JS散度:

C(G)=-\log (4)+2 \cdot J S D\left(p_{\text {data }} \| p_{g}\right)

只有當

p_{data}=p_{g}

的時候,我們才能得到這個式子的最小化結果就是

-\log (4)

。 所以可以看到最終這個目標函式,能夠讓G不斷擬合分佈,使得生成的資料的分佈接近真實樣本的分佈。

當然GAN現在發展已經好幾年了,已經有很多最佳化的方法被提出,下次再討論~

生成對抗網路 Generative Adversarial Nets(GAN)詳解

如果覺得不錯,可以關注微信公眾號,搜尋: DeepGo

一起來學習前沿且優秀的工作!!

轉載請註明出處,尊重勞動成果,維護美好社群謝謝!

標簽: 函式  生成  這裡  目標  就是