• VAE
  • GAN
  • FLOW

预备知识

雅各比阵 J

  • 对于一个非线性(或线性)函数f(x),对于其中任意一个点xi,可以认为在xi周围无穷小的区域内做了一个线性变换,每个点的线性变换都不一样(也是关于x的函数),该线性变化的矩阵的函数即是雅各比阵。

行列式 det

  • 一个线性变化把一个单位大小(大小为1的)的空间变换成的新的空间的大小。或者说一个线性变化对原空间的放大比例。
  • 只有方阵有行列式,因为方阵对应的线性变化输入和输出的纬度是一样的,才可以比较两个空间的体积,一个2维和3维的空间之间的体积无法比较
  • 方阵的逆的行列式=方阵的行列式的逆, 说明一个线性变化把原空间放大多少,他对应的逆线性变化就把原空间缩小多少。如果一个线性变化A的行列式为0,即A把一个空间缩小为0,则A的逆变化是把空间放大无穷倍,这种变化不存在(不存在有限值),因此当A的行列式为0,A不可逆。

Normalize Flow

问题1:

x服从p(x)分布,若y=f(x),则y服从什么分布?

假设y服从q(y)分布

p(x)*dx = q(f(x))*df(x)
q(y) = p(g(y)) |det J(g(y))|  
g=f^-1

问题2

假如y服从q(y),我们想从q(y)采样出一系列样本y,但是q(y)不好采样,或者我们就不知道q(y)的解析形式。这么办。

解决方法: 把问题1反过来看,选择一个简单的分布p(x),如果我们能找到一个变换f,使得f(x)服从q(y).则只要从p(x)中采样,然后执行f计算即可。任务就变为选择一个p(x)和找到一个f. 寻找f的过程需要计算q(y),因此对f有两个要求:

  1. f可逆
  2. f的行列式计算量不要过大

怎么找到f,f是一个带参数的函数,f的形式确定了,寻找f即寻找f的参数,可以找到一个使得q(y)和数据分布最一致的f(最大似然).

问题3

x服从p(x)分布,若y=f2(f1(x)),则y服从什么分布?

假设y服从q(y)分布

q(y) = p(g1(g2((y))) |det J(g1)|  |det J(g2)|  
g1=f1^-1
g2=f2^-1

可以看出,通过一系列变换fi将x变为y,q(y)的形式非常简单。因此,对于问题2,我们可以寻找一系列满足可逆和行列式容易计算这两个条件的f,来构建非常复杂的变换(多层的神经网络)。 通过梯度方法可以计算出神经网络的参数。概率估计问题被转换为一个深度神经网络的学习问题。

为flow选择f

NICE和NVP

  • 一个很巧妙的构造,把x拆成两部分,第一部分不变,第二部分的进行缩放变换,缩放比例是一个关于第一部分的函数,函数可逆,且行列式的值非常容易求得。
  • 为了使得每一维都可以被变换,每次拆分时选择不同的维度作为不变的第一部分。

Glow

在NVP中需要每次拆分选择不同的维度,使用1X1的卷积可以直接混合不同维度之间的信息,GFlow通过在每个NVP的f之间假如一个1X1的卷积(或者一个前向层),可以不需要每次拆分选择不同的维度。

自回归flow