久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

使用PyTorch從理論到實(shí)踐理解變分自編碼器VAE

 taotao_2016 2020-06-29
使用PyTorch從理論到實(shí)踐理解變分自編碼器VAE

變分自動編碼器(Variational Auto Encoders ,,VAE)是種隱藏變量模型[1,,2]。該模型的思想在于:由模型所生成的數(shù)據(jù)可以經(jīng)變量參數(shù)化,,而這些變量將生成具有給定數(shù)據(jù)的特征,。因此,這些變量被稱為隱藏變量,。

而VAE背后的關(guān)鍵點(diǎn)在于:為了從樣本空間中找到能夠生成合適輸出的樣本(就是能輸出盡可能接近我們所規(guī)定分布的數(shù)據(jù)),,它并沒有試圖去直接構(gòu)造一個隱藏空間(隱藏變量所在的空間),而是構(gòu)造了一個類似于具有編碼器和解碼器兩個部分的網(wǎng)絡(luò):

編碼器部分能夠?qū)W習(xí)到根據(jù)輸入樣本X來形成一個特定分布,,從中我們可以對一個隱藏變量進(jìn)行采樣,而這個隱藏變量極有可能生成X里面的樣本。換句話說,,可以理解為編碼器通過學(xué)習(xí)一組參數(shù)θ1來得到一個能計算出Q(X,θ1)分布樣本的模型,,通過抽樣能夠使得隱藏變量z的P(X|z)最大化。

而解碼器部分能夠?qū)W習(xí)到根據(jù)給定的一個隱藏變量z作為輸入,,生成一個具有真實(shí)數(shù)據(jù)分布的輸出,。換句話說,可以理解為解碼器通過學(xué)習(xí)一組參數(shù)θ2來得到一個能映射到隱藏空間分布的函數(shù)f(z,θ2),,從而能夠輸出與真實(shí)數(shù)據(jù)具有相同分布的數(shù)據(jù)集,。

使用PyTorch從理論到實(shí)踐理解變分自編碼器VAE

為了充分理解VAE背后的數(shù)學(xué)意義,我們將通過對其理論講解以及與一些傳統(tǒng)方法進(jìn)行比較來說明,。

這篇文章將包含以下內(nèi)容

如何對隱藏空間進(jìn)行定義,?

如何高效的從隱藏空間中生成數(shù)據(jù)?

VAE最終的框架是什么,?

通過一些實(shí)驗(yàn)來展示VAE中的一些有趣特征,。

潛在變量模型

隱藏變量模型這一說法是根據(jù):模型所生成的數(shù)據(jù)是通過對隱藏變量進(jìn)行參數(shù)化而來。而這個名稱具有這樣一個事實(shí):對于能夠生成我們所需數(shù)據(jù)的模型,,我們并不需要知道這個模型在哪設(shè)置了隱藏變量,。

在一些測試場合,對于一個在高維空間Z中的隱藏向量z,,我們能夠很輕松的根據(jù)它的概率密度函數(shù)P(z)進(jìn)行抽樣,。這時,我們能夠得到一些較為確定的函數(shù)f(z;θ),,其中θ能夠被參數(shù)化到Θ空間,,具體表示為:f :Z×Θ→X。式中f是一個確定的映射關(guān)系,,當(dāng)z具有隨機(jī)性而θ是一個固定參數(shù)時,,f(z;θ) 就是X張成空間中的隨機(jī)變量。

在訓(xùn)練過程中,,我們通過優(yōu)化參數(shù)θ來使得根據(jù)P(z)抽取出的z具有更高的概率,,從而通過f(z;θ)函數(shù)得到的數(shù)據(jù)能更加接近真實(shí)樣本X中的數(shù)據(jù)??傊疄榱藢?shí)現(xiàn)這一目的,,我們需要去找到這樣的參數(shù)θ:

使用PyTorch從理論到實(shí)踐理解變分自編碼器VAE

在上式中,為了使得X與z的關(guān)系更加直觀,,我們使用了總體概率密度進(jìn)行計算,,即采用P(X|z;θ)分布來替換f(z;θ)分布。此外,,我們還做了另外一個假設(shè):P(W|z;θ)遵循N(X|f(z; θ),σ*I)類型的高斯分布,。(這樣做的目的是:可以認(rèn)為生成的數(shù)據(jù)幾乎是X中的數(shù)據(jù),但卻又不完全是X中的數(shù)據(jù))

定義隱藏空間

正如開始介紹的那樣,隱藏空間是一個假設(shè)的模型,,該空間中的一些變量能夠影響到我們數(shù)據(jù)分布中的一些特定的特征,。我們可以想象下,如果我們的數(shù)據(jù)假設(shè)為是由汽車組成的以及數(shù)據(jù)的分布類比于汽車的空間,,那么這個隱藏變量可以理解為影響汽車顏色,、每個部件的位置以及車門的數(shù)量的因素。

