细水长flow之f-VAEs:Glow与VAEs的联姻
作者丨蘇劍林
單位丨廣州火焰信息科技有限公司
研究方向丨NLP,神經(jīng)網(wǎng)絡(luò)
個(gè)人主頁(yè)丨kexue.fm
前言:這篇文章是我們前幾天掛到 arXiv 上的論文的中文版。在這篇論文中,我們給出了結(jié)合流模型(如前面介紹的 Glow)和變分自編碼器的一種思路,稱之為 f-VAEs。理論可以證明 f-VAEs 是囊括流模型和變分自編碼器的更一般的框架,而實(shí)驗(yàn)表明相比于原始的 Glow 模型,f-VAEs 收斂更快,并且能在更小的網(wǎng)絡(luò)規(guī)模下達(dá)到同樣的生成效果。
■?論文 | f-VAEs: Improve VAEs with Conditional Flows
■ 鏈接 |?https://www.paperweekly.site/papers/2313
■ 作者 |?Jianlin Su / Guang Wu
近來(lái),生成模型得到了廣泛關(guān)注,其中變分自編碼器(VAEs)和流模型是不同于生成對(duì)抗網(wǎng)絡(luò)(GANs)的兩種生成模型,它們亦得到了廣泛研究。然而它們各有自身的優(yōu)勢(shì)和缺點(diǎn),本文試圖將它們結(jié)合起來(lái)。
▲?由f-VAEs實(shí)現(xiàn)的兩個(gè)真實(shí)樣本之間的線性插值
基礎(chǔ)
設(shè)給定數(shù)據(jù)集的證據(jù)分布為,生成模型的基本思路是希望用如下的分布形式來(lái)擬合給定數(shù)據(jù)集分布:
其中 q(z) 一般取標(biāo)準(zhǔn)高斯分布,而 q(x|z) 一般取高斯分布(VAEs 中)或者狄拉克分布(GANs 和流模型中)。理想情況下,優(yōu)化方式是最大化似然函數(shù) E[logq(x)],或者等價(jià)地,最小化。
由于積分可能難以顯式計(jì)算,所以需要一些特殊的求解技巧,這導(dǎo)致了不同的生成模型。其中,VAE 引入后驗(yàn)分布 p(z|x),將優(yōu)化目標(biāo)改為更容易計(jì)算的上界。眾所周知,VAE 有著收斂快、訓(xùn)練穩(wěn)定等優(yōu)點(diǎn),但一般情況下生成圖像存在模糊等問(wèn)題,其原因我們?cè)诤竺鏁?huì)稍加探討。
而在流模型中,q(x|z)=δ(x?G(z)),并精心設(shè)計(jì) G(z)(通過(guò)流的組合)直接把這個(gè)積分算出來(lái)。流模型的主要組件是“耦合層”:首先將 x 分區(qū)為兩部分 x1,x2,然后進(jìn)行如下運(yùn)算:
這個(gè)變換是可逆的,逆變換為:?
它的雅可比行列式是。這種變換我們通常稱之為“仿射耦合”(如果 s(x1)≡1,那么通常稱為“加性耦合”),用 f 表示。通過(guò)很多耦合層的組合,我們可以得到復(fù)雜的非線性變換,即 G=f1°f2°?°fn,這就是所謂的“(無(wú)條件)流”。
由于直接算出來(lái)積分,因此流模型可以直接完成最大似然優(yōu)化。最近發(fā)布的 Glow 模型顯示出強(qiáng)大的生成效果,引起了許多人的討論和關(guān)注。但是流模型通常相當(dāng)龐大,訓(xùn)練時(shí)間長(zhǎng)(其中 256 x 256 的圖像生成模型用 40 個(gè) GPU 訓(xùn)練了一周,參考這里 [1] 和這里 [2]),顯然還不夠友好。
分析
VAEs 生成圖像模糊的解釋有很多,有人認(rèn)為是 mse 誤差的問(wèn)題,也有人認(rèn)為是 KL 散度的固有性質(zhì)。但留意到一點(diǎn)是:即使去掉隱變量的 KL 散度那一項(xiàng),變成普通的自編碼器,重構(gòu)出來(lái)的圖像通常也是模糊的。這表明,VAEs 圖像模糊可能是低維重構(gòu)原始圖像的固有問(wèn)題。
如果將隱變量維度取輸入維度一樣大小呢?似乎還不夠,因?yàn)闃?biāo)準(zhǔn)的 VAE 將后驗(yàn)分布也假設(shè)為高斯分布,這限制了模型的表達(dá)能力,因?yàn)楦咚狗植即刂皇潜姸嗫赡艿暮篁?yàn)分布中極小的一部分,如果后驗(yàn)分布的性質(zhì)與高斯分布差很遠(yuǎn),那么擬合效果就會(huì)很糟糕。
那 Glow 之類的流模型的問(wèn)題是什么呢?流模型通過(guò)設(shè)計(jì)一個(gè)可逆的(強(qiáng)非線性的)變換將輸入分布轉(zhuǎn)化為高斯分布。在這個(gè)過(guò)程中,不僅僅要保證變換的可逆性,還需要保證其雅可比行列式容易計(jì)算,這導(dǎo)致了“加性耦合層”或“仿射耦合層”的設(shè)計(jì)。然而這些耦合層只能帶來(lái)非常弱的非線性能力,所以需要足夠多的耦合層才能累積為強(qiáng)非線性變換,因此 Glow 模型通常比較龐大,訓(xùn)練時(shí)間較長(zhǎng)。
f-VAEs
我們的解決思路是將流模型引入到 VAEs 中,用流模型來(lái)擬合更一般的后驗(yàn)分布 p(z|x) ,而不是簡(jiǎn)單地設(shè)為高斯分布,我們稱之為 f-VAEs(Flow-based Variational Autoencoders,基于流的變分自編碼器)。
相比于標(biāo)準(zhǔn)的 VAEs,f-VAEs 跳出了關(guān)于后驗(yàn)分布為高斯分布的局限,最終導(dǎo)致 VAEs 也能生成清晰的圖像;相比于原始的流模型(如 Glow),f-VAEs 的編碼器給模型帶來(lái)了更強(qiáng)的非線性能力,從而可以減少對(duì)耦合層的依賴,從而實(shí)現(xiàn)更小的模型規(guī)模來(lái)達(dá)到同樣的生成效果。?
推導(dǎo)過(guò)程
我們從 VAEs 的原始目標(biāo)出發(fā),VAEs 的 loss 可以寫(xiě)為:
其中 p(z|x),q(x|z) 都是帶參數(shù)的分布,跟標(biāo)準(zhǔn) VAEs 不同的是,p(z|x) 不再假設(shè)為高斯分布,而是通過(guò)流模型構(gòu)建:
這里 q(u) 是標(biāo)準(zhǔn)高斯分布,Fx(u) 是關(guān)于 x,u 的二元函數(shù),但關(guān)于 u 是可逆的,可以理解為 Fx(u) 是關(guān)于 u 的流模型,但它的參數(shù)可能跟 x 有關(guān),這里我們稱為“條件流”。代入 (4) 計(jì)算得到:
這便是一般的 f-VAEs 的 loss,具體推導(dǎo)過(guò)程請(qǐng)參考下面的注釋。
聯(lián)立 (4) 和 (5),我們有:
設(shè) v=Fx(u′),u′=Hx(v),對(duì)于雅可比行列式,我們有關(guān)系:
從而 (7) 變成:
兩個(gè)特例
式 (6) 描述了一般化的框架,而不同的 Fx(u) 對(duì)應(yīng)于不同的生成模型。如果我們?cè)O(shè):
那么就有:
以及:
這兩項(xiàng)組合起來(lái),正好是后驗(yàn)分布和先驗(yàn)分布的 KL 散度;代入到 (6) 中正好是標(biāo)準(zhǔn) VAE 的 loss。意外的是,這個(gè)結(jié)果自動(dòng)包含了重參數(shù)的過(guò)程。
另一個(gè)可以考察的簡(jiǎn)單例子是:
其中 σ 是一個(gè)小的常數(shù),而F是任意的流模型,但參數(shù)與 x 無(wú)關(guān)(無(wú)條件流)。這樣一來(lái):
所以它并沒(méi)有包含訓(xùn)練參數(shù)。這樣一來(lái),整個(gè) loss 包含訓(xùn)練參數(shù)的部分只有:
這等價(jià)于普通的流模型,其輸入加上了方差為的高斯噪聲。有趣的是,標(biāo)準(zhǔn)的 Glow 模型確實(shí)都會(huì)在訓(xùn)練的時(shí)候給輸入圖像加入一定量的噪聲。
我們的模型
上面兩個(gè)特例表明,式 (6) 原則上包含了 VAEs 和流模型。 Fx(u) 實(shí)際上描述了 u, x 的不同的混合方式,原則上我們可以選擇任意復(fù)雜的 Fx(u) ,來(lái)提升后驗(yàn)分布的表達(dá)能力,比如:
這里的 F1,F2 是無(wú)條件流。
同時(shí),到目前為止,我們并沒(méi)有明確約束隱變量 z 的維度大小(也就是 u 的維度大小),事實(shí)上它是一個(gè)可以隨意選擇的超參數(shù),由此我們可以訓(xùn)練更好的降維變分自編碼模型。但就圖像生成這個(gè)任務(wù)而言,考慮到低維重構(gòu)會(huì)導(dǎo)致模糊的固有問(wèn)題,因此我們這里選擇 z 的大小跟 x 的大小一致。
出于實(shí)用主義和簡(jiǎn)潔主義,我們把式 (13) 和 (10) 結(jié)合起來(lái),選擇:
其中 σ1,σ2 都是待訓(xùn)練參數(shù)(標(biāo)量即可),E(?),G(?) 是待訓(xùn)練的編碼器和解碼器(生成器),而F (?) 是參數(shù)與 x 無(wú)關(guān)的流模型。代入 (6),等效的 loss 為:
而生成采樣過(guò)程為:
相關(guān)
事實(shí)上,流模型是一大類模型的總稱。除了上述以耦合層為基礎(chǔ)的流模型(NICE、RealNVP、Glow)之外,我們還有“自回歸流(autoregressive flows)”,代表作有 PixelRNNs 和 PixelCNNs 等。自回歸流通常效果也不錯(cuò),但是它們是逐像素地生成圖片,無(wú)法并行,所以生成速度比較慢。?
諸如 RealNVP、Glow 的流模型我們通常稱為 Normalizing flows(常規(guī)流),則算是另外一種流模型。尤其是 Glow 出來(lái)后讓這類流模型再次火了一把。事實(shí)上,Glow 生成圖片的速度還是挺快的,就是訓(xùn)練周期太長(zhǎng)了,訓(xùn)練成本也很大。?
據(jù)我們了解,首次嘗試整合 VAEs 和模型的是 Variational Inference with Normalizing Flows [3],后面還有兩個(gè)改進(jìn)工作 Improving Variational Inference with Inverse Autoregressive Flow [4]?和 Variational Lossy Autoencoder?[5]。其實(shí)這類工作(包括本文)都是類似的。不過(guò)前面的工作都沒(méi)有導(dǎo)出類似 (6) 式的一般框架,而且它們都沒(méi)有在圖片生成上實(shí)現(xiàn)較大的突破。?
目測(cè)我們的工作是首次將 RealNVP 和 Glow 的流模型引入到 VAEs 中的結(jié)果。這些“流”基于耦合層,容易并行計(jì)算。所以它們通常比自回歸流要高效率,可以堆疊得很深。同時(shí)我們還保證隱變量維度跟輸入維度一樣,這個(gè)不降維的選擇也能避免圖像模糊問(wèn)題。
實(shí)驗(yàn)
受 GPU 設(shè)備所限,我們僅僅在 CelebA HQ 上做了 64x64 和 128x128 的實(shí)驗(yàn)。我們先在 64x64 圖像上對(duì)類似規(guī)模的 VAEs、Glow 和 f-VAEs 做了個(gè)對(duì)比,然后再詳細(xì)展示了 128x128 的生成效果。
實(shí)驗(yàn)流程
首先,我們的編碼器 E(?) 是卷積和 Squeeze 算子的堆疊。具體來(lái)說(shuō), E(?) 由幾個(gè) block 組成,并且在每個(gè) block 之前都進(jìn)行一次 Squeeze。而每個(gè) block 由若干步復(fù)合而成,每步的形式為 x+CNN(x) ,其中 CNN(x) 是 3x3 和 1x1 的卷積組成。具體細(xì)節(jié)可以參考代碼。?
至于解碼器(生成器)G (?) 則是卷積和 UnSqueeze 算子的堆疊,結(jié)構(gòu)上就是 E(?) 的逆。解碼器的最后可以加上 tanh(?) 激活函數(shù),但這也不是必須的。而無(wú)條件流 F(?) 的結(jié)果是照搬自 Glow 模型,只不過(guò)沒(méi)有那么深,卷積核的數(shù)目也沒(méi)有那么多。
源碼(基于Keras 2.2 + Tensorflow 1.8 + Python 2.7):?
https://github.com/bojone/flow/blob/master/f-VAEs.py
實(shí)驗(yàn)結(jié)果
對(duì)比 VAEs 和 f-VAEs 的結(jié)果,我們可以認(rèn)為 f-VAEs 已經(jīng)基本解決了 VAEs 的模糊問(wèn)題。對(duì)于同樣規(guī)模下的 Glow 和 f-VAEs,我們發(fā)現(xiàn) f-VAEs 在同樣的 epoch 下表現(xiàn)得更好。當(dāng)然,我們不懷疑 Glow 在更深的時(shí)候也表現(xiàn)得很好甚至更好,但很明顯,在同樣的復(fù)雜度和同樣的訓(xùn)練時(shí)間下,f-VAEs 有著更好的表現(xiàn)。
f-VAEs 在 64x64 上面的結(jié)果,只需要用 GTX1060 訓(xùn)練約 120-150 個(gè) epoch,大概需要 7-8 小時(shí)。
準(zhǔn)確來(lái)說(shuō),f-VAEs 的完整的編碼器應(yīng)該是 F(E(?)),即 F 和 E 的復(fù)合函數(shù)。如果在標(biāo)準(zhǔn)的流模型中,我們需要計(jì)算 E 的雅可比行列式,但是在 f-VAEs 中則不需要。所以 E 可以是一個(gè)普通的卷積網(wǎng)絡(luò),它可以實(shí)現(xiàn)大部分的非線性,從而簡(jiǎn)化對(duì)流模型 F 的依賴。
下面是 128x128 的結(jié)果(退火參數(shù) T 指的是先驗(yàn)分布的方差)。128x128 的模型大概在 GTX1060 上訓(xùn)練了 1.5 天(約 150 個(gè) epoch)。
隨機(jī)采樣結(jié)果
隱變量線性插值
▲?兩個(gè)真實(shí)樣本之間的線性插值
退火參數(shù)影響
總結(jié)
文章綜述
事實(shí)上,我們這個(gè)工作的原始目標(biāo)是解決針對(duì) Glow 提出的兩個(gè)問(wèn)題:?
如何降低 Glow 的計(jì)算量?
如何得到一個(gè)“降維”版本的 Glow??
我們的結(jié)果表明,一個(gè)不降維的 f-VAEs 基本相當(dāng)于一個(gè)迷你版本的 Glow,但是能達(dá)到較好的效果。而式 (6) 確實(shí)也允許我們訓(xùn)練一個(gè)降維版本的流模型。我們也從理論上證明了普通的 VAEs 和流模型自然地包含在我們的框架中。因此,我們的原始目標(biāo)已經(jīng)基本完成,得到了一個(gè)更一般的生成和推斷框架。?
未來(lái)工作
當(dāng)然,我們可以看到隨機(jī)生成的圖片依然有一種油畫(huà)的感覺(jué)。可能的原因是模型還不夠復(fù)雜,但我們猜測(cè)還有一個(gè)重要原因是 3x3 卷積的“濫用”,導(dǎo)致了感知野的無(wú)限放大,使得模型無(wú)法聚焦細(xì)節(jié)。?
因此,一個(gè)挑戰(zhàn)性的任務(wù)是如何設(shè)計(jì)更好的、更合理的編碼器和解碼器。看起來(lái) Network in Network 那一套會(huì)有一定的價(jià)值,還有 PGGAN 的結(jié)構(gòu)也值得一試,但是這些都還沒(méi)有驗(yàn)證過(guò)。
參考文獻(xiàn)
[1].?https://github.com/openai/glow/issues/14#issuecomment-406650950
[2].?https://github.com/openai/glow/issues/37#issuecomment-410019221
[3].?Rezende, Danilo Jimenez, and Shakir Mohamed. Variational inference with normalizing flows. arXiv preprint arXiv:1505.05770, 2015.
[4].?D.P. Kingma, T. Salimans, R. Jozefowicz, I. Sutskever, M. Welling. Improving Variational Autoencoders with Inverse Autoregressive Flow. Advances in Neural Information Processing Systems 29 (NIPS), Barcelona, 2016
[5].?X. Chen, D.P. Kingma, T. Salimans, Y. Duan, P. Dhariwal, J. Schulman, I. Sutskever, P. Abbeel. Variational Lossy Autoencoder. The International Conference on Learning Representations (ICLR), Toulon, 2017
點(diǎn)擊以下標(biāo)題查看作者其他文章:?
變分自編碼器VAE:原來(lái)是這么一回事 | 附開(kāi)源代碼
再談變分自編碼器VAE:從貝葉斯觀點(diǎn)出發(fā)
變分自編碼器VAE:這樣做為什么能成?
RealNVP與Glow:流模型的傳承與升華
全新視角:用變分推斷統(tǒng)一理解生成模型
細(xì)水長(zhǎng)flow之NICE:流模型的基本概念與實(shí)現(xiàn)
關(guān)于PaperWeekly
PaperWeekly 是一個(gè)推薦、解讀、討論、報(bào)道人工智能前沿論文成果的學(xué)術(shù)平臺(tái)。如果你研究或從事 AI 領(lǐng)域,歡迎在公眾號(hào)后臺(tái)點(diǎn)擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
▽ 點(diǎn)擊 |?閱讀原文?| 查看作者博客
總結(jié)
以上是生活随笔為你收集整理的细水长flow之f-VAEs:Glow与VAEs的联姻的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 近期大热的AutoML领域,都有哪些值得
- 下一篇: 你说我导!微软玩转标题描述生成视频