1. 程式人生 > 其它 >對抗生成網路GAN

對抗生成網路GAN

對抗生成網路GAN的學習筆記

GAN簡介

論文:Generative Adversarial Nets

參考資料:


對抗生成網路 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)。

此時,我們便可以用監督學習的方式來對判別器進行訓練。

生成器的學習

針對於 \(D\) 我們有標記為\(1\)\(0\)的資料,因此我們可以對其進行訓練。那麼對於生成器,有 \(x\)(也就是隨機噪聲 \(z\)),那麼他的標籤 \(y\) 在哪裡呢?

事實上,我們在訓練生成器的時候可以做出假設“判別器能夠做出準確可靠的判斷”,在這個假設下,我們可以通過判別器來產生生成器的標籤 \(y\)

  1. 我們通過隨機向量(噪聲資料)經由生成網路產生一組假圖片,我們將這些假圖片都標記為 1(也就是說,人為的把假的圖片當作真實的);

  2. 將這些假圖片輸入到判別器中,判別器在對這些圖片進行判別的時候,會發現這些圖片是假的圖片,然後給出低分,這樣就產生了誤差(因為標記的為1,但是判別器給了低分);

  3. 由於在訓練生成器的時候,這個網路是串接的,所以一個很重要的操作就是保持判別器網路的引數不發生改變,只是把誤差一直方向傳播,傳到生成網路那塊後更新生成網路的引數,這樣就完成了生成網路的訓練了。

在完成生成器的訓練之後,我們又可以產生新的假的圖片去對判別器進行訓練。我們把這個過程稱作為單獨交替訓練。同時要定義一個迭代次數,交替迭代到一定次數後停止即可。

數學表示

  1. 我們有一組含有 \(n\) 個樣本的資料集 \(X = \left\{ x^{\left( 1 \right)}, x^{\left( 2 \right)}, \cdots, x^{\left( n \right)} \right\}\),假設這些樣本資料從一個概率分佈 \(P_{\text{data}}\)中產生;

  2. 假設 \(G\) 的概率分佈為 \(P_g\left( x;\theta_g \right)\),實際上我們所生成的樣本也是從這個概率分佈中抽樣而得出的;

  3. 假定噪聲 \(z\) 從一個簡單的分佈中產生(如高斯分佈),即 \(z \sim P_z\left( z \right)\)

  4. 我們將判別器認為 \(x\) 是真樣本的概率記為 \(D\left( X;\theta_d \right)\)

需要注意的是:

  1. 我們不對生成器 \(G\) 的概率分佈 \(P_g\) 進行建模,而是使用神經網路來逼近生成器 \(G\) 的概率分佈 \(P_g\)

  2. 我們有 \(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

待更新

工程上的技巧

待更新


如果覺得這篇文章對您有用的話,請點推薦或者關注,這對我來說是十分寶貴的鼓勵!