【深度学习】18. 生成模型:Variational Auto-Encoder(VAE)详解

article/2025/8/5 0:37:34

Variational Auto-Encoder(VAE)详解

本节内容完整介绍 VAE 的模型结构、优化目标、重参数化技巧及其生成机制。

回顾:Autoencoder(自编码器)

Autoencoders and Visual Similarity

Autoencoder 是一种无监督学习模型,旨在从未标注的数据中学习压缩表示。其结构包括:

  • Encoder:将输入 x x x 映射为潜在空间的表示 z z z
  • Decoder:将 z z z 重构为 x ^ \hat{x} x^,使其尽可能接近原始输入 x x x

通常设置潜在变量 z z z 的维度低于 x x x,实现降维和特征提取。

Autoencoder 的训练目标

目标是最小化重构误差:

L ( x , x ^ ) = ∥ x − x ^ ∥ 2 L(x, \hat{x}) = \| x - \hat{x} \|^2 L(x,x^)=xx^2

模型通过优化参数使得 x ^ = f ( g ( x ) ) \hat{x} = f(g(x)) x^=f(g(x)) 尽可能接近 x x x,其中 g g g 是 Encoder, f f f 是 Decoder。

Encoder 的用途

自动编码器可以重构数据,并且可以学习特征来初始化监督模型。特征捕获训练数据中的变化因素

训练完成后,Encoder 可以作为特征提取器用于其他下游任务。通常在分类等监督任务中:

  • 预训练阶段训练 Autoencoder
  • 丢弃 Decoder,仅保留 Encoder
  • 添加分类器,进行微调训练

这种方式可利用无标签数据提升有标签任务效果。

Variational Auto-Encoder(VAE)的提出

An Introduction to Variational Autoencoders (VAEs) | by Francesco Franco |  T3CH | Apr, 2025 | Medium

注意图中写的Variance or standard deviation有误,应该是log_var!

Autoencoder 能学习数据表示,但无法从潜在空间采样生成新样本。为此,VAE 将其扩展为生成模型:

  • 假设存在潜变量 z z z,从先验分布 p ( z ) p(z) p(z)(通常是 N ( 0 , I ) \mathcal{N}(0, I) N(0,I),高斯分布)中采样
  • 使用生成网络从 p θ ( x ∣ z ) p_\theta(x|z) pθ(xz) 中生成 x x x

完整生成过程为:

  1. p ( z ) p(z) p(z) 中采样 z z z
  2. p θ ( x ∣ z ) p_\theta(x|z) pθ(xz) 生成样本 x x x

p ( z ∣ x ) p(z|x) p(zx) 往往难以直接推导,因此采用变分推断,引入近似后验分布 q ϕ ( z ∣ x ) q_\phi(z|x) qϕ(zx)

1. 输入与编码(Encoder)

输入样本 x x x 被送入编码器(Encoder),输出两个变量:

  • z mean = μ z_{\text{mean}} = \mu zmean=μ
  • z log_var = log ⁡ σ 2 z_{\text{log\_var}} = \log \sigma^2 zlog_var=logσ2

这些构成了潜在变量 z z z 的高斯分布参数。

2. KL 散度项(先验正则化)

使用高斯分布的 KL 散度公式计算 q ϕ ( z ∣ x ) ∼ N ( μ , σ 2 ) q_\phi(z|x) \sim \mathcal{N}(\mu, \sigma^2) qϕ(zx)N(μ,σ2) p ( z ) ∼ N ( 0 , 1 ) p(z) \sim \mathcal{N}(0,1) p(z)N(0,1) 之间的距离:

D K L ( N ( μ , σ 2 ) ∥ N ( 0 , 1 ) ) = − 1 2 ( 1 + log ⁡ σ 2 − μ 2 − σ 2 ) D_{KL}(\mathcal{N}(\mu, \sigma^2) \| \mathcal{N}(0,1)) = -\frac{1}{2} \left( 1 + \log \sigma^2 - \mu^2 - \sigma^2 \right) DKL(N(μ,σ2)N(0,1))=21(1+logσ2μ2σ2)

这项鼓励 q ( z ∣ x ) q(z|x) q(zx) 与标准高斯分布接近,使得从 p ( z ) p(z) p(z) 中采样具有可行性。

3. 重参数化技巧(Reparameterization Trick)

为了使得 z z z 可导,引入噪声变量 ϵ ∼ N ( 0 , 1 ) \epsilon \sim \mathcal{N}(0, 1) ϵN(0,1),用如下方式采样 z z z

z = μ + σ ⋅ ϵ z = \mu + \sigma \cdot \epsilon z=μ+σϵ

这样,整个采样过程对网络参数 μ , σ \mu, \sigma μ,σ 可导,允许使用反向传播训练网络。

