转载

OpenAI研究 Glow:更好的可逆生成模型

我们介绍 Glow,一种使用可逆 1x1 卷积的可逆生成模型。它扩展了 先前关于可逆生成模型的 工作 并简化了架构。我们的模型可以生成逼真的高分辨率图像,支持高效采样,并发现可用于操纵数据属性的特征。我们正在发布模型代码和在线可视化工具,以便人们可以探索和构建这些结果。

2018 年 7 月 9 日

更多资源

生成模型无监督学习图像生成辉光里程碑出版物发布
操纵
混合
输入
莉娜狮子座拉希达尼尔碧昂斯杰夫用户槽 0用户槽 1用户插槽 2
输出
点击以选择一张脸。

微笑

年龄

眯眼

金头发

胡须

我们模型的交互式演示,用于操纵您脸部的属性,并与其他脸部混合

动机

操纵研究人员 Prafulla Dhariwal 和 Durk Kingma 的图像属性。该模型在训练时没有给出属性标签,但它学习了一个潜在空间,其中某些方向对应于胡须密度、年龄、头发颜色等属性的变化。

生成建模是关于观察数据,比如一组人脸图片,然后学习如何生成这些数据的模型。学习近似数据生成过程需要学习  数据中存在的所有结构,成功的模型应该能够合成看起来与数据相似的输出。精确的生成模型具有广泛的应用,包括 语音合成、 文本分析和合成、 半监督学习 和 基于模型的控制。我们提出的技术也可以应用于这些问题。

Glow 是一种可逆生成模型,也称为 基于流的生成模型,是NICE 和 RealNVP技术的扩展  。与GAN 和 VAE相比,基于流的生成模型迄今为止在研究界几乎没有受到关注 。

