Skip to main content

【概述】为高分辨率图像合成训练Transformers

卷积方法的效率与transformers的表现力。
Created on February 25|Last edited on July 12

该报告概述了论文“为高分辨率图像合成训练Transformers”。论文解决了使用transformers的表现力进行高分辨率图像合成的重大挑战。所提出的方法将图像表示为感知丰富的图像成分的组成,并进而利用transformers在高分辨率图像内有效地对其组成进行建模。

这是Sander Dieleman总结该论文的一个不错的推文
论文| 项目页面| | GitHub
要生成像下图一样惊艳的图像,请查看我的Colab笔记本

Run set
1


导言

卷积神经网络(CNN)是视觉任务的首选模型。这是因为CNN表现出很强的局部偏差(由于使用了kernels),并且由于使用共享权重而偏向空间不变性(kernels扫描了整个图像)。
与CNN相比,transformers不包含优先考虑局部相互作用的诱导偏差,从而使它们能够学习输入之间的复杂关系,换句话说,使其具有表达力。然而,这对于长期序列来说计算成本很高。transformers表达力的提高伴随着计算成本的二次增加。
Esser等人 (2021)通过结合CNN的有效性和transformers的表现力展示了高分辨率的图像合成。

关于Generative Models的一些讨论

给定x≈pdata(x),其中pdata(x)是描述数据集X的真实分布,数据集由该分布中的有限样本组成,
X=xxpdata(x)X = {x|x \approx p_{data}(x)}
生成任务是找到这样一个模型:t pmodel(x;θ)pdata(x)p_{model}(x; θ) \approx p_{data}(x).。 θ是模型参数。
图1: Generative Model分类法(来源
我们可以区分两种主要类型的Generative Model:
  • 基于可能性的(显式)模型:这些模型提供数据分布的“显式”参数规范,并具有易于处理的似然函数。例如,Variational Autoencoders(VAE)和自回归模型。
  • 隐式模型:这些模型没有指定数据本身的分布,而是定义了一个随机过程,该过程经过训练后旨在从基础数据分布中抽取样本。例如,Generative Adversarial Models(GAN)。
以下关键思想有助于对论文有更好理解:
  • 隐式的GAN难以评估,通常无法覆盖数据的所有“模式”,因此更容易导致模型崩溃。
  • 大型GAN现在可以生成高质量和高分辨率的图像。但是,众所周知,这些模型的样本不能完全捕获真实分布的多样性。(来源
  • 基于可能性的方法可以优化训练数据的负对数可能性(NLL),从而可以更轻松地进行模型比较并更好地归纳到看不见的数据。然而,像素空间中的可能性最大化是有挑战性的并且在计算上是昂贵的。
  • 在自回归模型中,我们假设示例x∈X可以表示为序列xi。使用给定的概率链规则将分布分解为条件乘积: pdata(x)=q(x1)q(x2x1)..q(xdxd1,...,x1).p_{data}(x) = q(x_1)q(x_2|x_1)..q(x_d|x_{d-1},..., x_1).。该模型基于前一个x <i预测下一个xi。图像生成已成功地转换为自回归序列生成或转换问题。 (来源
  • 条件GAN(cGAN)是对常规GAN的简单而有效的修改,它允许基于类标签或其他图像(部分图像,分割图等)的条件生成图像。您可以从这篇出色的博客文章中了解有关cGAN的更多信息,并使用此Colab尝试一个简单的cGAN。

Run set
1




方法概述

以前将transformers应用于图像生成的工作展示了对于尺寸达64x64像素的图像很有希望的结果,但是由于序列长度导致成本成倍增加,因此无法扩展到更高的分辨率。因此,要使用transformers合成更高分辨率的图像,我们需要巧妙地表示图像的语义。使用像素表示是行不通的,因为如果图像分辨率提高2倍,像素数量会以平方的方式增加。

Vector Quantized Variational Autoencoder(VQ-VAE)

这项工作受到 Vectored Quantized Variational Autoencoder 的启发,该Autoencoder在两个关键方面不同于传统的VAE:
  • encoder网络输出离散而不是连续的代码(图像的latent表示)。
  • 先验是学习得到的,而不是静态的多元正态分布。
您可以在我的报告《使用W&B进行深度生成建模》中了解有关VAE的更多信息。但是,这项工作是VQ-VAE2的更自然的演变,表明在自回归生成建模的背景下,representation learning非常强大。
Figure 2: Overview of VQ-VAE architecture. (Source)
VQ-VAE包括一个将观测值(图像)映射到一系列离散潜在变量的encoder(E(.)E(.)the)和一个从这些离散变量重构观测值的decoder(G(.)G(.))。他们使用共享的codebook。codebook由 eRK×De \in R^{K \times D}给出。在此,K是codebook中离散代码矢量的大小,DD i是每个代码ei的维数, i1,2,..,Ki \in 1, 2,..,K. VQ-VAE。


如图2所示,图像x通过 EE 生成 E(x)E(x)。然后根据其与代码向量ei的距离对其进行量化,以使每个向量 E(x)E(x).被codebook中最近的代码向量的索引所取代。decoder将其用于重建。量化由下式给出:
Quantization(E(x))=ekQuantization(E(x)) = e_k where k=argminjE(x)ejk = \underset{j}{\operatorname{argmin}} || E(x) - e_j ||
两个最后的要点,
  • 量化是不可微的步骤,因此,为了进行端到端训练,重构误差的梯度将通过decoder反向传播,并使用straight-through梯度估计器传播到encoder(从decoder复制梯度到encoder)。
  • 除了重建损失外,还使用codebook损失和commitment损失。Codebook损失会使所选代码e接近encoder的输出。commitment损失可确保encoder的输出保持接近所选的 ee.。

为什么Discrete Latent Representation有效?

Generating Diverse High-Fidelity Images with VQ-VAE-2 这篇文章与Taming Transformers这篇文章有些类似,也使用VQ-VAE-2(对VQ-VAE的改版)。但是为什么discrete representation有效?
这是受图像JPEG有损压缩的启发。 JPEG编码可删除80%以上的数据,而不会明显改变感知的图像质量。其次,训练噪声较小的生成模型往往效果更好。

训练Transformer

图3: 训练Transformer的体系结构设计。
为了保持序列长度小并利用Transformer的表达力,该论文的作者使用了学习表示的离散codebook(从VQ-VAE启发而来),从而一个图像 xRH×W×3x \in R^{H \times W \times 3} 可以通过codebook条目的空间集合 zqRh×w×nzz_q \in R^{h \times w \times n_z} 来表示 ,其中 nzn_z是代码的维数。
如图3所示,作者使用了VQ-GAN,它是原始VQ-VAE的一种变体,使用了discriminator和perpetual loss,以在压缩率提高时保持良好的感知质量。
这是一个分为两步的训练体系结构设计:
  • 训练VQ-GAN和学习量化codebook。
  • 使用量化codebook作为对transformer的顺序输入来训练自回归transformer。

训练VQ-GAN

VQ-GAN使用已知的对抗训练程序和基于补丁的鉴别器D进行训练。找到最佳压缩模型 Q={E,G,Z}Q^* = \{E^*, G^*, Z^*\}的完整目标是,

Q=argminmaxE,G,Z Exp(x)[LVQ(E,G,Z)+λLGAN({E,G,Z},D)]Q^* = \underset{E, G, Z}{\operatorname{argminmax}} \space E_{x \approx p(x)} [L_{VQ}(E, G, Z) + \lambda L_{GAN}(\{E, G, Z\}, D)] 
其中λ\lambda 是自适应权重。
展开latent code时,此训练过程可大大减少序列长度,从而可以应用功能强大的transformer模型。
为了训练您自己的VQ-GAN,您可以克隆本文的官方GitHub存储库并安装依赖项。该存储库已配备Weights and Biases,因此您可以在W&B仪表板中自动获取所有必要的指标。作者明确提到了数据准备步骤。训练VQ-GAN:
python main.py --base configs/faceshq_vqgan.yaml -t True --gpus 0,
您可以根据选择的数据集选择其他.yaml文件。

训练Transformer

借助训练的encoder和decoder,我们现在可以根据其编码的codebook索引来表示图像。图像x上的这种量化编码由 zq=q(E(x))Rh×w×nzz_q = q(E(x)) \in R^{h \times w \times n_z}给出。通过将该编码表示为来自codebook的索引序列 s{0,....,Z1}h×ws \in \{0,...., |Z|-1\}^{h \times w} ,该编码序列是通过将每个代码替换为其在codebook Z中的索引而获得的,ZZ, sij=ks_{ij} = k 使得 (zq)ij=zk(z_q)_{ij} = z_k。现在可以将序列s映射回相应的codebook条目,并可以获得解码后的图像 x~=G(zq)\tilde{x} = G(z_q)
使用此序列,可以将图像生成化为自回归的下一个索引预测。给定索引s <i,transformer学习预测可能的下一个索引的分布,即 p(sis<i)p(s_i | s_{<i}),以计算完整表示为 p(s)=ip(sis<i)p(s) = \prod_i p(s_i | s_{<i})的可能性。因此,目标函数是使数据表示的对数可能性最大化。这是一篇关于可能性的非常不错的文章
如果用户可以控制生成过程,则任何图像生成系统都是有用的。图像生成可以有附加信息作为条件,例如类别标签(如上所示)或部分图像。然后的任务是在给定信息c的情况下学习序列的可能性:
p(sc)=ip(sis<i,c)p(s|c) = \prod_i p(s_i | s_{<i}, c)
使用训练的VQ-GAN,调整config key的检查点路径
model.params.first_stage_config.params.ckpt_path in configs/faceshq_transformer.yaml
然后运行:
python main.py --base configs/faceshq_transformer.yaml -t True --gpus 0,



生成高分辨率图像

随着序列长度的增加,训练transformer的计算成本呈二次方增加,这限制了序列长度。因此,要生成百万像素级的图像,作者必须逐块工作并裁剪图像,以在训练期间将s的长度限制为最大可行的大小。
为了采样图像,以滑动窗口的方式使用了transformer。
图4: 滑动attention窗口
只要数据集的统计信息在空间上近似不变或空间条件信息可用,VQ-GAN确保可用上下文仍对图像进行建模。
在下面显示的媒体面板中,单击⚙️,然后使用滑块来可视化如何使用滑动窗口合成高分辨率图像。


Run set
1


结果


Run set
1



Run set
1


扩展阅读和结论

本报告的目的是对论文进行总结,以使读者更容易理解。我在某些地方使用了论文的原文,为了更好传达信息。
以下是一些您可能会感兴趣的扩展阅读。
Iterate on AI agents and models faster. Try Weights & Biases today.