一、基本原理:
GAN其實本質就是由兩個網路組成,一個為我們熟知的判別網路,還有一個為生成網路;GAN的最終目標就是通過使用判別器,能夠使生成器生成我們需要的影象;
通常我們我們將生成網路簡寫為G,將辨別網路稱為D。
G主要接受一個噪音,並且生成偽造的資料,塞給D進行辨別,由D進行辨別,理想狀態下,D會成功的鑑別出來G生成的資料為假。這時,G會進行改進,進一步的將噪音偽造成真實資料的樣子,塞給D鑑別;
同時,D也會學習如何鑑別出G的造假技巧,從而能夠將G生成的假圖片甄別出來;可以看出,這就是一個動態的過程,其最終的目的是D無法鑑別出G生成的資料是真的還是假的;
二、基本原理:
GAN網路的一大特點就是可以使用噪音,學習到真實的資料分佈,從而模擬出真實資料的資料分佈;
下面是GAN的目標函式:

對於GAN網路,我們採用的是交替訓練,也就是先固定住一個網路,去訓練另一個網路;
我們先固定G訓練D,從而有:

對於這個式子,我們希望他越大越好。在理想狀態下,真實的資料辨別成1,而G生成的資料,也就是G(z),應該辨別成0;
觀察這個式子我們可以發現,如果真實資料x或者生成資料是G(z)被分類錯一個,這個式子的最終值都會變成負無窮,所以這就可以看出有很大的優化空間去是這個式子的值最大;
接下來我們固定D訓練G,會得到以下式子:

對於這個式子,我們的目的是使其最小化。對於該式的第一項,可以在這個時候理解成一個常數項,第二項才是影響這個式子值的關鍵;
G的目的是希望D將他生成的資料錯認為是真的,所以應該有D(G(z))=1,此時第二項為負無窮,滿足式子的最小值要求;
我們所說的GAN網路可以很好的學習真實資料的分佈,所以在訓練中,如果固定網路G不動,訓練D,所以會有最優結果:

三、損失函式:
損失函式的定義可以說是GAN網路的關鍵;
對於判別器的損失函式,大多都採用如下式子定義:

對於生成網路的損失函式,有兩種形式:
第一種是採用零和博弈。零和博弈從通俗理解就是拼個你死我活,你賺了我必然虧,我虧了多少你就賺多少;此時,G的代價函式就變為:

此時,我們訓練的目的就是能夠使的生成器和判別器達到一個平衡點,也就是鞍點,使得兩者達到平衡;
但是關鍵點在於,這個方法理論上是可行,但是實踐使用很糟糕;因為當判別器訓練到一定程度,完全有把握的拒絕生成樣本時,生成器的梯度就會消失,這裡可以近似的認為生成模型和源資料你和之後,求導結果都為(1/2)'=0;
所以,就有第二博弈形式:非飽和博弈;
也就是將G的代價函式變為:
