給定資料集,希望生成模型產生與訓練集同分布的新樣本。對於訓練資料服從\(p_{data}(x)\);對於產生樣本服從\(p_{model}(x)\)。希望學到一個模型\(p_{model}(x)\)與\(p_{data}(x)\)儘可能接近。
這也是無監督學習中的一個核心問題——密度估計問題。有兩種典型的思路:
首先介紹下自編碼器(Auto Encoder, AE),它將輸入的影象X通過編碼器encoder編碼為一個隱向量(bottleneck)Z,然後再通過解碼器decoder解碼為重構影象X',它將自己編碼壓縮再還原故稱自編碼。結構如下圖所示:
一般distance距離函數選擇均方誤差(Mean Square Error, MSE)。AE與PCA作用相同,通過壓縮資料實現降維,還能把降維後的資料進行重構生成影象,但PCA的通過計算特徵值實現線性變換,而AE則是非線性。
如果中間的隱向量的每一分量取值不是直接來自Encoder,而是在一個分佈上進行取樣,那麼就是VAE(Variational Auto Encoder),結構如下圖所示:
還是上面的例子,這裡的Z維度還是1 x 20,但是每一分量不是直接來自Encoder,而是在一個分佈上進行取樣計算,一般來說分佈選擇正態分佈(當然也可以是其他分佈)。每個正態分佈的\(\mu\)與\(\sigma\)由Encoder的神經網路計算而來。關於Z上每一分量的計算,這裡,\(\epsilon\)從噪聲分佈中隨機取樣得到。
在Encoder的過程中給定x得到z就是計算後驗概率\(q_\phi(z|x)\),學習得到的z為先驗分佈\(p_\theta(z)\),Decoder部分根據z計算x的過程就是似然估計\(p_\theta(x|z)\),訓練的目的也是最大化似然估計(給出了z儘可能得還原為x)。
邊緣似然度\(p_\theta(x)=\int p_\theta(z)p_\theta(x|z)\,{\rm d}z\),邊緣似然度又是每個資料點的邊緣似然之和組成:\(\log p_\theta(x^{(1)},\cdots,x^{(N)})=\sum_{i=1}^N\log p_\theta(x^{(i)})\),可以被重寫為:
等式右邊第二項稱為邊緣似然估計的下界,可以寫為:
得到損失函數:
生成對抗網路(Generative Adversarial Nets, GAN)需要同時訓練兩個模型:生成器(Generator, G)和判別器(Discriminator, D)。生成器的目標是生成與訓練集同分布的樣本,而判別器的目標是區分生成器生成的樣本和訓練集中的樣本,兩者相互博弈最後達到平衡(納什均衡),生成器能夠以假亂真,判別器無法區分真假。
生成器和判別器最簡單的應用就是分別設定為兩個MLP。為了讓生成器在資料x學習分佈\(p_g\),定義一個噪聲分佈\(p_z(z)\),然後使用生成器\(G(z;\theta_g)\)將噪聲對映為生成資料x'(\(\theta_g\)是生成器模型引數)。同樣定義判別器\(D(x;\theta_d)\),輸出為標量表示概率,代表輸入的x來自資料還是\(p_g\)。訓練D時,以最大化分類訓練樣例還是G生成樣本的概率準確性為目的;同時訓練G以最小化\(\log(1-D(G(z)))\)為目的,兩者互為博弈的雙方,定義它們的最大最小博弈的價值函數\(V(G,D)\):
可以得到生成器損失函數:\(\mathcal{L}_G = -\log(D(G(z)))\)
判別器損失函數:\(\mathcal{L}_D = -\log(D(x)) - \log(1 - D(G(z)))\)
極端情況下如果D很完美,\(D(x)=1,D(G(z))=0\),最後兩項結果都為0,但如果存在誤分類,由於log兩項結果會變為負數。隨著G的輸出越來越像x導致D誤判,價值函數V也會隨之變小。
計算它們的期望(\(\mathbb{E}_{x\sim p}f(x)=\int_xp(x)f(x){\rm d}x\)):
當D取到最優解時,上面的最大最小博弈價值函數\(V(G,D)\)可以寫為:
當\(p_g=p_{data}\),取到\(-\log4\),上式可以寫成KL散度的形式:
當\(p_g=p_{data}\)時,G取最小值也就是最優解。對於對稱的KL散度,可以寫成JS散度的形式: