AE(自动编码器)和VAE(变分自动编码器)

前言

github:https://github.com/lxk-yb/pytorch-AE

1.AE(自动编码器)

1.1 介绍

自编码器是一种无监督学习技术,利用神经网络进行表征学习。也就是说,我们设计一个在网络中施加“瓶颈”,迫使原始输入压缩知识表示的神经网络架构。如果输入特征彼此独立,则该压缩和随后的重构将是非常困难的任务。但是,如果数据中存在某种结构(即输入特征之间存在相关性),则可以学习这种结构,并在强制输入通过网络的瓶颈时使用。
在这里插入图片描述
通过自编码器的原理可以推断出它的主要用途:
设置合适的维度和稀疏约束,自编码器可以学习到PCA等技术更有意思的数据投影。

自编码器能从数据样本中进行无监督学习,这意味着可以将这个算法应用到某个数据集中,来取得良好的性能,且不需要任何新的特征工程,只需要适当地训练数据。

1.2 自动编码器的结构

AE分为两个部分:编码器和解码器。编码器可以是任意模型,现在一般都使用卷积神经网络。输入一张图片经过编码器得到潜变量,类似于降维,得到这张图片的主要成分,然后再通过解码网络进行恢复出原图,所以判断编码和解码网络好坏的 L o s s 1 = M S E ( i n p u t , o u t p u t ) Loss1=MSE(input,output) 那这个降维得到的潜变量代表什么意思呢?以MNIST为例, 潜变量 Z Z 就是一个内在的变量, 比如输入一张数字 “7”图片,写这个数字需要什么元素呢?需要一横一竖,横竖之间需要一定的角度。这些元素就是该数字的潜变量。单个潜变量元素分析是没有意义的,也是未知的,稍微改变这个潜变量或者不改变,都能得到数字 “7”,只不过会有偏移,比如粗细,胖瘦,倾斜角度。

如果以一张具体的图片为示例的话,经过encoder,可能网络学到了如何来表达这张图片,每一个维度的向量代表构成这张图片的某一特征信息。
在这里插入图片描述
此时AE的局限性也体现出来了,因为网络只学习了encoder和decoder,他只学习到了如何去复现一张图片,在这里有人提出了疑问,是不是网络只是机械的记忆并且复现出来,完全没有学习到图片本身的特征,证明这一说法的证据就是当你随机性的改变code的时候,可能此时的输出是跟原图完全不相关的输出。也就是没法根据图片本身的特征来学习到一些东西,此时人们想出了一种办法就是后面要介绍的变分自动编码器(VAE)

2.VAE(变分自动编码器)

相比于自编码器,VAE更倾向于数据生成。只要训练好了decoder,我们就可以从标准正态分布生成数据作为解码器的输入,来生成类似但不同于训练数据的新样本,作用类似GAN。VAE的结构整体上来看跟AE很相似,但是中间生成code的过程有一些不同,结构如图所示
在这里插入图片描述
这里可以直观地认为中间code的生成需要更多的因素参与,在未了解它的原理之前可以认为code因此包含了更多的信息,可能真正学习到了所输入图片的某些特征,因此它的code能够真正实现每个维度包含一个特征,可以通过改变它的code来实现输出图片中某一个特征的变换

同时它的目标也更为复杂,由两部分组成
在这里插入图片描述
在这里插入图片描述

  • 第一部分可以理解为code经过decoder后的输出与原始图片的区别
  • 第二部分就是限制中间生成code的一系列参数,后续会详细推导

2.1推导

直观理解

在这里插入图片描述
首先来看中间黄色的部分参数,直观的考虑的话这一部分相当于再给生成的code捣乱,虽然人为的想法是通过加一些干扰使中间生成的code学习到更多有用的特征,但是如果直接放在程序中训练的话,为了单纯的保证decoder后的输出和原图的损失最小,机器可能自动地认为,把黄色部分全部置0可以最快速的达到目标,但是显然这不是我们所期望的。因为我们需要强迫的加上一些限制,来保证黄色部分有效的参与到训练当中,也就是刚才提到的第二部分约束
在这里插入图片描述
形象化的来看
在这里插入图片描述
可以从图中得出结论 σ i \sigma_i 在等于0的时候,绿色的部分也就是约束的部分取得一个最小值,此时在 σ i = 0 \sigma_i=0 时,相对应的 e x p ( σ i ) exp(\sigma_i) 为1,这就可以使网络综合的权衡利弊了

理论推导

高斯混合模型,简单的理解就是,整个一个复杂的函数分布,是由多个高斯分布组合而成
在这里插入图片描述
图中画的非常详细,首先要考虑从哪一个Gaussian中选取,在选好Gaussian后再考虑它的概率
在这里插入图片描述
在这里插入图片描述
上图中最后一块不等式就是我们最终要求的形式,把整个式子化程KL散度和lower bound( L b L_b )的和的形式,我们所期望的就是尽可能地压缩KL散度的占比,做到decoder输出的图和原图尽可能地相似(套入到VAE终究是,通过随机改变code的值所生成的output尽量跟原图风格相似)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述