到目前为止,两种生成模型 G A N \mathrm{GAN} GAN和 V A E \mathrm{VAE} VAE并不能准确地从真实数据 x ∈ D {\bf{x}}\in \mathcal{D} x∈D中学习出概率分布 p ( x ) p({\bf{x}}) p(x)。以隐变量的生成模型为例,在计算积分 p ( x ) = ∫ p ( x ∣ z ) d z p({\bf{x}})=\int p({\bf{x}}|{\bf{z}})d{\bf{z}} p(x)=∫p(x∣z)dz时,需要遍历所有的隐变量 z {\bf{z}} z的取值这是非常困难,且不切实际的。基于 F l o w \mathrm{Flow} Flow的生成模型在正则化流(正则化流是估计概率分布非常有力的工具)帮助下可以更好的解决这个问题。一个的概率分布 p ( x ) p({\bf{x}}) p(x)好的估计可以完成很多任务,比如说数据生成,预测未来事件概率估计,数据样本增强等。
当前生成模型的种类可以主要分为三种,分别是基于 G A N \mathrm{GAN} GAN的生成模型,基于 V A E \mathrm{VAE} VAE的生成模型和基于 F l o w \mathrm{Flow} Flow的生成模型:

在了解基于 F l o w \mathrm{Flow} Flow的生成模型之前,需要知道三个关键的数学概念,分别是雅可比矩阵,行列式和变量替换定理。
给定一个映射函数
f
:
R
n
→
R
m
f:\mathbb{R}^n \rightarrow \mathbb{R}^m
f:Rn→Rm,将
n
n
n维输入向量
x
{\bf{x}}
x映射为
m
m
m维的输出向量。雅可比矩阵是函数
f
f
f关于输入向量
x
{\bf{x}}
x所有分量的一阶偏导数
J
=
[
∂
f
1
∂
x
1
⋯
∂
f
1
∂
x
n
⋮
⋱
⋮
∂
f
m
∂
x
1
⋯
∂
f
m
∂
x
n
]
{\bf{J}}=\left[∂f1∂x1⋯∂f1∂xn⋮⋱⋮∂fm∂x1⋯∂fm∂xn
给定一个单变量随机变量
z
z
z,已知它的概率分布为
z
∼
π
(
z
)
z\sim \pi(z)
z∼π(z),如果想要用一个映射函数
f
f
f构造一个新的随机变量
x
x
x,即
x
=
f
(
z
)
x=f(z)
x=f(z),其中
f
f
f是可逆的,即
z
=
f
−
1
(
x
)
z=f^{-1}(x)
z=f−1(x),则新随机变量的概率分布推导如下所示
∫
p
(
x
)
d
x
=
∫
π
(
z
)
d
z
=
1
\int p(x)dx =\int \pi (z)dz=1
∫p(x)dx=∫π(z)dz=1
p
(
x
)
=
π
(
z
)
d
z
d
x
=
π
(
f
−
1
(
x
)
)
d
f
−
1
d
x
=
π
(
f
−
1
(
x
)
)
∣
(
f
−
1
)
′
(
x
)
∣
p(x)=\pi(z)\frac{dz}{dx}=\pi(f^{-1}(x))\frac{d f^{-1}}{dx}=\pi(f^{-1}(x))|(f^{-1})^{\prime}(x)|
p(x)=π(z)dxdz=π(f−1(x))dxdf−1=π(f−1(x))∣(f−1)′(x)∣根据定义可知,积分
∫
π
(
z
)
d
z
\int \pi(z)dz
∫π(z)dz是无穷多个宽度
Δ
z
\Delta z
Δz无穷小的矩形之和。该位置
z
z
z处矩形的高度是密度函数
π
(
z
)
\pi(z)
π(z)的值。当进行变量替换时,由
z
=
f
−
1
(
x
)
z=f^{-1}(x)
z=f−1(x)得到
Δ
z
Δ
x
=
(
f
−
1
(
x
)
)
′
\frac{\Delta z}{\Delta x}=(f^{-1}(x))^{\prime}
ΔxΔz=(f−1(x))′和
Δ
z
=
(
f
−
1
(
x
)
)
′
\Delta z =(f^{-1}(x))^{\prime}
Δz=(f−1(x))′。
∣
f
−
1
(
x
)
∣
′
|f^{-1}(x)|^{\prime}
∣f−1(x)∣′表示在两个不同的变量坐标中定义矩形面积之间的比例。多变量的版本如下所示:
z
∼
π
(
z
)
,
x
=
f
(
z
)
,
z
=
f
−
1
(
x
)
{\bf{z}}\sim \pi({\bf{z}}), \text{ }{\bf{x}}=f({\bf{z}}),\text{ }{\bf{z}}=f^{-1}({\bf{x}})
z∼π(z), x=f(z), z=f−1(x)
p
(
x
)
=
π
(
z
)
⋅
d
e
t
(
d
z
d
x
)
=
π
(
f
−
1
(
x
)
)
⋅
d
e
t
(
d
f
−
1
d
x
)
p({\bf{x}})=\pi({\bf{z}})\cdot \mathrm{det} \left(\frac{d{\bf{z}}}{d{\bf{x}}}\right)=\pi(f^{-1}({\bf{x}}))\cdot\mathrm{det}\left(\frac{d f^{-1}}{d{\bf{x}}}\right)
p(x)=π(z)⋅det(dxdz)=π(f−1(x))⋅det(dxdf−1)其中
d
e
t
(
∂
f
∂
z
)
\mathrm{det}\left(\frac{\partial f}{\partial {\bf{z}}}\right)
det(∂z∂f)为雅可比矩阵的行列式。
对概率分布进行良好的密度估计在许多机器学习问题中有直接的应用,但这是非常困难的。例如,由于我们需要在深度学习模型中运行反向传播,因此嵌入变量的概率分布(即后验
p
(
z
∣
x
)
p(\mathbf{z}\vert\mathbf{x})
p(z∣x))预计足够简单,可以轻松有效地计算导数。这就是为什么在隐变量生成模型中经常使用高斯分布的原因,尽管大多数真实世界的分布比高斯分布复杂得多。标准化流模型则可以用于更好、更强大的分布近似。标准化流通过应用一系列可逆变换函数将简单分布转换为复杂分布。通过一系列变换,根据变量替换定理反复替换新变量,最终得到最终目标变量的概率分布。

如上图的图示,对应则有以下公式
z
i
−
1
∼
p
i
−
1
(
z
i
−
1
)
z
i
=
f
i
(
z
i
−
1
)
,
z
i
−
1
=
f
i
−
1
(
z
i
)
p
i
(
z
i
)
=
p
i
(
f
i
−
1
(
z
i
)
)
⋅
d
e
t
d
f
i
−
1
d
z
i
zi−1∼pi−1(zi−1)zi=fi(zi−1), zi−1=f−1i(zi)pi(zi)=pi(f−1i(zi))⋅detdf−1idzi
d
f
−
1
(
y
)
d
y
=
d
x
d
y
=
(
d
y
d
x
)
−
1
=
(
d
f
(
x
)
d
x
)
−
1
\frac{d f^{-1}(y)}{dy}=\frac{dx}{dy}=\left(\frac{dy}{dx}\right)^{-1}=\left(\frac{d f(x)}{dx}\right)^{-1}
dydf−1(y)=dydx=(dxdy)−1=(dxdf(x))−1雅可比矩阵的反函数定理为:一个可逆矩阵逆的行列式为这个矩阵行列式的倒数,即
d
e
t
(
M
−
1
)
=
(
d
e
t
(
M
)
)
−
1
\mathrm{det}({M}^{-1})=(\mathrm{det}(M))^{-1}
det(M−1)=(det(M))−1,因为
d
e
t
(
M
)
⋅
d
e
t
(
M
−
1
)
=
d
e
t
(
M
⋅
M
−
1
)
=
d
e
t
(
I
)
=
1
\mathrm{det}({M})\cdot\mathrm{det}(M^{-1})=\mathrm{det}(M\cdot M^{-1})=\mathrm{det}(I)=1
det(M)⋅det(M−1)=det(M⋅M−1)=det(I)=1。给定这样一系列概率密度函数,我们知道每对连续变量之间的关系。所以可以通过输出
x
{\bf{x}}
x直到追溯到初始分布
z
0
{\bf{z}}_0
z0。
x
=
z
k
=
f
K
∘
f
K
−
1
∘
⋯
f
1
(
z
0
)
log
p
(
x
)
=
log
π
K
(
z
K
)
=
log
π
K
−
1
(
z
K
−
1
)
−
log
d
e
t
(
d
f
K
d
z
K
−
1
)
=
log
π
K
−
2
(
z
K
−
2
)
−
log
d
e
t
(
d
f
K
−
1
d
z
K
−
2
)
−
log
d
e
t
(
d
f
K
d
z
K
−
1
)
=
⋯
=
log
π
0
(
z
0
)
−
∑
i
=
1
K
log
det
(
d
f
i
d
z
i
−
1
)
x=zk=fK∘fK−1∘⋯f1(z0)logp(x)=logπK(zK)=logπK−1(zK−1)−logdet(dfKdzK−1)=logπK−2(zK−2)−logdet(dfK−1dzK−2)−logdet(dfKdzK−1)=⋯=logπ0(z0)−K∑i=1logdet(dfidzi−1)
通过标准化流求输入数据的精确对数似然变得更加容易,基于流的生成模型的训练损失函数为训练数据集上的负对数似然 L ( D ) = − 1 ∣ D ∣ ∑ x ∈ D log p ( x ) \mathcal{L}(\mathcal{D})=-\frac{1}{|\mathcal{D}|}\sum\limits_{{\bf{x}}\in \mathcal{D}}\log p({\bf{x}}) L(D)=−∣D∣1x∈D∑logp(x)
RealNVP模型通过叠加可逆双射变换函数序列来实现标准化流。在每个双射 f : x → y f:{\bf{x}}\rightarrow {y} f:x→y中,输入维度分为两部分:
对于标准化流的条件1为函数可逆在RealNVP模型中是非常容易实现的,具体函数如下所示
{
y
1
:
d
=
x
1
:
d
y
d
+
1
:
D
=
x
d
+
1
:
D
⊙
exp
(
s
(
x
1
:
d
)
)
+
t
(
x
1
:
d
)
⟺
{
x
1
:
d
=
y
1
:
d
x
d
+
1
:
D
=
(
y
d
+
1
:
D
−
t
(
y
1
:
d
)
)
⊙
exp
(
−
s
(
y
1
:
d
)
)
\left\{y1:d=x1:dyd+1:D=xd+1:D⊙exp(s(x1:d))+t(x1:d)
对于标准化流条件2中雅可比行列式容易计算在RealNVP模型同样可以实现,其雅可比矩阵为下三角矩阵,具体矩阵如下所示
J
=
[
I
d
0
d
×
(
D
−
d
)
∂
y
d
+
1
:
D
∂
x
1
:
d
d
i
a
g
(
exp
(
s
(
x
1
:
d
)
)
)
]
{\bf{J}}=\left[Id0d×(D−d)∂yd+1:D∂x1:ddiag(exp(s(x1:d)))
NICE模型是RealNVP的前作,NICE中的变换是没有尺度项的仿射耦合层,称为加性耦合层
{
y
1
:
d
=
x
1
:
d
y
d
+
1
:
D
=
x
d
+
1
:
D
+
m
(
x
1
:
d
)
⟺
{
x
1
:
d
=
y
1
:
d
x
d
+
1
:
D
=
y
d
+
1
:
D
−
m
(
y
1
:
d
)
\left\{y1:d=x1:dyd+1:D=xd+1:D+m(x1:d)
G l o w \mathrm{Glow} Glow模型扩展了以前的可逆生成模型 N I C E \mathrm{NICE} NICE和 R e a l N V P \mathrm{RealNVP} RealNVP,并通过用可逆 1 × 1 1\times 1 1×1卷积替换通道排序上的反向置换操作来简化架构。 G l o w \mathrm{Glow} Glow中的一个流程中的一个步骤包含三个子步骤:
自回归约束是一种对序列数据 x = [ x 1 , ⋯ , x D ] {\bf{x}}=[x_1,\cdots,x_D] x=[x1,⋯,xD]建模的方法:每个输出只依赖于过去观察到的数据,而不依赖于未来的数据。换句话说,观察的概率 x i x_i xi是依赖于序列数据 x 1 , ⋯ , x i − 1 x_1,\cdots,x_{i-1} x1,⋯,xi−1,这些条件概率的乘积为提供了观察完整序列的概率: p ( x ) = ∏ i = 1 D p ( x i ∣ x 1 , ⋯ , x i − 1 ) = ∏ i = 1 D p ( x i ∣ x 1 : i − 1 ) p({\bf{x}})=\prod_{i=1}^D p(x_i|x_1,\cdots,x_{i-1})=\prod_{i=1}^D p(x_i|x_{1:i-1}) p(x)=i=1∏Dp(xi∣x1,⋯,xi−1)=i=1∏Dp(xi∣x1:i−1)
M
A
D
E
\mathrm{MADE}
MADE是一种专门设计的架构,可以有效地在自编码器中执行自回归属性。当使用自动编码器来预测条件概率时,
M
A
D
E
\mathrm{MADE}
MADE不是向自动编码器提供不同观察窗口时间的输入,而是通过乘以二进制掩码矩阵来消除某些隐藏单元的贡献,以便每个输入维度仅从给定的先前维度重构进行一次性传播。给定一个有
L
L
L个隐层的全连接神经网络,其权重矩阵为
W
1
,
⋯
W
L
{\bf{W}}^1,\cdots{\bf{W}}^L
W1,⋯WL,和一个输出层的权重矩阵
V
{\bf{V}}
V,输出的每个维度有
x
^
i
=
p
(
x
i
∣
x
1
:
i
−
1
)
\hat{x}_i=p(x_i|x_{1:i-1})
x^i=p(xi∣x1:i−1),当没有掩码矩阵的时候,神经网络前向传播的过程为如下所示:
h
0
=
x
h
l
=
a
c
t
i
v
a
t
i
o
n
l
(
W
l
h
l
−
1
+
b
l
)
x
^
=
σ
(
V
h
L
+
c
)
h0=xhl=activationl(Wlhl−1+bl)ˆx=σ(VhL+c)

W
a
v
e
N
e
t
\mathrm{WaveNet}
WaveNet由一堆因果卷积组成,这是一种旨在尊重排序的卷积操作:在某个时间戳的预测只能消耗过去观察到的数据,不依赖于未来。
W
a
v
e
N
e
t
\mathrm{WaveNet}
WaveNet中的因果卷积只是将输出移动多个时间戳到未来,以便输出与最后一个输入元素对齐。卷积层的一大缺点是感受视野的大小非常有限。 输出几乎不能依赖于数百或数千个时间步之前的输入,这可能是对长序列建模的关键要求。 因此,
W
a
v
e
N
e
t
\mathrm{WaveNet}
WaveNet采用扩张卷积,其中内核应用于输入的更大感受视野中均匀分布的样本子集。
W
a
v
e
N
e
t
\mathrm{WaveNet}
WaveNet使用门控激活单元作为非线性层,因为它被发现在建模一维音频数据方面比
R
e
L
U
\mathrm{ReLU}
ReLU工作得更好,在门控激活之后应用残差连接,具体公式如下所示
z
=
t
a
n
h
(
W
f
,
k
⊗
x
)
⊙
σ
(
W
g
,
k
⊗
x
)
{\bf{z}}=\mathrm{tanh}({\bf{W}}_{f,k}\otimes {\bf{x}})\odot \sigma({\bf{W}}_{g,k}\otimes {\bf{x}})
z=tanh(Wf,k⊗x)⊙σ(Wg,k⊗x)其中
W
f
,
k
{\bf{W}}_{f,k}
Wf,k和
W
g
,
k
{\bf{W}}_{g,k}
Wg,k分别是第
k
k
k层的卷积滤波器和门权重矩阵,两者都是可学习的。

M A F \mathrm{MAF} MAF是一种标准化流,其中转换层构建为自回归神经网络。 M A F \mathrm{MAF} MAF与后面介绍的 I A F \mathrm{IAF} IAF 非常相似。给定两个随机变量 z ∼ π ( z ) {\bf{z}}\sim \pi({\bf{z}}) z∼π(z)和 x ∼ p ( x ) {\bf{x}}\sim p({\bf{x}}) x∼p(x),并且概率密度函数 π ( z ) \pi({\bf{z}}) π(z)已知, M A F \mathrm{MAF} MAF旨在学习 p ( x ) p({\bf{x}}) p(x)。 M A F \mathrm{MAF} MAF生成每个 x i x_i xi以过去的维度 x 1 : i − 1 {\bf{x}}_{1:i-1} x1:i−1为条件。准确地说,条件概率是 z {\bf{z}} z的仿射变换,其中尺度和移位项是 x {\bf{x}} x的观察部分的函数。数据生成时,会产生出一个新的 x {\bf{x}} x,公式如下所示 x i ∼ p ( x i ∣ x 1 : i − 1 ) = z i ⊙ σ i ( x 1 : i − 1 ) + μ i ( x 1 : i − 1 ) x_i\sim p(x_i|{{\bf{x}}_{1:i-1}})=z_i\odot \sigma_i({\bf{x}}_{1:i-1})+\mu_i({\bf{x}}_{1:i-1}) xi∼p(xi∣x1:i−1)=zi⊙σi(x1:i−1)+μi(x1:i−1)给定 x {\bf{x}} x时,密度估计为 p ( x ) = ∏ i = 1 D p ( x i ∣ x 1 : i − 1 ) p({\bf{x}})=\prod_{i=1}^D p(x_i|{\bf{x}}_{1:i-1}) p(x)=i=1∏Dp(xi∣x1:i−1)该框架的方法优点在于生成过程是顺序的,因此设计速度很慢。而密度估计只需要使用 M A D E \mathrm{MADE} MADE等网络架构。变换函数对逆很简单,雅可比行列式也很容易计算。
与
M
A
F
\mathrm{MAF}
MAF类似,逆自回归流
I
A
F
\mathrm{IAF}
IAF也将目标变量的条件概率建模为自回归模型,但采用反向流动,从而实现了非常有效的采样过程。
M
A
F
\mathrm{MAF}
MAF中的仿射变换为:
z
i
=
x
i
−
μ
i
(
x
1
:
i
−
1
)
σ
i
(
x
1
:
i
−
1
)
=
−
μ
i
(
x
1
:
i
−
1
)
σ
i
(
x
1
:
i
−
1
)
+
x
i
⊙
1
σ
i
(
x
1
:
i
−
1
)
z_i=\frac{x_i -\mu_i({\bf{x}}_{1:i-1})}{\sigma_i({\bf{x}}_{1:i-1})}=-\frac{\mu_i({\bf{x}}_{1:i-1})}{\sigma_i({\bf{x}}_{1:i-1})}+x_i \odot \frac{1}{\sigma_i({\bf{x}}_{1:i-1})}
zi=σi(x1:i−1)xi−μi(x1:i−1)=−σi(x1:i−1)μi(x1:i−1)+xi⊙σi(x1:i−1)1如果令
x
~
=
z
,
p
~
(
⋅
)
=
π
(
⋅
)
,
x
~
∼
p
~
(
x
~
)
x
~
=
x
,
π
~
(
⋅
)
=
p
(
⋅
)
,
z
~
∼
π
~
(
z
~
)
μ
~
i
(
z
~
1
:
i
−
1
)
=
μ
~
i
(
x
1
:
i
−
1
)
=
−
μ
i
(
x
1
:
i
−
1
)
σ
i
(
x
1
:
i
−
1
)
σ
~
(
z
~
1
:
i
−
1
)
=
σ
~
(
x
1
:
i
−
1
)
=
1
σ
i
(
x
1
:
i
−
1
)
˜x=z, ˜p(⋅)=π(⋅), ˜x∼˜p(˜x)˜x=x ,˜π(⋅)=p(⋅), ˜z∼˜π(˜z)˜μi(˜z1:i−1)=˜μi(x1:i−1)=−μi(x1:i−1)σi(x1:i−1)˜σ(˜z1:i−1)=˜σ(x1:i−1)=1σi(x1:i−1)

单个元素
x
~
i
\tilde{x}_i
x~i的计算不相互依赖,因此它们很容易并行化。已知
x
~
\tilde{\bf{x}}
x~的密度估计效率不高,因为必须按顺序恢复
z
~
i
\tilde{z}_i
z~i的值,即为
z
~
i
=
(
x
~
i
−
μ
~
i
(
z
~
1
:
i
−
1
)
)
/
σ
~
i
(
z
1
:
i
−
1
)
\tilde{z}_i=(\tilde{x}_i-\tilde{\mu}_i(\tilde{\bf{z}}_{1:i-1}))/\tilde{\sigma}_i({\bf{z}}_{1:i-1})
z~i=(x~i−μ~i(z~1:i−1))/σ~i(z1:i−1),因此总计需要
D
D
D次估计。