[读书笔记] Variational AutoEncoders


此读书笔记来自于Joseph Rocca的Understanding Variational Autoencoders (VAEs),非常推荐阅读原文。

1. Generative Model (生成式模型)简述

在深度学习模型范畴中,区别于图像分类、检测、分割等领域中的各种经典模型,

  1. 从模型的目标而言,上述经典模型致力于对输入数据判定类别、bounding box或segment area,而Generative Model的目的在于学习输入数据的分布,以生成更多的样本;

  2. 从训练数据而言,上述经典模型必须依赖于groundtruth annotation,而Generative Model能不一定强依赖于annotation,如给定一个人脸数据集,完全可以不依赖于任何的annotation也可以生成新的人脸,但若希望生成“特殊条件”的人脸,如长头发的人脸,则训练过程依然需要提供相应的annotation。

2. 简单生成模型 AutoEncoders

AutoEncoder结构图

2.1 结构

AutoEncoders包含了一个encoder和decoder的经典结构,

  • encoder的作用是将输入从原空间映射到latent space,往往latent space的数据维度是要小于原空间的。
  • decoder则是将latent space中的数据重新映射回与原空间维度完全一致的新空间。

AutoEncoder的训练目标是通过Encoder和Decoder的变换后,能尽可能地保持输入数据地信息完整性,即 x = x x=x x=x.

在这样的结构里,decoder就起到了一个样本生成的一个作用:设想若以成功训练好了AutoEncoder,我们完全可以单独将decoder拿出来,输入一些random的signal或者在原latent space sample中加入random signal,即可生成出原数据中不存在的数据。

AutoEncoder的应用场景(它还能用来干什么):
Dimensionality Reduction(数据降维):通过Encoder可以将数据维度大大降低,而且decoder的存在可以极大地保证了降维后的数据仍包含了原数据的信息量,基于此可以较好地恢复回原来的样子。

2.2 不足

AutoEncoder的致命不足:无法保证生成数据的泛化性,即生成的数据与原数据并不能完全保证是同分布的。借用Joseph的一个图来说明这个问题。
图来源于Joseph
造成这种现象的根本问题在于两点:

  1. 模型并不理解noise:尽管decoder能对任何latent space空间的都能映射到原空间,但这种映射的pattern在训练数据和测试数据上是存在gap的。训练过程中decoder的输入其实可以认为是原空间的fixed point,在测试过程中加入的noise对于decoder来说是unseen和unknown的,decoder是没有机制保证加噪后的输出质量的。

  2. 过拟合(Overfitting):可以想象一个极端的例子,latent space就只有一维,当decoder的参数量大到一定程度,依然能完美地拟合训练数据,但这样的模型却是无意义的。当然,这样的例子有点极端,并不具备代表性,但这种缺乏约束和规范的结构实际上确实是很容易收到overfit的影响。

那在训练过程中,每次对decoder的输入加入噪声,是否可行?
答案依然是No,原因依然是上述两点,当加入噪声之后,decoder是能处理noise了,但是模型依然可以狡猾地将不同sample在latent space的分布极大地区分开来,以大大降低noise的作用。依然借用Joseph的一个图说明这个问题。
图来源于Joseph

来到这里,一个非常straight-forward的想法很自然地出来了:约束样本在latent space的分布,以让decoder能理解noise,从而保证泛化性。

Joseph总结了AutoEncoder不足的本质在于Irregular latent space,我的出发点是其对noise的泛化性不足,俩者的理解最终还是殊途同归。
基于此,一个最简单的想法是:训练过程中限制样本在latent space的距离是否可行。读者并未对这进行验证,VAE提出了一个更加fancy的solution。

3. Variational AutoEncoders

相比于AutoEncoder(AE),VAE最本质的一个改进在于:encoder预测的是一个输入样本在latent space的一个分布,并且VAE对这些分布进行了约束。

  1. 什么叫做“latent space的一个分布”
    对于AutoEncoders,encoder的作用是将一个输入数据 x x x映射到latent space是一个single point,在latent space里,这个point只代表 x x x .而VAR认为latent space里,它应该代表了一个分布,即以输入数据为代表的一类东西。举例而言,如果输入是一只站立的黄色的狗,AE只会认为它是一只站立的黄色的狗,VAE会认为它可以是一只黄色的狗,也可以是黑色的,也可以是坐着的。
    在这里插入图片描述
    而这个分布则用这个条件概率表示 P ( z ∣ x ) P(z|x) P(zx) .

  2. 如何通过一个输入 x x x得到一个分布 P ( z ∣ x ) P(z|x) P(zx)

    首先,我们假定这个分布是一个正态分布,因此 P ( z ∣ x ) ∼ N ( μ , σ 2 ) P(z|x) \sim N(\mu, \sigma^2) P(zx)N(μ,σ2)

    这样的假定是合理的,如果不做假定,是无法求解的,其次正态分布是能更好地反映“以输入数据为代表的一类东西”的这种性质。

    因此,若想得到这个分布,本质只需要求得正态分布的均值和方差,我们可以将其建模成 μ = f θ ( x ) \mu = f_\theta(x) μ=fθ(x), σ = g β ( x ) \sigma=g_\beta(x) σ=gβ(x), 是学习参数, f f f g g g 建模成深度网络。

  3. 如何对 P ( z ∣ x ) P(z|x) P(zx)进行约束?

    VAE希望对任何的输入数据,得到的分布都属于一个标准正态分布 P ( z ∣ x ) → N ( 0 , 1 ) P(z|x) \rightarrow N(0,1) P(zx)N(0,1),训练过程中迫使拟合标准正态分布,“迫使”的方式则是引入KL散度这一loss项实现。
    图来源于Joseph

  4. 这种约束为啥是有效的?

    回顾这个分布 P ( z ∣ x ) P(z|x) P(zx)的本质:其代表的是以输入数据为代表的一类东西,而且这个约束要求所有样本的分布都要接近 N ( 0 , 1 ) N(0,1) N(0,1)。从均值的角度,这意味着所有的东西都必须要迫近原点,这就避免了上述提到的问题.

    那在训练过程中,每次对decoder的输入加入噪声,是否可行?”,也就是分布之间必须要尽可能地靠近。那这就够了吗?No!还得从方差的角度去限制,如果不对方差进行限制,也就是这个分布是以零点为中心无限发散的,这极大地影响模型的收敛。方差的限制隐藏的意义是:让同分布内的数据要尽可能地靠近。

    方差约束的通俗理解:
    如果方差是不约束的,假设当前样本在latent space是狗的分布,因方差过大在latent space采样出了一张桌子,而训练过程我们需要要求这张桌子复原回一只狗,这会影响模型的收敛。

现在我们可以正式介绍VAE的结构,

  • encoder:基于输入样本预测出一个该样本在latent space的分布
  • decoder:对于这个分布的任意一个样本,均可通过该样本复原出输入样本
  • 图来源于Joseph

4. Variational AutoEncoders的数学支持

TBD

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值