AutoEncoder和VAE

自编码器(AE)是一种无监督学习模型,用于数据压缩、降维和特征提取。其通过编码器和解码器实现输入数据的重建。De-noising AE通过训练去除输入数据的噪声,可用于图像降噪等任务。AE还可应用于分类、异常检测和数据生成。变分自编码器(VAE)引入概率分布,使得隐藏层向量能表示连续变化的特征,适用于复杂数据的生成。VAE的损失函数包括重建损失和KL散度,通过重参数技巧解决采样不可导的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、AutoEncoder(自编码器)

AE是一种左右几乎对称的网络模型(之所以说几乎是因为也可以不需要完全对称),左边的结构称为编码器encoder,右边的结构称为解码器decoder,如下图所示
 
在这里插入图片描述
AE的不需要有label的数据,因为它的优化目标是重建输入。当然,我们的最终目的并不是得到一个这样一个训练好的左右对称的网络,通常是结合应用场景,在网络的某一个部分上做文章。
 
AE的应用比较广泛,最直观的应用就是数据的压缩(有损)和解压缩,数据降维,换一种思路,一个训练好的AE,隐藏层向量(瓶颈)可以看作是一种对于原始数据信息的精炼提取,其中包含了关于输入数据的关键信息。
 
设想输入是一个人的声音,隐藏层的向量包含了这个声音的关键信息,比如,说话人的声音特性,这句话包含的内容等等,将这些关键信息进行解构就是Feature Disentangle的任务,如下图所示,分别训练一个男声的AE和女声的AE,将男声的说话内容和女声的声音特性进行结合,就完成了一个粗糙的声音转换功能。
 
一个优秀的AE应该做到两点:

  1. 对于输入的变化足够的敏感,以至于可以更好的重建不同的输入;
  2. 对于输入也不能太敏感,以至于网络直接记忆了输入(网络中权重都为1),从而没有学习到任何东西(overfitting)。
    以上两点刚好对应与AE的损失函数中的重建损失和对于瓶颈向量的正则化

在这里插入图片描述
 

二、De-noising AutoEncoder

在输入数据上加上特定的噪音,然后喂进AE中进行训练,训练使用的损失函数依然是重构数据和原始数据(未加噪音之前)之间的差异。
如此一个训练好的AE就可以完成降噪功能,比如图片降噪,图片去水印,语音降噪。
 
在这里插入图片描述
 

三、AE的其他应用

分类任务:给瓶颈处的向量做一些约束,比如约束为二进制数据,或者one-hot vector,就可以做一些分类任务。
 
异常检测:使用一批正常的数据训练好AE,然后将AE放到检测环境中,如果某个数据能很好的被该AE重建,我们就可以说这个数据是正常数据,相反,如果某个数据reconstruction loss很大,就将这条数据当作异常数据。
 
数据生成:将训练好的AE的解码器部分单独拿出来,使用某个特定分布采样的数据放入解码器,可以进行数据生成。
 

四、VAE

变分自编码器(variational-auto encoder)在AE的基础上对隐藏层做出了一些改变,将概率分布引入了AE。
如果说AE中瓶颈向量是一个single value(离散值)。举个例子,输入一个laughing的人物图片,隐藏层向量第一维代表了laughing的程度,数字越大代表laughing越大,但是如何处理蒙娜丽莎的微笑呢,这似乎并不是一件很确定的是,用概率来描述似乎更合理,如下图所示:
在这里插入图片描述
使用VAE,瓶颈向量就成了一个各个关键特征的分布的采样,如此这般,隐藏层向量某个维度的大小就成为了某种特征的连续变化的代表。VAE结构如下图所示,隐藏层有两个向量,一个代表分布的均值,一个代表分布的方差,输入deocder的向量就是利用这些均值和标准差采样出来的。
在这里插入图片描述
 
VAE的损失函数有两项,一项是重建损失,一项是约束隐藏层的KL散度,一般假设隐藏层特征符合标准正态分布。
 
上述的结构乍一看很合理,但是实际优化的时候会有问题,神经网络参数优化依赖反向传播,需要层与层之间是可导的关系,但是采样是个什么鬼,怎么可能可导呢。这里需要一个trick,reparameter-trick(重参数技巧),先从一个标准正态分布中采样出一个向量,向量维度和隐藏层维度相同,然后将其乘epsilon标准差向量加上均值向量得到可以反向传播的decoder输入,如下图所示:
在这里插入图片描述

变分自编码器(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: # ...进行前向传播、计算损失、反向传播优化操作... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值