日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人工智能 > pytorch >内容正文

pytorch

深度学习(二十六)——VAE

發(fā)布時(shí)間:2023/12/20 pytorch 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度学习(二十六)——VAE 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

https://antkillerfarm.github.io/

VAE

變分自編碼器(Variational Auto-Encoder,VAE)是Autoencoder的一種擴(kuò)展。

論文:

《Auto-Encoding Variational Bayes》

以下部分主要摘自:

https://kexue.fm/archives/5253

變分自編碼器(一):原來(lái)是這么一回事

分布變換

通常我們會(huì)拿VAE跟GAN比較,的確,它們兩個(gè)的目標(biāo)基本是一致的——希望構(gòu)建一個(gè)從隱變量Z生成目標(biāo)數(shù)據(jù)X的模型,但是實(shí)現(xiàn)上有所不同。更準(zhǔn)確地講,它們是假設(shè)了Z服從某些常見(jiàn)的分布(比如正態(tài)分布或均勻分布),然后希望訓(xùn)練一個(gè)模型X=g(Z)X=g(Z)X=g(Z),這個(gè)模型能夠?qū)⒃瓉?lái)的概率分布映射到訓(xùn)練集的概率分布,也就是說(shuō),它們的目的都是進(jìn)行分布之間的映射。

現(xiàn)在假設(shè)Z服從標(biāo)準(zhǔn)的正態(tài)分布,那么我就可以從中采樣得到若干個(gè)Z1,Z2,…,ZnZ_1, Z_2, \dots, Z_nZ1?,Z2?,,Zn?,然后對(duì)它做變換得到X^1=g(Z1),X^2=g(Z2),…,X^n=g(Zn)\hat{X}_1 = g(Z_1),\hat{X}_2 = g(Z_2),\dots,\hat{X}_n = g(Z_n)X^1?=g(Z1?),X^2?=g(Z2?),,X^n?=g(Zn?),我們?cè)趺磁袛噙@個(gè)通過(guò)f構(gòu)造出來(lái)的數(shù)據(jù)集,它的分布跟我們目標(biāo)數(shù)據(jù)集的分布是不是一樣的呢?

生成模型的難題就是判斷生成分布與真實(shí)分布的相似度,因?yàn)槲覀冎恢纼烧叩牟蓸咏Y(jié)果,不知道它們的分布表達(dá)式。

有讀者說(shuō)不是有KL散度嗎?當(dāng)然不行,因?yàn)镵L散度是根據(jù)兩個(gè)概率分布的表達(dá)式來(lái)算它們的相似度的,然而目前我們并不知道它們的概率分布的表達(dá)式,我們只有一批從構(gòu)造的分布采樣而來(lái)的數(shù)據(jù){X^1,X^2,…,X^n}\{\hat{X}_1,\hat{X}_2,\dots,\hat{X}_n\}{X^1?,X^2?,,X^n?},還有一批從真實(shí)的分布采樣而來(lái)的數(shù)據(jù){X1,X2,…,Xn}\{X_1,X_2,\dots,X_n\}{X1?,X2?,,Xn?}(也就是我們希望生成的訓(xùn)練集)。我們只有樣本本身,沒(méi)有分布表達(dá)式,當(dāng)然也就沒(méi)有方法算KL散度。

雖然遇到困難,但還是要想辦法解決的。GAN的思路很直接粗獷:既然沒(méi)有合適的度量,那我干脆把這個(gè)度量也用神經(jīng)網(wǎng)絡(luò)訓(xùn)練出來(lái)吧。而VAE則使用了一個(gè)精致迂回的技巧。

VAE的傳統(tǒng)理解

首先我們有一批數(shù)據(jù)樣本{X1,…,Xn}\{X_1,\dots,X_n\}{X1?,,Xn?},其整體用X來(lái)描述,我們本想根據(jù){X1,…,Xn}\{X_1,\dots,X_n\}{X1?,,Xn?}得到X的分布p(X),如果能得到的話,那我直接根據(jù)p(X)來(lái)采樣,就可以得到所有可能的X了(包括{X1,…,Xn}\{X_1,\dots,X_n\}{X1?,,Xn?}以外的),這是一個(gè)終極理想的生成模型了。當(dāng)然,這個(gè)理想很難實(shí)現(xiàn),于是我們將分布改一改:

p(X)=∑Zp(X∣Z)p(Z)p(X)=\sum_Z p(X|Z)p(Z)p(X)=Z?p(XZ)p(Z)

此時(shí)p(X∣Z)p(X\mid Z)p(XZ)就描述了一個(gè)由Z來(lái)生成X的模型,而我們假設(shè)Z服從標(biāo)準(zhǔn)正態(tài)分布,也就是p(Z)=N(0,I)p(Z)=\mathcal{N}(0,I)p(Z)=N(0,I)。如果這個(gè)理想能實(shí)現(xiàn),那么我們就可以先從標(biāo)準(zhǔn)正態(tài)分布中采樣一個(gè)Z,然后根據(jù)Z來(lái)算一個(gè)X,也是一個(gè)很棒的生成模型。接下來(lái)就是結(jié)合自編碼器來(lái)實(shí)現(xiàn)重構(gòu),保證有效信息沒(méi)有丟失,再加上一系列的推導(dǎo),最后把模型實(shí)現(xiàn)。框架的示意圖如下:

看出了什么問(wèn)題了嗎?如果像這個(gè)圖的話,我們其實(shí)完全不清楚:究竟經(jīng)過(guò)重新采樣出來(lái)的ZkZ_kZk?,是不是還對(duì)應(yīng)著原來(lái)的XkX_kXk?,所以我們?nèi)绻苯幼钚』?span id="ozvdkddzhkzd" class="katex--inline">D(X^k,Xk)2\mathcal{D}(\hat{X}_k,X_k)^2D(X^k?,Xk?)2(這里D代表某種距離函數(shù))是很不科學(xué)的,而事實(shí)上你看代碼也會(huì)發(fā)現(xiàn)根本不是這樣實(shí)現(xiàn)的。

VAE初現(xiàn)

其實(shí),在整個(gè)VAE模型中,我們并沒(méi)有去使用p(Z)(先驗(yàn)分布)是正態(tài)分布的假設(shè),我們用的是假設(shè)p(Z∣X)p(Z\mid X)p(ZX)(后驗(yàn)分布)是正態(tài)分布!!

具體來(lái)說(shuō),給定一個(gè)真實(shí)樣本XkX_kXk?,我們假設(shè)存在一個(gè)專屬于XkX_kXk?的分布p(Z∣Xk)p(Z\mid X_k)p(ZXk?)(學(xué)名叫后驗(yàn)分布),并進(jìn)一步假設(shè)這個(gè)分布是(獨(dú)立的、多元的)正態(tài)分布。為什么要強(qiáng)調(diào)“專屬”呢?因?yàn)槲覀兒竺嬉?xùn)練一個(gè)生成器X=g(Z)X=g(Z)X=g(Z),希望能夠把從分布p(Z∣Xk)p(Z\mid X_k)p(ZXk?)采樣出來(lái)的一個(gè)ZkZ_kZk?還原為XkX_kXk?。如果假設(shè)p(Z)是正態(tài)分布,然后從p(Z)中采樣一個(gè)Z,那么我們?cè)趺粗肋@個(gè)Z對(duì)應(yīng)于哪個(gè)真實(shí)的X呢?現(xiàn)在p(Z∣Xk)p(Z\mid X_k)p(ZXk?)專屬于XkX_kXk?,我們有理由說(shuō)從這個(gè)分布采樣出來(lái)的Z應(yīng)該要還原到XkX_kXk?中去。

這樣有多少個(gè)X就有多少個(gè)正態(tài)分布了。我們知道正態(tài)分布有兩組參數(shù):均值μ\muμ和方差σ2\sigma^2σ2(多元的話,它們都是向量),那我怎么找出專屬于XkX_kXk?的正態(tài)分布p(Z∣Xk)p(Z\mid X_k)p(ZXk?)的均值和方差呢?好像并沒(méi)有什么直接的思路。那好吧,就用神經(jīng)網(wǎng)絡(luò)擬合出來(lái)吧!

