跳转至

变分自编码器 VAE

1 概念

  • 目的:变分自编码器 (Variational AutoEncoder,VAE),构建一个从隐变量 生成目标数据 的模型。其假设了服从某些常见的分布(比如正态分布或均匀分布),然后希望训练一个模型 ,这个模型能够将原来的概率分布映射到训练集的概率分布
  • 自编码器(AutoEncoder)作为生成模型的劣势:1626444514076
  • 上图是自编码器,其把输入的图片,通过编码器编码到,然后使用解码器
  • 可以使用作为损失函数,这样训练好后,就蕴含了输入数据的大部分信息。
  • 对于解码器,不能这个模型直接当做生成模型,在低维空间中随机生成某些向量,再喂给解码器来生成图片。
    • 这是没有显性对的分布进行建模,并不知道哪些能够生成有用的图片。
    • 而用于训练的数据也是有限的,只对有限的会进行响应。因为空间 十分庞大,在这个空间上随机采样不一定能得到有用的
  • 变分自编码器:显性的对的分布进行建模,给定一个简单的分布,将采样的空间缩小,使得自编码器成为一个合格的生成模型。

2 推导

2.1 初步想法

  • 假设:, 将看作一个服从标准多元高斯分布的变量,多维随机变量

  • 得到生成模型:可以认为数据集是由某个随机过程生成的,而是这个随机过程中的一个不可观测到的隐变量。则数据集的生成看成如下步骤:

  • 根据采样出样本

  • 然后根据, 从条件分布中采样出数据点

因此,对上述步骤建模

2.2 解码器

  • 架构图:1626450466216

  • 假设:给定后, 服从协方差为对角阵的多元高斯分布 因此,只需要输入, 让Decoder拟合出, 就可以得到分布

2.3 目标函数

2.3.1 统计视角下生成模型

  • 对于生成模型,从统计视角看模板是对数据本身的分布进行建模。如果成功使用来逼近, 那k可以从中进行采样,生成一些可能的数据点
  • 得到后,则使得较大的可能就是比较正常的生成对象

2.3.2 函数推导

  • 前提:假设有数据集,且有分布。因此有:

  • 极大似然估计(MLE):使用最大似然估计的思想,去优化参数

  • 代价极大:

  • 的维度较大,而对于, 与其强相关的是有限的。

  • 如果在进行采样,需要极大量的采样。

2.4 编码器

  • 原理:在Encoder引入后验分布。在前向传播时,把传入Encoder,并得到。从分布中进行采样后得到。之后把喂给Decoder,得到的分布。最后使用MLE去优化模型。

1626501445734

  • 后验分布的理解:Encoder中,把先验分布用后验分布代替。

去掉(理解不太对):

之所以可以这么做,这是因为式中: 其中,是总的采样数目。是和相关的集合,是不相关的集合。可以看出,如果要最小化, 只需要考虑相关的集合部分的极值即可,也就是和强相关的那部分。

这样做的原因是为了把不同分布分开,使得每个都可以从其相关性较大的中采样。

  • 为了得到, 使用一个网络来拟合该分布

  • 由于先验分布,似然分布也符合高斯分布,由贝叶斯估计中可以得到,高斯分布的共轭分布仍然是高斯分布,因此也符合高斯分布,因此可以设

  • 通过Encoder进行拟合,其是一个拥有对角协方差矩阵的多元高斯分布

2.5 构架

  • 构架图:1626502712377

其中表示的二维特征

  • VAE 流程

  • 给Encoder输入, 得到分布的均值和方差

  • 采样出, 该代表了和相似的一类样本
  • 输入到Decoder, 得到分布的均值和方向
  • 从分布中进行采样,来生成可能的数据点。也可以直接拿当作数据点

NOTE: 人们一般认为的方差是固定的,因此当作超参数,而不是被Decoder进行输出

2.6 重参化技巧

  • 构架图:1626514056212

  • 重参化技巧(Reparameterization Trick):

  • 前向传播的第2步,调用了一个"采样函数",从采样出。这个是无法进行反向传播

  • 因此,再通过Encoder得到后,然后采样,然后令,其中是Hadamard积,可以看出仍然服从正态分布。

  • 这样,可以把看作是伴作一起输入到Decoder的特征

2.7 经验下限(变分下界)

  • 经验下限被称作 ELBO (Empirical Lower Bound),通过变分法求得

  • 此时最大化中的

  • 其中散度, 因此的经验下限,可以通过变分法证明了

  • 进行变换,转而求的最大值

  • 只需要最大化,则被最大化的同时,被最小化

  • 最大化,相当于最大似然估计
  • 最小化, 相对于最小化近似后验和真实后验的差距,否则的话Encoder可能只能输出一些无意义的分布。如果没有这一项,则模型只为了使得似然概率更大,可能会使得方差为0,而加上这一项有效的避免了这种情况,保证了模型的生成能力。

  • 展开,得到

  • 其中对进行计算:

  • 已知:, 假设

  • 因此,有

    • 尝试向量运算,失败了:

    • 由于各分量独立的多元正态分布,因此可以从一元导出,对于一元来说

    • 因为对正态分布

    • 因此有

    • 拓展到协方差为对角阵的多元正态分布

  • 对于,称为

    • 可以在进行采样,然后可以近似得到

    • 接下来,只需要计算,前面假设了。并且假设维度是, 因此可以算出

2.8 损失函数

  • 结合, 可以看出损失函数为 其中,是采样于,不同于前文采样于

  • 之前采样,采样出来和相关的概率很低,因此需要大量的采样

  • 而上式,随着训练次数增加逼近于真实的后验分布,因此可以在有限次数的采样中采样出和关联较大的

  • 在实际操作中,一般取 在前文中提到,一般把的方差当作固定超参数,当其为每一个元素均为维向量时,得到高斯分布的情况下,VAE最终的损失函数:

  • 是第个样本,表示Encoder第个输入

  • 是Encoder输出,表示的参数

  • 是从采样出的一个样本,是Decoder的输入

  • 是Decoder的输出,表示利用解码后的

2.9 如何生成样本

  • 在最终的 中,包含了项,其使得靠拢。若所有的都很接近标准正态分布,那么根据定义有

  • 因此,训练好VAE后,只需要在采样喂给Decoder即可生成可能得数据点

3 条件VAE(Conditional VAE)

  • 背景:
  • 在VAE中,可以在采样喂给Decoder即可生成新的数据点,但是不能控制数据点的类别。
  • 然而有时候,我们需要控制数据点的类别。例如MNIST手写数字的例子,原版VAE只能采样得到后随机生成数字。然而,更多的时候我们可能会希望模型能够生成我们指定的数字
  • 例如有数据集, 其中。想通过来控制生成的结果,需要引入CVAE
  • 流程:
  • 原来是对建模,现在对进行建模
  • 原来对进行建模,现在对进行建模
  • 原来Decoder是对似然分布建模,现在需要对进行建模
  • 原来Encoder对近似后验分布进行建模,现在对进行建模
  • 只要对不同的, 有不同的Encoder、Decoder即可。一个直观方法就是把当作Encoder和Decoder的输入即可。