VAE
學習+整理
來源:
https://www.spaces.ac.cn/archives/5253
https://www.cnblogs.com/blogofnickchen/p/7221641.html
分佈變換
VAE和GAN它們兩個的目標基本是一致的——希望構建一個從隱變量Z生成目標數據X的模型,但是實現上有所不同。更準確地講,它們是假設了Z服從某些常見的分佈(比如正態分佈或均勻分佈),然後希望訓練一個模型X=g(Z)X=g(Z),這個模型能夠將原來的概率分佈映射到訓練集的概率分佈,也就是說,它們的目的都是進行分佈之間的變換。
VAE 變分自編碼器
首先我們有一批數據樣本,其整體用來描述,我們本想根據得到的分佈,如果能得到的話,那我直接根據來採樣,就可以得到所有可能的了(包括{X1,…,Xn}{X1,…,Xn}以外的),這是一個終極理想的生成模型了。當然,這個理想很難實現,於是我們將分佈改一改
這裏我們就不區分求和還是求積分了,意思對了就行。此時就描述了一個由Z來生成X的模型,而我們假設Z服從標準正態分佈,也就是。如果這個理想能實現,那麼我們就可以先從標準正態分佈中採樣一個Z,然後根據Z來算一個X,也是一個很棒的生成模型。接下來就是結合自編碼器來實現重構,保證有效信息沒有丟失,再加上一系列的推導,最後把模型實現。
在整個VAE模型中,我們並沒有去使用(隱變量空間的分佈)是正態分佈的假設,我們用的是假設(後驗分佈)是正態分佈!!
具體來說,給定一個真實樣本Xk,我們假設存在一個專屬於Xk的分佈p(Z|Xk)(學名叫後驗分佈),並進一步假設這個分佈是(獨立的、多元的)正態分佈。爲什麼要強調“專屬”呢?因爲我們後面要訓練一個生成器X=g(Z),希望能夠把從分佈p(Z|Xk)採樣出來的一個Zk還原爲Xk。如果假設p(Z)是正態分佈,然後從p(Z)中採樣Z,那麼我們怎麼知道這個Z對應於哪個真實的X呢?現在p(Z|Xk)專屬於Xk,我們有理由說從這個分佈採樣出來的Z應該要還原到Xk中去。
這時候每一個Xk都配上了一個專屬的正態分佈,才方便後面的生成器做還原。但這樣有多少個X就有多少個正態分佈了。我們知道正態分佈有兩組參數:均值μ和方差σ2(多元的話,它們都是向量)。用神經網絡來擬合出專屬於Xk的正態分佈p(Z|Xk)的均值和方差!
構建兩個神經網絡來算它們。選擇擬合而不是直接擬合,是因爲總是非負的,需要加激活函數處理,而擬合不需要加激活函數,因爲它可正可負。
最小化。
分佈標準化
最小化會使方差爲0,方差爲零就等於沒有噪聲了。VAE讓所有的都向標準正態分佈看齊,防止噪聲爲零,保證模型具有生成能力。方法是在重構誤差的基礎上加入額外的loss:
因爲它們分別代表了均值和方差的對數,達到標準分佈就是希望它們儘量接近於0。對於這個兩個損失的比例怎麼選取,原論文直接算一般(各分量獨立的)正態分佈與標準正態分佈的KL散度作爲這個額外的loss。
KL散度 Kullback-Leibler Divergence
在統計應用中,我們經常需要用一個簡單的,近似的概率分佈來描述
觀察數據 D 或者另一個複雜的概率分佈f。這個時候,我們需要一個量來衡量我們選擇的近似分佈相比原分佈f究竟損失了多少信息量,這就是KL散度起作用的地方。
一個概率分佈對應的熵的表達:
在Variational Inference中,我們希望能夠找到一個相對簡單好算的概率分佈q,使它儘可能地近似我們待分析的後驗概率p(z|x),其中z是隱變量,x是顯變量。在這裏我們的“loss函數”就是KL散度,他可以很好地測量兩個概率分佈之間的距離。如果兩個分佈越接近,那麼KL散度越小,如果越遠,KL散度就會越大。