深度学习(七)—— GAN
https://antkillerfarm.github.io/
GAN(續)
基本原理
上面的解釋雖然通俗,卻并未涉及算法的實現。要實現上述原理,至少要解決三個問題:
1.什么是偽造者。
2.什么是鑒別者。
3.如何對抗。
以下文章的組織順序,主要參考下文:
http://kexue.fm/archives/4439/
互懟的藝術:從零直達WGAN-GP
老規矩,摘要+點評。
偽造者
偽造者在這里實際上是一種Generative算法。偽造的內容是:將隨機噪聲映射為我們所希望的正樣本。
隨機噪聲我們一般定義為均勻分布,于是上面的問題可以轉化為:如何將均勻分布X映射為正樣本分布Y。
首先,我們思考一個簡單的問題:如何將U[0,1]映射為N(0,1)?
理論上的做法是:將X~U[0,1]經過函數Y=f(X)映射之后,就有Y~N(0,1)了。設ρ(x)是U[0,1]是概率密度函數,那么[x,x+dx]和[y,y+dy]這兩個區間的概率應該相等,而根據概率密度定義,ρ(x)不是概率,ρ(x)dx才是概率,因此有:
ρ(x)dx=12π??√exp(?y22)dy
即:
∫x0ρ(t)dt=∫y?∞12π??√exp(?t22)dt=Φ(y)
其中,Φ(y)是標準正態分布的累積分布函數,所以
y=Φ?1(∫x0ρ(t)dt)
注意到累積分布函數是無法用初等函數顯式表示出來的,更不用說它的逆函數了。說白了,Y=f(X)的f的確是存在的,但很復雜,以上解只是一個記號,該算的還是要用計算機算。
正態分布是常見的、相對簡單的分布,但這個映射已經這么復雜了。如果換了任意分布,甚至概率密度函數都不能顯式寫出來,那么復雜度可想而知~
考慮到我們總可以用一個神經網絡來擬合任意函數。這里不妨用一個帶有多個參數的神經網絡G(X,θ)去擬合f?只要把參數$$\theta$訓練好,就可以認為$Y=G(X,\theta)$了。這里的G是Generator*的意思。
正樣本分布
如上所述,一般的正樣本分布是很難給出概率密度函數的。然而,我們可以換個角度思考問題。
假設有一批服從某個指定分布的數據Z=(z1,z2,…,zN),根據概率論的相關定義,我們至少可以使用離散采樣的方法,根據Z中的樣本分布,來近似求出Z的指定分布。下文如無特殊指出,均以Z中的樣本分布來代替Z的指定分布,簡稱Z的分布。
那么接著就有另一個問題:如何評估G(X,θ)生成的樣本的分布和Z的分布之間的差異呢?
KL散度
比較兩個分布的差異的最常用指標是KL散度。其定義參見《機器學習(八)》。
JS散度
因為KL散度不是對稱的,有時候將它對稱化,即得到JS散度(Jensen–Shannon divergence):
JS(p1(x),p2(x))=12KL(p1(x)∥p2(x))+12KL(p2(x)∥p1(x))
注:Claude Elwood Shannon,1916~2001,美國數學家,信息論之父。密歇根大學雙學士+MIT博士。先后供職于貝爾實驗室和MIT。
KL散度和JS散度,也是Ian Goodfellow在原始GAN論文中,給出的評價指標。
雖然KL散度和JS散度,在這里起著距離的作用,但它們不是距離,它們不滿足距離的三角不等式,因此只能叫“散度”。
神經距離
假設我們可以將實數域分成若干個不相交的區間I1,I2,…,IK,那么就可以估算一下給定分布Z的概率分布:
pz(Ii)=1N∑j=1N#(zj∈Ii)
其中#(zj∈Ii)表示如果zj∈Ii,那么取值為1,否則為0。
接著我們生成M個均勻隨機數x1,x2,…,xM(這里不一定要M=N,還是那句話,我們比較的是分布,不是樣本本身,因此多一個少一個樣本,對分布的估算也差不了多少。),根據Y=G(X,θ)計算對應的y1,y2,…,yM,然后根據公式可以計算:
py(Ii)=1M∑j=1M(yj∈Ii)
現在有了pz(Ii)和py(Ii),那么我們就可以算它們的差距了,比如可以選擇JS距離
Loss=JS(py(Ii),pz(Ii))
假如我們只研究單變量概率分布之間的變換,那上述過程完全夠了。然而,很多真正有意義的事情都是多元的,比如在MNIST上做實驗,想要將隨機噪聲變換成手寫數字圖像。要注意MNIST的圖像是28*28=784像素的,假如每個像素都是隨機的,那么這就是一個784元的概率分布。按照我們前面分區間來計算KL距離或者JS距離,哪怕每個像素只分兩個區間,那么就有2784≈10236個區間,這是何其巨大的計算量!
為此,我們用神經網絡L定義距離:
L({yi}Mi=1,{zi}Ni=1,Θ)
其中,Θ為神經網絡的參數。
對于特定的任務來說,{zi}Ni=1是給定的,并非變量,因此上式可簡寫成:
L({yi}Mi=1,Θ)
通常,我們采用如下的L實現:
L=1M∑i=1MD(yi,Θ)
上式可以簡單的理解為:分布之間的距離,等于單個樣本的距離的平均。
這里的神經網絡D(Y,Θ),實際上就是GAN的另一個主角——鑒別者。這里的D是Discriminator的意思。
如何對抗
因為D(Y,Θ)的均值,也就是L,是度量兩個分布的差異程度,這就意味著,L要能夠將兩個分布區分開來,即L越大越好;但是我們最終的目的,是希望通過均勻分布而生成我們指定的分布,所以G(X,θ)則希望兩個分布越來越接近,即L越小越好。
形式化的描述就是:
argminGmaxDV(G,D)
具體的做法是:
Step1
隨機初始化G(X,θ),固定它,然后生成一批Y,這時候我們要訓練D(Y,Θ),既然L代表的是“與指定樣本Z的差異”,那么,如果將指定樣本Z代入L,結果應該是越小越好,而將Y代入L,結果應該是越大越好,所以
Θ=Θ=argminΘL=argminΘ1N∑i=1ND(zi,Θ)argmaxΘL=argmaxΘ1M∑i=1MD(yi,Θ)
然而有兩個目標并不容易平衡,所以干脆都取同樣的樣本數B(一個batch),然后一起訓練就好:
Θ==argminΘL1argminΘ1B∑i=1B[D(zi,Θ)?D(yi,Θ)]
Step2
G(X,θ)希望它生成的樣本越接近真實樣本越好,因此這時候把Θ固定,只訓練θ讓L越來越小:
θ==argminθL2argminθ1B∑i=1B[D(G(xi,θ),Θ)]
總結
以上是生活随笔為你收集整理的深度学习(七)—— GAN的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习(六)——CNN进化史
- 下一篇: 深度学习(八)——fine-tuning