https://www.bilibili.com/video/av9770302/?p=15
前面說了auto-encoder,VAE可以用於生成
VAE的問題,
AE的訓練是讓輸入輸出盡可能的接近,所以生成出來圖片只是在模仿訓練集,而無法生成他完全沒有見過的,或新的圖片
由於VAE並沒有真正的理解和學習如何生成新的圖片,所以對於下面的例子,他無法區分兩個case的好壞,因為從lost上看都是比7多了一個pixel
所以產生GAN,
大家都知道GAN是對抗網絡,是generator和discriminator的對抗,對抗是有一個逐漸進化的過程
而generator不會看到訓練集,訓練集只用來訓練discriminator,所以generator是試圖去生成新的圖片,而不是單純的模仿訓練集
過程是,
我們通過V1的generator的輸出和real images來訓練V1的discriminator,讓V1的discriminator可以判別出兩者的差別
然后,將V1的generator和V1的discriminator作為整體network訓練(這里需要固定discriminator的參數),目標就是讓generator產生的圖片可以騙過V1的discriminator
這樣就產生出V2的generator,重復上面的過程,讓generator和discriminator分別逐漸進化
訓練Discriminator的詳細過程,
訓練generator的詳細過程,
可以看到 generator會調整參數,產生image讓discriminator判別為1,即騙過discriminator
並且在網絡訓練的時候,雖然是把generator和discriminator合一起訓練,但是要fix住discriminator的參數,不然discriminator只需要簡單的迎合generator就可以達到目標,起不到對抗的效果
下面從理論上來看下GAN,
GAN的目的是生成和目標分布(訓練集所代表的分布)所接近的分布
Pdata就是訓練數據所代表的分布
PG是我們要生成的分布
所以我們的目標就是讓PG和Pdata盡可能的close
從Pdata中sample任意m個點,然后用這些點去計算PG,用最大似然估計,算likelihood
讓這些點在PG中的概率和盡可能的大,就會讓PG分布接近Pdata
這里的推導出,上面給出的最大似然估計,等價於求Pdata和PG的KL散度,這個是make sense的,KL散度本身就用來衡量兩個分布的相似度
這里PG可以是任意函數,比如,你可以用高斯混合模型來生成PG,那么theta就是高斯混合中每個高斯的參數和weight
那么這里給定參數和一組sample x,我們就可以用混合高斯的公式算出PG,根據上面的推導,也就得到了兩個分布的KL散度
當然高斯混合模型不夠強大,很難很好的去擬合Pdata
所以這里是用GAN的第一個優勢,我們可以用nn去擬合PG
這個圖就是GAN的generator,z符合高斯分布,z是什么分布不關鍵也可以是其他分布
通過Gz函數,得到x,z可以從高斯分布中sample出很多點,所以計算得到很多x,x的分布就是PG;只要nn足夠復雜,雖然z的分布式高斯,但x可以是任意分布
這里和傳統方法,比如高斯混合的不同是,這個likelihood,即PG不好算,因為這里G是個nn,所以我們沒有辦法直接計算得到兩個分布的KL散度
所以GAN需要discriminator,它也是一個nn,用discriminator來間接的計算PG和Pdata的相似性,從而替代KL散度的計算
GAN可以分成Generator G和Discriminator D,其中D是用來衡量PG和Pdata的相似性
最終優化目標的公式,看着很唬人,又是min,又是max
其實分成兩個步驟,
給定G,優化D,使得maxV(紅線部分),就是訓練discriminator,計算出兩個分布之間的差異值;在上圖中就是在每個小圖里找到那個紅點
給定D,優化G,使得min(maxV),就是在訓練generator,最小化兩個分布之間的差異;就是在上圖中挑選出G3
這里有個問題沒有講清楚的是,
為何給定G,優化D,使得maxV,得到的V可以代表兩個分布的差異?
如果這個問題明白了,下一步優化G,去最小化這個分布間的差異是很好理解的
做些簡單的轉換,如果我們要最后一步這個積分最大,那么等價於對於每個x,積分的內容都最大
這里是給定G,x,Pdata(x),PG(x)都是常量,所以轉換成D的一個簡單函數
求最大值,就極值,就是求導找到極點
這里推導出當V max的時候, D的定義,並且D的值域應該在0到1之間
上面推導出如果要Vmax,D要滿足
所以進一步將D帶入V的公式,這里經過一系列推導得到,V就等價於jensen-shannon divergence
jensen-shannon divergence的定義,如下,
比KL divergence好的是,KL是非對稱的,而jensen-shannon divergence是對稱的,可以更好的反應兩個分布間的差異
那么這里的推導就證明,給定G,優化D讓V最大的時候,V就表示Pdata和PG的jensen-shannon divergence,所以這個Vmax就可以表示這個兩個分布的差異,也就回答了前面的問題
總結一下,
GAN,有兩部分Generator G,Discriminator D
我們的目的是找到一個G,可以生成出足夠好的x,即滿足minmaxV(G,D),其中V的定義在藍框中
GAN分兩步,先給定G,去MaxD,然后再通過找到最優的G以滿足,Pg(x) = Pdata(x)
MaxV,給定G,找到最大D,所以可以看成G的函數,設為L(G)
那么這樣找到最優G,就是對L(G)進行梯度下降
這里的問題是L(G)中有一個Max,如何梯度下降?
下面給出一個例子,給定x先找出max的D,再對D做梯度下降
所以算法的步驟,
給定G0,max V得到D0,這里V(G0,D0)就Pdata和PG的JS divergence
然后固定D0,對V進行梯度下降,盡量降低JS divergence,得到G1,。。。。。。
但這里會有一個問題,
從G0梯度下降到G1,如果step太大,會導致圖中的情況,在G1,D1會和D0差的比較遠,這樣有可能V(G,D)反而變大了
但是我們只要控制住G的變化程度,這個問題就可以避免
在實際實現的時候,對於V,我們是無法算出Pdata,PG的期望的
所以只能sample,對Pdata,PG中進行m個sample
所以對於給定G,我們要算使得V max的D,這就是在訓練discriminator
把m個sample的數據帶入V的公式,期望E就變成求平均
這個式子就等同於binary classifer,這個很直覺,本身discriminator就是在訓練一個二元分類,來判斷是否是生成數據
完整的過程如上,分為兩部分,
Learning D,需要固定G,去maximize V,所以這里用的梯度上升,這個步驟可以做多次,以盡量找到max
Learning G,固定D,去minimize V,用梯度下降,這個步驟只做一次,上面說了如果G變化太大,會導致JS divergence變大而不是變小;用紅線划掉部分,因為和G無關,所以梯度下降時可以去掉
實現上,learning G的時候,我們往往不會對上面那個式子做梯度下降,因為你可以看圖,D(X)比較小的時候(開始訓練時,D會很小),這個曲線的梯度是很小的,很難訓練
所以會用下面的式子替代,這樣,在開始訓練時候梯度會比較大,訓練較快
在訓練GAN的時候,往往會出現discriminator過強,導致無法訓練的問題,
比如上面的例子,強弱兩種generator,但是在discriminator看來,沒有區別,它都可以很輕松的判別出他們是false的,這樣就會無法訓練,因為沒有梯度
為何discriminator很容易判斷出Pdata和PG是完全沒有交集?
兩個原因,首先因為我們只是對分布做了sample,所以雖然兩個分布有交集,但是我們sample的數據有可能很容易被過擬合繞開
再者,data是高維空間的manifold,所以重疊的部分可能非常的小,導致discriminator認為沒有重疊
所以問題就在於,你無法從PG0直接跳到PG100,需要逐漸演化,而過強的discriminator會導致在100之前,JS divergence一直是log2,這樣就完全沒有梯度
這個比較簡單的解決方法就是給discriminator加noise,效果如圖,會讓分布的overlap更加明顯
但這個noises需要隨着時間遞減,因為隨着generator變強,noise會干擾正常的訓練
Conditional GAN
Conditional GAN的不同就是,需要給一個條件輸入,比如這里的text,train
這里用GAN和其他簡單的模型的差異是,GAN還有一個輸入是z,在是一個prior distribution的sample,所以一個條件train對應的不是一個輸出,而是一個分布
這里對於train可能有很多種picture,所以更為合理,普通的nn一個輸入只對應一個輸出
同樣對於discriminator,也要同時輸入condition和x,來進行判別