1. 程式人生 > >初步認識GAN(生成對抗網路)

初步認識GAN(生成對抗網路)

初步認識GAN(生成對抗網路)

1.GAN的發明

生成模型的基本思想是輸入一個訓練樣本集合,形成樣本概率分佈的表徵。 常用的生成模型是直接推斷他的密度概率函式。

好的生成模型有以下幾方面的實際應用;
1. 提升圖片的質量(高解析度)
2. 預測未來狀態的規劃
3.生成缺失資料和標籤
4.模擬實驗結果
5. 生成高質量語音
2014年,lan Goodfellow 機及其蒙特利爾大學的同事引入了生成對抗網路(GAN)。這是一種全新的方法用於學習資料的基本分佈,使得生成的人工物件和真實物件直接達到驚人的相似。

GAN的思想其實就是兩個網路——生成器和檢測器的博弈。生成器的目標是生成一個物件,使之和真實物件一樣。而檢測器的目標是找出生成物件和真實物件之間的差別。
在這裡插入圖片描述


這個圖片是生成對抗網路的一個大體概述。最重要的就是要理解GAN就是將兩個網路放在一起工作的方法——生成器和鑑別器都有其自己的架構。

那麼我們應該思考一個問題,如果網路分類影象的能力比大多數人還好,我們應該如何欺騙他?

對抗樣本

對於給定一個訓練之後的分類器,我們可以生成一個可以騙過該網路的樣本。也就是說,我們利用生成器生成的樣本,和真實物件看起來毫無差別,使得分類網路得到錯誤的分類結果(使得生成器生成的物件被檢測成真實物件)。並且我們還可以對影象通過變形的方式得到一個新圖,和真實圖片看起來毫無差別,但使得分類網路得到錯誤的分類結果,這個過程被稱為對抗攻擊。

對抗樣本是指經過精心計算得到的旨在誤導分類器的樣本(也就是使得分類器辨別不出來的樣本)。

影象分類器其實是高維空間中複雜的決策邊界。但在影象分類中,我們無法畫出這樣的決策邊界。但是我們可以肯定的假設,這個分類器只能用於訓練集中的樣本,不能泛化到所有影象,這樣的泛化很可能不能很好的近似真實情況。也就是說,這個分類網路和我們的訓練資料過擬合了——我們可以利用這一點來欺騙網路。

首先我們在影象中加入一些隨機噪聲,情怯確保噪聲接近於0。我們可以通過控制噪聲的L2正規化來實現這一點(所謂的L2正規化,可以看做是影象畫素越多,其平均的L2正規化就越大)。所以,如果你的噪聲的範數足夠低,你就可以認為他在視覺上是不可感知的,但在向量空間中,加入噪聲的影象和原始影象相差甚遠。

如果H* W的影象是一個向量,我們加入其中的H*W 也是一個向量,原始影象上有各種各樣相當密集的顏色——這會增加L2正規化。另一方面,噪聲從視覺看上去是一張混亂且非常蒼白的影象——一個小范式的向量。最後加在一起,得到的受損影象和原影象很接近,但是會被錯誤的分類!

如果原始圖的決策邊界沒有那麼遠,那麼增加的噪聲會將影象帶到決策邊界之外!

每張圖片都是高維空間中的一個向量,在他們之上的訓練的分類器就是將【所有猴子】定義為【這個用隱含引數描述的高維blob(二進位制大象)中的所有向量】。我們將這個blob成為該類的決策邊界。

這就是通過增加隨機噪聲來欺騙網路。

生成器和鑑別器

根據上述所講的對抗樣本,我們把上面所講的分類器網路(也就是所提及的二分類(真和假)),根據Goodfellow等人所寫的原始論文,我們稱之為鑑別器(Discriminator)。

現在我們增加一個網路,讓其生成鑑別器錯誤分類的影象。這個過程和對抗樣本使用的過程灣區一樣,這個網路我們稱之為生成器。

訓練的每一步,鑑別器都要區分訓練集和假樣本的影象,這樣他的區分能力越來越強。在統計學習理論中,這本質上就意味著學習到了資料的底層分佈。

那麼一個有趣的話題隨之而來,當鑑別器非常善於辨別真假時,欺騙它又有什麼好處呢?

沒錯!能用來學習以假亂真的贗品~!
在這裡插入圖片描述
左圖用訓練集中的樣本訓練鑑別器,右圖通過加入噪聲利用生成器得到影象樣本,使鑑別器進行分類。

有一個古老但睿智的數學結果最小最大定理(Minimax theorem)開啟了我們所知的博弈論的先河,其表明:對於零和博弈中的兩個玩家而言,最小最大解決方案與納什均衡是一樣的。

哇!這都說的啥!

