論文地址:https://arxiv.org/pdf/1406.2661.pdf
1、簡介:
GAN的兩個模型
- 判別模型:就是圖中右半部分的網絡,直觀來看就是一個簡單的神經網絡結構,輸入就是一副圖像,輸出就是一個概率值,用於判斷真假使用(概率值大於0.5那就是真,小於0.5那就是假),真假也不過是人們定義的概率而已。
- 生成模型:生成模型要做什么呢,同樣也可以看成是一個神經網絡模型,輸入是一組隨機數Z,輸出是一個圖像,不再是一個數值。從圖中可以看到,會存在兩個數據集,一個是真實數據集,這好說,另一個是假的數據集,那這個數據集就是有生成網絡造出來的數據集。
我們再來理解一下GAN的目標是要干什么:
- 判別網絡的目的:就是能判別出來屬於的一張圖它是來自真實樣本集還是假樣本集。假如輸入的是真樣本,網絡輸出就接近1,輸入的是假樣本,網絡輸出接近0,那么很完美,達到了很好判別的目的。
- 生成網絡的目的:生成網絡是造樣本的,它的目的就是使得自己造樣本的能力盡可能強,強到什么程度呢,你判別網絡沒法判斷我是真樣本還是假樣本。
G和D的異同點
相同點是:
- 這兩個模型都可以看成是一個黑匣子,接受輸入然后有一個輸出,類似一個函數,一個輸入輸出映射。
不同點是:
- 生成模型功能:比作是一個樣本生成器,輸入一個噪聲/樣本,然后把它包裝成一個逼真的樣本,也就是輸出。
- 判別模型:比作一個二分類器(如同0-1分類器),來判斷輸入的樣本是真是假。(就是輸出值大於0.5還是小於0.5);
幾點說明:
- 我們有的只是真實采集而來的人臉樣本數據集,僅此而已,而且很關鍵的一點是我們連人臉數據集的類標簽都沒有,也就是我們不知道那個人臉對應的是誰。(因此GAN算是無監督算法)
- 生成網絡生成的假樣本進去了判別網絡以后,判別網絡給出的結果是一個接近0.5的值,極限情況就是0.5,也就是說判別不出來了,這就是納什平衡了。
2、訓練:
訓練方式:
G和D交替優化:
對於D:真樣本集以及它們的label(都是1)、假樣本集以及它們的label(都是0),這樣單就判別網絡來說,此時問題就變成了一個再簡單不過的有監督的二分類問題了,直接送到神經網絡模型中訓練就完事了。
對於G:樣本集(只有假樣本集,沒有真樣本集)對應的label全為1,只有一類訓練在訓練這個串接的網絡的時候,一個很重要的操作就是不要判別網絡的參數發生變化,也就是不讓它參數發生更新,只是把誤差一直傳,傳到生成網絡那塊后更新生成網絡的參數。
目標函數公式:
這個公式既然是最大最小的優化,那就不是一步完成的,其實對比我們的分析過程也是這樣的,這里現優化D,然后在取優化G,本質上是兩個優化問題,把拆解就如同下面兩個公式:
優化D:
優化G:
可以看到,優化D的時候,也就是判別網絡,其實沒有生成網絡什么事,后面的G(z)這里就相當於已經得到的假樣本。優化D的公式的第一項,使的真樣本x輸入的時候,得到的結果越大越好,可以理解,因為需要真樣本的預測結果越接近於1越好嘛。對於假樣本,需要優化是的其結果越小越好,也就是D(G(z))越小越好,因為它的標簽為0。但是呢第一項是越大,第二項是越小,這不矛盾了,所以呢把第二項改成1-D(G(z)),這樣就是越大越好,兩者合起來就是越大越好。 那么同樣在優化G的時候,這個時候沒有真樣本什么事,所以把第一項直接卻掉了。這個時候只有假樣本,但是我們說這個時候是希望假樣本的標簽是1的,所以是D(G(z))越大越好,但是呢為了統一成1-D(G(z))的形式,那么只能是最小化1-D(G(z)),本質上沒有區別,只是為了形式的統一。之后這兩個優化模型可以合並起來寫,就變成了最開始的那個最大最小目標函數了。
兩種說法:
GAN強大之處在於可以自動的學習原始真實樣本集的數據分布。
這張圖表明的是GAN的生成網絡如何一步步從均勻分布學習到正太分布的。原始數據x服從正太分布,這個過程你也沒告訴生成網絡說你得用正太分布來學習,但是生成網絡學習到了。假設你改一下x的分布,不管什么分布,生成網絡可能也能學到。這就是GAN可以自動學習真實數據的分布的強大之處。
如果讓你說從隨機噪聲到人臉應該服從什么分布,你不可能知道。這是一層層映射之后組合起來的非常復雜的分布映射規律。然而GAN的機制可以學習到,也就是說GAN學習到了真實樣本集的數據分布。
GAN強大之處在於可以自動的定義潛在損失函數。
什么意思呢,這應該說的是判別網絡可以自動學習到一個好的判別方法,其實就是等效的理解為可以學習到好的損失函數,來比較好或者不好的判別出來結果。雖然大的loss函數還是我們人為定義的,基本上對於多數GAN也都這么定義就可以了,但是判別網絡潛在學習到的損失函數隱藏在網絡之中,不同的問題這個函數就不一樣,所以說可以自動學習這個潛在的損失函數。
3、GAN 的優點:
(以下部分摘自ian goodfellow 在Quora的問答)
● GAN是一種生成式模型,相比較其他生成模型(玻爾茲曼機和GSNs)只用到了反向傳播,而不需要復雜的馬爾科夫鏈
● 相比其他所有模型, GAN可以產生更加清晰,真實的樣本
● GAN采用的是一種無監督的學習方式訓練,可以被廣泛用在無監督學習和半監督學習領域
● 相比於變分自編碼器, GANs沒有引入任何決定性偏置( deterministic bias),變分方法引入決定性偏置,因為他們優化對數似然的下界,而不是似然度本身,這看起來導致了VAEs生成的實例比GANs更模糊
● 相比VAE, GANs沒有變分下界,如果鑒別器訓練良好,那么生成器可以完美的學習到訓練樣本的分布.換句話說,GANs是漸進一致的,但是VAE是有偏差的
● GAN應用到一些場景上,比如圖片風格遷移,超分辨率,圖像補全,去噪,避免了損失函數設計的困難,不管三七二十一,只要有一個的基准,直接上判別器,剩下的就交給對抗訓練了。
4、 GAN的缺點:
● 訓練GAN需要達到納什均衡,有時候可以用梯度下降法做到,有時候做不到.我們還沒有找到很好的達到納什均衡的方法,所以訓練GAN相比VAE或者PixelRNN是不穩定的,但我認為在實踐中它還是比訓練玻爾茲曼機穩定的多
● GAN不適合處理離散形式的數據,比如文本
● GAN存在訓練不穩定、梯度消失、模式崩潰的問題(目前已解決)
模式崩潰(model collapse)原因
一般出現在GAN訓練不穩定的時候,具體表現為生成出來的結果非常差,但是即使加長訓練時間后也無法得到很好的改善。
具體原因可以解釋如下:GAN采用的是對抗訓練的方式,G的梯度更新來自D,所以G生成的好不好,得看D怎么說。具體就是G生成一個樣本,交給D去評判,D會輸出生成的假樣本是真樣本的概率(0-1),相當於告訴G生成的樣本有多大的真實性,G就會根據這個反饋不斷改善自己,提高D輸出的概率值。但是如果某一次G生成的樣本可能並不是很真實,但是D給出了正確的評價,或者是G生成的結果中一些特征得到了D的認可,這時候G就會認為我輸出的正確的,那么接下來我就這樣輸出肯定D還會給出比較高的評價,實際上G生成的並不怎么樣,但是他們兩個就這樣自我欺騙下去了,導致最終生成結果缺失一些信息,特征不全。
為什么GAN中的優化器不常用SGD
1. SGD容易震盪,容易使GAN訓練不穩定,
2. GAN的目的是在高維非凸的參數空間中找到納什均衡點,GAN的納什均衡點是一個鞍點,但是SGD只會找到局部極小值,因為SGD解決的是一個尋找最小值的問題,GAN是一個博弈問題。
為什么GAN不適合處理文本數據
1. 文本數據相比較圖片數據來說是離散的,因為對於文本來說,通常需要將一個詞映射為一個高維的向量,最終預測的輸出是一個one-hot向量,假設softmax的輸出是(0.2, 0.3, 0.1,0.2,0.15,0.05)那么變為onehot是(0,1,0,0,0,0),如果softmax輸出是(0.2, 0.25, 0.2, 0.1,0.15,0.1 ),one-hot仍然是(0, 1, 0, 0, 0, 0),所以對於生成器來說,G輸出了不同的結果但是D給出了同樣的判別結果,並不能將梯度更新信息很好的傳遞到G中去,所以D最終輸出的判別沒有意義。
2. 另外就是GAN的損失函數是JS散度,JS散度不適合衡量不想交分布之間的距離。
(WGAN雖然使用wassertein距離代替了JS散度,但是在生成文本上能力還是有限,GAN在生成文本上的應用有seq-GAN,和強化學習結合的產物)
5、訓練GAN的一些技巧
1. 輸入規范化到(-1,1)之間,最后一層的激活函數使用tanh(BEGAN除外)
2. 使用wassertein GAN的損失函數,
3. 如果有標簽數據的話,盡量使用標簽,也有人提出使用反轉標簽效果很好,另外使用標簽平滑,單邊標簽平滑或者雙邊標簽平滑
4. 使用mini-batch norm, 如果不用batch norm 可以使用instance norm 或者weight norm
5. 避免使用RELU和pooling層,減少稀疏梯度的可能性,可以使用leakrelu激活函數
6. 優化器盡量選擇ADAM,學習率不要設置太大,初始1e-4可以參考,另外可以隨着訓練進行不斷縮小學習率,
7. 給D的網絡層增加高斯噪聲,相當於是一種正則
參考:
https://blog.csdn.net/on2way/article/details/72773771
https://blog.csdn.net/qq_25737169/article/details/78857724