從認識AI開始-----變分自編碼器:從AE到VAE

前言

之前的文章里,我已經介紹了傳統的AE能夠將高維輸入壓縮成低維表示,并重建出來,但是它的隱空間結構并沒有概率意義,這就導致了傳統的AE無法自行生成新的數據(比如新圖像)。因此,我們希望:

  • 隱空間向量?z?是連續、結構良好的
  • 并且可以在隱空間中采樣?z?并生成樣本

這就是VAE的目標:構造一個“生成型AutoEncoder”。


一、回顧AE

前面的文章中,我已經詳細介紹了AE,這里我們簡單回顧一下AE干了什么,如下圖所示:

AE基于一個簡單卻新穎的概念:獲取輸入數據?x?,將其壓縮成低維表示,然后再將其重構成原始形式。拿圖像舉例,圖像通常包含數萬個數值,而低維表示通常是一個包含10-100維的向量,這些低維表示存儲在更緊湊的隱空間中,使用訓練好的AE,它可以根據隱空間表示來重建圖像。

但是如何生成新圖像呢?我們很容易想到的是從這個隱空間中隨機采樣一些點,然后通過AE的Decoder來生成圖像,如下圖所示:

?通過上圖,雖然AE能夠通過隱空間隨機采樣一些點,來生成新圖像,但是,由于隱空間是無組織、不規則的,因此隱空間的大部分區域都不會產生有意義的新圖像。

還有一種方式,就是取編碼后的圖像,然后對其隱空間附近的點進行采樣,生成與原始圖片相似的新圖像:

?但是,通過圖片我們會發現,由于隱空間的結構太差,即時采樣附近的點,也無法生成與原始圖像同樣意義的新圖像或者只能生成與原始圖像近似的圖像。

總而言之,由于AE壓縮的隱空間的結構具有缺陷,因此不能生成有意義的新數據。因此如果能生成一個連續、結構良好的隱空間,那么就能對采樣點生成連貫的新數據了,這就是VAE要做的事了。


二、VAE所用的概率基礎

1. 隨機變量與概率密度函數(PDF)

給定一個隨機變量?X \in [0,20],它的概率密度函數?p(x)?描述了采樣得到某個值?x?的相對可能性有多大:

  • 概率密度?p(x)?并不是概率本身,而是在一個非常小的區間?[x, x+\delta x]?上,采樣值落入這個區間的概率近似為?p(x)*\delta x
  • 積分為1,:所有可能值的總概率為1,\int_{1}^{20}p(x)dx=1

2. 期望

從X中不斷采樣,會得到一組值的平均,稱為期望E[X]

E[X]=\int x*p(x)dx

它表示從分布中采樣所期望的平均值

3. 聯合分布

若我們有兩個變量?X?和?Z,則它們的聯合分布記為:

p(x,z)

它給出了所有可能組合(x,z)?的概率密度

4. 邊緣分布

每個變量對自己的分布,可以通過聯合分布進行積分(邊緣化)得到:

  • 對于?Z?積分得到?X?的邊緣分布:

p(x)=\int p(x,z)dz

  • 對于?X?積分得到?Z?的邊緣分布:

p(z)=\int p(x,z)dx

5. 條件概率密度

條件概率表示在已知某一變量的情況下,另一個變量的概率分布,根據貝葉斯公式,可以得到:

  • 已知z,求 x 的條件概率

p(x|z)=\frac {p(x,z)}{p(z)}

  • 已知x,求 z 的條件概率

p(z|x)=\frac {p(x,z)}{p(x)}


三、VAE的原理

2014年,Diederik P. Kingma在他的論文《Auto-Encoding Variational Bayes》里首次提出了變分自編碼器,簡稱VAE,它的核心思想之一就是貝葉斯統計。

1. VAE的目標

我們希望給定數據?x ,能夠學習隱空間?z?的分布,并能從?z?中生成“相似”的 x,即從先驗分布中采樣?z\sim p(z)p(z)為先驗概率),通過解碼器生成?x\sim p(x|z)p(x|z)為似然概率)。由于VAE屬于生成模型,因此我們關注的是:

p(x)=\int p(x,z)dx=\int p(x|z)p(z)dz

如下所示:

