第7章:生成模型
变分自编码器(VAE)
1. 基本概念
变分自编码器(Variational Autoencoder, VAE) 是一种结合了深度学习和概率图模型的生成模型。与传统的自编码器不同,VAE通过引入概率编码和解码过程,能够生成新的数据样本。
- 核心思想:VAE假设数据是由某个潜在变量(latent variable)生成的,并通过变分推断(variational inference)来学习潜在变量的分布。
- 关键组件:
- 编码器(Encoder):将输入数据映射到潜在空间的分布参数(均值和方差)。
- 解码器(Decoder):从潜在空间采样并重构输入数据。
- 重参数化技巧(Reparameterization Trick):使梯度可以通过随机采样的节点反向传播。
2. 数学原理
VAE的优化目标是最小化证据下界(ELBO, Evidence Lower Bound),其公式为:
其中:
- 第一项是重构损失,衡量解码器生成的数据与原始数据的相似度。
- 第二项是KL散度,约束编码器输出的分布与先验分布(通常为标准正态分布)的接近程度。
3. 模型架构
- 编码器网络:
- 输入:原始数据(如图像、文本)。
- 输出:潜在变量的均值()和方差()。
- 采样与重参数化:
- 从标准正态分布采样噪声 。
- 计算潜在变量 。
- 解码器网络:
- 输入:潜在变量 。
- 输出:重构的数据或生成的新数据。
4. 优势与特点
- 生成能力:可以生成连续且多样化的数据样本。
- 潜在空间结构:潜在变量具有明确的概率意义,支持插值和语义操作。
- 端到端训练:通过重参数化技巧实现梯度反向传播。
5. 应用场景
- 图像生成:如生成人脸、手写数字等。
- 数据补全:修复缺失或损坏的数据(如图像去噪)。
- 异常检测:通过重构误差识别异常样本。
6. 代码示例(PyTorch)
import torch
import torch.nn as nn
import torch.nn.functional as F
class VAE(nn.Module):
def __init__(self, input_dim, latent_dim):
super(VAE, self).__init__()
# 编码器
self.encoder = nn.Sequential(
nn.Linear(input_dim, 512),
nn.ReLU(),
nn.Linear(512, 256),
nn.ReLU(),
)
self.fc_mu = nn.Linear(256, latent_dim)
self.fc_var = nn.Linear(256, latent_dim)
# 解码器
self.decoder = nn.Sequential(
nn.Linear(latent_dim, 256),
nn.ReLU(),
nn.Linear(256, 512),
nn.ReLU(),
nn.Linear(512, input_dim),
nn.Sigmoid()
)
def encode(self, x):
h = self.encoder(x)
return self.fc_mu(h), self.fc_var(h)
def reparameterize(self, mu, logvar):
std = torch.exp(0.5 * logvar)
eps = torch.randn_like(std)
return mu + eps * std
def decode(self, z):
return self.decoder(z)
def forward(self, x):
mu, logvar = self.encode(x)
z = self.reparameterize(mu, logvar)
return self.decode(z), mu, logvar
# 损失函数
def loss_function(recon_x, x, mu, logvar):
BCE = F.binary_cross_entropy(recon_x, x, reduction='sum')
KLD = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())
return BCE + KLD
7. 扩展阅读
- 改进模型:
- -VAE:通过调整KL散度的权重控制生成多样性与 disentanglement。
- VQ-VAE:结合向量量化的离散潜在空间。
- 与其他生成模型的对比:
- 相比GAN,VAE生成样本可能更模糊但训练更稳定。
- 相比扩散模型,VAE的计算效率更高。
注:VAE是生成模型中的重要方法,理解其概率背景和实现细节对掌握生成式AI至关重要。
