Auto Encoder(AE),Denoising Auto Encoder(DAE), Variational Auto Encoder(VAE) 区别

文章主要内容参考李宏毅老师的机器学习课程:https://www.bilibili.com/video/BV1Wv411h7kN?p=70

Auto Encoder: 是什么?有什么用?

Auto Encoder 的思路特别简单,就是把高维信息编码为低维信息(encoder的工作),然后再尝试解码回原来的高维信息(decoder的工作),还要尽可能保证能恢复出原来的样子。其中,中间的低维信息被叫做 code, representation, bottleneck, Embedding等等,这里提一嘴,后面就会理解为什么这么叫。

你可能会问,为什么要这样做?有什么用?

首先他是一个无监督的机器学习方法,也就是说,不用人工标注数据集,有训练数据直接扔给模型,模型只管encode到低维信息,decode到高维信息就好了。

理想状态下,AE能将训练数据分布的冗余信息储存在模型的参数里,降维几乎是一定会损失信息的,但是encoder部分和decoder相互配合,能够将损失的部分配合补齐,与原来尽可能一致。

最近想到一个很理想的,最适合AE的例子,例子中可能会有纰漏,尽可能理解思想:

假设我们的输入的维度每个维度表示一个汉字,我的训练数据集都是7个字的文本,我们的中间表示 Embedding 是 2个字两维的文本。某一个理想情况下,输入都是类似“张三今天去学校”,“李四今天去学校”,“王五今天去学校”这样的,某某两个字名字加上“今天去学校”,那么模型就可以学到说,数据的分布中,后面的内容是固定的,encoder在降维的时候可以直接抛去后面的几个字,只保留关键的姓名作为Embedding传给Decoder,然后decoder也心领神会,直接在Embedding后面再补上额外的信息,又把低维信息变成高维了。

补一句,什么是低维信息,什么是高维信息?在实现或者模型里,其实本质就是向量维度,打个比方 [1,2,3,4] 就是四维向量,就比[1,2] 二维向量维度高。通常来说我们默认高维向量中存储更多的信息,直接把[1,2,3,4]转成[1,2]就丢失了信息。但是如果机器能学到看到[1,2]就恢复成[1,2,3,4],那就没有问题,但是如果训练数据集里有 [1,2,3,4] [1,2,4,3] ,那模型该怎么做呢?所以实际情况还是很复杂的,我们希望我们的(神经网络)能够配合学习出相应的规则。

那么从前面我举出的不那么合适的例子,引申到实际情况,就可能是一个64*64*3(高和宽都是64像素的RGB彩色图片)=12288维度的向量作为输入,进入Encoder的神经网络,一顿操作之后变成了1024维的Embedding向量,很明显维度降低,可能损失大量的信息,然后Decoder要尝试把Embedding再回复成原来的彩图,当然难度很大,所以 AE 就可以学习出一些较为精炼的语义信息,比如训练图片都是狗狗,我可以用一个维度表示狗狗的毛色,一个维度表示狗狗占画面的大小比例,一个维度表示品种等等,就可以用较少维度的信息,恢复出原图。当然哈,实际的Embedding几乎不太可能会有我描述的这么有语义的情况,如果有可能搞这部分的人该乐开花了,当然我也是初学,可能有相关的文章大佬评论区推荐哈。

本来想写短文的……一下子又臭又长……

OK,赶紧进入正题,AE有什么用?很明显,如果我把中间的 Embedding 拿出来,那某种意义讲,如果我带着 Decoder 模型,我就有了一个原来数据的压缩,比如原来10000维的数据我压缩到了1000维,如果数据类型一致,那不就是直接10%压缩率起飞?其次,我随便生成一个随机向量,把它当成Embedding送给Decoder,会不会生成一些类似训练集的数据?如果我给AE喂的都是世界名画,随便扔一个Embedding进去我是不是就名画收藏+1?当然实际可能会有各种各样的问题hhh,这就是生成。最后,很明显,就像我举的例子,AE只能对它的训练数据集内的数据进行编码解码,如果我找一个训练集外的数据,AE可能会恢复成四不像,所以我找一个数据送进AE,看和原来像不像,如果像那这个数据大概率比较符合训练集的分布,如果和原来大相径庭,那么很明显这是一个离群数据,所以我们可以拿来做异常检测。

