1、GAN的原理:
GAN的主要靈感來源於博弈論中零和博弈的思想,應用到深度學習神經網絡上來說,就是通過生成網絡G(Generator)和判別網絡D(Discriminator)不斷博弈,進而使G學習到數據的分布,如果用到圖片生成上,則訓練完成后,G可以從一段隨機數中生成逼真的圖像。G, D的主要功能是:
● G是一個生成式的網絡,它接收一個隨機的噪聲z(隨機數),通過這個噪聲生成圖像 ;
● D是一個判別網絡,判別一張圖片是不是“真實的”。它的輸入參數是x,x代表一張圖片,輸出D(x)代表x為真實圖片的概率,如果為1,就代表100%是真實的圖片,而輸出為0,就代表不可能是真實的圖片
訓練過程中,生成網絡G的目標就是盡量生成真實的圖片去欺騙判別網絡D。而D的目標就是盡量辨別出G生成的假圖像和真實的圖像。這樣,G和D構成了一個動態的“博弈過程”,最終的平衡點即納什均衡點.
2、特點
相比較傳統的模型,他存在兩個不同的網絡,而不是單一的網絡,並且訓練方式采用的是對抗訓練方式;
GAN中G的梯度更新信息來自判別器D,而不是來自數據樣本;
3、優點
- ● GAN是一種生成式模型,相比較其他生成模型(玻爾茲曼機和GSNs)只用到了反向傳播,而不需要復雜的馬爾科夫鏈
- ● 相比其他所有模型, GAN可以產生更加清晰,真實的樣本
- ● GAN采用的是一種無監督的學習方式訓練,可以被廣泛用在無監督學習和半監督學習領域
- ● 相比於變分自編碼器, GANs沒有引入任何決定性偏置( deterministic bias),變分方法引入決定性偏置,因為他們優化對數似然的下界,而不是似然度本身,這看起來導致了VAEs生成的實例比GANs更模糊
- ● 相比VAE, GANs沒有變分下界,如果鑒別器訓練良好,那么生成器可以完美的學習到訓練樣本的分布.換句話說,GANs是漸進一致的,但是VAE是有偏差的
- ● GAN應用到一些場景上,比如圖片風格遷移,超分辨率,圖像補全,去噪,避免了損失函數設計的困難,不管三七二十一,只要有一個的基准,直接上判別器,剩下的就交給對抗訓練了。
4、缺點
- ● 訓練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生成的並不怎么樣,但是他們兩個就這樣自我欺騙下去了,導致最終生成結果缺失一些信息,特征不全。
5、問題
(1)為什么GAN中的優化器不常用SGD
1. SGD容易震盪,容易使GAN訓練不穩定,
2. GAN的目的是在高維非凸的參數空間中找到納什均衡點,GAN的納什均衡點是一個鞍點,但是SGD只會找到局部極小值,因為SGD解決的是一個尋找最小值的問題,GAN是一個博弈問題。()
(2)為什么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,和強化學習結合的產物)
6、訓練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的網絡層增加高斯噪聲,相當於是一種正則
7、GAN變體總結
https://blog.csdn.net/Sakura55/article/details/81514828#4wgan