再谈变分自编码器VAE:从贝叶斯观点出发
作者丨蘇劍林
單位丨廣州火焰信息科技有限公司
研究方向丨NLP,神經網絡
個人主頁丨kexue.fm
前幾天寫了文章變分自編碼器VAE:原來是這么一回事,從一種比較通俗的觀點來理解變分自編碼器(VAE),在那篇文章的視角中,VAE 跟普通的自編碼器差別不大,無非是多加了噪聲并對噪聲做了約束。
然而,當初我想要弄懂 VAE 的初衷,是想看看究竟貝葉斯學派的概率圖模型究竟是如何與深度學習結合來發揮作用的,如果僅僅是得到一個通俗的理解,那顯然是不夠的。
所以我對 VAE 繼續思考了幾天,試圖用更一般的、概率化的語言來把 VAE 說清楚。事實上,這種思考也能回答通俗理解中無法解答的問題,比如重構損失用 MSE 好還是交叉熵好、重構損失和 KL 損失應該怎么平衡,等等。
建議在閱讀變分自編碼器VAE:原來是這么一回事后再對本文進行閱讀,本文在內容上盡量不與前文重復。
準備
在進入對 VAE 的描述之前,我覺得有必要把一些概念性的內容講一下。?
數值計算 vs 采樣計算
對于不是很熟悉概率統計的讀者,容易混淆的兩個概念應該是數值計算和采樣計算,也有讀者對三味Capsule:矩陣Capsule與EM路由出現過同樣的疑惑。比如已知概率密度函數 p(x),那么 x 的期望也就定義為:
如果要對它進行數值計算,也就是數值積分,那么可以選若干個有代表性的點 x0<x1<x2<?<xn,然后得到:
這里不討論“有代表性”是什么意思,也不討論提高數值計算精度的方法。這樣寫出來,是為了跟采樣計算對比。如果從 p(x) 中采樣若干個點 x1,x2,…,xn,那么我們有:
我們可以比較 (2) 跟 (3),它們的主要區別是 (2) 中包含了概率的計算而 (3) 中僅有 x 的計算,這是因為在 (3) 中 xi 是從 p(x) 中依概率采樣出來的,概率大的 xi 出現的次數也多,所以可以說采樣的結果已經包含了 p(x) 在里邊,就不用再乘以 p(xi) 了。
更一般地,我們可以寫出:
這就是蒙特卡洛模擬的基礎。
KL散度及變分
我們通常用 KL 散度來度量兩個概率分布 p(x) 和 q(x) 之間的差異,定義為:
KL 散度的主要性質是非負性,如果固定 p(x),那么 KL(p(x)‖‖‖q(x))=0?p(x)=q(x);如果固定 q(x),同樣有 KL(p(x)‖‖‖q(x))=0?p(x)=q(x),也就是不管固定哪一個,最小化 KL 散度的結果都是兩者盡可能相等。
這一點的嚴格證明要用到變分法,而事實上 VAE 中的 V(變分)就是因為 VAE 的推導就是因為用到了 KL 散度(進而也包含了變分法)。?
當然,KL 散度有一個比較明顯的問題,就是當 q(x) 在某個區域等于 0,而 p(x)?在該區域不等于 0,那么 KL 散度就出現無窮大。
這是 KL 散度的固有問題,我們只能想辦法規避它,比如隱變量的先驗分布我們用高斯分布而不是均勻分布,原因便在此,這一點我們在前文變分自編碼器VAE:原來是這么一回事中也提到過了。?
順便說點題外話,度量兩個概率分布之間的差異只有 KL 散度嗎?
當然不是,我們可以看維基百科的 Statistical Distance 一節,里邊介紹了不少分布距離,比如有一個很漂亮的度量,我們稱之為巴氏距離(Bhattacharyya distance),定義為:
這個距離不僅對稱,還沒有 KL 散度的無窮大問題。然而我們還是選用 KL 散度,因為我們不僅要理論上的漂亮,還要實踐上的可行。KL 散度可以寫成期望的形式,這允許我們對其進行采樣計算,
相反,巴氏距離就沒那么容易了,讀者要是想把下面計算過程中的 KL 散度替換成巴氏距離,就會發現寸步難行了。
本文的符號表
講解 VAE 免不了出現大量的公式和符號,這里將部分式子的含義提前列舉如下:
框架
這里通過直接對聯合分布進行近似的方式,簡明快捷地給出了 VAE 的理論框架。?
直面聯合分布
出發點依然沒變,這里再重述一下。首先我們有一批數據樣本 {x1,…,xn},其整體用 x 來描述,我們希望借助隱變量 z 描述 x 的分布 p(x):
這樣(理論上)我們既描述了 p(x),又得到了生成模型 p(x|z),一舉兩得。?
接下來就是利用 KL 散度進行近似。但我一直搞不明白的是,為什么從原作 Auto-Encoding Variational Bayes 開始,VAE 的教程就聚焦于后驗分布 p(z|x) 的描述?
也許是受了 EM 算法的影響,這個問題上不能應用 EM 算法,就是因為后驗分布 p(z|x) 難以計算,所以 VAE 的作者就聚焦于 p(z|x) 的推導。?
但事實上,直接來對 p(x,z) 進行近似是最為干脆的。具體來說,我們設想用一個新的聯合概率分布 q(x,z) 來逼近 p(x,z),那么我們用 KL 散度來看它們的距離:
KL 散度是我們的終極目標,因為我們希望兩個分布越接近越好,所以 KL 散度越小越好。由于我們手頭上只有 x 的樣本,因此利用 p(x,z)=p(x)p(z|x) 對上式進行改寫:
這樣一來利用 (4) 式,把各個 xi 代入就可以進行計算了,這個式子還可以進一步簡化,因為:
而:
注意這里的 p(x) 是根據樣本 x1,x2,…,xn 確定的關于?x 的先驗分布(更常見的寫法是 p?(x)),盡管我們不一定能準確寫出它的形式,但它是確定的、存在的,因此這一項只是一個常數,所以可以寫出:
目前最小化 KL(p(x,z)‖q(x,z)) 也就等價于最小化 L。注意減去的常數一般是負數(概率小于 1,取對數就小于 0),而 KL 散度本來就非負,非負數減去一個負數,結果會是一個正數,所以?L?恒大于一個某個正數。
你的VAE已經送達
到這里,我們回顧初衷——為了得到生成模型,所以我們把 q(x,z) 寫成 q(x|z)q(z),于是就有:
再簡明一點,那就是:
看,括號內的不就是 VAE 的損失函數嗎?只不過我們換了個符號而已。我們就是要想辦法找到適當的 q(x|z) 和 q(z) 使得 L 最小化。
再回顧一下整個過程,我們幾乎都沒做什么“讓人難以想到”的形式變換,但 VAE 就出來了。所以,沒有必要去對后驗分布進行分析,直面聯合分布,我們能更快捷地到達終點。
不能搞分裂
鑒于 (13) 式的特點,我們也許會將 L 分開為兩部分看:?z~p(z|x)[?lnq(x|z)] 的期望和 KL(p(z|x)‖q(z)) 的期望,并且認為問題變成了兩個 loss 的分別最小化。
然而這種看法是不妥的,我們前面已經分析了,L 會大于一個正數,這就意味著 ?z~p(z|x)[?lnq(x|z)]?和 KL(p(z|x)‖q(z)) 兩部分的 loss 不可能同時為零——盡管它們每一個都有可能為 0。這也表明這兩部分的 loss 其實是相互拮抗的。
所以,L 不能割裂來看,而是要整體來看,整個的 L 越小模型就越接近收斂,而不能只單獨觀察某一部分的 loss。
事實上,這正是 GAN 模型中夢寐以求的——有一個總指標能夠指示生成模型的訓練進程,在 VAE 模型中天然就具備了這種能力了,而 GAN 中要到 WGAN 才有這么一個指標。
實驗
截止到上面的內容,其實我們已經完成了 VAE 整體的理論構建。但為了要將它付諸于實驗,還需要做一些工作。事實上原論文 Auto-Encoding Variational Bayes 也在這部分做了比較充分的展開,但遺憾的是,網上很多 VAE 教程都只是推導到 (13) 式就沒有細說了。
后驗分布近似
現在 q(z),q(x|z),p(z|x) 全都是未知的,連形式都還沒確定,而為了實驗,就得把 (13) 式的每一項都明確寫出來。?
首先,為了便于采樣,我們假設 z~N(0,I),即標準的多元正態分布,這就解決了 q(z)。那 q(x|z),p(z|x) 呢?一股腦用神經網絡擬合吧。
注:本來如果已知 q(x|z) 和 q(z),那么 p(z|x)?最合理的估計應該是:
這其實就是 EM 算法中的后驗概率估計的步驟,具體可以參考從最大似然到EM算法:一致的理解方式。但事實上,分母的積分幾乎不可能完成,因此這是行不通的。所以干脆用一般的網絡去近似它,這樣不一定能達到最優,但終究是一個可用的近似。
具體來說,我們假設 p(z|x) 也是(各分量獨立的)正態分布,其均值和方差由 x 來決定,這個“決定”,就是一個神經網絡:
這里的 μ(x),σ^2(x) 是輸入為 x、輸出分別為均值和方差的神經網絡,其中?μ(x) 就起到了類似 encoder 的作用。既然假定了高斯分布,那么 (13) 式中的 KL 散度這一項就可以先算出來:
也就是我們所說的 KL loss,這在上一篇文章已經給出。
生成模型近似
現在只剩生成模型部分 q(x|z) 了,該選什么分布呢?論文 Auto-Encoding Variational Bayes 給出了兩種候選方案:伯努利分布或正態分布。?
什么?又是正態分布?是不是太過簡化了?然而并沒有辦法,因為我們要構造一個分布,而不是任意一個函數,既然是分布就得滿足歸一化的要求,而要滿足歸一化,又要容易算,我們還真沒多少選擇。?
伯努利分布模型
首先來看伯努利分布,眾所周知它其實就是一個二元分布:
所以伯努利分布只適用于 x 是一個多元的二值向量的情況,比如 x 是二值圖像時(mnist 可以看成是這種情況)。這種情況下,我們用神經網絡 ρ(z) 來算參數 ρ,從而得到:
這時候可以算出:
這表明 ρ(z) 要壓縮到 0~1 之間(比如用 sigmoid 激活),然后用交叉熵作為損失函數,這里 ρ(z) 就起到了類似 decoder 的作用。
正態分布模型
然后是正態分布,這跟 p(z|x) 是一樣的,只不過 x,z 交換了位置:
這里的 μ(z),σ^2(z) 是輸入為 z、輸出分別為均值和方差的神經網絡,μ(z) 就起到了 decoder 的作用。于是:
很多時候我們會固定方差為一個常數 σ^2,這時候:
這就出現了 MSE 損失函數。
所以現在就清楚了,對于二值數據,我們可以對 decoder 用 sigmoid 函數激活,然后用交叉熵作為損失函數,這對應于 q(x|z) 為伯努利分布;而對于一般數據,我們用 MSE 作為損失函數,這對應于 q(x|z) 為固定方差的正態分布。
采樣計算技巧
前一節做了那么多的事情,無非是希望能將 (13) 式明確地寫下來。當我們假設 p(z|x) 和 q(z) 都是正態分布時,(13) 式的 KL 散度部分就已經算出來了,結果是 (16) 式;當我們假設 q(x|z) 是伯努利分布或者高斯分布時,?lnq(x|z) 也能算出來了。
現在缺什么呢? 采樣!
p(z|x) 的作用分兩部分,一部分是用來算 KL(p(z|x)‖q(z)),另一部分是用來算 ?z~p(z|x)[?lnq(x|z)] 的,而 ?z~p(z|x)[?lnq(x|z)] 就意味著:
我們已經假定了 p(z|x) 是正態分布,均值和方差由模型來算,這樣一來,借助“重參數技巧”就可以完成采樣。
但是采樣多少個才適合呢?標準的 VAE 非常直接了當:一個!所以這時候 (13) 式就變得非常簡單了:
該式中的每一項,可以在把 (16),(19),(21),(22) 式找到。這因為標準的 VAE 只采樣了一個,所以這時候它就跟普通的 AE 對應起來了。
那么最后的問題就是采樣一個究竟夠了嗎?事實上我們會運行多個 epoch,每次的隱變量都是隨機生成的,因此當 epoch 數足夠多時,事實上是可以保證采樣的充分性的。我也實驗過采樣多個的情形,感覺生成的樣本并沒有明顯變化。
致敬
這篇文章從貝葉斯理論的角度出發,對 VAE 的整體流程做了一個梳理。用這種角度考察的時候,我們心里需要緊抓住兩個點:“分布”和“采樣”——寫出分布形式,并且通過采樣來簡化過程。
簡單來說,由于直接描述復雜分布是難以做到的,所以我們通過引入隱變量來將它變成條件分布的疊加。而這時候我們對隱變量的分布和條件分布都可以做適當的簡化(比如都假設為正態分布),并且在條件分布的參數可以跟深度學習模型結合起來(用深度學習來算隱變量的參數),至此,“深度概率圖模型”就可見一斑了。
讓我們一起致敬貝葉斯大神,以及眾多研究概率圖模型的大牛,他們都是真正的勇者。
點擊以下標題查看相關內容:?
變分自編碼器VAE:原來是這么一回事
PaperWeekly 第二十七期 | VAE for NLP
End-to-End任務驅動對話與數據庫的銜接
#作 者 招 募#
讓你的文字被很多很多人看到,喜歡我們不如加入我們
? ? ? ? ??
?我是彩蛋
?解鎖新功能:熱門職位推薦!
PaperWeekly小程序升級啦
今日arXiv√猜你喜歡√熱門職位√
找全職找實習都不是問題
?
?解鎖方式?
1. 識別下方二維碼打開小程序
2. 用PaperWeekly社區賬號進行登陸
3. 登陸后即可解鎖所有功能
?職位發布?
請添加小助手微信(pwbot02)進行咨詢
?
長按識別二維碼,使用小程序
*點擊閱讀原文即可注冊
關于PaperWeekly
PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學術平臺。如果你研究或從事 AI 領域,歡迎在公眾號后臺點擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
▽ 點擊 |?閱讀原文?| 進入作者博客
總結
以上是生活随笔為你收集整理的再谈变分自编码器VAE:从贝叶斯观点出发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 来不及想标题了,我要去打包收藏了 | 本
- 下一篇: 如何走近深度学习人脸识别?你需要这篇超长