从认识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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…