然而,,直接去明確每個隱藏變量是非常困難的,,特別是當(dāng)我們所需處理的數(shù)據(jù)具有上百個維度時。并且當(dāng)其中一個隱藏變量與另一個隱藏變量存在一定耦合關(guān)系時,,人工去定義這些隱藏變量將變得更加困難,,換句話說就是對于P(z)的復(fù)雜分布很難通過人工去進(jìn)行定義。

解決方案

為了解決這一問題,,我們以反向傳播的方式,,采用數(shù)學(xué)中概率分布的性質(zhì)和神經(jīng)網(wǎng)絡(luò)的能力來學(xué)習(xí)出這些樣本所服從的函數(shù)。

使得該問題能被更容易處理的數(shù)學(xué)性質(zhì):對于一個d維的任意分布,,它都能夠通過選取一組d個服從正態(tài)分布的變量并將它們映射到一個足夠復(fù)雜的函數(shù)中來生成,。因此,我們可以假定我們的隱藏變量服從高斯分布,,然后構(gòu)造出一個具體的函數(shù)將我們服從高斯分布的隱藏空間映射到一個更為復(fù)雜的分布當(dāng)中,,這樣我們就能通過取樣來生成我們需要的數(shù)據(jù)了。其中,,這個具體的函數(shù)需要把簡單的隱藏分布映射成一個更為復(fù)雜的分布,,而這樣的一個復(fù)雜分布可以看作是一個隱藏空間,這時就可以采用神經(jīng)網(wǎng)絡(luò)來建立出一些參數(shù),,因此這些參數(shù)就能夠在訓(xùn)練中進(jìn)行微調(diào)了,。

學(xué)會從潛在空間中生成數(shù)據(jù)

