概述
GAN(Generative Adversarial Network,生成對抗網絡)是一個網絡框架,它通常包括兩部分,生成器(generator)和判別器(discriminator)。生成器的作用是學習真實數據的分布(或者通俗地說就是學習真實數據的特征),然后自動地生成新的數據——所以GAN實際上是生成模型。判別器的工作是區分某個數據是真實數據,還是由生成器生成的數據。從生成器和判別器的定義可以看出,二者之間存在相互“對抗”(adversary)的關系。生成器試圖生成“逼真”的數據,使判別器難以分辨,而判別器試圖識別出由生成器生成的數據。生成器與判別器相互作用,目標是達到納什均衡(Nash equilibrium)的狀態。也就是說,對於判別器當前的狀態,生成器達到了它的最優解,而對於生成器此時的狀態,判別器也得到了最好的結果。
下面我們將從多方面去了解GAN,包括它的基礎理論、學習數據的方式、它的優化案例以及一些應用案例。
基礎理論
GAN及其衍生出來的模型包含了很多的數學理論,涉及微積分、概率論、線性代數等,但這里先不做太多的延申,也不是講解基礎的數學知識,而只介紹原生的GAN[1]的相關理論。
生成模型
生成模型是指通過學習數據的分布,從而模擬真實數據的模型。例如,我們假設人的身高服從高斯分布,且均值是2米,那模型就能生成一群身高在2米左右的人造人,甚至能讓他們都是禿頂。已知生成模型要學習數據的分布,對於連續分布(continuous distribution),有:
\begin{equation} P(b \leq x < a) = \int_b^a{p(x)} dx \nonumber \end{equation}
其中$p(·)$稱為概率密度函數(probability density function)。我們以某個預設的密度函數$q(·)$或參數函數$f(·)$來模擬$p(·)$,學習數據的分布實際上是優化函數$q$的參數——例如高斯分布$N(μ,σ^2)$的參數,均值$μ$和方差$σ^2$——或f的參數,使$q$接近$p$,或$f$的輸出接近於$\hat{x} \sim p(x)$。
生成模型可以分為兩類,一類是顯性密度模型(explicit density model),另一類是隱性密度模型(implicit density model)。顯性密度模型顯性地學習真實數據的分布或者分布的參數,也就是模擬出這個分布,然后用模擬的分布生成新的數據。這類模型包括最大似然模型(maximum likelihood estimator,MLE)、近似推斷(approximate inference)、馬爾可夫模型(Markov model)。
隱性密度模型並不需要顯性的假設(explicit hypothesis),不直接學習數據的分布,而是先生成模擬數據,然后使模擬數據接近真實數據。GAN就屬於隱性密度生成模型。相對於一個顯性的分布,我們並不關心GAN的生成器是什么,因此它的設計所受的限制要更小。
生成器 vs 判別器
GAN中采用了生成器與判別器對抗學習的機制。生成器的操作實際上是將噪聲變量/隱變量$z$(noise/latent variable)映射到模擬的數據空間$(G(z))$,其中我們自定義$z$服從某個分布$z \sim p_z (z)$,例如高斯分布$z \sim p_z (z)=N(0,I)$,而$G(·)$表示 $z$到$\hat{x}$的映射關系,也就是某個函數$f(·)$。通過這樣的映射,我們就得到了生成數據$\hat{x}$,它服從分布$\hat{x} \sim p_g (\hat{x})$。真實的數據$x$服從的是分布$p_{data} \, (x)$。生成器的目標是使$p_g (\hat{x})$與$p_{data} \, (x)$接近,但我們不直接優化$p_g (\hat{x})$,而是優化$G(z)$(生成器)的參數,從而得到“逼真”的$\hat{x}$。
得到模擬數據$\hat{x}$后,GAN會讓判別器$D(·)$判斷數據是$\hat{x}$還是$x$。在理想狀況下,對於二分類任務,$D(x)=1$而$D(\hat{x} )=0$。
目標函數
有了生成器和判別器,我們怎么訓練它們呢?答案是通過目標函數。模型訓練都有一個或多個目標,訓練的結果是使這個或這些目標的值取到最大或最小。GAN有多種目標函數,對應不同的博弈(game)。
最大最小博弈
GAN最初的博弈采用的是最大最小博弈/零和博弈(minimax game/zero-sum game),其對應的目標函數是:
\begin{equation} \min_G{\max_D{V(D,G)}} = E_{x \sim p_{data} \, (x)} [\log{D(x)}] + E_{z \sim p_z (z)} [\log{(1 - D(G(z)))}] \label{1.1} \end{equation}
$\min_G{\max_D{V(D,G)}}$ 表示,對於判別器$D$,訓練目標是使函數$V$取到最大值,因為理想狀況下,$D(x)=1$且$D(G(z))=0$,而對於生成器$G$,訓練目標是最小化$V$的值。另外,$E_{x \sim p_{data} \, (x)} $表示從分布$p_{data}$中采樣$x$,將樣本$x$帶入中括號中的函數進行計算,再求它們的均值。等號右邊第一項實際上是一個似然估計(likelihood estimate),就是使D對真實數據的判斷盡可能正確。
關於GAN的訓練,Goodfellow在原生GAN的論文$[1]$中的建議是,每更新生成器一次后更新判別器n次,否則容易過擬合(overfitting)(例如生成的人造人都是頭發都非常濃密,因為判別器沒見過什么世面,錯誤地就認為禿頂的都是人造人)。這樣1對n的優化方式,可以使在生成器更新頻率相對較低時,判別器保持接近最優的狀態。
對於生成器,目標函數如下:
\begin{equation} \label{1.2} \min_G{V(D^*,G)} = E_{z \sim p_z (z)} [\log{(1-D^* (G(z)))}] \end{equation}
其中$D^*$為在優化生成器時,當前最優狀態的判別器,因此公式$(\ref{1.2})$式表示固定$D$,通過優化$G$使$V$的值最小。
如果我們固定生成器$G$,判別器的目標函數為:
\begin{align} \max_D{V(D,G)} &= E_{x \sim p_{data} \, (x)} [\log{D(x)}] + E_{z \sim p_z (z)} [\log{(1-D(G(z)))}] \nonumber \\ &= \int_x{p_{data}\,(x) \log{(D(x))}} dx + \int_z{ p_z(z) \log{(1-D(G(z)))} } dz \nonumber \\ &= \int_x{ p_{data}\, (x) \log{(D(x))} + p_g (x) \log{(1-D(x))}} dx \label{1.3} \end{align}
其中$p_{data}\, (x)$、$p_z (z)$和$p_g (x)$為概率密度函數。因為函數在極大、極小值處導數為0,所以令公式$(\ref{1.3})$關於$D(x)$的導數為0:
\begin{align} &\frac{p_{data}\, (x)}{D^* (x)} - \frac{p_g (x)}{(1-D^* (x))} = 0 \nonumber \\[6pt] &D^* (x) = \frac{p_{data}\, (x)}{(p_{data}\, (x) + p_g (x))} \label{1.4} \end{align}
所以最優的判別器$D^*$應該滿足公式$(\ref{1.4})$。
當判別器處於最優狀態時,對目標函數$(\ref{1.1})$做一些變換:
\begin{align} \min_G{V(D^*,G)} &= E_{x \sim P_{data} \, (x)} [\log{\frac{2 p_{data}\,(x)}{p_{data}\,(x) + p_g(x)}}] + E_{x \sim p_g(x)}[\log{\frac{2 p_g(x)}{p_{data}\,(x) + p_g(x)}}] -2 \log{2} \nonumber \\ &= \int{p_{data}\,(x) \log{\frac{2 p_{data}\,(x)}{p_{data}\,(x) + p_g(x)}}} dx + \int{p_g(x) \log{\frac{2 p_g(x)}{p_{data}\,(x) + p_g(x)}}} dx -\log{4} \nonumber \\ &= KL(p_{data} \parallel \frac{p_{data} + p_g}{2} + KL(p_g \parallel \frac{p_{data}+p_g}{2}) - \log{4} \nonumber \\ &= 2 JS(p_{data} \parallel p_g) - \log{4} \nonumber \end{align}
\begin{equation} \label{1.5} \min_G{V(D^*,G)} = 2 JS(p_{data} \parallel p_g) - \log{4} \end{equation}
其中$KL$為KL散度(Kullback-Leibler divergence),$JS$為JS散度(Jensen-Shannon divergence),它們的定義從上面的推導可知。因為$JS$的值大於等於0,當$p_{data}=p_g$時,JS散度$JS=0$,由公式$(\ref{1.5})$可知此時生成器$G$達到最優,而此時$D^* (x)=1/2$。
非飽和博弈
(圖1)
(圖2)
上面的推導$(\ref{1.5})$證明了零和博弈與使$p_g$逼近$p_{data}$的目標一致。但是在模型訓練初期,生成器還沒學會真實數據的分布,生成的數據質量較差,與真實數據有很大差別,判別器能很容易地辨別出生成的數據。在這種情況下,$D(G(z))$的值趨於零,因此$\log{(1-D(G(z)))}$的梯度(gradient)接近零(如$(圖1)$中曲線的左側非常平緩),模型趨於飽和(saturate)。因為我們在模型參數的更新時,通常采用的是梯度下降法(gradient descent):
\begin{equation} θ^{t+1} = θ^t - η \frac{∂V}{∂θ} \nonumber \end{equation}
當梯度為0時,參數θ不再更新,模型停止訓練。
為了在訓練初期能得到較大的梯度,Goodfellow在原生GAN的論文$[1]$中提出的一個方法是非飽和博弈(non-saturating game)。非飽和博弈將零和博弈中的$\log{(1-D(G(z)))}$轉換為$- \log{(D(G(z)))}$。如$(圖2)$所示,在訓練初始階段(曲線左側),$D$接近0時,曲線的梯度非常大,模型沒有飽和。因此,這種博弈被稱為非飽和博弈。
但是非飽和博弈存在穩定性問題。根據公式$(\ref{1.5})$,對於$D^*$生成器的目標函數為:
\begin{equation} \label{1.6} E_{x \sim p_{data}\,(x)} [\log{D^* (x)}] + E_{x \sim p_g (x)} [\log{(1-D^* (x))}] = 2 JS(p_{data} \parallel p_g) - \log{4} \end{equation}
\begin{align} KL(p_g \parallel p_{data}) &= E_{x \sim p_g} [\log{\frac{p_g (x)}{p_{data}\, (x)}}] \nonumber \\ &= E_{x \sim p_g} [\log{\frac{p_g (x)/(p_g (x) + p_{data}\,(x))}{p_{data}\,(x)⁄(p_g(x) + p_{data}\,(x))}}] \nonumber \\ &= E_{x \sim p_g} [\log{\frac{(1- D^* (x))}{D^* (x)}}] \nonumber \\ &= E_{x \sim p_g} [\log{(1- D^* (x))}] - E_{x \sim p_g} [\log{D^* (x)}] \label{1.7} \end{align}
結合公式$(\ref{1.6})$和$(\ref{1.7})$:
\begin{align} E_{x \sim p_g} [- \log{D^* (x)}] &= KL(p_g \parallel p_{data}) - E_{x \sim p_g} [\log{(1- D^* (x)}] \nonumber \\ &= KL(p_g \parallel p_{data}) + E_{x \sim P_{data} \, (x)} [\log{D^* (x)}] - 2 JS(p_{data} \parallel p_g) + \log{4} \label{1.8} \end{align}
公式$(\ref{1.8})$中等號右邊第一項和第二項相矛盾。第一項試圖使$p_g$和$p_{data}$的KL散度盡可能小,也就是使$p_g$逼近$p_{data}$,但是第三項因為負號,試圖使JS散度盡可能大,也就是讓$p_g$和$p_{data}$的差異更大。
另外,非飽和博弈還有一個問題,就是會使模型趨向於生成准確度高但是多樣性較差的數據,例如生成的圖像雖然很逼真,但是都是一樣的。導致這樣的結果,是因為KL散度是不對稱性(asymmetry)。觀察KL散度的定義式,我們就可以發現,對於$KL(p_g \parallel p_{data})$:
當$p_g (x) \to 0$而$p_{data}\, (x) \rightarrow 1$,此時$p_g (x) \log{\frac{p_g (x)}{p_{data}\, (x)}} \rightarrow 0$,$KL$的影響趨於零;
當$p_g (x) \rightarrow 1$而$p_{data}\, (x) \rightarrow 0$,此時$p_g (x) \log{\frac{p_g (x)}{p_{data}\, (x)}} \rightarrow \infty $,$KL$的值非常大。
上面的第一種情況對應的是生成的數據多樣性較差的情況,$p_g (x)$不能覆蓋到所有的真實數據,在$p_{data}\, (x) \to 1$時$p_g (x)$卻趨近於0。第二種反映的是生成的數據准確度較差的情況,在$p_{data}\, (x)$為0時$p_g (x)$不為零,生成了不存在的東西。$KL$的值在這兩種情況下的差異,導致模型訓練時第二種情況要受到更大的懲罰,因為要最小化目標函數就要使$KL$的值變小。這樣,訓練出來的模型就會傾向於重復地生成准確度高的安全的數據,也就是模式坍塌(mode collapse)。
最大似然博弈
除了上面兩種博弈,Goodfellow在2015年的一篇論文$[2]$中還推導了另一種博弈——最大似然博弈(maximum likelihood game)。最大似然博弈與最大最小/零和博弈實際上是等價的。假設一個參數函數$f$,生成器的似然表示為:
\begin{align} J_G &= E_{x \sim p_g} [f(x)] \nonumber \\ &= \int{f(x) p_g (x)} dx \label{1.9} \end{align}
$J_G$關於$p_g$的參數$θ$的導數為:
\begin{equation} \frac{∂}{∂θ} J_G = \int{ f(x) \frac{∂}{∂θ} p_g (x)} dx \label{1.10} \end{equation}
假設$p_g (x) \geq 0$,那么$p_g (x) = \exp{(\log{p_g (x)})},因此式$(\ref{1.10})$變換為:
\begin{align} \frac{∂}{∂θ} J_G &= \int{f(x) \frac{∂}{∂θ} \exp{(\log{p_g (x)})}} dx \nonumber \\ &= \int{f(x) \exp{(\log{p_g (x)})} \frac{∂}{∂θ} \log{p_g (x)}} dx \nonumber \\ &= \int{f(x) p_g (x) \frac{∂}{∂θ} \log{p_g (x)}} dx \label{1.11} \end{align}
另外,KL散度的梯度為:
\begin{align} \frac{∂}{∂θ} KL(p_{data} \parallel p_g) &= \int{\frac{∂}{∂θ} p_{data}\, (x) \log{\frac{p_{data}\, (x)}{p_g (x)}}} dx \nonumber \\ &= \int{ \frac{∂}{∂θ} p_{data}\, (x) (\log{p_{data}\, (x)} - \log{p_g (x)})} dx \nonumber \\ &= \int{- p_{data}\, (x) \frac{∂}{∂θ} \log{p_g (x)}} dx \label{1.12} \end{align}
為了使式$(\ref{1.11})$與式$(\ref{1.12})$相等,需要:
\begin{equation} f(x) = - \frac{p_{data}\, (x)}{p_g (x)} \nonumber \end{equation}
當判別器最后通過sigmoid函數進行二分類判斷時,即當$D(y=1\mid x) = \sigma (a(x))$時:
\begin{equation} \sigma (a(x)) = \frac{1}{(1 + exp(-a(x))} \nonumber \end{equation}
根據式$(\ref{1.4})$:
\begin{equation} D^* (x) = \frac{p_{data}\, (x)}{(p_{data}\, (x) + p_g (x))} \nonumber \end{equation}
那么:
\begin{align} \frac{p_{data}\, (x) + p_g (x)}{p_{data}\, (x)} &= \frac{1}{D^* (x)} \nonumber = \frac{1}{\sigma (a(x))} \nonumber \\[6pt] &= 1 + \exp{(-a(x))} \nonumber \end{align}
最終得到:
\begin{align} \frac{p_g (x)}{p_{data}\, (x)} &= - \frac{1}{f(x)} = \exp{(-a(x))} \nonumber \\[6pt] f(x) &= - \exp{(a(x))} \label{1.13} \end{align}
其中函數$a(x) = \sigma^{-1} (D(x)),\sigma^{-1}$為sigmoid函數的反函數,即logit函數:
\begin{equation} \label{1.14} \sigma^{-1}{(D)} = \log{\frac{D}{(1-D)}} \end{equation}
將式$(\ref{1.13})$和$(\ref{1.14})$帶入生成器的似然$(\ref{1.9})$,得到最大似然博弈的生成器的目標函數:
\begin{align} \max_G{V(D^*,G)} &= E_{x \sim p_g} [- \exp{\log{\frac{D^* (x)}{(1-D^* (x)}}}] \nonumber \\ &= E_{z \sim p_z} [- \frac{D^* (G(z))}{(1-D^* (G(z)))}] \label{1.15} \end{align}
目標函數$(\ref{1.15})$實際上是求最大似然,因此這種博弈被稱為最大似然博弈。
三種博弈方式的目標函數的曲線如$圖2$所示,零和博弈和最大似然博弈在訓練初期都會遇到梯度消失(gradient vanishing)的問題。
(圖2,來自:論文《nips 2016 tutorial generative adversarial networks》)
未完待續~
[1] I. Goodfellow, J. Pouget-Abadie, M. Mirza, B. Xu, D. Warde-Farley, S. Ozair, A. Courville, and Y. Bengio, (2014). “Generative adversarial nets”.
[2] I. Goodfellow, (2014). “On distinguishability criteria for estimating generative models”.
小提示1:本篇部分內容基於個人理解,僅供參考,如有錯誤(非常)歡迎指出。另外,如果有看不明白的不好理解的地方,也歡迎告知作者。
小提示2:轉載請注明出處。