簡單來說,當兩個玩家(D 和 G)彼此競爭時(零和博弈),雙方都假設對方採取最優的步驟而自己也以最優的策略應對(最小最大策略),那麼結果就已經預先確定了,玩家無法改變它(納什均衡)。
在這裡插入圖片描述
圖片來自:Goodfellow, 2017
也就是說當訓練次數足夠到的時候,我們的生成器可以 學會如何從真實影象中取樣,生成非常接近真實影象的影象,鑑別器無法將其鑑別出來。

上手學習的最佳架構

回顧一些經典架構,並提供一些相關連結。

深度卷積生成對抗網路(DCGAN)

     在開始的訓練GAN中,模型很不穩定,需要大量的調整。2015 年時,Radford 等人發表了題為《使用深度卷積生成對抗網路的無監督表徵學習(Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks)》的論文,描述了之後被稱為 DCGAN 的著名模型。
     DCGAN,在大多數情況下都是穩定的。這是第一篇使用向量運算描述的生成器學習到的表徵的固有性質的論文:這與Word2Vec中的詞向量使用的技巧一樣,但卻是對影象操作的!
     後面會提供一些關於DCGAN學習的連結。

在這裡插入圖片描述
圖片來自:Radford et al., 2015

條件GAN(Conditional GAN)

     這是研究者提出的一種 GAN 的元架構的擴充套件,以便提升生成影象的質量,你也可以把它稱為一個小技巧,百分之百沒問題。其思想是,如果你的一些資料點有標籤,你可以使用它們來構建顯著的表徵。這和你使用了哪種架構無關——這個擴充套件每次都是一樣的。你需要做的全部事情就是為其生成器新增另一個輸入。

在這裡插入圖片描述
圖片來自:Mirza, 2014
所以,現在又如何呢?現在假如你的模型可以生成各種各樣的動物,但你其實喜歡貓。現在你不再為生成器傳遞生成的噪聲然後期待有最好的結果,而是為第二個輸入增加一些標籤,比如「貓」類別的 ID 或詞向量。在這種情況下,就說生成器是以預期輸入的類別為條件的。

訣竅和技巧

在GitHub上克隆,使之正常執行。使用哪種隨機梯度演算法,目前還無普遍共識。並且在進行長時間的訓練之前要對學習率進行仔細調節。一般的流程如下;

  1. 取樣訓練樣本的一個 minibatch,然後計算它們的鑑別器分數;
  2. 得到一個生成樣本 minibatch,然後計算它們的鑑別器分數;
  3. 使用這兩個步驟累積的梯度執行一次更新。
    值得注意的是,要分開處訓練和生成的minibatch,並且為不同的bath 計算batch norm,這個很關鍵,可以確保鑑別器有快速的初始訓練。

有時候,當生成器執行一步時,讓鑑別器執行一步以上的效果更好。如果你的生成器在損失函式方面開始「獲勝」了,不妨試試這麼做。

基本而言,每個bath都會得到同樣的結果,其中只是會稍微有些不同,該如何防止這種情況發生呢?一種方法是預算平均畫素和標準差,然後每次都使用 ,這嚐嚐會導致過擬合。作為代替,還有一種被稱為虛擬批歸一化(Virtual Batch Normalization)的妙招:在你開始訓練之前預定義一個batch(讓我們稱其為R),對於每一個新的batch X,都使用R和X的級聯來計算歸一化引數。

另一個有趣的技巧是從一個球體上取樣輸入噪聲,而不是從一個立方體上。我們可以通過控制噪聲向量的範數來近似實現這一目標,但是從高維立方體上真正均勻地取樣會更好一點。

下一個訣竅是避免使用稀疏梯度,尤其是在生成器中。只需將特定的層換成它們對應的「平滑」的類似層就可以了,比如:

1.ReLU 換成 LeakyReLU

  1. 最大池化換成平均池化、卷積+stride

3.Unpooling 換成去卷積

演講

教程

程式碼庫

1.TensorFlow 實現 DCGAN:https://github.com/carpedm20/DCGAN-tensorflow
2.PyTorch 實現 DCGAN:https://github.com/pytorch/examples/tree/master/dcgan
3. 使用條件 GAN 生成動畫人物:https://github.com/m516825/Conditional-GAN

論文

  1. 生成對抗網路(Generative Adversarial Networks):https://arxiv.org/abs/1406.2661)
  2. 使用深度卷積生成對抗網路的無監督表徵學習)Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks):https://arxiv.org/abs/1511.06434
  3. 條件生成對抗網路(Conditional Generative Adversarial Nets):https://arxiv.org/abs/1411.1784

本文參考連結:https://sigmoidal.io/beginners-review-of-gan-architectures/
如有侵權,請作者聯絡我及時刪除!