Deep Generative Model
Deep Generative Model

PixelRNN
很朴素的想法,就是用RNN来生成图片,每一个像素点的生成都是依赖于之前的像素点。也是做一个自回归unsupervised learning。

结果不好,且慢。
VAE(Variational Autoencoder)

为什么用VAE?
Intuitive的理由:

VAE通过引入Gaussian,使用noise让模型更鲁棒。VAE在minimize时会考虑与之相近的图片。因为noise的引入让embedding space更加平滑。在code space随机sample会比在Auto encoder中更加有真实。
exp保证noise强度都是正的,当做variance。

但是直接这样train不行,因为这里
注意这里加上了正则项的限制,在这个限制中
当然这个正则式不会只有上述heuristic的理由,还有一些理论上的证明:

Gaussian Mixture Model

sample process : 先抽一个确定的gaussian,然后再从这个gaussian中sample。
如果知道了mixture的数目,再结合数据,就可以用EM Algorithm来估计每个gaussian的参数。这里每个gaussian更像是生成过程中对象的一个特质vector,而不是简单分类cluster。
VAE其实就是Gaussian Mixture Model的一个distributive representation的版本。

当然z不一定是gaussian,也可以是其他的分布。在各个特质独立且权值有重要的少trivial的多情况下,采用gaussian也是合理的。
于是就可以用Maximizing likelihood来训练

我们又反过来定义了函数
注意到一下式子推演:

本来我们要找的是
为什么要引入

因为q和P没有关系,所以调整q不会影响蓝色的
同时我们有一个副产物,顺便会找到q与P十分相近的解!
继续推导:

因为q是自己定的函数,我们也用nn来拟合gaussian分布。
这里对于KL,我们的任务就是去调整VAE网络框架一开始的
具体的数学过程参见论文,最后的结果就是最开始说的那个intuitive regulation的式子。

这两项合起来就是我们在一开始看见的VAE的loss function。
Problem of VAE
VAE其实没有在做generate而是在逼近数据集,只是在模仿。

所以接下来就有GAN。可以看我之前关于GAN的blog。
Flow-based Model
前文几种方法或多或少有些问题。

我们先解构一下生成器:

看flow之前需要干三件事:
Jacobian Matrix

注意到
更注意到上式的展开式中:多元情况下偏导数的乘积
在多元函数中,偏导数表示在固定其他变量时,一个变量对另一个变量的变化率。但是,由于变量之间可能存在相互依赖,单独的偏导数不能完全描述变量之间的关系。
在多元情况下,偏导数的乘积不一定等于 1,原因如下:
-
变量的相互依赖性: 在多元函数中,
可能同时依赖于 和 ,而 也可能依赖于 和 。 -
固定其他变量的影响: 当计算偏导数
时,我们假设 固定;而当计算 时,我们假设 固定。这两种情况下,固定的变量不同,导致结果不对称。
更一般地,偏导数乘积不等于 1,而是需要考虑其他变量的影响。
Determinant

Change of Variable Theorem




所以变换的系数就是一个jacobian matrix的行列式。
可以进入正题了:
我们本来要做的是最大化极大似然

这样我们就把
虽然听上去很容易,实际上还是计算上的困难,计算
因为我们对G有限制,所以G的表示能力是有限的,所以可以像nn一样叠layers:

仔细看一下优化式子,只有

可以有一个直观的理解,我们实际在做的是train一个
注意到第一个部分最大化:
第二个部分:则限制了第一个部分,不能所有来啥你都映射到0,否则det会爆炸。
Coupling Layer

这样设计的好处,即是从

确实很妙,有种密码学的感觉hhh。
现在

发下实际写出来就是
于是我们把这些coupling layer叠起来,就是一个flow-based model了。

因为coupling layer有一段是直接复制的,所以我们很trick地不断调整复制段的位置。对于序列可以前半后半轮流,对于图像可以奇偶格子或者channel轮流。
GLOW

G的逆很好算↑
G的det也好算:

这样训练处encode(