基于流的生成模型的一些优点包括:

  • 精确的潜在变量推断和对数似然评估。在 VAE 中,人们只能大致推断出与数据点对应的潜在变量的值。GAN 根本没有编码器来推断潜在的。在可逆生成模型中,这可以在没有近似的情况下精确完成。这不仅可以导致准确的推理,还可以优化数据的精确对数似然,而不是下限。
  • 高效推理和高效综合。自回归模型(例如 PixelCNN  也是可逆的,但是此类模型的合成难以并行化,并且在并行硬件上通常效率低下。基于流的生成模型,如 Glow(和 RealNVP)可以有效地并行化推理和综合。
  • 下游任务的有用潜在空间。自回归模型的隐藏层具有未知的边际分布,这使得对数据进行有效操作变得更加困难。在 GAN 中,数据点通常不能直接在潜在空间中表示,因为它们没有编码器并且可能无法完全支持数据分布。对于可逆生成模型和 VAE,情况并非如此,它们允许各种应用,例如数据点之间的插值和对现有数据点进行有意义的修改。
  • 节省内存的巨大潜力。正如RevNet 论文中所解释的那样,在可逆神经网络中计算梯度需要一定数量的内存,这些内存在深度上是恒定的而不是线性的 。

结果

使用我们的技术,与 RealNVP 相比,我们在标准基准测试上取得了显着改进,RealNVP 是之前基于流的生成模型的最佳发布结果。

数据集真正的NVP辉光
CIFAR-103.493.55
图像网 32x324.284.09
图片网络 64x643.983.81
LSUN(卧室)2.722.38
LSUN(塔)2.812.46
LSUN(教堂户外)3.082.67

对于RealNVP 模型 与我们的 Glow 模型,在各种数据集的测试集上评估的每维度位数的定量性能 。 *

在包含 30,000 张高分辨率人脸的数据集上训练后,我们模型中的样本

发光模型可以生成逼真的高分辨率图像,并且可以高效地生成。我们的模型在 NVIDIA 1080 Ti GPU 上生成 256 x 256 样本大约需要 130 毫秒。与之前的工作一样  ,我们发现从降低温度的模型中采样通常会产生更高质量的样本。上面的样本是通过将潜伏的标准偏差按 0.7 的温度缩放而获得的。

潜在空间的插值

我们还可以在任意人脸之间进行插值,方法是使用编码器对两幅图像进行编码并从中间点进行采样。请注意,输入是任意面孔而不是模型中的样本,因此提供了模型支持完整目标分布的证据。

在 Prafulla 的面孔和名人面孔之间进行插值。

潜在空间的操纵

我们可以训练一个没有标签的基于流的模型,然后将学习到的潜在表示用于下游任务,例如操作输入的属性。这些语义属性可以是面部头发的颜色、图像的风格、音乐声音的音调或文本句子的情感。由于基于流的模型具有完美的编码器,您可以对输入进行编码并计算具有和不具有属性的输入的平均潜在向量。然后可以使用两者之间的矢量方向来操纵针对该属性的任意输入。

上述过程需要的标注数据量相对较少,可以在模型训练完成后进行(训练时不需要标注)。 以前使用 GAN 的 工作 需要单独训练编码器。 使用VAE 的方法  只能保证解码器和编码器与分布数据兼容。其他方法涉及直接学习表示转换的函数,例如 Cycle-GAN 的,但是它们需要为每个转换重新训练。

使用基于流的模型来操作属性的简单代码片段

# Train flow model on large, unlabelled dataset X
m = train(X_unlabelled)

# Split labelled dataset based on attribute, say blonde hair
X_positive, X_negative = split(X_labelled)

# Obtain average encodings of positive and negative inputs
z_positive = average([m.encode(x) for x in X_positive])
z_negative = average([m.encode(x) for x in X_negative])

# Get manipulation vector by taking difference
z_manipulate = z_positive - z_negative

# Manipulate new x_input along z_manipulate, by a scalar alpha \in [-1,1]
z_input = m.encode(x_input)
x_manipulated = m.decode(z_input + alpha * z_manipulate)
无效的

贡献

我们的主要贡献以及我们与早期 RealNVP 工作的不同之处在于添加了可逆的 1x1 卷积,并删除了其他组件,从而简化了整体架构。

RealNVP 体系结构由两种类型的层序列组成:具有棋盘掩码的层和具有逐通道掩码的层。我们删除了带有棋盘掩码的层,简化了架构。具有通道掩码的层执行相当于重复以下步骤的操作:

  1. 通过在通道维度上反转输入的顺序来排列输入。
  2. 将输入分成两部分,A 和 B,沿着特征维度的中间向下。
  3. 将 A 送入浅层卷积神经网络。根据神经网络的输出对B进行线性变换。
  4. 连接 A 和 B。

通过链接这些层,A 更新 B,然后 B 更新 A,然后 A 更新 B,等等。这种双向信息流显然非常严格。我们发现,通过将步骤 (1) 的反向排列更改为(固定的) 洗牌 排列,模型性能得到提高。

更进一步,我们还可以 学习 最佳排列。学习置换矩阵是一种离散优化,无法修正梯度上升。但是因为置换操作只是方阵线性变换的一个特例,我们可以用卷积神经网络来实现,因为置换通道等同于输入和输出通道数量相等的 1x1 卷积操作。所以我们用学习的 1x1 卷积运算替换固定排列。1x1 卷积的权重被初始化为一个随机旋转矩阵。如下图所示,此操作显着改进了建模。我们还表明,优化目标函数所涉及的计算可以通过权重的 LU 分解有效地完成。

仿射耦合图

我们的主要贡献,可逆 1x1 卷积,导致显着的建模改进。

此外,我们删除了批量归一化并用激活归一化层代替。该层简单地移动和缩放激活,并使用 数据相关的初始化 对给定初始小批量数据的激活进行归一化。这允许将小批量大小缩小到 1(对于大图像)并扩大模型的大小。

规模

我们的架构结合了各种优化,例如 梯度检查点,使我们能够比平时更大规模地训练基于流的生成模型。我们使用 Horovod 在多台机器的集群上轻松训练我们的模型;我们演示中使用的模型是在 5 台机器上训练的,每台机器有 8 个 GPU。使用此设置,我们训练了具有超过一亿个参数的模型。

研究方向

我们的工作表明,可以训练基于流的模型来生成逼真的高分辨率图像,并学习可以轻松用于下游任务(如数据处理)的潜在表示。我们为未来的工作提出了几个方向:

  1. 在可能性上与其他模型类别竞争。 自回归模型和 VAE 的对数似然比基于流的模型表现更好,但它们分别具有采样效率低和推理不精确的缺点。可以结合基于流的模型、VAE 和自回归模型来权衡它们的优势;这将是未来工作的一个有趣方向。
  2. 改进架构以提高计算和参数效率。 为了生成逼真的高分辨率图像,人脸生成模型使用了约 2 亿个参数和约 600 个卷积层,这使得训练成本很高。深度较小的模型在学习长程依赖性方面表现较差。使用 自我 关注 架构,或执行 渐进式 训练以扩展到高分辨率可以使训练发光模型的计算成本更低。

最后,如果您想在研究中使用 Glow,我们鼓励您查看 我们的论文 以了解更多详细信息,或者查看我们在 Github 存储库中的代码。

详细论文