核心思想就是如果能從后延分布中采樣隱空間向量,這些隱空間向量由原始數據生成,來自原始數據分布?p(x)?,如果我們能夠將這些隱空間向量重建回原數據,我們就能從原始數據分布中生成新的樣本。由于我們不知道隱空間分布 p(z)?的確切形狀,因此我們假設隱空間分布是一個正態分布,然后就能計算似然概率?p(x|z)?,它衡量從隱空間重建圖像的可能性有多大,但是我們仍然不知道后驗概率?p(z|x)?,因此就需要使用“變分自編碼器中的變分推斷了”

2. 變分推斷

上面我們已經知道了,不知道真實分布的后驗概率?p(z|x)?,所以我們引入一個近似后驗分布?q(z|x)?來近似后驗概率?p(z|x),這個近似后驗分布包括參數 \mu?和 \sigma,這個參數可以用Encoder來學習;然后我們使用一個Decoder從學習到的近似后驗概率中采樣隱空間向量來重構數據。

具體來說,我們使用變分下界(ELBO)來近似優化?logp(x)

\log p(x)=\log\int p(x,z)dz=\log\int q(z|x)\frac {p(x,z)}{q(z|x)}dz

根據Jensen不等式:

\log E_{q(z|x)}\left [ \frac {p(x,z)}{q(z|x)} \right ]\geqslant E_{q(z|x)}\left [ \log\frac {p(x,z)}{q(z|x)} \right ]

即:

\log p(x)\geqslant E_{q(z|x)}\left [\log p(x,z)-\log q(z|x) \right ]=Loss

這個下界Loss,就是我們用來訓練模型的目標函數

3. 對下界(ELBO)推導

根據聯合概率?p(x,z)=p(x|z)p(z),代入目標函數:

Loss=E_{q(z|x)}\left [ \log p(x|z) \right ]-KL(q(z|x)||p(z))

這就是VAE的損失函數,由兩部分組成:

重構項,表示從隱空間變量 z 重建原始輸入 x 的可能性:

E_{q(z|x)}\left [ \log p(x|z) \right ]

KL散度,也叫正則化項,用來衡量我們學到的近似后驗分布?q(z|x)?與先驗分布?p(z)?之間的差距:

KL(q(z|x)||p(z))

4. VAE的整體流程:

5. 重參數技巧

為了讓采樣過程可導,VAE使用重參數技巧,這樣就可以把 z 寫成可導的形式,就能訓練模型了:

z=\mu+\sigma *\epsilon ,\epsilon \sim \mathbb{N}(0,I)

6. 最終VAE損失

在實際中,我們最大化ELBO(最小化負對數),因此最終優化的是:

L_{VAE}=\frac {1}{N}\sum||x-\hat x||^2+D_{KL}(\mathbb{N}(\mu,\sigma^2)||\mathbb{N}(0,I))

其中,KL項可以表示為:

D_{KL}=\frac {1}{2}\sum(\mu^2+\sigma^2-log\sigma^2-1)


四、Pytroch具體實現

接下來,我使用MNIST手寫數字數據集來簡單訓練一下VAE流程:

import torch
import torch.nn as nn
import torch.nn.functional as F
from torchvision import datasets, transforms
from torch.utils.data import DataLoadertransform = transforms.ToTensor()
train_dataset = datasets.MNIST('./data', train=True, transform=transform, download=True)
train_loader = DataLoader(train_dataset, batch_size=128, shuffle=True)class VAE(nn.Module):def __init__(self):super().__init__()self.fc1 = nn.Linear(784, 400)self.fc_mu = nn.Linear(400, 20)self.fc_logvar = nn.Linear(400, 20)self.fc2 = nn.Linear(20, 400)self.fc3 = nn.Linear(400, 784)def encode(self, x):h1 = F.relu(self.fc1(x))return self.fc_mu(h1), self.fc_logvar(h1)def reparameterize(self, mu, logvar):std = torch.exp(0.5 * logvar)eps = torch.randn_like(std)return mu + eps * stddef decode(self, z):h3 = F.relu(self.fc2(z))return torch.sigmoid(self.fc3(h3))def forward(self, x):x = x.view(-1, 784)mu, logvar = self.encode(x)z = self.reparameterize(mu, logvar)return self.decode(z), mu, logvardef loss_fn(recon_x, x, mu, logvar):BCE = F.binary_cross_entropy(recon_x, x.view(-1, 784), reduction='sum')KLD = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())return BCE + KLD

