emmmmm…先来一首BGM吧。
VAE的讲解
网络的逻辑输入和输出 这是我为了更加清晰的介绍流程图而设定的(不知专业的词哈)
首先,对于一批数据来说,生成模型的目标就是学习得到一个分布 P ( X ) P(X) P(X),使得该分布和数据的真是分布 P g t ( X ) P_{gt}(X) Pgt(X)很接近,这样一来,我们就可以根据得到的 P ( X ) P(X) P(X)来生成该数据集中到数据,也就是达到了生成数据的目的,这就是生成模型的最终目标。但是,我们无法直接获得这样的 P ( X ) P(X) P(X),而且,随着 X X X的维度的变大,很多的方法例如蒙特卡洛近似就无法使用。既然是概率图的形式,我们可以采用如下的模型来生成 X X X–通过引进一个隐层变量,这样 P ( X ) = ∫ P ( X ∣ Z ) P ( Z ) d z P(X)=\int P(X|Z)P(Z)dz P(X)=∫P(X∣Z)P(Z)dz,而且我们假设 p ( z ) ∼ N ( 0 , 1 ) p(z) \sim N(0,1) p(z)∼N(0,1), P ( X ∣ Z ; θ ) = N ( X ∣ f ( Z ; θ ) , σ 2 ∗ I ) P(X|Z;\theta)=N(X|f(Z;\theta),\sigma^2*I) P(X∣Z;θ)=N(X∣f(Z;θ),σ2∗I)。其中 f ( Z ; θ ) f(Z;\theta) f(Z;θ)是网络的输出, P ( X ∣ Z ) P(X|Z) P(X∣Z)是网络拟合的函数。这样我们就可以用过采样得到 Z Z Z,输入网络得到最后的 P ( X ) P(X) P(X)(这就是终极目标),再通过近似或者采样等操作生成 X X X。但是这个网络太难训练了,因此直接从一个正太分布中采样 Z Z Z输入到网络中,其对于网络拟合的 P ( X ) P(X) P(X)的贡献可能为0!这样,如果 X X X的维度也很高的话,网络学习的难度就更大了,因此这样的方法不符合实际。
插播一则广告:网络的输出 和 网络的拟合函数是不一样的,而且网络最终的逻辑输出也不一样!例如我们训练一个网络来拟合高斯分布,此时,你网络的输出可能是 ( μ , σ ) (\mu,\sigma) (μ,σ),但是网络最终拟合的是 P ( X ∣ Z ) = N ( μ , σ ) P(X|Z)=N(\mu,\sigma) P(X∣Z)=N(μ,σ),但是此时如果 Z Z Z也是一个随机变量的话,那么网络最终符合的逻辑输出是 P ( X ∣ Z ) P ( Z ) P(X|Z)P(Z) P(X∣Z)P(Z)。
那么,怎么改进上面的生成模型呢,还是使用隐层变量的话,这时候,我们要保证采样得到的 Z Z Z是每个数据 X X X专属的变量,它是有利于构建P(X)的,因此我们决定从P(Z|X)中采样,这样一来, Z Z Z是依赖于输出的 X X X的,它对于重构出 X X X有很高的置信度。那么此时的P(Z|X)会是什么分布呢?当然是高分布 N ( 0 , I ) N(0,I) N(0,I)!这样,encoder的输出 ( μ , σ ) (\mu,\sigma) (μ,σ)就可以采用KL散度来训练。注意此时和之前的区别!!此时采样后输入到网络中的 Z Z Z虽然是 P ( Z ) ∼ N ( 0 , I ) P(Z)\sim N(0,I) P(Z)∼N(0,I),但是这是网络的拟合输出,网络的逻辑输出是 P ( Z ∣ X ) P(Z|X) P(Z∣X),也就是此时的Z是采样于 P ( Z ∣ X ) ∼ N ( 0 , I ) P(Z|X)\sim N(0,I) P(Z∣X)∼N(0,I),这是有区别的!逻辑输入就不一样了。这样,网络就变成了下面的例子:
VAE的关键是在隐层的处理,引进了 Q ( Z ∣ X ) Q(Z|X) Q(Z∣X)来近似 P ( Z ∣ X ) P(Z|X) P(Z∣X),这样就可以通过采样 Z