在進(jìn)入本文最有趣的部分之前,讓我們先回顧一下最終的目標(biāo):我們有一個服從正態(tài)分布的d維隱藏空間,,以及我們所要學(xué)習(xí)的f(z;θ2)函數(shù)能夠?qū)㈦[藏分布映射到真實(shí)數(shù)據(jù)的分布,。換句話說就是:我們先對隱藏變量進(jìn)行采樣,然后將這個隱藏變量作為生成器的輸入,,最后生成的數(shù)據(jù)樣本能夠盡可能的接近真實(shí)的數(shù)據(jù),。

我們需要解決以下兩件事情

1. 為了使得變量z的概率密度P(X|z)最大化,如何高效的對隱藏空間進(jìn)行探索,?(我們需要在訓(xùn)練過程中為給定的X找到最為正確的z)

2. 如何使用反向傳播來訓(xùn)練這整個過程?(我們需要找到一個具體對象來優(yōu)化f:P(z)映射到P(X))

為我們的X找到正確的隱藏變量z

在絕大多數(shù)的實(shí)驗(yàn)中,,z和P(X|z)的數(shù)值都接近于零,因此我們對P(X)的估計幾乎沒有什么意義,。而VAE的核心思想在于:需要嘗試對可能產(chǎn)生X的z值進(jìn)行不斷采樣,,然后從這些值中計算出P(X)的大小,。為了做到這一點(diǎn),我們首先需要構(gòu)建一個能夠給出X的值并給出可能產(chǎn)生z的值的X分布的這樣一個新函數(shù)Q(z|X),,并希望在Q函數(shù)下的z值的空間大小比P(z)下的z值的空間大小要小得多,。

對于VAE的編碼器與所假定出的Q函數(shù),我們采用神經(jīng)網(wǎng)絡(luò)來對其進(jìn)行訓(xùn)練,,使得輸入X能映射到輸出Q(z|X)的分布中,從而幫助我們能夠找到一個最好的z來生成實(shí)際X中的數(shù)據(jù),。

使用反向傳播訓(xùn)練模型

為了更好理解到我們的VAE是如何訓(xùn)練出來的,,首先我們需要定義一個明確的目標(biāo),而為了做到這一點(diǎn),,我們又需要做一些數(shù)學(xué)公式的推導(dǎo),。

讓我們從編碼器開始說起,我們是想讓Q(z|X)的分布無限接近于P(X|z)的分布,,為了確定出這兩個分布到底有多接近,,我們可以采用兩個分布間的Kullback-Leibler散度D來進(jìn)行度量:

使用PyTorch從理論到實(shí)踐理解變分自編碼器VAE

通過數(shù)學(xué)推導(dǎo),我們可以把這個等式寫成更為有趣的形式,。對P(z|X)使用貝葉斯定律后,,等式如下:

使用PyTorch從理論到實(shí)踐理解變分自編碼器VAE

還可以表示成如下等式:

使用PyTorch從理論到實(shí)踐理解變分自編碼器VAE

花點(diǎn)時間看看這個公式

對于A部分:就是在等式左邊的這一項(xiàng),它對于反向傳播來說并不是一個有利的設(shè)定(我們并不知道P (X)的表達(dá)式是多少),,但是我們可以知道如果想要在給定z的情況下最大化log(P(X)),,可以通過最小化減號右邊的部分來實(shí)現(xiàn)(這樣可以使得Q(z|x)的分布盡可能接近P(z|X)的分布),這也正是我們在一開始時提到的最終目標(biāo),。

對于B部分:等式右邊的這一項(xiàng)就更加有趣,,正如我們了解P(X|z)(這是解碼器部分->生成器)和Q(z|X)(這是我們的編碼器)。所以我們可以得出,,為了最大化這一項(xiàng),,我們需要最大化log(P(X|z)),而這也就意味著我們不需要最大化log函數(shù)的極大似然概率和最小化Q(z|X)和P(z)之間的KL散度,。

為了使得B部分更容易被計算,,我們假設(shè)Q(z|X)是服從N(z|mu(X,θ1)或sigma(X,θ1))的高斯分布,其中θ1是在神經(jīng)網(wǎng)絡(luò)中需要從數(shù)據(jù)集中所學(xué)到的參數(shù),。此外,,在我們的公式中還有一個問題還沒被解決:就是如何計算反向傳播中的期望(損失函數(shù))?

損失函數(shù)部分的操作

一種思路是采用多次前向傳遞的方式來計算出log(P(X|z))的期望,但是其計算效率較低,。從而我們希望通過隨機(jī)訓(xùn)練來解決這一問題,,首先我們假定在第n輪迭代中使用的數(shù)據(jù)Xi能代表整個數(shù)據(jù)集,因此可以考慮我們從樣本Xi中所獲得的log(P(Xi|zi))和代表log(P(X|z))對Q分布的期望zi,。最后,,這個解碼器只是一個簡單的生成器模型,,而我們希望去重建這個輸入圖像,因此一個簡單的方法是使用輸入圖像和生成圖像之間的均方誤差來作為其期望部分(損失函數(shù)),,如下式,。

使用PyTorch從理論到實(shí)踐理解變分自編碼器VAE

VAE的最終框架

正如在一開始所介紹的那樣,我們知道VAE的最終結(jié)構(gòu)由兩個部分的網(wǎng)絡(luò)所構(gòu)成:

1. 編碼器部分能夠?qū)W習(xí)到根據(jù)輸入樣本X來形成一個特定分布,,從中我們可以對一個隱藏變量進(jìn)行采樣,,而這個隱藏變量極有可能生成X里面的樣本。為了使得Q(z|X)服從高斯分布,,這部分需要被優(yōu)化,。

2. 解碼器部分能夠?qū)W習(xí)到根據(jù)給定的一個隱藏變量z作為輸入,生成一個具有真實(shí)數(shù)據(jù)分布的輸出,。該部分將經(jīng)過采樣后的z(最初來自正態(tài)分布)映射到一個更復(fù)雜的隱藏空間去(實(shí)際數(shù)據(jù)的空間),,并通過這個復(fù)雜的隱藏變量z生成一個個的數(shù)據(jù)點(diǎn),這些數(shù)據(jù)點(diǎn)十分接近我們真實(shí)數(shù)據(jù)的分布,。

使用PyTorch從理論到實(shí)踐理解變分自編碼器VAE

VAE的詳細(xì)架構(gòu),。左邊的圖和右邊的圖是類似的,只是左邊示例中展示了反向傳播,,實(shí)際使用圖一般為右邊的示例

VAE實(shí)驗(yàn)分析

現(xiàn)在你已經(jīng)了解到了VAE背后的數(shù)學(xué)理論,,那么現(xiàn)在讓我們看看通過VAE我們能夠生成哪些模型,實(shí)驗(yàn)平臺為PyTorch,。

PyTorch的全局架構(gòu)