總結

以上就是VAE的全部內容,相信小伙伴們看到這已經對VAE有了更深刻的理解:VAE將概率建模引入AE中,讓模型可以從隱空間中采樣生成新樣本,它通過最大化變分下界ELBO優化目標函數,使用重參數技巧來使得采樣過程可導。但是,VAE生成圖像時較模糊。


如果小伙伴們覺得本文對各位有幫助,歡迎:👍點贊 |?? 收藏 | ?🔔 關注。我將持續在專欄《人工智能》中更新人工智能知識,幫助各位小伙伴們打好扎實的理論與操作基礎,歡迎🔔訂閱本專欄,向AI工程師進階!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/82942.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/82942.shtml
英文地址,請注明出處:http://en.pswp.cn/web/82942.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

智慧賦能:移動充電樁的能源供給革命與便捷服務升級

在城市化進程加速與新能源汽車普及的雙重推動下,移動充電樁正成為能源供給領域的一場革命。傳統固定充電設施受限于布局與效率,難以滿足用戶即時、靈活的充電需求,而移動充電樁通過技術創新與服務升級,打破了時空壁壘,…

發版前后的調試對照實踐:用 WebDebugX 與多工具構建上線驗證閉環

每次產品發版都是一次“高壓時刻”。版本升級帶來的不僅是新功能上線,更常伴隨隱藏 bug、兼容性差異與環境同步問題。 為了降低上線風險,我們逐步構建了一套以 WebDebugX 為核心、輔以 Charles、Postman、ADB、Sentry 的發版調試與驗證流程,…

如何安裝huaweicloud-sdk-core-3.1.142.jar到本地倉庫?

如何安裝huaweicloud-sdk-core-3.1.142.jar到本地倉庫? package com.huaweicloud.sdk.core.auth does not exist 解決方案 # 下載huaweicloud-sdk-core-3.1.142.jar wget https://repo1.maven.org/maven2/com/huaweicloud/sdk/huaweicloud-sdk-core/3.1.142/huawe…

Python學習(7) ----- Python起源

🐍《Python 的誕生》:一段圣誕假期的奇妙冒險 📍時間:1989 年圣誕節 在荷蘭阿姆斯特丹的一個寒冷冬夜,燈光昏黃、窗外飄著雪。一個程序員 Guido van Rossum 正窩在家里度假——沒有會議、沒有項目、沒有 bug&#xf…

DiMTAIC 2024 數字醫學技術及應用創新大賽-甲狀腺B超靜態及動態影像算法賽-參賽項目

參賽成績 項目介紹 去年參加完這個比賽之后,整理了項目文件和代碼,雖然比賽沒有獲獎,但是參賽過程中自己也很有收獲,自己一個人搭建了完整的pipeline并基于此提交了多次提高成績,現在把這個項目梳理成博客&#xff0c…

繪制餅圖詳細過程

QtCharts繪制餅圖 說明:qcustomplot模塊沒有繪制餅圖的接口和模塊,所以用Qt官方自帶的QtCharts進行繪制。繪制出來還挺美觀。 1 模塊導入 QT chartsQT_BEGIN_NAMESPACE以上這兩行代碼必須得加 2 總體代碼 widget.h #ifndef WIDGET_H #defin…

本地windows主機安裝seafile部署詳解,及無公網IP內網映射外網訪問方案

在Windows上部署Seafile服務器是一個相對直接的過程,但需要你具備一定的系統管理知識。Seafile是一個開源的文件共享和協作平臺,類似于Dropbox或Google Drive。 以下是在Windows上部署Seafile服務器的步驟: 1. 準備環境 確保你的Windows系…

Vue學習之---nextTick

前言:目前來說,nextTick我們遇到的比較少,至少對我來說是這樣的,但是有一些聰明的小朋友早早就注意到這個知識點了。nextTick 是前端開發(尤其是 Vue 生態)中的核心知識點,原理上跟Vue的異步更新…

