1. 程式人生 > >生成對抗網路(GAN)簡單入門(33)---《深度學習》

生成對抗網路(GAN)簡單入門(33)---《深度學習》

生成對抗網路與2014年被提出,一經提出便引發了深度學習的又一次小高潮,屬於無監督學習,本篇部落格主要介紹***GAN網路的結構以及訓練過程!***

對抗樣本即對抗網路的發展大家可以參考GANs學習系列(4):對抗樣本和對抗網路,有助於建立一個對對抗樣本的系統認知!

1、生成對抗網路(GAN)的結構

GAN網路主要由兩個網路構成,生成網路G和辨別網路D,生成模型G的思想是將一個噪聲包裝成一個逼真的樣本,判別模型D則需要判斷送入的樣本是真實的還是假的樣本,即共同進步的過程,辨別模型D對樣本的判別能力不斷上升,生成模型G的造假能力也不斷上升!
需要注意的是,生成模型G的輸入是服從-1~1均勻分佈的隨機變數,輸出為一張圖片(或者其他,這裡我們需要圖片而已),因此,生成網路的結構是一個反捲積網路,即對應CNN中的視覺化操作,由隨機變數生成圖片的過程!

2、生成對抗網路(GAN)的訓練

生成網路G的分佈參考:生成對抗網路的tensorflow實現,接下來我們來看一下如何訓練這兩個網路!
因為是2個網路,不好一起訓練,所以怎樣訓練這兩個模型呢?方法就是:

單獨交替迭代訓練。

即在訓練一個網路的時候,固定住一個網路,然後去訓練另一個網路;訓練另一個網路的時候,固定住一個網路!
假設現在生成網路已經存在了,給一堆隨機陣列,就會得到一堆假的樣本集,針對判別網路D,結合真樣本集和假的樣本集同時對D進行訓練,可以使D對於真假樣本的判別能力得到提高!

針對生成網路呢?我們的目的是即可能的生成儘可能逼真的樣本,原始的生成網路只負責生成對抗樣本,然而它的效果好不好則需要判別網路進行判別,因此,在訓練生成網路G的時候後面需要跟上一個判別網路D進行訓練,需要注意的是:在訓練生成網路G的時候,判別網路D的引數不發生變化,即只是把loss一直回傳,傳到生成網路G後更新生成網路的引數即可!

我們來看看GAN網路的額loss函式,下面是原始論文中給出來的目標公式:
這裡寫圖片描述
這個公式包含了兩個網路的訓練過程,即先優化辨別網路D,然後再來優化生成網路G,仔細想想,我們要生成很好地對抗樣本,如何證明我們生成很棒的對抗樣本呢?即能夠非常好的愚弄一個已經能夠對樣本進行很好區分的辨別網路D,這樣才可定義為對抗樣本是比較逼真的,這樣就很容易確定優化順序了,即先要有一個訓練的好的辨別網路D,由於辨別網路D和生成網路G是同時訓練的,因此,因此我們先訓練辨別網路D,然後在訓練生成網路G,即兩個優化問題,現在我們將該公式進行拆解:
1)優化辨別網路D:
這裡寫圖片描述
這裡寫圖片描述
**(分析:因為D(x)或者D(G(z))的取值範圍僅僅只是0~1,分析一下這個函式,可以發現,為了是這個函式值最大,D(x)應該儘可能趨向於1,而D(G(z))應該儘可能趨向於0,這樣的話,可以很好地訓練我們的辨別網路D)**優化辨別網路的時候,我們需要對真樣本的預測結果越大越好,對於偽樣本的的預測結果越小越好,即log(D(x)和1-log(1-D(G(z))),包含智慧使其儘可能大,然後進行訓練。
2)優化生成網路G:
這裡寫圖片描述


這裡寫圖片描述
訓練生成網路G的時候,與真樣本無關,因此可以去掉第一項,我們的目標是最大化D(G(z)),為了統一格式,所以寫成了最小化log(1-D(G(z)),將兩個優化模型合併起來寫,就變成了原始的那個最大最小目標函數了!

下面是論文中給出的訓練GAN網路的演算法:
這裡寫圖片描述

ps:不過需要注意的是,實際中在定義loss函式的時候,1)訓練辨別網路D的時候,由於需要最大化對應的值,在實際中我們使用梯度下降演算法,因此,我們將其轉化為負數,即可以利用梯度下降演算法減小loss值即可;2)訓練生成網路的時候,我們需要最小化對應的值,因此,我們採用小trick,即將1-D(G(z))轉化為D(G(z))並給對應的外部值乘上負號,便於計算,而且還能避免在log(1-D(G(z))飽和時出現的相應問題,方便操作!具體參考參考文獻中第6條!