于是我們構(gòu)建兩個(gè)神經(jīng)網(wǎng)絡(luò)μk=f1(Xk),log?σ2=f2(Xk)\mu_k = f_1(X_k),\log \sigma^2 = f_2(X_k)μk?=f1?(Xk?),logσ2=f2?(Xk?)來(lái)算它們了。我們選擇擬合log?σ2\log \sigma^2logσ2而不是直接擬合σ2\sigma^2σ2,是因?yàn)?span id="ozvdkddzhkzd" class="katex--inline">σ2\sigma^2σ2總是非負(fù)的,需要加激活函數(shù)處理,而擬合log?σ2\log \sigma^2logσ2不需要加激活函數(shù),因?yàn)樗烧韶?fù)。到這里,知道專屬于XkX_kXk?的均值和方差,也就知道它的正態(tài)分布長(zhǎng)什么樣了,然后從這個(gè)專屬分布中采樣一個(gè)ZkZ_kZk?出來(lái),經(jīng)過(guò)一個(gè)生成器得到X^k=g(Zk)\hat{X}_k=g(Z_k)X^k?=g(Zk?),現(xiàn)在我們可以放心地最小化D(X^k,Xk)2\mathcal{D}(\hat{X}_k,X_k)^2D(X^k?,Xk?)2,因?yàn)?span id="ozvdkddzhkzd" class="katex--inline">ZkZ_kZk?是從專屬XkX_kXk?的分布中采樣出來(lái)的,這個(gè)生成器應(yīng)該要把開(kāi)始的XkX_kXk?還原回來(lái)。

分布標(biāo)準(zhǔn)化

讓我們來(lái)思考一下,根據(jù)上圖的訓(xùn)練過(guò)程,最終會(huì)得到什么結(jié)果。

首先,我們希望重構(gòu)X,也就是最小化D(X^k,Xk)2\mathcal{D}(\hat{X}_k,X_k)^2D(X^k?,Xk?)2,但是這個(gè)重構(gòu)過(guò)程受到噪聲的影響,因?yàn)?span id="ozvdkddzhkzd" class="katex--inline">ZkZ_kZk?是通過(guò)重新采樣過(guò)的,不是直接由encoder算出來(lái)的。顯然噪聲會(huì)增加重構(gòu)的難度,不過(guò)好在這個(gè)噪聲強(qiáng)度(也就是方差)通過(guò)一個(gè)神經(jīng)網(wǎng)絡(luò)算出來(lái)的,所以最終模型為了重構(gòu)得更好,肯定會(huì)想盡辦法讓方差為0。而方差為0的話,也就沒(méi)有隨機(jī)性了,所以不管怎么采樣其實(shí)都只是得到確定的結(jié)果(也就是均值)。說(shuō)白了,模型會(huì)慢慢退化成普通的AutoEncoder,噪聲不再起作用。

為了使模型具有生成能力,VAE決定讓所有的p(Z∣X)p(Z\mid X)p(ZX)都向標(biāo)準(zhǔn)正態(tài)分布看齊。如果所有的p(Z∣X)p(Z\mid X)p(ZX)都很接近標(biāo)準(zhǔn)正態(tài)分布N(0,I)\mathcal{N}(0,I)N(0,I),那么根據(jù)定義:

p(Z)=∑Xp(Z∣X)p(X)=∑XN(0,I)p(X)=N(0,I)∑Xp(X)=N(0,I)p(Z)=\sum_X p(Z|X)p(X)=\sum_X \mathcal{N}(0,I)p(X)=\mathcal{N}(0,I) \sum_X p(X) = \mathcal{N}(0,I)p(Z)=X?p(ZX)p(X)=X?N(0,I)p(X)=N(0,I)X?p(X)=N(0,I)

這樣我們就能達(dá)到我們的先驗(yàn)假設(shè):p(Z)是標(biāo)準(zhǔn)正態(tài)分布。然后我們就可以放心地從N(0,I)\mathcal{N}(0,I)N(0,I)中采樣來(lái)生成圖像了。

