小全读书笔记 《Variational AutoEncoders》
- 1. Generative Model (生成式模型)简述
- 2. 简单生成模型 AutoEncoders
- 2.1 结构
- 2.2 不足
- 3. Variational AutoEncoders
- 4. Variational AutoEncoders的数学支持
此读书笔记来自于Joseph Rocca的Understanding Variational Autoencoders (VAEs),非常推荐阅读原文。
1. Generative Model (生成式模型)简述
在深度学习模型范畴中,区别于图像分类、检测、分割等领域中的各种经典模型,
-
从模型的目标而言,上述经典模型致力于对输入数据判定类别、bounding box或segment area,而Generative Model的目的在于学习输入数据的分布,以生成更多的样本;
-
从训练数据而言,上述经典模型必须依赖于groundtruth annotation,而Generative Model能不一定强依赖于annotation,如给定一个人脸数据集,完全可以不依赖于任何的annotation也可以生成新的人脸,但若希望生成“特殊条件”的人脸,如长头发的人脸,则训练过程依然需要提供相应的annotation。
2. 简单生成模型 AutoEncoders
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的一个图来说明这个问题。
造成这种现象的根本问题在于两点:
-
模型并不理解noise:尽管decoder能对任何latent space空间的都能映射到原空间,但这种映射的pattern在训练数据和测试数据上是存在gap的。训练过程中decoder的输入其实可以认为是原空间的fixed point,在测试过程中加入的noise对于decoder来说是unseen和unknown的,decoder是没有机制保证加噪后的输出质量的。
-
过拟合(Overfitting):可以想象一个极端的例子,latent space就只有一维,当decoder的参数量大到一定程度,依然能完美地拟合训练数据,但这样的模型却是无意义的。当然,这样的例子有点极端,并不具备代表性,但这种缺乏约束和规范的结构实际上确实是很容易收到overfit的影响。
那在训练过程中,每次对decoder的输入加入噪声,是否可行?
答案依然是No,原因依然是上述两点,当加入噪声之后,decoder是能处理noise了,但是模型依然可以狡猾地将不同sample在latent space的分布极大地区分开来,以大大降低noise的作用。依然借用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对这些分布进行了约束。
-
什么叫做“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(z∣x) . -
如何通过一个输入 x x x得到一个分布 P ( z ∣ x ) P(z|x) P(z∣x)?
首先,我们假定这个分布是一个正态分布,因此 P ( z ∣ x ) ∼ N ( μ , σ 2 ) P(z|x) \sim N(\mu, \sigma^2) P(z∣x)∼N(μ,σ2)。
这样的假定是合理的,如果不做假定,是无法求解的,其次正态分布是能更好地反映“以输入数据为代表的一类东西”的这种性质。
因此,若想得到这个分布,本质只需要求得正态分布的均值和方差,我们可以将其建模成 μ = f θ ( x ) \mu = f_\theta(x) μ=fθ(x), σ = g β ( x ) \sigma=g_\beta(x) σ=gβ(x), 是学习参数, f f f 和 g g g 建模成深度网络。
-
如何对 P ( z ∣ x ) P(z|x) P(z∣x)进行约束?
VAE希望对任何的输入数据,得到的分布都属于一个标准正态分布 P ( z ∣ x ) → N ( 0 , 1 ) P(z|x) \rightarrow N(0,1) P(z∣x)→N(0,1),训练过程中迫使拟合标准正态分布,“迫使”的方式则是引入KL散度这一loss项实现。
-
这种约束为啥是有效的?
回顾这个分布 P ( z ∣ x ) P(z|x) P(z∣x)的本质:其代表的是以输入数据为代表的一类东西,而且这个约束要求所有样本的分布都要接近 N ( 0 , 1 ) N(0,1) N(0,1)。从均值的角度,这意味着所有的东西都必须要迫近原点,这就避免了上述提到的问题.
“那在训练过程中,每次对decoder的输入加入噪声,是否可行?”,也就是分布之间必须要尽可能地靠近。那这就够了吗?No!还得从方差的角度去限制,如果不对方差进行限制,也就是这个分布是以零点为中心无限发散的,这极大地影响模型的收敛。方差的限制隐藏的意义是:让同分布内的数据要尽可能地靠近。
方差约束的通俗理解:
如果方差是不约束的,假设当前样本在latent space是狗的分布,因方差过大在latent space采样出了一张桌子,而训练过程我们需要要求这张桌子复原回一只狗,这会影响模型的收敛。
现在我们可以正式介绍VAE的结构,
- encoder:基于输入样本预测出一个该样本在latent space的分布
- decoder:对于这个分布的任意一个样本,均可通过该样本复原出输入样本
4. Variational AutoEncoders的数学支持
TBD