class VAE(nn.Module): def __init__(self, latent_dim): super().__init__() self.encoder = nn.Sequential(nn.Linear(28 * 28, 256), nn.ReLU(), nn.Linear(256, 128)) self.mu = nn.Linear(128, latent_dim) self.logvar = nn.Linear(128, latent_dim) self.latent_mapping = nn.Linear(latent_dim, 128) self.decoder = nn.Sequential(nn.Linear(128, 256), nn.ReLU(), nn.Linear(256, 28 * 28)) def encode(self, x): x = x.view(x.size(0), -1) encoder = self.encoder(x) mu, logvar = self.mu(encoder), self.logvar(encoder) return mu, logvar def sample_z(self, mu, logvar): eps = torch.rand_like(mu) return mu + eps * torch.exp(0.5 * logvar) def decode(self, z,x): latent_z = self.latent_mapping(z) out = self.decoder(latent_z) reshaped_out = torch.sigmoid(out).view(x.shape[0],1, 28,28) return reshaped_out def forward(self, x): mu, logvar = self.encode(x) z = self.sample_z(mu, logvar) output = self.decode(z,x) return output

訓(xùn)練模型

下圖展示了我們在訓(xùn)練期過程中所得到的結(jié)果,。為了演示,VAE已經(jīng)在MNIST數(shù)據(jù)集[3]上經(jīng)過了訓(xùn)練,,每10輪展示一次,,我們繪制了輸入X和所生成的數(shù)據(jù),而這些輸出的數(shù)據(jù)又作為VAE的輸入,。

使用PyTorch從理論到實(shí)踐理解變分自編碼器VAE

訓(xùn)練樣本(輸入在上,,輸出在下)——第1輪

使用PyTorch從理論到實(shí)踐理解變分自編碼器VAE

訓(xùn)練樣本(輸入在上,輸出在下)——第10輪

使用PyTorch從理論到實(shí)踐理解變分自編碼器VAE

訓(xùn)練樣本(輸入在上,,輸出在下)——第20輪

使用PyTorch從理論到實(shí)踐理解變分自編碼器VAE

訓(xùn)練樣本(輸入在上,,輸出在下)——第30輪

使用PyTorch從理論到實(shí)踐理解變分自編碼器VAE

訓(xùn)練樣本(輸入在上,輸出在下)——第40輪

使用PyTorch從理論到實(shí)踐理解變分自編碼器VAE

訓(xùn)練樣本(輸入在上,,輸出在下)——第50輪

隱藏空間

其中關(guān)于VAE有一個有趣的事情:在訓(xùn)練中學(xué)習(xí)到的隱藏空間有很好的連續(xù)性,。為了能夠在二維空間中輕松地可視化我們的數(shù)據(jù)點(diǎn),我們考慮通過二維可視化隱藏空間的特性來實(shí)現(xiàn),。

在訓(xùn)練過程中,,我們能夠發(fā)現(xiàn)在2維隱藏空間中MNIST數(shù)據(jù)集被重新劃分了,從中我們可以看到相似的數(shù)字被分在了一起(綠色的表示3且都被分在了一起,,并且非??拷鼣?shù)字8,,說明這兩個數(shù)字非常相似)。

使用PyTorch從理論到實(shí)踐理解變分自編碼器VAE

2維圖中可視化隱藏空間

一個更好地從視覺上去理解隱藏空間連續(xù)性的方法是:去觀察從隱藏空間中所生成的圖像,。我們從下圖中可看出,,數(shù)字在隱藏空間內(nèi)進(jìn)行移動時被平滑地轉(zhuǎn)換為了與之相似的數(shù)字。

使用PyTorch從理論到實(shí)踐理解變分自編碼器VAE

二維隱藏空間中抽樣出的數(shù)字

結(jié)論

VAE是一個令人驚嘆的工具,,它依靠神經(jīng)網(wǎng)絡(luò)的幫助能夠解決一些具有挑戰(zhàn)性的問題:生成模型,。與傳統(tǒng)方法相比,VAEs解決了兩個主要的問題: 1. 如何在隱藏空間中抽取最相關(guān)的隱藏變量來給到輸出,。2.如何將隱藏空間中的數(shù)據(jù)分布映射到真實(shí)的數(shù)據(jù)分布中去,。但是,VAE也存在著一些缺點(diǎn):由于使用的是均方根誤差,,它使得生成器是收斂到了平均最優(yōu),導(dǎo)致生成的圖像有一點(diǎn)模糊,。

而生成對抗網(wǎng)絡(luò)(GANs)通過使用鑒別器而不是均方根誤差作為損失能解決這一問題,,從而使得生成的圖像更為真實(shí)。但是,,由于GAN的隱藏空間難以控制,,使得它不具有像VAEs那樣的連續(xù)性,但這在某些應(yīng)用場合中卻是必要的,。

參考文獻(xiàn):

[1] Doersch, C., 2016. Tutorial on variational autoencoders. arXiv preprint arXiv:1606.05908.

[2] Kingma, D.P. and Welling, M., 2019. An introduction to variational autoencoders. arXiv preprint arXiv:1906.02691.

[3] MNIST dataset, http://yann./exdb/mnist/

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多