原文地址:http://www.dengfanxin.cn/?p=334git
如今有一個數據集DX(dataset, 也能夠叫datapoints),每一個數據也稱爲數據點。
咱們假定這個樣本受某種神祕力量操控,可是咱們也無從知道這些神祕力量是什麼?那麼咱們假定這股神祕力量有n個,起名字叫power1,power2,…,powern 吧,他們的大小分別是z1,z2,…,zn ,稱之爲神祕變量表示成一個向量就是github
z=⎛⎝⎜⎜⎜⎜z1z2⋮zn⎞⎠⎟⎟⎟⎟網絡
z也起個名字叫神祕組合。架構
一言以蔽之:神祕變量表明了神祕力量的神祕組合關係。
用正經的話說就是:隱變量(latent variable)表明了隱因子(latent factor)的組合關係。函數
這裏咱們澄清一下隸屬空間,假設數據集DX是m個點,這m個點也應該隸屬於一個空間,好比一維的狀況,假如每一個點是一個實數,那麼他的隸屬空間就是實數集,因此咱們這裏定義一個DX每一個點都屬於的空間稱爲XS,咱們在後面提到的時候,你就再也不感到陌生了。學習
神祕變量z能夠確定他們也有一個歸屬空間稱爲ZS。優化
下面咱們就要形式化地構造X與Z的神祕關係了,這個關係就是咱們前面說的神祕力量,直觀上咱們已經很是清楚,假設咱們的數據集就是徹底由這n個神祕變量全權操控的,那麼對於X中每個點都應該有一個n個神祕變量的神祕組合zj 來神祕決定。編碼
接下來咱們要將這個關係再簡化一下,咱們假設這n個神祕變量不是可以操控X的所有,還有一些其餘的神祕力量,咱們暫時不考慮,那麼就能夠用機率來彌補這個缺失,爲何呢?舉個例子,假設咱們製造了一個機器能夠向一個固定的目標發射子彈,咱們精確的計算好了打擊的力量和角度,但因爲某些難以控制的因素,好比空氣的流動,地球的轉動致使命中的目標沒法達到精準的目的,而這些因素可能十分巨大和繁多,可是他們並非造成DX的主因素,根據大數定理,這些全部因素產生的影響能夠用高斯分佈的機率密度函數來表示。它長這樣:
p(x|μ,σ2)=12π√σe−12(x−μσ)2 atom
當μ=0 時,就變成了這樣:
p(x|σ2)=12π√σe−x22σ2
這是一維高斯分佈的公式,那麼多維的呢?比較複雜,推導過程見知乎,長這樣:spa
無論怎樣,你只要記住咱們如今沒有能力關注所有的神祕變量,咱們只關心若干個可能重要的因素,這些因素的分佈情況能夠有各類假設,咱們回頭再討論他們的機率分佈問題,咱們如今假定咱們對他們的具體分佈狀況也是一無所知,咱們只是知道他們處於ZS空間內。
前面說到了一個神祕組合,若是一個數據集X對應的神祕組合徹底同樣,那麼這個數據集就是一個單一的分類數據集,若是是多個,那麼就是多分類數據集,但若是是一個連續的組合數據,那麼就是一個有點分不清界限的複雜數據集,就比如,咱們這個數據集是一條線段的集合,線段的長度是惟一的神祕變量,那麼只要長度在一個範圍內連續變化,那麼這個集合裏的線段你就會發現分散的很均勻,你幾乎沒有辦法區分開他們,也無法給他們分紅幾類,但若是這個長度值只能選擇1,3,5,那麼當你觀察這個數據集的時候,你會發現他們會聚在三堆兒裏。若是這個線段的生成徹底依靠的是計算機,那麼每一堆兒都是徹底重合的,但若是是人畫的,就可能由於偏差,無法徹底重合,這無法重合的部分就是咱們說的其餘複雜因素,咱們一般用一個高斯分佈來把它表明了。好,咱們已經基本清晰了,咱們該給這個神祕組合一個形式化的描述了。
假設有兩個變量,z∈ZS 和 x∈XS ,存在一個肯定性函數族f(z;θ) ,族中的每一個函數由θ∈Θ 惟一肯定,f:ZS×Θ→XS ,當θ 固定,z是一個隨機變量(機率密度函數爲Pz(z) )時,那麼f(z;θ) 就是定義在XS上的隨機變量x,對應的機率密度函數能夠寫成g(x)。
那麼咱們的目標就是優化θ 從而尋找到一個f,可以是隨機變量x的採樣和X很是的像。這裏須要注意一下,x是一個變量,DX是已經現成的數據集,x不屬於DX,我特地將名字起的有區分度。
這樣,f就是那個神祕力量通道,他把這些神祕力量的力度,經過f變成了x變量,而這個x變量就是與數據集DX具備直接關係的隨機變量。
設一個數據集爲DX,那麼這個數據集存在的機率爲Pt(DX) ,則根據貝葉斯公式有:
其中,Pxz(DX|z;θ) 是咱們新定義的機率密度函數,咱們前面知道f是將z映射成x,而x又與DX有某種直接的關係,這個直接關係能夠表示成Px(DX|x) ,那麼Pt(DX)=∫Px(DX|x)g(x)dx
這樣咱們就直接定義個Pxz(DX|z;θ) 來替換Px(DX|x)g(x) ,從而表示z與DX的關係了。
好了,其實公式(1)就是咱們的神祕力量與觀察到的數據集之間的神祕關係,這個關係的意思咱們直白的說就是:當隱祕變量按照某種規律存在時,就很是容易產生如今咱們看到的這個數據集。那麼,咱們要作的工做就是當咱們假定有n個神祕力量時,咱們可以找到一個神奇的函數f,將神祕力量的變化轉化成神奇的x的變化,這個x可以垂手可得地生成數據集DX。
從上面的描述裏面咱們看到,f是生成轉換函數,公式(1)不表示這種轉換關係,而是這種關係的最大似然估計(maximum likelihood),它的意思是找到最有可能生成DX這個數據集的主導函數f。
接下來咱們回到討論Pxz(DX|z;θ) 這個機率密度函數上來,咱們前面說過,若是z是所有的神祕力量,那麼它產生的變量x就必定固定的,即當z取值固定時,x取值固定,可是現實中還有不少其餘的因素,於是x的取值還與他們有關,他們的影響力,最終反映成了高斯函數,因此咱們大膽假定Pxz 是一個高斯分佈的機率密度函數,即Pxz(DX|z;θ)=N(DX|f(x;θ),σ2∗I)
注意z的分佈咱們依然是未知的。
假定咱們知道z如今取某一個或幾個特定值,那麼咱們就能夠經過Gradient Descent來找到一個θ 儘可能知足z可以以極高的機率生成咱們但願的數據集DX。再一推廣,就變成了,z取值某一範圍,但去幾個特定值或某一取值範圍是就面臨z各類取值的機率問題,咱們回頭再討論這個棘手的問題,你如今只要知道冥冥之中,咱們彷佛能夠經過學習參數θ 尋找最優解就好了。
OK,咱們還要說一個關鍵問題,就是咱們確信f是存在的,咱們認爲變量與神祕變量之間的關係必定能夠用一個函數來表示。
本節,咱們探討如何最大化公式(1)。首先,咱們要討論怎樣肯定神祕變量z,即z應該有幾個維度,每一個維度的做用域是什麼?更爲較真的,咱們可能甚至要追究每一維度都表明什麼?他們之間是否是獨立的?每一個維度的機率分佈是什麼樣的?
若是咱們沿着這個思路進行下去,就會陷入泥潭,咱們能夠巧妙地避開這些問題,關鍵就在於讓他們繼續保持「神祕」!
咱們不關心每個維度表明什麼含義,咱們只假定存在這麼一羣相互獨立的變量,維度咱們也回到以前的討論,咱們雖然不知道有多少,咱們能夠假定有n個主要因素,n能夠定的大一點,好比假設有4個主因素,而咱們假定有10個,那麼最後訓練出來,可能有6個長期是0。最後的問題須要詳細討論一下,比較複雜,就是z的機率分佈和取值問題。
既然z是什麼都不知道,咱們是否是能夠尋找一組新的神祕變量w,讓這個w服從標準正態分佈N(0,I) 。I 是單位矩陣,而後這個w能夠經過n個複雜函數,轉換成z呢?有了神經網絡這些也是可行的,假設這些複雜函數分別是h1,h2,…,hn ,那麼有z1=h1(w1),…,zn=hn(wn) 。而z的具體分佈是什麼,取值範圍是多少咱們也不用關心了,反正由一個神經網絡去算。回想一下P(DX|z;θ)=N(DX|f(z;θ),σ2×I) ,咱們能夠想象,若是f(z;θ) 是一個多層神經網絡,那麼前幾層就用來將標準正態分佈的w變成真正的隱變量z,後面幾層纔是將z映射成x,但因爲w和z是一一對應關係,因此w某種意義上說也是一股神祕力量。就演化成w和x的關係了,既然w也是神祕變量,咱們就仍是叫回z,把那個以前咱們認爲的神祕變量z忘掉吧。
好,更加波瀾壯闊的歷程要開始了,請坐好。
咱們如今已經有了
Pz(z)=N(0,I) ,
Pxz(DX|z;θ)=N(DX|f(x;θ),σ2∗I) ,
Pt(DX)=∫Pxz(DX|z;θ)Pz(z)dz ,
咱們如今就能夠專心攻擊f了,因爲f是一個神經網絡,咱們就能夠梯度降低了。可是另外一個關鍵點在於咱們怎麼知道這個f生成的樣本,和DX更加像呢?若是這個問題解決不了,咱們根本都不知道咱們的目標函數是什麼。
咱們先來定義個函數 Q(z|DX),數據集DX的發生,z的機率密度函數,即若是DX發生,Q(z|DX)就是z的機率密度函數,好比一個數字圖像0,z隱式表明0的機率就很大,而那些表明1的機率就很小。若是咱們有辦法搞到這個Q的函數表示,咱們就能夠直接使用DX算出z的最佳值了。爲何會引入Q呢?其實道理很簡單,若是DX是x這個變量直接生成的,要想找回x的模型,就要引入一個機率密度函數T(x|DX),亦即針對DX,咱們要找到一個x的最佳機率密度函數。
如今的問題就變成了,咱們能夠根據DX計算出Q(z|DX)來讓他儘可能與理想的Pz(z|DX)儘可能的趨同,這就要引入更加高深的功夫了——相對熵,也叫KL散度(Kullback-Leibler divergence,用 D 表示)。
離散機率分佈的KL公式
KL(p∥q)=∑p(x)logp(x)q(x)
連續機率分佈的KL公式
KL(p∥q)=∫p(x)logp(x)q(x)dx
Pz(z|DX) 和Q(z|DX) 的KL散度爲
D[Q(z|DX)∥Pz(z|DX)]=∫Q(z|DX)[logQ(z|DX)–logPz(z|DX)]
也可寫成
D[Q(z|DX)∥Pz(z|DX)]=Ez∼Q[logQ(z|DX)–logPz(z|DX)]
經過貝葉斯公式
Pz(z|DX)=P(DX|z)P(z)P(DX)
這裏再也不給P起名,其實Pz(z)直接寫成P(z)也是沒有任何問題的,前面只是爲了區分概念,括號中的內容已經足以表意。
D[Q(z|DX)∥Pz(z|DX)]=Ez∼Q[logQ(z|DX)–logP(DX|z)–logP(z)]+logP(DX)
由於logP(DX) 與z變量無關,直接就能夠提出來了,進而獲得閃閃發光的公式(2):
公式(2)是VAE的核心公式,咱們接下來分析一個這個公式。
公式的左邊有咱們的優化目標P(DX),同時攜帶了一個偏差項,這個偏差項反映了給定DX的狀況下的真實分佈Q與理想分佈P的相對熵,當Q徹底符合理想分佈時,這個偏差項就爲0,而等式右邊就是咱們可使用梯度降低進行優化的,這裏面的Q(z|DX)特別像一個DX->z的編碼器,P(DX|z)特別像z->DX的解碼器,這就是VAE架構也被稱爲自編碼器的緣由。
因爲DX早已再也不有分歧,咱們在這裏把全部的DX都換成了X。
咱們如今有公式(2)的拆分:
– 左側第一項:logP(X)
– 左側第二項:D(Q(z|X∥P(z|X))
– 右邊第一項:Ez∼Q[logP(X|z)]
– 右邊第二項:D[Q(z|X)∥P(z)]
還有下面這些:
– P(z)=N(0,I) ,
– P(X|z)=N(X|f(z),σ2∗I) ,
– Q(z|X)=N(z|μ(X),Σ(X))
咱們再明確一下每一個機率的含義:
– P(X) ——當前這個數據集發生的機率,可是他的機率分佈咱們是不知道,好比,X的空間是一個一維有限空間,好比只能取值0-9的整數,而咱們的 X = { 0, 1, 2, 3, 4 },那麼當機率分佈是均勻的時候,P(X)就是0.5,可是若是不是這個分佈,就很差說是什麼了,沒準是0.1, 0.01,都有可能。P(X)是一個函數,就好像是一我的,當你問他X=某個值的時候,他能告訴發生的機率。
– P(z) —— 這個z是咱們後來引入的那個w,還記得嗎?他們都已經歸順了正態分佈,若是z是一維的,那他就是標準正態分佈N(0, I)。
– P(X|z) —— 這個函數的含義是若是z給定一個取值,那麼就知道X取某個值的機率,仍是舉個例子,z是一個神奇的變量,能夠控制在計算機屏幕上出現整個屏幕的紅色而且控制其灰度,z服從N(0,1)分佈,當z=0時表明純正的紅色,z越偏離0,屏幕的紅色就越深,那麼P(X|z)就表示z等於某個值時X=另外一值的機率,因爲計算機是精確控制的,沒有額外的隨機因素,因此若是z=0可以致使X取一個固定色值0xFF0000,那麼P(X=0xFF0000|z=0)=1,P(x!=0xFF0000|z=0) = 0,但若是現實世界比較複雜附加其餘的隨機因素,那麼就可能在z肯定出來的X基礎值之上作隨機了。這就是咱們以前討論的,大數定理,P(X|z)=N(X|f(x),σ2∗I) 。f(z)就是X與z直接關係的寫照。
– P(z|X) —— 當X發生時,z的機率是多少呢?回到剛纔計算機屏幕的例子,就很是簡單了P(z=0|X=0xFF0000) = 1, P(z!=0|X=0xFF0000) = 0,可是因爲機率的引入,X|z能夠簡化成高斯關係,相反,也能夠簡化高斯關係。這個解釋對下面的Q一樣適用。
– Q(z) —— 對於Q的分析和P的分析是同樣的,只不過Q和P的不一樣時,咱們假定P是那個理想中的分佈,是真正決定X的最終構成的背後真實力量,而Q是咱們的親兒子,試着弄出來的贗品,而且但願在現實世界經過神經網絡,讓這個贗品可以嘗試控制產生X。當這個Q真的行爲和咱們理想中的P如出一轍的時候,Q就是上等的贗品了,甚至能夠打出如假包換的招牌。咱們的P已經簡化成N(0,I),就意味着Q只能向N(0, I)靠攏。
– Q(z|X) —— 根據現實中X和Q的關係推導出的機率函數, 當X發生時,對應的z取值的機率分佈狀況。
– Q(X|z) —— 現實中z發生時,取值X的機率。
咱們的目標是優化P(X),可是咱們不知道他的分佈,因此根本無法優化,這就是咱們沒有任何先驗知識。因此有了公式(2),左邊第二項是P(z|X) 和Q(z|X) 的相對熵,意味着X發生時現實的分佈應該與咱們理想的分佈趨同纔對,因此整個左邊都是咱們的優化目標,只要左邊越大就越好,那麼右邊的目標就是越大越好。
右邊第一項:Ez∼Q[logP(X|z)] 就是針對面對真實的z的分佈狀況(依賴Q(z|X),由X->z的映射關係決定),算出來的X的分佈,相似於根據z重建X的過程。
右邊第二項:D[Q(z|X)∥P(z)] 就是讓根據X重建的z與真實的z儘可能趨近,因爲P(z)是明確的N(0, I),而Q(z|X)是也是正態分佈,其實就是要讓Q(z|X)趨近與標準正態分佈。
如今咱們對這個公式的理解更加深刻了。接下來,咱們要進行實現的工做。
針對右邊兩項分別實現
第二項是Q(z|X)與N(0, I)的相對熵,X->z構成了編碼器部分。
Q(z|x)是正態分佈,兩個正態分佈的KL計算公式以下(太複雜了,我也推不出來,感興趣的看[1]):
KL(N(μ,Σ)∥N(0,I))=12[−log[det(Σ)]−d+tr(Σ)+μTμ]
det 是行列式,tr 是算矩陣的秩,d 是I 的秩即d=tr(I) 。
變成具體的神經網絡和矩陣運算,還須要進一步變化該式:
KL(N(μ,Σ)∥N(0,I))=12∑i[−log(Σi)+Σi+μ2i–1]
OK,這個KL咱們也會計算了,還有一個事情就是編碼器網絡,μ(X) 和Σ(X) 都使用神經網絡來編碼就能夠了。
第一項是Ez∼Q[logP(X|z)] 表明依賴z重建出來的數據與X儘可能地相同,z->X重建X構成了解碼器部分,整個重建的關鍵就是f函數,對咱們來講就是創建一個解碼器神經網絡。
到此,整個實現的細節就全都展示在下面這張圖裏了
因爲這個網絡傳遞結構的一個環節是隨機採樣,致使沒法反向傳播,因此聰明的前輩又將這個結構優化成了這樣:
這樣就能夠對整個網絡進行反向傳播訓練了。
具體的實現代碼,我實如今了這裏:
https://github.com/vaxin/TensorFlow-Examples/blob/master/examples/3_NeuralNetworks/variational_autoencoder.py
裏面的每一步,都有配合本文章的對照解釋。
之因此關注VAE,是從文獻[4]引起的,因爲視覺早期的概念造成對於以後的視覺認知起了十分關鍵的做用,咱們有理由相信,在神經網絡訓練時,利用這種遞進關係,先構建具備基礎認知能力的神經網絡,再作高級認知任務時會有極大的效果提高。但經過前面神祕變量的分析,咱們發現,爲了充分利用高斯分佈,咱們將w替換成了z,也就是說真正的隱變量隱藏在f的神經網絡裏面,而如今的z反而容易變成說不清楚的東西,這一不利於後續的時候,二來咱們須要思考,是否應該還原真實的z,從而在層次化遞進上有更大的發揮空間。
[1] http://stats.stackexchange.com/questions/60680/kl-divergence-between-two-multivariate-gaussians[2] https://arxiv.org/abs/1606.05908[3] https://zhuanlan.zhihu.com/p/22464768[4] https://arxiv.org/abs/1606.05579