DAE:Denoising AutoEncoder

Vincent P, Larochelle H, Bengio Y, et al. Extracting and composing robust features with denoising autoencoders[C]//Proceedings of the 25th international conference on Machine learning. 2008: 1096-1103.  谷歌学术引用:6429

DAE是一个常见的变体,原来我们要还原的是原来的图片,现在我们给训练数据加一个噪声(其实就可以是符合一些分布的随机数),然后还要让decoder还原出没加噪声的图片。所以相当于让 DAE 还要额外学会去噪。

PS:李宏毅老师在这里直接一波联系到BERT,Masking 其实也是某种角度的加噪声。

VAE:Variational AutoEncoder

参考资料:

论文:Kingma D P, Welling M. Auto-encoding variational bayes[J]. arXiv preprint arXiv:1312.6114, 2013.  谷歌学术引用:18901

https://arxiv.org/abs/1312.6114icon-default.png?t=M1L8https://arxiv.org/abs/1312.6114 

PyTorch-VAE/vanilla_vae.py at master · AntixK/PyTorch-VAE · GitHub Vanilla VAE 实现

GitHub - AntixK/PyTorch-VAE: A Collection of Variational Autoencoders (VAE) in PyTorch.  VAE 及各种变体的 Pytorch 实现集合

https://medium.com/dataseries/variational-autoencoder-with-pytorch-2d359cbf027b Eugenia Anello 的 VAE 教程博客

怨不得上网搜了好多 VAE 的介绍都不是我想要的……这原文就很硬啊,Variational 指的是 variational Bayesian (VB)。数学弱鸡低头。

看了一圈,大致懂意思了,升级 AE 到 VAE 的原因是,普通 AE 在训练后,中间的 Embedding 很有可能是不平滑的,大致意思就是说, Embedding简单的改变,可能会让 Decode 出来的东西差的很多,而我们可能会希望 Embedding 空间中两个距离相近的 Embedding,Decode 出来的东西也应该比较接近,这样的模型也往往更鲁棒,不会Decode出奇奇怪怪的东西。

那怎么办?

VAE 的解决思路是,原来 Encoder 输出的是一个 Embedding 低维度向量,现在我们让他不是输出某一个特定的 Embedding,而是输出一个 Embedding 的 (正态)分布 Distribution。具体来说,如果 Embedding 的维度是D, Encoder 会输出两个 D 维向量,分别表示每个维度的期望和标准差。有期望和标准差,我们就确定了一个正态分布(对于 Embedding 的每个维度),所以我们就可以把 Embedding 中的每个维度进行采样,来得到一个 Embedding,这个 Embedding 才是之后送给 Decoder 的输入。值得一提的是,Encoder输出的是分布,而送入Decoder的是特定的采样,这一步是离散的,无法微分,所以无法梯度下降优化,所以在实际写代码的时候会有 trick,这里建议想要深挖的同学在搜索一下,相对比较复杂,超过了这篇文章的深度(其实是我没看太深)

然后是定义损失函数,与 AE 相同,VAE 也要尽可能让 Decode 出来的结果尽可能与输入相似,除此之外通常还会有一个 KL 散度的正则化项,关于 KL散度也是机器学习的数学基础,抽象来讲可以评估两个分布的接近程度,这里损失函数还包括一个评估 Encoder 输出的分布与标准正态分布(均值为0,方差为1)的区别,作用就是传统正则化的作用。

那么点题一下,VAE 和 AE 有什么区别呢?

首先,Encoder 部分存在不同,Encoder 输出的是一个概率分布,通过采样得到的Embedding才会送给Decoder。

其次,损失函数加入了 Encoder 的正则化项,让 Encoder 输出的分布尽可能接近标准正态分布。

最后,VAE 还有很多变体,这里也不展开介绍分析。

最最后,建议结合代码,打开 Colab 跑一下,应该会获益匪浅。

PS:感觉自己平时CSDN用的多还是快速的查找一些问题,之后也会写一些简单的短文。

PPS:文中出现的信息和维度等概念,还是尽可能参见正式定义,文中为了便于阐述,可能出现了很多名词的不恰当使用。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值