我们知道在神经网络中,如果某个操作是“不可导的”或者“不确定的(stochastic)”,我们就无法对它的参数进行梯度传播

而在 VAE 中,如果我们直接从 z ∼ N ( μ , σ 2 ) z \sim \mathcal{N}(\mu, \sigma^2) zN(μ,σ2) 中采样,那么这个采样过程本身是随机的、不可导的,无法对 μ \mu μ σ \sigma σ 求导!

所以怎么解决?

我们使用重参数化技巧,将随机性“从参数中移除”,变成一个确定性的函数:

z = μ + σ ⋅ ϵ , ϵ ∼ N ( 0 , 1 ) z = \mu + \sigma \cdot \epsilon,\quad \epsilon \sim \mathcal{N}(0,1) z=μ+σϵ,ϵN(0,1)

这个时候:

  • ϵ \epsilon ϵ 是一个常量样本(在每次前向传播时采一次)
  • z z z μ \mu μ σ \sigma σ 的一个确定函数(因为 ϵ \epsilon ϵ 视为已知)
为什么 ϵ \epsilon ϵ 不影响反向传播?

因为反向传播的目标是对损失函数 L L L 关于参数 μ \mu μ σ \sigma σ 求导,比如:

$ ∂μ∂L=∂z∂L⋅∂μ∂z,∂μ∂z=1$

∂ L ∂ σ = ∂ L ∂ z ⋅ ∂ z ∂ σ , ∂ z ∂ σ = ϵ ∂L∂σ=∂L∂z⋅∂z∂σ,∂z∂σ=ϵ Lσ=Lzzσ,zσ=ϵ

  • 虽然 ϵ \epsilon ϵ 是随机变量,但在一次前向过程中是常数(采样好了)
  • 所以我们仍然可以对 μ \mu μ σ \sigma σ 使用链式法则求导,反向传播不需要对 ϵ \epsilon ϵ 求导
每次前向传播时, ϵ \epsilon ϵ 都要重新采样一次!
为什么?

在 VAE 中,我们采样的目的是从一个 随机潜在变量 z z z 中生成样本。为了能让 z z z 具有“随机性”,我们必须在每次前向传播时, ϵ ∼ N ( 0 , 1 ) \epsilon \sim \mathcal{N}(0,1) ϵN(0,1) 中重新采样,否则模型生成的 z z z 就是确定的了,完全失去生成模型的意义。

4. 解码与重建误差

z z z 输入 Decoder 得到重建样本 x ^ \hat{x} x^。再与原始输入 x x x 比较,计算重建误差:

  • 若像素值为 [ 0 , 1 ] [0, 1] [0,1],常使用 二值交叉熵损失(Binary Cross Entropy)

L recon = ∑ i = 1 n [ − x i log ⁡ x ^ i − ( 1 − x i ) log ⁡ ( 1 − x ^ i ) ] L_{\text{recon}} = \sum_{i=1}^n \left[ -x_i \log \hat{x}_i - (1 - x_i) \log(1 - \hat{x}_i) \right] Lrecon=i=1n[xilogx^i(1xi)log(1x^i)]

  • 若为连续实值向量(如图像灰度),可使用 均方误差(MSE)

L recon = ∑ i = 1 n ( x i − x ^ i ) 2 L_{\text{recon}} = \sum_{i=1}^n (x_i - \hat{x}_i)^2 Lrecon=i=1n(xix^i)2

VAE 的完整损失函数

VAE 的最终损失函数由两个部分组成:

L VAE = L recon + D K L ( q ϕ ( z ∣ x ) ∥ p ( z ) ) \mathcal{L}_{\text{VAE}} = L_{\text{recon}} + D_{KL}(q_\phi(z|x) \| p(z)) LVAE=Lrecon+DKL(qϕ(zx)p(z))

