Variational Autoencoder(VAE)是一种深度生成模型,它结合了变分推断和神经网络的优势,用于学习数据的潜在分布,并生成新的数据样本。VAE可以看作是自编码器(Autoencoder)的一种扩展,在自编码器的基础上引入了概率模型,并通过变分推断来近似后验分布。VAE的关键创新之一是通过引入潜在变量模型,能够以概率的方式生成新的数据点。
VAE的目标是通过神经网络生成数据,类似于传统的自编码器(AE),但是它在潜在空间中引入了概率建模。与传统AE不同,VAE假设输入数据的潜在表示是通过一个概率分布来建模的,而不是一个固定的向量。
1. 模型介绍
VAE将数据 x 通过一个潜在变量 z 来生成,即假设每个数据样本是从一个潜在变量 z 中生成的。这个生成过程可以描述为:
-
p(x∣z) 给定潜在变量 z 时,生成数据 x 的概率分布。
-
p(z) 潜在变量的先验分布,通常取标准正态分布N(0,1)
2.VAE的核心算法
① 输入与输出
-
输入:高维数据
(如图像,
为空间维度,
为通道数)。
-
输出:低维潜在变量
,其中
,
。
② 编码器(Encoder)的降维过程
编码器通过卷积神经网络(CNN)逐步压缩输入数据的空间维度,具体步骤如下:
(1) 卷积与下采样(Downsampling)
-
层结构:多个卷积层 + 激活函数(如ReLU) + 池化层(如最大池化)。
-
目标:逐层减少空间分辨率,提取高层语义特征。
eg:
输入:512×512×3
操作:卷积核4×4,步长2,填充1,输出通道64
输出:256×256×64
激活函数:ReLU
(2) 输出潜在分布参数
-
最终层:通过全连接层或1×1卷积生成潜在变量的均值 μμ 和方差 logσ2logσ2。
-
输入:64×64×256
-
操作:1×1卷积核,输出通道 2d(d 为潜在空间通道数)
-
输出:64×64×
→ 拆分为
和
-
③重参数化
从编码器输出的分布参数中采样得到潜在变量 Z,确保梯度可导:
-
解释:通过引入随机噪声 ϵ,将采样过程从不可导的随机操作转换为可导的确定性计算。
④解码器(Decoder)的重建过程
解码器通过转置卷积或上采样层逐步恢复空间分辨率:
(1) 上采样(Upsampling)
示例(潜在变量64×64×4 → 输出图像512×512×3):
第一层:
- 输入:64×64×4
- 操作:转置卷积核4×4,步长2,填充1,输出通道256
- 输出:128×128×256
- 激活函数:ReLU
第二层:
- ......
最终层:
- 输入:512×512×64
- 操作:1×1卷积核,输出通道3(RGB图像)
- 输出:512×512×3
- 激活函数:Sigmoid(将值映射到[0,1]区间)
⑤损失函数:优化降维与重建
VAE的损失函数由两部分组成,通过反向传播优化编码器和解码器参数:
- 重建损失:衡量输入
与重建图像
的差异,常用均方误差(MSE):
- KL散度:约束潜在分布
接近标准正态分布
- 总损失:
其中,超参数 β:平衡重建质量与潜在空间的正则化(通常 β=1)。
变分推断的详细分析:
在VAE中,我们希望学习一个后验分布 p(z∣x),即给定数据 x,潜在变量 z 的分布。直接求解 p(z∣x)是非常困难的,因此VAE采用了变分推断的方法。
变分推断的基本思想是通过引入一个变分分布 q(z∣x)来逼近真实的后验分布 p(z∣x),这样我们就能通过优化变分分布来间接学习潜在空间的分布。
贝叶斯公式计算后验概率:
其中:
- p(x∣z)是似然函数,表示给定潜在变量 z 时生成数据 x 的概率;
- p(z)是潜在变量 z 的先验分布;
- p(x) 是数据的边际概率(或称证据),计算为:
但是,这个积分通常是非常复杂或者无法解析求解的,因此直接计算 p(z∣x) 是困难的。因此,引入一个变分分布 q(z),希望通过最小化某种“误差”来让这个变分分布尽可能接近真实的后验分布 p(z∣x)。
于是,我们的目标就变成了:最小化 q(z) 与 p(z∣x) 之间的差异。这个差异通常使用 KL散度来度量:(但是KL散度又是什么呢?)
变分推断的推导过程
通过最大化证据下界(ELBO)来最小化KL散度。
- 根据贝叶斯公式,数据的对数似然可以表示为:
- 我们引入变分分布 q(z) 来近似后验 p(z∣x)(这个不等式又是怎么来的?)
- 于是,得到了证据下界(ELBO):(虽然但是为什么正号变负号了?)
ELBO有两部分:
- 第一项
是重构误差,表示通过 z 生成 x 的质量。
- 第二项
是KL散度,表示变分分布 q(z) 和先验 p(z) 之间的差异
VAE的训练目标就是最大化这个ELBO,即最小化KL散度和最大化重构误差。
Jensen不等式
Jensen不等式是一种关于凸函数(或凹函数)的不等式,它表明对于一个凸函数 f,如果我们有一个随机变量 X,那么
3. 训练过程
训练过程中,通过最小化损失函数来优化编码器和解码器的参数。这相当于最大化ELBO,从而优化模型使得生成的数据尽可能接近真实数据。
- 前向传播:输入数据 x,通过编码器和解码器生成
。
- 计算损失:计算重构误差和KL散度,得到总损失。
- 反向传播:通过反向传播算法更新编码器和解码器的参数 ϕ 和 θ。
- 迭代训练:重复上述步骤,直到模型收敛。
①编码器(Encoder)
编码器 q(z∣x) 将输入数据 x 映射到潜在空间中。与传统AE不同,编码器不会输出一个固定的向量,而是输出潜在变量的分布参数,通常是均值 μ(x)和方差 σ(x) 的一对向量。假设潜在变量 z 的分布是一个高斯分布,编码器输出的是这个高斯分布的参数:
②重参数化技巧
直接从高斯分布中采样会导致不连续性,无法进行梯度计算。通过引入一个随机变量 ϵ,使得采样过程可微,从而可以通过梯度下降法进行优化(为什么这样就可以优化呢?)
其中,ϵ∼N(0,I),这样可以保证 z 的采样是可微的,从而支持通过梯度下降进行优化。
为什么这样做可以优化?
解决了梯度计算的问题:尽管 z 是随机的,但 z 的计算(即 z=μ(x)+σ(x)⋅ϵ)可以看作是输入 x 和一个与 x 无关的随机变量 ϵ 的函数。
在这个过程中,ϵ 是一个固定的随机变量(在每次训练中都会重新采样),而 μ(x) 和 σ(x) 是与神经网络的参数相关的,可以通过网络的前向传播计算得到。因此,采样操作变成了一个 连续可微的过程,这使得我们能够通过反向传播来计算梯度,并优化神经网络的参数。
③解码器(Decoder):
解码器 p(x∣z) 接受从潜在空间中采样得到的 z,然后生成数据 x 的分布。通常我们假设解码器输出的是数据的条件概率分布,比如对于图像数据,解码器可能会输出像素的高斯分布。
④损失函数:
VAE的损失函数由两部分组成:
- 重构误差:度量输入数据 x 和生成数据
之间的差异,通常使用均方误差(MSE)或交叉熵损失。
- KL散度:度量编码器的变分分布 q(z∣x) 与先验分布 p(z) 之间的差异,通常是高斯分布之间的KL散度。
VAE的总体损失函数是:
其中:
- θ和 ϕ分别是解码器和编码器的参数。
- 第一个项是重构误差,表示生成数据与输入数据之间的相似度。
- 第二项是KL散度,表示潜在空间分布与先验分布之间的差异。
4.应用
图像生成、图像修复与去噪、数据压缩与降维、异常检测、文本生成与建模、药物发现与分子生成、语音处理、推荐系统、多模态学习、强化学习、医学图像分析、艺术创作、时间序列分析、半监督学习........
在stable diffusion中的作用:
(1)VAE应用过程
-
编码器
将图像
压缩到潜在空间
,典型压缩比
。
-
解码器
解码器
将潜在变量
还原为图像
。
(2) 数学目标:变分下界(ELBO)
VAE的损失函数为:
(3) 在Stable Diffusion中的作用
-
降维加速:将512x512图像压缩为64x64潜在变量,减少扩散过程的计算量(内存和计算量降低约64倍)。
-
连续性保证:潜在空间的平滑性使扩散过程更稳定,避免像素空间的高频噪声干扰。