VAE变分自编码
VAE 变分自编码器
https://blog.csdn.net/smileyan9/article/details/107362252
https://blog.csdn.net/Je1zvz/article/details/136276851
[1606.05908] Tutorial on Variational Autoencoders (arxiv.org)
VAE是一种基于贝叶斯推理的生成模型,它通过编码器将数据映射到潜在空间,然后通过解码器从潜在空间重构数据。
相关背景
生成模型(Generative model):
生成模型是指能够随机生成观测数据的模型,尤其是在给定某些隐含参数的条件下。它给观测值和标注数据序列指定一个联合概率分布。换句话说,生成模型首先研究的是特征 X 与标签 y之间的联合分布,然后再求条件概率 P(y|X) ,预测时应用最大后验概率法得到预测结果。
论文(Tuturial on Variational Autoencoders)中举例如下:
- 图像是一种流行的数据,我们可以为其创建生成模型。每个“数据点”(图像)都有数千或数百万个维度(像素),生成模型的任务是以某种方式捕捉像素之间的依赖关系,例如,附近的像素具有相似的颜色,并被组织成对象。“捕获”这些依赖项的确切含义取决于我们要对模型做什么。一种简单明了的生成模型允许我们用数值计算 P(X) 。在图像的情况下,看起来像真实图像的 X XX 值应该得到高概率,而看起来像随机噪声的图像应该得到低概率。然而,像这样的模型并不一定有用:知道一个图像不太可能帮助我们合成一个相似的图像。
关于生成模型的相关概念与例子请自行搜索查询资料。
隐变量模型(Latent Variable Models)
- 隐变量: 不可直接观测的综合性变量。
- 隐变量模型: 隐变量模型是一种概率模型,其中某些变量是不可观测的。(即包隐变量的概率模型)A latent variable model is a probability model for which certain variables are never observed.
借用这篇论文中的例子,在生成手写数字的过程中(0~9),如果数字的左半部分包含数字 5 的左半部分,则右半部分不能包含 0 的左半部分,否则字符将很明显看起来不像任何真正的数字。简单来说,如果模型在给任何像素赋值之前,先决定生成哪个字符(或者说具有某种特征的字符),这对生成字符这个工作将会很有帮助。这种决定在形式上被称为 隐变量(Latent Variable)。
也就是说,在我们的模型生成任何数据之前,它首先从集合 [0,1,…,9] 中随机抽取一个数字值 z,然后确保接下来生成的数值中的笔划都与该字符匹配。 z之所以称为 “latent”,是因为我们需要的是模型产生一个字符,但是我们并不清楚模型是使用了哪些隐变量而产生这个字符的。
自编码器 (AutoEncoder)
自编码器是一类在半监督学习和非监督学习中使用的人工神经网络,其功能是通过将输入信息作为学习目标,对输入信息进行表征学习。
AutoEncoder 包括 编码器(Encoder) 和 解码器(Decoder) 两部分。Encoder 过程是将原先的数据(常用于图像方向)压缩为低维向量;Decoder 则是把低维向量还原为原来数据。
因为自编码常用于图像方向,因为一张图每一个像素点都被看作是一个特征,所以随便一张现实中的图都属于高维向量。所以很多教程直接把这里提到的数据用 图片 来代替,Decoder 的过程也就是转换为原来的图像。
这里借用的是百度百科的图片:
自编码器具有以下几个特点:
- 非监督学习 (Unsupervised Learning)
- 是一种前馈神经网络,没有任何反馈
- 是一种生成模型
- 具有较好的特征提取能力
- 它的降维可以是非线性的,而 PCA 是线性的
- 常用于 特征提取、文档检索、分类和异常检测
变分自编码 (Variational AutoEncoder)
VAE 模型是一种包含隐变量的生成模型,它利用神经网络训练得到两个函数(也称为推断网络和生成网络),进而生成输入数据中不包含的数据。
VAE 模型在生成多种复杂数据方面已经显示出了巨大的潜力,包括手写数字图像、人脸图像、门牌号图像、CIFAR 图像、场景物理模型、分割图像以及从静态图像进行预测等。
举一个例子(李宏毅老师的视频)
图片左边部分是 AutoEncoder 的简单例子:我们把一张满月的图片 Encoder 后得到 code,这个code被decoder 后又转换为满月图,弦月图也是如此。注意它们直接的一对一关系。
图片右边部分是 VAE 的简单例子,在 code 中添加一些 noise,这样可以让在满月对应 noise 范围内的code 都可以转换为满月,弦月对应的noise 范围内的code也能转换成弦月。
但当我们在code中进行采样时,在不是满月和弦月对应的noise的code中采样时,decoder出来的图片可能是介于满月和弦月之间的图。
也就是说,VAE 产生了输入数据中不包含的数据,(可以认为产生了含有某种特定信息的新的数据),而 AE 只能产生尽可能接近或者就是以前的数据(当数据简单时,编码解码损耗少时)。
图片左边那个问号的意思是当对 AE 中的code进行随机采样时,它介于满月与弦月之间的数据,decoder后可能会输出什么?
可能会输出满月,可能会输出弦月,但是最有可能输出的是奇奇怪怪的图片。
AE与VAE的区别(chatGPT):VAE在AE的基础上引入了概率建模
结构:
- AE:由编码器和解码器两部分组成。编码器将输入数据压缩成低维表示,解码器则从该表示重建输入数据。
- VAE:在AE的基础上,编码器输出的是输入数据的潜在分布的参数(均值和方差),而不是直接的潜在表示。解码器则从这个分布中采样来生成重建数据。
损失函数:
- AE:使用重建误差(如均方误差)作为损失函数,衡量重建数据与原始数据之间的差距。
- VAE:损失函数由两部分组成:重建误差和KL散度。KL散度衡量潜在分布与标准正态分布之间的差异,促使潜在空间的分布更为平滑和连续。
VAE 中隐藏层服从高斯分布,AE 中的隐藏层无分布要求
训练时,AE 训练得到 Encoder 和 Decoder 模型,而 VAE 除了得到这两个模型,还获得了隐藏层的分布模型(即高斯分布的均值与方差)
AE 只能重构输入数据X,而 VAE 可以生成含有输入数据某些特征与参数的新数据。