MS2691 全頻段、多模導航、射頻低噪聲放大器芯片,應用于導航儀 雙頻測量儀

MS2691 全頻段、多模導航、射頻低噪聲放大器芯片,應用于導航儀 雙頻測量儀 產品簡述 MS2691 是一款具有 1164MHz ? 1615MHz 全頻段、低功耗的低噪聲放大器芯片。該芯片通過對外圍電路的簡單配置,使得頻帶具有寬帶或窄帶特性。支持不同頻段的各種導…

學習STC51單片機30(芯片為STC89C52RCRC)

每日一言 當你感到疲憊時,正是成長的關鍵時刻,再堅持一下。 IIC協議 是的,IIC協議就是與我們之前的串口通信協議是同一個性質,就是為了滿足模塊的通信,其實之前的串口通信協議叫做UART協議,我們千萬不要弄…

python打卡day47@浙大疏錦行

昨天代碼中注意力熱圖的部分順移至今天 知識點回顧: 熱力圖 作業:對比不同卷積層熱圖可視化的結果 以下是不同卷積層特征圖可視化的對比實現: import torch import matplotlib.pyplot as pltdef compare_conv_layers(model, input_tensor):# …

藍橋杯單片機之通過實現同一個按鍵的短按與長按功能

實現按鍵的短按與長按的不同功能 問題分析 對于按鍵短按,通常是松開后實現其功能,而不會出現按下就進行后續的操作;而對于按鍵長按,則不太一樣,按鍵長按可能分為兩種情況,一是長按n秒后實現后續功能&…

數據導入技術(文檔加載)

1. 簡單文本的讀取 用LangChain讀入txt文檔 # 讀取單個txt文件 import os from langchain_community.document_loaders import TextLoader # 獲取當前腳本文件所在的目錄 script_dir os.path.dirname(__file__) print(f"獲取當前腳本文件所在的目錄:{script…

靶場(二十)---靶場體會小白心得 ---jacko

老樣子開局先看端口,先看http端口 PORT STATE SERVICE VERSION 80/tcp open http Microsoft IIS httpd 10.0 |_http-title: H2 Database Engine (redirect) | http-methods: |_ Potentially risky methods: TRACE |_http-server-header:…

讓AI看見世界:MCP協議與服務器的工作原理

讓AI看見世界:MCP協議與服務器的工作原理 MCP(Model Context Protocol)是一種創新的通信協議,旨在讓大型語言模型能夠安全、高效地與外部資源進行交互。在AI技術快速發展的今天,MCP正成為連接AI與現實世界的重要橋梁。…

|從零開始的Pyside2界面編程| 用Pyside2打造一個AI助手界面

🐑 |從零開始的Pyside2界面編程| 用Pyside2打造一個AI助手界面 🐑 文章目錄 🐑 |從零開始的Pyside2界面編程| 用Pyside2打造一個AI助手界面 🐑?前言??調取Deepseek大模型??準備工作??調用API? ?將模型嵌入到ui界面中??…

如何利用Elastic Stack(ELK)進行安全日志分析

在以下文章中,我將解釋如何使用Elastic Stack(ELK)進行安全日志分析,以提高安全性和監控網絡活動。ELK是一個功能強大的開源日志管理和分析平臺,由Elasticsearch、Logstash和Kibana組成,適用于各種用例&…

網絡安全-等級保護(等保)3-0 等級保護測評要求現行技術標準

################################################################################ 第三章:測評要求、測評機構要求,最終目的是通過測評,所以我們將等保要求和測評相關要求一一對應形成表格。 GB/T 28448-2019 《信息安全技術 網絡安全等…

網絡通訊知識——通訊分層介紹,gRPC,RabbitMQ分層

網絡通訊分層 網絡通訊分層是為了將復雜的網絡通信問題分解為多個獨立、可管理的層次,每個層次專注于特定功能。目前主流的分層模型包括OSI七層模型和TCP/IP四層(或五層)模型,以下是詳細解析: 一、OSI七層模型&#…

gopool 源碼分析

gopool gopool是字節跳動開源節流的gopkg包中協程池的一個實現。 關鍵結構 協程池: type pool struct {// The name of the poolname string// capacity of the pool, the maximum number of goroutines that are actually working// 協程池的最大容量cap int32…