其中:

  • L recon L_{\text{recon}} Lrecon:重建误差(衡量生成的 x ^ \hat{x} x^ x x x 的差距)
  • D K L D_{KL} DKL:先验正则化项(限制潜变量空间服从 N ( 0 , 1 ) \mathcal{N}(0, 1) N(0,1)

最终优化目标:

min ⁡ θ , ϕ E q ϕ ( z ∣ x ) [ − log ⁡ p θ ( x ∣ z ) ] + D K L ( q ϕ ( z ∣ x ) ∥ p ( z ) ) \min_{\theta, \phi} \mathbb{E}_{q_\phi(z|x)}[-\log p_\theta(x|z)] + D_{KL}(q_\phi(z|x) \| p(z)) θ,ϕminEqϕ(zx)[logpθ(xz)]+DKL(qϕ(zx)p(z))

VAE + GAN:Variational Autoencoder 与 GAN 的结合

本图展示了由 Makhzani 等人于 2015 年提出的 Adversarial Autoencoders (AAE) 架构,它结合了 Variational Autoencoder (VAE) 的编码思想与 Generative Adversarial Network (GAN) 的对抗训练机制。

在这里插入图片描述

模型结构解析

1. 编码器(Encoder)
  • 输入图像 x x x(如 MNIST 的手写数字图像)

  • 编码器输出两个向量: z mean z_{\text{mean}} zmean z log_var z_{\text{log\_var}} zlog_var

  • 通过重参数技巧采样得到 z z z

    z = μ + σ ⋅ ϵ , ϵ ∼ N ( 0 , 1 ) z = \mu + \sigma \cdot \epsilon, \quad \epsilon \sim \mathcal{N}(0, 1) z=μ+σϵ,ϵN(0,1)

2. 解码器(Decoder)
  • 接收采样的隐变量 z z z,重建图像 x ^ \hat{x} x^
  • 使用重建误差(如 CrossEntropy 或 MSE)作为训练信号
3. 判别器(Discriminator)
  • 判别器用于判断隐变量 z z z 是否来自:

    • 编码器生成的 q ( z ) q(z) q(z),即编码器输出的 z z z
    • 还是先验分布 p ( z ) p(z) p(z),如 N ( 0 , I ) \mathcal{N}(0, I) N(0,I)
  • 编码器的目标是欺骗判别器,使 q ( z ) q(z) q(z) p ( z ) p(z) p(z) 的样本无法区分,从而用 GAN 的方式逼近先验分布。

数学公式说明

图中展示了边缘分布 q ( z ) q(z) q(z) 的定义:

q ( z ) = ∫ x q ( z ∣ x ) p data ( x ) d x q(z) = \int_x q(z|x) \, p_{\text{data}}(x) \, dx q(z)=xq(zx)pdata(x)dx

即:将所有数据 x x x 编码后的隐变量 z z z 分布汇总起来形成 q ( z ) q(z) q(z)。我们希望 q ( z ) q(z) q(z) 与先验 p ( z ) p(z) p(z) 尽可能接近。

而对抗目标则是:

最小化判别器无法区分 q ( z ) q(z) q(z) p ( z ) p(z) p(z) 的能力
用 GAN 代替 KL 散度进行对齐。

总结

  • 传统 VAE 使用 KL 散度来匹配 q ( z ) q(z) q(z) p ( z ) p(z) p(z),容易不稳定
  • VAE + GAN (或 AAE) 使用判别器对抗训练,让隐空间更贴合先验分布
  • 优势:
    • 更高质量生成样本
    • 更结构化的 latent space
    • 支持复杂先验(如高斯混合)

这种结构为生成建模提供了更加稳定与表达力强的框架。


http://www.hkcw.cn/article/NwYqhWJTlT.shtml

相关文章

电容的深入探讨

文章目录 6.1.1 概念6.1.2 容抗6.1.3 电容种类6.1.3.1 安规电容6.1.3.2 电解电容6.1.3.3 电容命名 6.1.4 电容作用6.1.4.1 降压6.1.4.2 滤波6.1.4.3 延时6.1.4.4 解耦合6.1.4.5 旁路 6.1.5 电容的充放电6.1.6 电容储能量化6.1.7 电容的特性理解 6.1.1 概念 无源元件。&#xf…

《P3959 [NOIP 2017 提高组] 宝藏》

题目背景 NOIP2017 D2T2 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度。 小明决心亲自前往挖掘所有宝藏屋中的宝藏。但是,每个宝藏屋…

59、干系人概述

干系人(Stakeholders)是指在项目、组织、活动或任何特定情境中,具有利益、影响力或受其影响的人、团体或组织。他们可以是内部的(如项目团队成员、管理层),也可以是外部的(如客户、供应商、政府…

计算机视觉---YOLOv5

YOLOv5理论讲解 一、YOLOv5 整体架构解析 YOLOv5 延续了 YOLO 系列的 单阶段目标检测框架,包含 主干网络(Backbone)、颈部网络(Neck) 和 检测头(Head),但在结构设计上更注重 轻量化…

前端框架进化史

本内容是对 You’ll Never Manually Update the DOM Again // Here’s Why 内容的翻译与整理。 你再也不需要手工更新DOM, 以下是原因 现代 JavaScript 框架,如 React、Vue、Svelte、Solid、Quick,以及本周推出的其他 786 个框架,都试图做一些…

Redis笔记

Redis(Remote Dictionary Server),开源、基于C语言、内存可持久化的NoSQL的键值对数据库。 命令:redis命令不区分大小写,set和SET效果相同 主键(key):任意二进制序列(字…

flask pyinstaller打包exe,出现module not found问题

最近大作业要做一个项目要打包成可执行程序,这里说一下这个module not found问题,并提供几种可能的方案,如果严格按照这些来走就能解决常见问题,剩下的神仙问题建议问问ai或者清缓存重试 首先说一下目录问题,这应该是包括我(打包app.py)在内的大多数人遇见该报错问题的原因,提…

基于SpringBoot+Redis实现RabbitMQ幂等性设计,解决MQ重复消费问题

一、实现方案 本实验方案参考「RabbitMQ消息可靠性深度解析|从零构建高可靠消息系统的实战指南」 1、业务层幂等处理: 每个消息携带一个全局唯一ID,在业务处理过程中,首先检查这个ID是否已经被处理过。例如,将已处理消…

性能优化 - 案例篇:数据一致性

文章目录 Pre引言1. 分布式缓存概念2. Redis 与 Memcached 区别概览3. Spring Boot 中使用 Redis3.1 引入依赖与常用客户端3.2 RedisTemplate 的基本用法3.3 Spring Cache 注解式缓存 4. 秒杀业务简介及挑战5. Lua 脚本实现原子库存扣减5.1 准备阶段:数据预加载5.2 …

【深度学习】 19. 生成模型:Diffusion Models

Diffusion Models Diffusion Models 简介 Diffusion 模型是一类通过逐步添加噪声并再逆向还原的方式进行图像生成的深度生成模型。其基本流程包括: 前向过程(Forward Process):将真实图像逐步加噪,最终变为高斯噪声…

【速通RAG实战:进阶】22、RAG 技术前沿探索:GraphRAG 等 13 种技术详解与应用场景

一、RAG技术的演进脉络与前沿分类 (一)从基础RAG到前沿创新的技术跃迁 传统RAG(检索增强生成)通过“检索-生成”两阶段解决LLM的知识时效性和准确性问题,但在复杂推理、多模态融合、成本控制等场景面临瓶颈。前沿RAG技术围绕检索精度、推理深度、生成质量、系统效率四大…

美业新动能:智能体如何赋能行业“维护”升级(3/6)

摘要:美业行业蓬勃发展,但竞争激烈、客户要求提高等挑战并存。智能体技术应运而生,它融合机器学习、自然语言处理和计算机视觉等技术,实现精准营销、个性化服务,优化客户关系、设备和供应链维护。本文探讨智能体在美业…

RAGflow详解及实战指南

目录 前言 一、RAGflow核心技术解析 1. 技术原理:检索与生成的协同进化 2. 架构设计:分层模块化与高扩展性 3. 核心优势:精准、高效、安全 二、RAGflow实战应用场景 1. 企业知识库搭建 2. 智能客服系统 3. 投资分析报告生成 4. 制造…

C# winform教程(二)

一、基础控件 常用的基础控件主要有按钮,文本,文本输入,组,进度条,等等。 基础控件 名称含义详细用法Button按钮checkbox多选按钮Combobox下拉选择groupbox组控件label标签,显示文字panel控件集合&#xf…

Altium Disigner(16.1)学习-原理图绘制以及必要操作

一、下载软件 通过网盘分享的文件:Altium Designer 16.zip 链接: https://pan.baidu.com/s/1uBHeoJJ-iA2tXw3NRjCcdA?pwd7c3h 提取码: 7c3h 复制这段内容后打开百度网盘手机App,操作更方便哦 --来自百度网盘超级会员v5的分享 二、建立工程 添加proje…

DAY 18 推断聚类后簇的类型

目录 DAY 18 推断聚类后簇的类型1.推断簇含义的2个思路:先选特征和后选特征2.通过可视化图形借助ai定义簇的含义3.科研逻辑闭环:通过精度判断特征工程价值作业:参考示例代码对心脏病数据集采取类似操作,并且评估特征工程后模型效果有无提升。…

常见的PLC浮点数字节序转换方法

变量的字节序 在 PLC 中,寄存器的长度通常为 16 bit,常见的数据类型有 16bit、32bit长度的 对于 32 bit 长度的数据,比如浮点型(在西门子、Codesys 中称为 REAL 型),由于长度较长,在不同平台、…

【Day42】

DAY 42 Grad-CAM与Hook函数 知识点回顾 回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例 作业:理解下今天的代码即可 """ Day 42: Grad-CAM与Hook函数本节主要内容: 1. 回调函数(Callback)和lambda函数- 回调函数是作为参…

各种乱码问题解决措施

1.乱码问题原因 1.数据的编码和解码使用的不是同一个字符集 编码就是我们能看懂的数据转换为计算机能够识别的二进制编码 解码就是将存在计算机里面的二进制编码的文件转化为我们能够识别的字符等内容。 2.使用了不支持某个语言文字的字符集。 1,1html文件乱码 在<meta c…

c++ 异常处理

测试代码&#xff1a; #include <exception>void testException() { // test exceptionclass MyException : public exception {public:using std::exception::exception; // 关键&#xff1a;继承父类所有构造函数};struct Divide {int operator() (int a, int b) cons…