那怎么讓所有的p(Z∣X)p(Z\mid X)p(ZX)都向N(0,I)\mathcal{N}(0,I)N(0,I)看齊呢?如果沒(méi)有外部知識(shí)的話,其實(shí)最直接的方法應(yīng)該是在重構(gòu)誤差的基礎(chǔ)上中加入額外的loss:

Lμ=∥f1(Xk)∥2,Lσ2=∥f2(Xk)∥2\mathcal{L}_{\mu}=\Vert f_1(X_k)\Vert^2,\mathcal{L}_{\sigma^2}=\Vert f_2(X_k)\Vert^2Lμ?=f1?(Xk?)2,Lσ2?=f2?(Xk?)2

因?yàn)樗鼈兎謩e代表了均值μk\mu_kμk?和方差的對(duì)數(shù)log?σ2\log \sigma^2logσ2,達(dá)到N(0,I)\mathcal{N}(0,I)N(0,I)就是希望二者盡量接近于0了。不過(guò),這又會(huì)面臨著這兩個(gè)損失的比例要怎么選取的問(wèn)題,選取得不好,生成的圖像會(huì)比較模糊。所以,原論文直接算了一般(各分量獨(dú)立的)正態(tài)分布與標(biāo)準(zhǔn)正態(tài)分布的KL散度KL(N(μ,σ2)∥N(0,I))KL\Big(N(\mu,\sigma^2)\Big\Vert N(0,I)\Big)KL(N(μ,σ2)?N(0,I))作為這個(gè)額外的loss,計(jì)算結(jié)果為:

Lμ,σ2=12∑i=1d(μ(i)2+σ(i)2?log?σ(i)2?1)\mathcal{L}_{\mu,\sigma^2}=\frac{1}{2} \sum_{i=1}^d \Big(\mu_{(i)}^2 + \sigma_{(i)}^2 - \log \sigma_{(i)}^2 - 1\Big)Lμ,σ2?=21?i=1d?(μ(i)2?+σ(i)2??logσ(i)2??1)

這里的d是隱變量Z的維度,而μ(i)\mu_{(i)}μ(i)?σ(i)2\sigma_{(i)}^2σ(i)2?分別代表一般正態(tài)分布的均值向量和方差向量的第i個(gè)分量。直接用這個(gè)式子做補(bǔ)充loss,就不用考慮均值損失和方差損失的相對(duì)比例問(wèn)題了。顯然,這個(gè)loss也可以分兩部分理解:

Lμ,σ2=Lμ+Lσ2Lμ=12∑i=1dμ(i)2=12∥f1(X)∥2Lσ2=12∑i=1d(σ(i)2?log?σ(i)2?1)\begin{aligned}&\mathcal{L}_{\mu,\sigma^2}=\mathcal{L}_{\mu} + \mathcal{L}_{\sigma^2}\\ &\mathcal{L}_{\mu}=\frac{1}{2} \sum_{i=1}^d \mu_{(i)}^2=\frac{1}{2}\Vert f_1(X)\Vert^2\\ &\mathcal{L}_{\sigma^2}=\frac{1}{2} \sum_{i=1}^d\Big(\sigma_{(i)}^2 - \log \sigma_{(i)}^2 - 1\Big)\end{aligned}?Lμ,σ2?=Lμ?+Lσ2?Lμ?=21?i=1d?μ(i)2?=21?f1?(X)2Lσ2?=21?i=1d?(σ(i)2??logσ(i)2??1)?

Reparameterization Trick

這是實(shí)現(xiàn)模型的一個(gè)技巧。我們要從p(Z∣Xk)p(Z\mid X_k)p(ZXk?)中采樣一個(gè)ZkZ_kZk?出來(lái),盡管我們知道了p(Z∣Xk)p(Z\mid X_k)p(ZXk?)是正態(tài)分布,但是均值方差都是靠模型算出來(lái)的,我們要靠這個(gè)過(guò)程反過(guò)來(lái)優(yōu)化均值方差的模型,但是“采樣”這個(gè)操作是不可導(dǎo)的,而采樣的結(jié)果是可導(dǎo)的,于是我們利用了一個(gè)事實(shí):

