变分自动编码器(VAE variational autoencoder)

变分自动编码器:原理与应用解析


禁止转载

自动编码器 AutoEncoder

  • 组成 Components:

    • 编码器 Encoder: X → Z X \rightarrow Z XZ
    • 解码器 Decoder: Z → X ^ Z \rightarrow \hat X ZX^
    • 其中, X X X为训练集输入; Z Z Z为隐变量 latent variable
  • 应用场景 Applications:

    • 自动编码器:输入和输出尽可能相似
      在这里插入图片描述

    • 去噪模型 Denoising: 去除图像噪声(去水印也可)
      在这里插入图片描述

    • 压缩模型 Compression:将图像使用低维隐变量表示,结果传输后在接收端使用解压缩恢复图像
      在这里插入图片描述

    • 异常检测 Anomaly detector:根据损失大小检测图像是否和训练集同分布
      在这里插入图片描述

    • 生成器 Generator:将随机向量映射成有意义的数据
      在这里插入图片描述

  • 注意 Note: 编码器的降维过程如果使用无非线性激活函数的单层CNN,那么它将等效于PCA

变分推断 Variational Inference

  1. 引入 Introduction
    • 动机 Motivation: 作为一个生成器来说,随机采样生成的向量 Z Z Z很难通过解码器Decoder对应到有意义的数据,导致生成器模型失败。
    • 解决方案 Solution:假定 Z Z Z服从某分布,通过前半部分预测分布参数,随后从分布中采样得到可能对应有意义数据的 Z Z Z
    • 一些事实 Some Facts: d d d维的任意分布可以被一系列 d d d维的正态分布和一个将它们映射的一个足够复杂的函数来表示。
      在这里插入图片描述
  2. 方法和讨论 Methods&Discussion:
    • 数学说明:对于编码器这个过程,条件概率公式可由贝叶斯公式表达,其中 P ( X ) P(X) P(X) 一般是高维数据,计算复杂intractable。
      在这里插入图片描述

    • 对于上述问题,有两种解决方案:Monte Carlo方法(基于采样的方法?),变分推断方法。变分推断使用另一个分布来近似不可求解的分布,这一过程是通过最小化两个分布之间的KL散度实现的。

    • KL散度 divergence:
      在这里插入图片描述

      • K L ≥ 0 KL \geq 0 KL0
      • KL散度不是对称的, q q q p p p的KL散度和 p p p q q q的KL散度不同
    • 综上可得下式,对于给定的 X X X,左式是固定的,对于右式来说,最小化第一项等同于最大化第二项,并且由于第二项+第一项(KL散度),所以左式恨大于等于第二项,第二项故又称为变分下限variational lower bound,它也是我们需要优化的项。
      在这里插入图片描述

    • 关于上式为什么选择 K L ( q ∣ ∣ p ) KL(q||p) KL(q∣∣p):假定 p p p是一个多峰的真实分布, q q q是期待用来近似 p p p的可求解分布,则从下图结合KL散度的计算公式可得到解答。
      在这里插入图片描述

    • 对第二项进行变换得到两项,第一项实际上维感知损失,常见的有交叉熵误差、均方误差等,第二项表示 q q q p p p的散度。
      -

    • 模型的结构如下所示,编码器估计隐变量分布的参数,隐变量的分布一般假定为正态分布,采样得到的隐变量输入给解码器得到输出,但是此时存在一些问题:基于梯度下降的算法无法更新网络参数,因为采样操作在模型中引入了不确定节点,导致无法求解梯度。可以通过重参数的化的方法进行解决,即 Z = Σ ∗ θ + μ Z=\Sigma * \theta + \mu Z=Σθ+μ,其中 θ \theta θ是服从标准正太分布,通过采样得到,这样就把随机节点移除了。

在这里插入图片描述
在这里插入图片描述

变分自动编码器 Variational AutoEncoder

  • 未重参数化的VAE结构(左)和重参数化之后的VAE结构(右)
    在这里插入图片描述
  • 总结
    在这里插入图片描述

条件变分自动编码器 Conditional Variational AutoEncoder

  • 在编码器和解码器都引入输入
    在这里插入图片描述

实验 Experiments

  • 实验结果
    在这里插入图片描述

声明

  • 第一节中的图片来源于李宏毅老师的课件
  • Tutorial on Variational Autoencoders
  • https://www.youtube.com/watch?v=uaaqyVS9-rM
变分自编码器(VAE)是一种深度学习模型,主要用于生成新的、类似训练数据的内容。它结合了自编码器(AE)的无监督特征学习和变分推断的概念。设计和实现VAE通常包含以下几个步骤: 1. **数据预处理**:首先对输入数据进行标准化或归一化,以便于神经网络处理。 2. **构建编码器**:编码器是一个接收输入数据并将其映射到潜在空间(如高斯分布)的函数。常用架构可以是多层感知器(MLP),对于复杂的数据结构,可能需要使用卷积神经网络(CNN)或循环神经网络(RNN)。 ```python import torch from torch import nn class Encoder(nn.Module): def __init__(self, input_dim, latent_dim): super(Encoder, self).__init__() # ...此处添加适当的层数和节点数,如全连接层或卷积层... self.fc1 = nn.Linear(input_dim, hidden_dim) self.fc2 = nn.Linear(hidden_dim, latent_dim * 2) # 输出均值和方差参数 def forward(self, x): h = torch.relu(self.fc1(x)) z_mean, z_log_var = self.fc2(h).chunk(2, dim=-1) return z_mean, z_log_var ``` 3. **构建解码器**:解码器负责从潜在空间将数据重建回原始空间。同样,可以选择合适的网络结构适应复杂数据。 ```python class Decoder(nn.Module): def __init__(self, latent_dim, output_dim): super(Decoder, self).__init__() # ...添加适当的层,比如线性层,反卷积层等... self.fc1 = nn.Linear(latent_dim, hidden_dim) self.fc2 = nn.Linear(hidden_dim, output_dim) def forward(self, z): h = torch.relu(self.fc1(z)) reconstructed_x = torch.sigmoid(self.fc2(h)) # 对二进制数据如图像使用sigmoid激活 return reconstructed_x ``` 4. **计算损失**:使用KL散度衡量编码器生成的潜在变量与标准正态分布之间的差异,并与重构误差相加作为总损失。 ```python def loss_function(recon_x, x, z_mean, z_log_var): BCE = F.binary_cross_entropy(recon_x, x.view(-1, x.size(1))) KLD = -0.5 * torch.sum(1 + z_log_var - z_mean.pow(2) - z_log_var.exp()) return BCE + KLD ``` 5. **训练模型**:使用Adam或其他优化器更新网络权重,同时监控损失函数的变化。 ```python def train(model, dataloader, epochs, learning_rate): optimizer = Adam(model.parameters(), lr=learning_rate) for epoch in range(epochs): for data, _ in dataloader: # ...进行前向传播、计算损失、反向传播和优化操作... ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值