赞
踩
基于Flow的生成模型之所以具有较大吸引力,是由于其能够精确计算对数似然,能很容易进行潜在变量的推理,并且在训练和合成时能够并行进行。在本文中,我们提出了Glow,这是一种使用可逆1×1卷积的Flow。通过使用我们的方法,我们在标准benchmark上展示了对数似然的显着改进。也许最引人注目的是,我们证明针对对数似然目标直接优化的生成模型能够有效地实现非常逼真的合成效果,以及对大图像的操纵。我们模型的代码可在https://github.com/openai/glow上获得。
机器学习领域的两个主要未解决的问题是(1)数据利用率:即如人类一样从少数样本中学习的能力;(2)泛化性:对任务或其上下文改变的鲁棒性。例如,AI系统通常在当给定的输入与训练数据分布不一致时表现的不好。生成式模型这一机器学习的主要分支,是通过以下方式克服这些限制:(1)学习真实环境的模型,在允许agent在与环境实际交互之前,先建模真实模型,(2)学习输入的有意义特征,同时只需要具有很少标签或无监督数据。由于这些特征可以从大型未标注的数据集中学习,并且不一定是特定于任务的,因此基于这些特征的下游任务可能是可能更鲁棒,且数据利用率更高的。在本文中,除了实际应用以外,我们还致力于提高生成式模型性能。
生成式建模通常涉及极具挑战性的任务,可以在高维输入数据内建模所有依赖性,通常以完整的联合概率分布的形式定义。由于这种联合模型可能捕获数据中存在的所有模式,因此精确的生成式模型的应用场景非常广泛,即语音合成,文本分析,半监督学习和模型控制等多样化场景; 参见第4节。
近年来,生成式建模的性能在近年来取得了巨大进步,主要是基于似然的方法和生成对抗网络(GANS)(参见第4节)。 基于似然的方法可分为三类:
与GANS和VAE相比,基于Flow的生成式模型在研究界中很少受到关注。基于Flow的生成式模型具有以下一些优点:
令
x
\textbf x
x为具有未知真实分布
x
〜
p
∗
(
x
)
\textbf x〜p^*(\textbf x)
x〜p∗(x)的高维随机向量。我们收集一个独立同分布的数据集
D
\mathcal D
D,并选择具有参数
θ
\textbf θ
θ的模型
p
θ
(
x
)
p_{\textbf θ}(\textbf x)
pθ(x)。在数据
x
\textbf x
x为离散的情况下,对数似然目标的优化相当于最小化下式:
L
(
D
)
=
1
N
∑
i
=
1
N
−
l
o
g
p
θ
(
x
i
)
(1)
\mathcal L(\mathcal D)=\frac{1}{N}\sum^N_{i=1}-log~p_{\textbf θ}(\textbf x^{i})\tag{1}
L(D)=N1i=1∑N−log pθ(xi)(1)
在数据
x
\textbf x
x为连续的情况下,我们则优化下式:
L
(
D
)
≃
1
N
∑
i
=
1
N
−
l
o
g
p
θ
(
x
~
i
)
+
c
(2)
\mathcal L(\mathcal D)\simeq \frac{1}{N}\sum^N_{i=1}-log~p_{\textbf θ}(\tilde {\textbf x}^{i})+c\tag{2}
L(D)≃N1i=1∑N−log pθ(x~i)+c(2)
其中
x
~
(
i
)
=
x
(
i
)
+
u
,
u
〜
U
(
0
,
a
)
\tilde{\textbf x}^{(i)}=\textbf x^{(i)}+u,~u〜\mathcal U(0,a)
x~(i)=x(i)+u, u〜U(0,a),并且
c
=
−
M
⋅
l
o
g
a
c=-M·log~a
c=−M⋅log a,其中
a
a
a由数据的离散化级别确定,
M
M
M是
x
\textbf x
x的维度。等式1和等式2这两个目标都是测量纳特或比特中的预期压缩成本。 优化过程通过对mini-batch数据采用随机梯度下降来完成。
在大多数基于flow的生成模型中,生成过程被定义为:
z
∼
p
θ
(
z
)
(3)
\textbf z\sim p_{\textbf θ}(\textbf z)\tag{3}
z∼pθ(z)(3)
x
=
g
θ
(
z
)
(4)
\textbf x=g_{\textbf θ}(\textbf z)\tag{4}
x=gθ(z)(4)
其中
z
\textbf z
z是潜在变量,并且
p
θ
(
z
)
p_{\textbf θ}(\textbf z)
pθ(z)具有(通常是简单的)易计算的密度,例如各向同性的多元高斯分布:
p
θ
(
z
)
=
N
(
z
;
0
,
I
)
p_{\textbf θ}(\textbf z)=\mathcal N(\textbf z;0,\textbf I)
pθ(z)=N(z;0,I)。 函数
g
θ
(
.
.
)
g_{\textbf θ}(..)
gθ(..)是可逆的,也称为双映射函数,使得给定数据点
x
\textbf x
x,潜在变量推断由
z
=
f
θ
(
x
)
=
g
θ
−
1
(
x
)
\textbf z =f_{\textbf θ}(\textbf x)=g^{-1}_{\textbf θ}(\textbf x)
z=fθ(x)=gθ−1(x)完成。为了简洁起见,我们将省略下标
θ
\textbf θ
θ。
我们专注于函数
f
f
f(以及函数
g
g
g),其由一系列变换组成:
f
=
f
1
◦
f
2
◦
⋅
⋅
⋅
◦
f
K
f=f_1◦f_2◦···◦f_K
f=f1◦f2◦⋅⋅⋅◦fK,使得
x
\textbf x
x和
z
\textbf z
z之间的关系可以写为:
x
⟷
f
1
h
1
⟷
f
2
h
2
⋯
⟷
f
K
z
(5)
\textbf x \stackrel{f_1}{\longleftrightarrow} \textbf h_1 \stackrel{f_2}{\longleftrightarrow} \textbf h_2 \cdots \stackrel{f_K}{\longleftrightarrow}\textbf z\tag{5}
x⟷f1h1⟷f2h2⋯⟷fKz(5)
这种可逆变换序列也称为normalizing flow。基于等式4的变量变换,给定数据点
x
\textbf x
x的模型的概率密度函数(PDF)可以写为:
l
o
g
p
θ
(
x
)
=
l
o
g
p
θ
(
z
)
+
l
o
g
∣
d
e
t
(
d
z
/
d
x
)
∣
(6)
log~p_{\textbf θ}(\textbf x)=log~p_{\textbf θ}(\textbf z)+log|det(d\textbf z/d\textbf x)|\tag{6}
log pθ(x)=log pθ(z)+log∣det(dz/dx)∣(6)
=
l
o
g
p
θ
(
z
)
+
∑
i
=
1
K
l
o
g
∣
d
e
t
(
d
h
i
/
d
h
i
−
1
)
∣
(7)
=log~p_{\textbf θ}(\textbf z)+\sum^K_{i=1}log|det(d\textbf h_i/d\textbf h_{i-1})|\tag{7}
=log pθ(z)+i=1∑Klog∣det(dhi/dhi−1)∣(7)
为了方便,我们定义
h
0
=
△
x
,
h
K
=
△
z
\textbf h_0 \stackrel{\vartriangle}{=}\textbf x,~\textbf h_K \stackrel{\vartriangle}{=}\textbf z
h0=△x, hK=△z。 标量值
l
o
g
∣
d
e
t
(
d
h
i
/
d
h
i
−
1
)
∣
log|det(d\textbf h_i/d\textbf h_{i-1})|
log∣det(dhi/dhi−1)∣是雅可比矩阵
(
d
h
i
/
d
h
i
−
1
)
(d\textbf h_i/d\textbf h_{i-1})
(dhi/dhi−1)的行列式绝对值的对数,也称为log-determinant。基于变换函数
f
i
f_i
fi,对数密度的值将从
h
i
−
1
\textbf h_{i-1}
hi−1变为
h
i
\textbf h_i
hi。虽然它可能看起来感觉计算成本非常高,但它的值能够被化简到去计算某个特定变换。基本思想是选择雅各比矩阵
(
d
h
i
/
d
h
i
−
1
)
(d\textbf h_i/d\textbf h_{i-1})
(dhi/dhi−1)是三角矩阵的变换。对于这些变换,log-determinant的计算会很简单:
l
o
g
∣
d
e
t
(
d
h
i
/
d
h
i
−
1
)
∣
=
s
u
m
(
l
o
g
∣
d
i
a
g
(
d
h
i
/
d
h
i
−
1
)
∣
)
(8)
log|det(d\textbf h_i/d\textbf h_{i-1})|=sum(log|diag(d\textbf h_i/d\textbf h_{i-1})|)\tag{8}
log∣det(dhi/dhi−1)∣=sum(log∣diag(dhi/dhi−1)∣)(8)
基于NICE的和RealNVP flow,我们提出了一种新的flow。它由一系列flow操作步骤组成,并结合了多尺度架构,如图2所示。flow的每个步骤均由actnorm(第3.1节)组成,然后是可逆的1×1卷积(第3.2节),然后是耦合层(第3.3节)。
该flow与多尺度架构结合在一起,由于篇幅限制,可以参考(Dinh et al., 2016) 了解更多细节。该结构中flow的深度为
K
K
K,并总共有
L
L
L个尺度(图2)。
在 Dinh et al. (2016)中,作者提出了使用batch normalization来减轻训练深层模型时遇到的问题。但是,由于通过batch normalization添加的激活噪声与每个GPU或其他处理单元(PU)的mini-batch的大小成反比,因此当使用小的mini-batch时性能会降低。对于大图像,由于内存限制,我们仅能设置mini-batch为1进行训练。我们提出了一个actnorm层(作为activation normalizaton),该层对每个通道使用缩放和偏差参数进行仿射转换,这类似于batch normalization。这些参数由给定的初始mini-batch数据初始化,以使得每个激活后的通道均值为零,并且方差为1。这是data dependent initialization的一种形式。初始化后,缩放和偏差被视为独立于数据的常规可训练参数。
(Dinh et al., 2014, 2016) 提出的flow包含会颠倒通道顺序的恒等变换。我们提出用一个可学习的可逆的1×1卷积替换这种固定的变换,其中权重矩阵被初始化为随机旋转矩阵。注意,具有相同输入和输出通道数量的1×1卷积是组合操作的泛化。
具有
c
×
c
c×c
c×c权重矩阵
W
\textbf W
W的可逆1×1卷积,对维度为
h
×
w
×
c
h×w×c
h×w×c的张量
H
\textbf H
H的雅可比对数行列式是很简单的,可以直接计算如下:
l
o
g
∣
d
e
t
(
d
c
o
n
v
2
D
(
h
;
W
)
d
h
)
∣
=
h
⋅
w
⋅
l
o
g
∣
d
e
t
(
W
)
∣
(9)
log|det(\frac{d~conv2D(\textbf h;\textbf W)}{d~\textbf h})|=h\cdot w\cdot log|det(\textbf W)|\tag{9}
log∣det(d hd conv2D(h;W))∣=h⋅w⋅log∣det(W)∣(9)
d
e
t
(
W
)
det(\textbf W)
det(W)的计算或微分成本是
O
(
c
3
)
\mathcal O(c^3)
O(c3),其通常与
C
o
n
v
2
D
(
h
;
W
)
Conv2D(\textbf h;\textbf W)
Conv2D(h;W)的计算成本(
O
(
h
⋅
w
⋅
c
2
)
\mathcal O(h·w·c^2)
O(h⋅w⋅c2))相当。我们将权重
W
\textbf W
W初始化为一个随机旋转矩阵,其对数行列式为0,在一个SGD步骤之后,这些值从0开始改变。
LU Decomposition。通过使用LU分解法直接对
W
\textbf W
W进行参数化,可以将
d
e
t
(
W
)
det(\textbf W)
det(W)的计算成本从
O
(
c
3
)
\mathcal O(c^3)
O(c3)降低到
O
(
c
)
\mathcal O(c)
O(c):
W
=
PL
(
U
+
d
i
a
g
(
s
)
)
(10)
\textbf W=\textbf P\textbf L(\textbf U+diag(s))\tag{10}
W=PL(U+diag(s))(10)
其中
P
\textbf P
P是个一个置换矩阵,
L
\textbf L
L是一个对角线值为1的下三角矩阵,
U
\textbf U
U是一个对角线值为0的上三角矩阵,
s
s
s是一个向量。然后,对数行列式可以简化为:
l
o
g
∣
d
e
t
(
W
)
∣
=
s
u
m
(
l
o
g
∣
s
∣
)
(11)
log|det(\textbf W)|=sum(log~|s|)\tag{11}
log∣det(W)∣=sum(log ∣s∣)(11)
当
c
c
c非常大时,计算成本的差异会非常显著,尽管对于我们实验中使用的网络,我们没有测量到执行计算时间上的巨大差异。
在该参数化中,我们首先使用随机旋转矩阵来初始化
W
\textbf W
W的参数,然后计算
P
\textbf P
P(其保持固定)的对应值,以及
L
\textbf L
L和
U
\textbf U
U的相应初始值(其被优化)。
一个强大的可逆变换,前向函数,反向函数和对数行列式在计算上是有效的,其在(Dinh et al., 2014, 2016)中作为仿射耦合层进行引入。如表1所示。加法耦合层是一种特殊情况,其向量
s
=
1
s=1
s=1,对数行列式为0。
Zero initialization。我们将每个
N
N
(
)
NN()
NN()的最后一个卷积初始化为0,因此每个仿射耦合层最初都执行一个恒等函数。我们发现这有助于训练非常深的网络。
Split and concatenation。如(Dinh et al., 2014)一样,
s
p
l
i
t
(
)
split()
split()函数沿通道维度将一个输入张量分为两个半部,而
c
o
n
c
a
t
(
)
concat()
concat()操作执行对应的反向操作:连接成单个张量。在(Dinh et al., 2016) 中,引入了另一种类型的
s
p
l
i
t
(
)
split()
split():沿着空间维度使用棋盘格模式。 在这项工作中,我们只能沿通道维度进行拆分,从而简化整体结构。
Permutation。flow的每个操作步骤都应在某种变换下执行,以确保在具有足够多的flow操作之后,每个维度都可以影响每个其他维度。在(Dinh et al., 2014, 2016) 的置换类型在执行加性耦合层之前简单地逆转通道(特征)的顺序。 另一种选择是执行(固定的)随机排列。我们可逆的1x1卷积是对此类排列的泛化。在实验中,我们比较了这三个选择。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。