N(μ,σ2)\mathcal{N}(\mu,\sigma^2)N(μ,σ2)中采樣一個(gè)Z,相當(dāng)于從N(0,I)\mathcal{N}(0,I)N(0,I)中采樣一個(gè)ε\varepsilonε,然后讓Z=μ+ε×σZ=\mu + \varepsilon \times \sigmaZ=μ+ε×σ

于是,我們將從N(μ,σ2)\mathcal{N}(\mu,\sigma^2)N(μ,σ2)采樣變成了從N(0,I)\mathcal{N}(0,I)N(0,I)中采樣,然后通過(guò)參數(shù)變換得到從N(μ,σ2)\mathcal{N}(\mu,\sigma^2)N(μ,σ2)中采樣的結(jié)果。這樣一來(lái),“采樣”這個(gè)操作就不用參與梯度下降了,改為采樣的結(jié)果參與,使得整個(gè)模型可訓(xùn)練了。

VAE本質(zhì)

VAE本質(zhì)上就是在我們常規(guī)的自編碼器的基礎(chǔ)上,對(duì)encoder的結(jié)果(在VAE中對(duì)應(yīng)著計(jì)算均值的網(wǎng)絡(luò))加上了“高斯噪聲”,使得結(jié)果decoder能夠?qū)υ肼曈恤敯粜?#xff1b;而那個(gè)額外的KL loss(目的是讓均值為0,方差為1),事實(shí)上就是相當(dāng)于對(duì)encoder的一個(gè)正則項(xiàng),希望encoder出來(lái)的東西均有零均值。

那另外一個(gè)encoder(對(duì)應(yīng)著計(jì)算方差的網(wǎng)絡(luò))的作用呢?它是用來(lái)動(dòng)態(tài)調(diào)節(jié)噪聲的強(qiáng)度的。直覺(jué)上來(lái)想,當(dāng)decoder還沒(méi)有訓(xùn)練好時(shí)(重構(gòu)誤差遠(yuǎn)大于KL loss),就會(huì)適當(dāng)降低噪聲(KL loss增加),使得擬合起來(lái)容易一些(重構(gòu)誤差開(kāi)始下降);反之,如果decoder訓(xùn)練得還不錯(cuò)時(shí)(重構(gòu)誤差小于KL loss),這時(shí)候噪聲就會(huì)增加(KL loss減少),使得擬合更加困難了(重構(gòu)誤差又開(kāi)始增加),這時(shí)候decoder就要想辦法提高它的生成能力了。

簡(jiǎn)言之,重構(gòu)的過(guò)程是希望沒(méi)噪聲的,而KL loss則希望有高斯噪聲的,兩者是對(duì)立的。所以,VAE跟GAN一樣,內(nèi)部其實(shí)是包含了一個(gè)對(duì)抗的過(guò)程,只不過(guò)它們兩者是混合起來(lái),共同進(jìn)化的。

VAE vs AE

VAE和AE的差異在于:

1.兩者雖然都是X->Z->X’的結(jié)構(gòu),但是AE尋找的是單值映射關(guān)系,即:z=f(x)z=f(x)z=f(x)

2.而VAE尋找的是分布的映射關(guān)系,即:DX→DZD_X\to D_ZDX?DZ?

為什么會(huì)有這個(gè)差別呢?我們不妨從生成模型的角度考慮一下。既然AE的decoder做的是Z->X’的變換,那么理論上它也可以作為生成器使用。但這里有個(gè)問(wèn)題,顯然不是所有的RZR^ZRZ都是有效的Z,或者可以說(shuō)Z只占了高維空間RZR^ZRZ的一部分。Z的邊界在哪里?如何得到有效的z,從而生成x?這些都不是AE能解決的。

VAE映射的是分布,而分布可以通過(guò)采樣得到有效的z,從而生成相應(yīng)的x。

總結(jié)

以上是生活随笔為你收集整理的深度学习(二十六)——VAE的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。