AutoEncoder和VAE

文章目录

  • 一、AutoEncoder(自编码器)
  • 二、De-noising AutoEncoder
  • 三、AE的其他应用
  • 四、VAE


一、AutoEncoder(自编码器)

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

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

AutoEncoder和VAE_第2张图片
 

二、De-noising AutoEncoder

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

三、AE的其他应用

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

四、VAE

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

你可能感兴趣的:(机器学习,人工智能,深度学习)