對抗生成網路GAN
GAN簡介
論文:Generative Adversarial Nets
參考資料:
- bilibili - 【機器學習】白板推導系列(三十一) ~ 生成對抗網路(GAN)
對抗生成網路 GAN 的英文全稱為 Generative Adversarial Network,
-
生成器(Generator, \(G\))
- Generator是一個函式,輸入是隨機向量(隨機噪聲)\(z\),輸出是 \(x\);
-
判別器(Discriminator, \(D\))
- Discriminator也是一個函式,輸入是 \(x\),輸出是一個標量;
GAN的訓練流程
我們需要藉助一個高水平的判別器來訓練我們的生成器
那麼我們如何訓練判別器呢?事實上,我們從上帝視角來看,其實我們是知道哪些是真的,哪些是假的,所以我們可以直接將古董和工藝品混合在一起,去給鑑賞專家,告訴鑑賞專家哪些是真的,哪些是假的,讓鑑賞專家從帶標籤的樣本中去學習、去提升鑑別能力。
判別器的學習
首先我們初始化生成器 \(G\) ,然後輸入一組隨機向量(Randomly sample a vactor),生成器會根據輸入的向量產生一些圖片,我們把這些圖片標註成 0(假圖片)。同時把已有訓練集中真實的圖片標註成 1(真圖片)。兩者同時丟進判別器 \(D\)
此時,我們便可以用監督學習的方式來對判別器進行訓練。
生成器的學習
針對於 \(D\) 我們有標記為\(1\)和\(0\)的資料,因此我們可以對其進行訓練。那麼對於生成器,有 \(x\)(也就是隨機噪聲 \(z\)),那麼他的標籤 \(y\) 在哪裡呢?
事實上,我們在訓練生成器的時候可以做出假設“判別器能夠做出準確可靠的判斷”,在這個假設下,我們可以通過判別器來產生生成器的標籤 \(y\) :
-
我們通過隨機向量(噪聲資料)經由生成網路產生一組假圖片,我們將這些假圖片都標記為 1(也就是說,人為的把假的圖片當作真實的);
-
將這些假圖片輸入到判別器中,判別器在對這些圖片進行判別的時候,會發現這些圖片是假的圖片,然後給出低分,這樣就產生了誤差(因為標記的為1,但是判別器給了低分);
-
由於在訓練生成器的時候,這個網路是串接的,所以一個很重要的操作就是保持判別器網路的引數不發生改變,只是把誤差一直方向傳播,傳到生成網路那塊後更新生成網路的引數,這樣就完成了生成網路的訓練了。
在完成生成器的訓練之後,我們又可以產生新的假的圖片去對判別器進行訓練。我們把這個過程稱作為單獨交替訓練。同時要定義一個迭代次數,交替迭代到一定次數後停止即可。
數學表示
-
我們有一組含有 \(n\) 個樣本的資料集 \(X = \left\{ x^{\left( 1 \right)}, x^{\left( 2 \right)}, \cdots, x^{\left( n \right)} \right\}\),假設這些樣本資料從一個概率分佈 \(P_{\text{data}}\)中產生;
-
假設 \(G\) 的概率分佈為 \(P_g\left( x;\theta_g \right)\),實際上我們所生成的樣本也是從這個概率分佈中抽樣而得出的;
-
假定噪聲 \(z\) 從一個簡單的分佈中產生(如高斯分佈),即 \(z \sim P_z\left( z \right)\);
-
我們將判別器認為 \(x\) 是真樣本的概率記為 \(D\left( X;\theta_d \right)\);
需要注意的是:
-
我們不對生成器 \(G\) 的概率分佈 \(P_g\) 進行建模,而是使用神經網路來逼近生成器 \(G\) 的概率分佈 \(P_g\);
-
我們有 \(z \rightarrow G\left( Z;\theta_g \right) \rightarrow x\) ,其中 \(z\) 是輸入噪聲, \(G\left( Z;\theta_g \right)\) 是生成器的神經網路,\(x\) 是生成的樣本;
判別器
我們所希望判別器 \(D\) 能達到的效果是:
\[\begin{cases} D\left( x \right)\uparrow, & \text {if $x$ is from $p_{data}$} \\ \left( 1-D\left( G\left( z \right) \right)\right)\uparrow , & \text {if $x$ is from $p_{g}$} \end{cases} \]為了方便計算,我們將上式進行改寫:
\[\begin{cases} \log D\left( x \right)\uparrow, & \text {if $x$ is from $p_{data}$} \\ \log \left( 1-D\left( G\left( z \right) \right)\right)\uparrow , & \text {if $x$ is from $p_{g}$} \end{cases} \]所以,判別器的目標函式為:
\[\max_D \mathbb{E}_{x\sim p_{data}} \left[ \log D\left( x \right) \right] + \mathbb{E}_{z\sim p_z} \left[ \log \left( 1-D\left( G\left( z \right) \right) \right) \right] \]為了便於初學者理解,這裡說明一下 \(\mathbb{E}_{x\sim p_{data}} \left[ f\left( x \right) \right]\) 所代表的含義:\(\mathbb{E}_{x\sim p_{data}} \left[ f\left( x \right) \right] = \frac{1}{N} \sum_{i=1}^N f\left( x_i \right), x_i \sim p_{data}\)。
生成器
我們所希望生成器 \(G\) 生成的樣本能夠使判別器 \(D\) 儘可能地以為是真樣本,即生成器所期望達到的效果是:\(D\left( G\left( z \right) \right) \uparrow\),即\(\log \left(1 - D\left( G\left( z \right) \right) \right)\downarrow\)
所以,生成器 \(G\) 的目標函式為:
\[\min_G \mathbb{E}_{z\sim p_z} \left[ \log\left( 1- D\left( G\left( z \right) \right) \right) \right] \]綜上所述,總目標為:
\[\underset{G}{\min} \underset{D}{\max} \mathbb{E}_{x\sim p_{data}} \left[ \log D\left( x \right) \right] + \mathbb{E}_{z\sim p_z} \left[ \log \left( 1-D\left( G\left( z \right) \right) \right) \right] \]演算法推導
在開始進行推導之前,我們介紹一下傳統的生成器(這裡除去GAN)方法:
首先再次明確一下我們的目標:我們所期望生成器生成的樣本儘可能逼真,換句話說,我們所期望生成器生成的樣本儘可能與真實的樣本相似,即:\(P_g \rightarrow P_{data}\)。
對於常規的生成模型(這裡除去GAN)來說,我們直接將生成器 \(G\) 的概率分佈進行 \(P_g\) 建模:\(P_g\left( \theta_g \right)\) ,那麼我們有:
\[\begin{align}\theta_g &= \arg \underset{\theta_g}{\max} \sum_{i=1}^N \log p_g\left( x_i \right) \\ &= \arg \underset{\theta_g}{\min} KL \left( P_{data} \mid\mid P_g \right) \end{align} \]上式 \(\left( 1 \right)\) 為極大似然估計的推導,上式 \(\left( 2 \right)\) 為 KL 散度的推導。
我們獲得引數 \(\theta_g\) 之後,便可以得到生成器的概率分佈 \(P_g\left( \theta_g \right)\),所以生成器生成的樣本可以從 \(P_g\left( \theta_g \right)\) 中取樣得到 \(X \sim P_g\left( \theta_g \right)\)。
我們記生成器的目標函式為 \(V\left( D,G \right) = \mathbb{E}_{x\sim P_{data}} \left[ \log D\left( x \right) \right] + \mathbb{E}_{x\sim P_g}\left[ \log \left( 1-D\left( x \right) \right) \right]\),那麼對於固定的 \(G\) 來說:
\[\begin{align} V\left( D,G \right) &= \int_x P_{data}\left( x \right)\log \left( D\left(x\right) \right) \text{dx} + \int_x P_{g}\left( x \right)\log \left( 1-D\left( x \right) \right) \text{dx}\notag \\ &= \int_x \left[ P_{data}\left( x \right)\log \left( D\left(x\right) \right) + P_{g}\left( x \right)\log \left( 1-D\left( x \right) \right) \right]\text{dx} \notag\end{align} \]我們探討是否存在最優的 \(D_G^\star\)使得\(V\left( D_G^\star,G \right)\)最大化,很自然地會想到對 \(V\left( D,G \right)\) 求 \(D\) 的偏導,即:
\[\begin{align} \frac{\partial V\left( D,G \right)}{\partial D} &= \int_x \frac{\partial}{\partial D}\left[ P_{data}\left( x \right)\log\left( D\left( x \right) \right) + P_g\left( x \right)\log\left( 1-D\left( x \right) \right)\right] \text{dx}\notag \\ &= \int_x\left[ P_{data}\left( x \right)\frac{1}{D\left( x \right)} + P_g\left( x \right) \frac{-1}{1-D\left( x\right)}\right] \triangleq 0 \notag \\ &\Rightarrow D_G^\star = \frac{P_{data}\left( x \right)}{P_{data}\left( x \right) + P_g\left( x \right)} \notag\end{align} \]所以,對於固定的 \(G\) 來說,最優的判別器 \(D\) 是:
\[D_G^\star \left( x \right)=\frac{P_{data}\left( x \right)}{P_{data}\left( x \right) + P_g\left( x \right)} \]將 \(D_G^\star\) 代入生成器 \(G\) 的目標函式 \(V\left( D,G \right)\),則有:
\[\begin{align} \underset{G}{\min}\underset{D}{\max}V\left( D,G \right) &= \underset{G}{\min} V\left( D_G^\star, G \right)\notag\\ &= \underset{G}{\min}\mathbb{E}_{x\sim P_{data}} \left[ \log\left( \frac{P_{data}\left( x \right)}{P_{data}\left( x \right) + P_g\left( x \right)} \right) \right] + \mathbb{E}_{x\sim P_g} \left[ \log \left( 1-\frac{P_{data}\left( x \right)}{P_{data}\left( x\right)+P_g\left( x \right)} \right) \right] \notag \\ &= \underset{G}{\min}\mathbb{E}_{x\sim P_{data}} \left[ \log\left( \frac{P_{data}\left( x \right)}{P_{data}\left( x \right) + P_g\left( x \right)} \right) \right] + \mathbb{E}_{x\sim P_g} \left[ \log \left( \frac{P_g\left( x \right)}{P_{data}\left( x\right)+P_g\left( x \right)} \right) \right] \notag \\ &= \underset{G}{\min} \mathbb{E}_{x\sim P_{data}}\left[ \log\left( \frac{P_{data}\left( x \right)}{\left[ P_{data}\left( x \right)+P_g\left( x \right) \right]/2} \cdot \frac{1}{2}\right)\right] + \mathbb{E}_{x\sim P_g}\left[ \log\left( \frac{P_{g}\left( x \right)}{\left[ P_{data}\left( x \right)+P_g\left( x \right) \right]/2} \cdot \frac{1}{2}\right)\right] \notag \\ &= \underset{G}{\min} KL\left( P_{data}\left(x \right)\middle\| \frac{P_{data}\left(x\right)+P_g\left( x \right)}{2} \right) + KL\left( P_{g}\left(x \right)\middle\| \frac{P_{data}\left(x\right)+P_g\left( x \right)}{2} \right)-\log 4 \notag \\ &\ge -\log 4 \notag\end{align}\]當 \(P_{data} \left(x\right) = P_g\left( x \right) = \left[ P_{data}\left( x \right) + P_g\left( x \right) \right]/2\) 時,"\(=\)"成立。
所以 \(P_g^\star\left( x \right)=P_g\left( x \right)\),此時 \(G_G^\star = P_{data}\left( x \right) / \left[ {P_{data}\left( x \right) + P_g\left( x \right)} \right] = \frac{1}{2}\)。
GAN目前的問題
訓練不穩定
待更新
Model Collapse
待更新
工程上的技巧
待更新
如果覺得這篇文章對您有用的話,請點推薦或者關注,這對我來說是十分寶貴的鼓勵!