《VAR:通过下一尺度预测实现可扩展的图像生成》笔记

paper:2404.02905 (arxiv.org)

GitHub:GitHub - FoundationVision/VAR: [NeurIPS 2024 Oral][GPT beats diffusion🔥] [scaling laws in visual generation📈] Official impl. of "Visual Autoregressive Modeling: Scalable Image Generation via Next-Scale Prediction". An *ultra-simple, user-friendly yet state-of-the-art* codebase for autoregressive image generation!

目录

1、什么是自回归模型(AR)?

2、什么是token?

(1)自然语言处理

(2)计算机视觉

 3、通过下一个token预测进行自回归建模(传统自回归模型)

 (1)序列依赖

(2)自回归模型的似然函数:

(3)图像的标记化过程(Tokenization)

(4)量化过程

(5)图像重建

(6)复合损失函数

(7)传统自回归模型中的主要问题

4、通过下一个尺度预测进行自回归建模(VAR)

(1)VAR 似然函数:

(2)VAR 的标记化

(3)VAR训练阶段

阶段一:多尺度VQVAE训练 (具体实现细节看伪代码算法1、2)

阶段二:VAR变换器训练(下一个尺度预测)

(4)VAR 优势:

(5)伪代码

算法1:多尺度VQVAE编码

算法2:多尺度VQVAE 重建

5、VQVAE

6、VQGAN

(1)模块介绍:

(2)整体流程:


1、什么是自回归模型(AR)?

自回归模型(Autoregressive Model, AR 是一种通过序列中的过去值来预测当前值的统计模型。它通常用于时间序列分析、自然语言处理、计算机视觉等领域。在自回归模型中,当前的值依赖于先前时刻的值。

自回归模型的核心思想是:给定一个序列,预测下一个值时仅依赖于当前和历史的值,而不依赖于其他外部信息。具体来说,对于一个序列x=(x_{1},x_{2},...,x_{T}),自回归模型通过条件概率的方式建模每个元素在序列中的生成过程:

p(x_{1},x_{2},...,x_{T})=\prod_{t=1}^{T}p(x_{t}|x_{1},x_{2},...,x_{t-1})

这里的p(x_{1},x_{2},...,x_{T})表示在给定前t-1个元素的条件下,预测第t个元素的概率。也就是说,自回归模型将一个序列的生成过程分解为一系列条件概率的乘积。

2、什么是token?

token(标记)是对输入数据(如文本、图像或其他类型的数据)进行分解后得到的最小单位。

(1)自然语言处理

在自然语言处理中,token通常是单词子词字符或者标点符号等语言的基本单元。

例如,句子“我喜欢学习”可能被分解为以下tokens:

  • [“我”,“喜欢”,“学习”],如果是按词来分词。
  • [“我”,“喜”,“欢”,“学习”],如果是按子词来分词。

Tokenization(标记化):将一段文本分解为这些基本单位的过程。标记化是NLP中的重要预处理步骤。

(2)计算机视觉

token可以是将图像数据通过特定方式分解后得到的基本单位。

  • 图像标记化(Tokenization:图像可以通过某些方法(如卷积、区域划分、特征提取等)被切分成小的块,每个块可以看作一个token。
  • Vision Transformer(ViT)通过将图像划分成若干个patch(补丁),每个patch可以看作一个token。

 3、通过下一个token预测进行自回归建模(传统自回归模型)

 (1)序列依赖

生成序列时,每个 token 依赖于它的前缀序列(已生成的 token)。

由于展平操作,破坏了二维空间关系,序列中的相邻 token 不一定对应图像中相邻的位置。

(2)自回归模型的似然函数:

给定一个离散标记序列x=(x_{1},x_{2},...,x_{T}),其中每个标记x\in V(V是词汇表大小),模型根据前面的标记(x_{1},x_{2},...,x_{T-1})来预测每个标记x_{t}

整个序列的似然可以分解为:

p(x_{1},x_{2},...,x_{T})=\prod_{t=1}^{T}p(x_{t}|x_{1},x_{2},...,x_{t-1})

p(x_{1},x_{2},...,x_{T})=p(x_{1})\times p(x_{2}|x_{1})\times...\times p(x_{T}|x_{1},x_{2},...x_{T-1})

自回归假设认为每个token的出现只依赖于它之前的token(即“马尔可夫假设”),因此可以将整个序列的联合概率分解为一系列条件概率的乘积。

在这个过程中,模型被训练来优化每个token x_{T}在给定之前的token下的预测,这就是下一个token预测。

(3)图像的标记化过程(Tokenization

图像是二维的连续信号,为了将自回归建模应用到图像上,需要将图像转化为离散的token,并定义这些标记的顺序。因为与语言不同,图像没有自然的从左到右的顺序。

f=E(im)

q=Q(f)

图像im首先通过编码器E(\cdot )转换为一个特征图f\in R^{h\times w\times C}。这里的f是一个连续的高维特征张量,形状为h\times w\times C,其中hw是图像的高度和宽度,C是通道数。

然后通过量化器Q(\cdot)将该特征图转换为离散 token q\in [V]^{h\times w}。量化后的token q 是一个离散的网格,每个位置上存储一个token,表示该位置的特征被映射到字典中的哪个离散值。

(4)量化过程

q^{(i,j)} = (argmin\left \| lookup(Z,v)-f^{(i,j)}\right \|_{2} )\in [V]

f^{(i,j)}是特征图f中第(i,j)位置的特征向量,表示图像在该位置的特征。

Z\in R^{V\times C}是量化器通常中的一个可学习的字典,其中包含V个离散的向量,每个向量代表一个“代码”。

lookup(Z,v)是字典查找操作,表示获取字典Z中第v个向量。

argmin操作寻找与特征向量f^{(i,j)}最相似的字典向量。通过计算f^{(i,j)}和字典中每个向量的欧几里得距离,找到最小距离对应的 token q^{(i,j)}

完成标记化后,得到的 token 序列q=Q(f)会被展平成一维序列,然后传递给自回归模型进行训练。

自回归模型(如Transformer或RNN)通常是为处理 一维序列数据(如自然语言、时间序列)而设计的。在这种情况下,输入数据必须被表示为线性序列。因此,为了将二维特征图(如图像的token map)输入到自回归模型中,通常需要将其展平为一维序列。一个h\times w的二维token图,展平后变成长度为h\times w的一维序列(x_{1},x_{2},...,x_{h\times w})。通过这种方式,自回归模型可以依赖序列生成的机制逐步生成图像的每个token。

(5)图像重建

为了训练量化自编码器,每个q^{(i,j)}会查找字典Z,以获取\hat{f},即原始特征f的近似值。然后,使用解码器D(\cdot)通过\hat{f}重建新的图像\hat{im}

\hat{f}=lookup(Z,q)

\hat{im}=D(\hat{f})

\hat{f}=lookup(Z,q)将 token q 转换回特征图\hat{f},这个特征图是图像的近似表示。

\hat{im}=D(\hat{f})使用解码器 D 将重建的特征图\hat{f} 转换回图像 \hat{im},这是输入图像的近似重建。

(6)复合损失函数

L=\left \| im- \hat{im} \right \|^{2}+\left\| f- \hat{f} \right\|^{2}+\lambda_{P}L_{P}(\hat{im})+\lambda_{G}L_{G}(\hat{im})

这个复合损失函数用于训练量化自编码器,其目的是最小化输入图像im和重建图像\hat{im}之间的差异,同时保持特征空间的准确性。

\left \| im- \hat{im} \right \|^{2}是图像重建误差,表示输入图像和重建图像之间的差异(通常使用均方误差)。

\left\| f- \hat{f} \right\|^{2}是特征图误差,表示原始特征图和重建特征图之间的差异。

L_{P}是感知损失,用于衡量重建图像与原图像在视觉上的差异。

L_{G}是判别性损失,通过判别器来衡量生成图像的质量(如StyleGAN)。

(7)传统自回归模型中的主要问题

虽然自回归模型在文本(有自然顺序)中表现良好,但将其应用于图像时会遇到一些挑战,具体包括:

数学前提的违背:展平之后,图像标记仍然保持双向相关性,这与自回归模型的单向依赖假设相矛盾。

zero-shot泛化能力差:自回归模型在需要双向推理的任务上表现差(例如,给定图像的下半部分,无法预测上半部分)。

空间结构破坏:展平操作破坏了图像特征图中固有的空间结构和局部相关性。

低效性:传统的自回归生成图像的复杂度为O(n^{6}),计算量大。

4、通过下一个尺度预测进行自回归建模(VAR)

与其预测单个标记,不如预测整个“token图”(即多个token的网格),每个尺度逐渐生成更高分辨率的token图,从而以粗到细的方式进行图像生成。

首先,特征图f\in R^{ h\times w\times C}被量化为K个多尺度token图(r_{1},r_{2},...r_{k}),其中每个r_{k}的分辨率逐渐增加,最终r_{k}匹配原始特征图的分辨率h\times w

(1)VAR 似然函数:

p(r_{1},r_{2},...,r_{T})=\prod_{t=1}^{T}p(r_{t}|r_{1},r_{2},...,r_{t-1})

p(r_{1},r_{2},...r_{k})=p(r_{1})\times p(r_{2}|r_{1})\times ...\times p(r_{k}|r_{1},r_{2},...,r_{k-1})

其中,r_{k} \in [V]^{h_{k}\times w_{k}} 是第 k 个尺度的 token 图,包含h_{k} \times w_{k} 个token。前缀(r_{1},r_{2},...r_{k-1})用于预测r_{k} 中的token。

(2)VAR 的标记化

为了实现VAR,提出了一种多尺度量化自编码器,它将图像编码为K个多尺度的标记图R=(r_{1},r_{2},...,r_{k-1}),用于VAR的学习。该自编码器类似于VQGAN,但经过修改以适应多尺度量化。

在编码过程中:每个尺度r_{k}仅依赖于前面的尺度(r_{1},r_{2},...,r_{k-1}),所有尺度共享一个代码本Z,确保每个尺度的标记属于相同的词汇表。

(3)VAR训练阶段

VAR涉及两个独立的训练阶段:

阶段一:多尺度VQVAE训练 (具体实现细节看伪代码算法1、2)

一个多尺度VQVAE将图像编码为 K 个token 图R=(r_{1},r_{2},...,r_{K}) ,并通过复合损失进行训练。

(1)输入图像处理:输入的图像经过VAE的编码部分,将其从原始的连续特征(如RGB像素)转化为一组具有离散表示的token图。每个token图 r_{k} 是图像在不同尺度下的离散表示。最终,将得到 K 个token图 (r_{1},r_{2},...,r_{K}),每个token图都对应一个不同的图像尺度(比如低分辨率、中分辨率和高分辨率的特征表示)。

(2)多尺度量化:这一步使用了多尺度量化(Multi-scale Quantization)的技术。与传统的单一尺度量化不同,VAR使用了多个不同的分辨率或尺度来表示图像。每个尺度下,图像被量化成不同的token图。这些token图有不同的分辨率。

阶段二:VAR变换器训练(下一个尺度预测)

使用一个基于变换器(Transformer)的自回归模型,这个模型用于从训练数据中学习如何生成图像的多个尺度token图。其核心思想是通过下一个尺度预测来建模图像生成的过程

在训练过程中,使用注意力掩码来确保每个 r_{k} 只能关注之前的 token 图。

在训练时,VAR变换器的输入包括一个带有条件信息的起始token [s] 和前k-1 个token图(r_{1},r_{2},...r_{k-1}),目标是预测下一个token图 r_{k} 。即变换器根据前面的token图来生成下一个尺度的token图。

(1)输入部分:

输入数据r图片底部的r_{1},r_{2}显示了输入的tokens序列,这些tokens是通过第一阶段的多尺度VQVAE从图像中提取的,每个token代表图像中的一个特定尺度,这些token是图像被分块处理后生成的离散值。

初始token [s][s]是一个特殊的start token,用于初始化序列并带有条件信息。

Word Embedding and Up-Interpolation: 输入的tokens首先通过词嵌入(word embedding)转换为向量表示,然后进行上采样(up-interpolation)以匹配VAR变换器的输入要求。

(2)模块部分

VAR Transformer (causal): 这是一个基于因果机制的 Transformer 模型,用于预测序列中的下一个标记,意味着在生成序列时,每个token的预测仅依赖于它之前的tokens,这有助于模型学习序列中元素之间的时间依赖关系。它接受([s],e_{1},e_{2})等,通过递归计算生成新的标记预测值(\hat{r_{1}},\hat{r_{2}},\hat{r_{3}}...)

块级因果掩码 Block-wise Causal Mask: 图中右下角展示了一个用于限制信息流的掩码矩阵,掩码基于块(block)设计,每个块代表一组相邻的token,灰色区域表示可用信息,黑色区域表示被掩盖的信息,确保标记只能依赖于已经生成的内容。例如,块编号为 9 的标记只能看到编号为 1、4、9 的块。总复杂度为 L=1^{2}+2^{2}+3^{3}=14,计算效率高于逐像素的依赖机制。

(3)输出部分

Cross-Entropy: 训练过程中,VAR Transformer 的输出是预测的token值\hat{r_{1}},\hat{r_{2}},\hat{r_{3}} 。使用交叉熵损失(Cross-Entropy)计算预测值与真实值r_{1},r_{2},r_{3}的误差,并以此优化模型。这个损失函数用于指导模型的学习过程,以最小化预测和实际之间的差异。

(4)VAR 优势:

数学一致性:下一个尺度预测确保每个尺度 r_{k} 仅依赖于其前缀([s],r_{1},r_{2},...r_{k-1}),这一约束符合自回归模型的数学前提,同时也符合人类视觉感知的自然发展(粗到细)。

保留空间局部性:在VAR中没有展平操作。每个尺度r_{k}中的标记是完全相关的。多尺度设计进一步增强了空间结构的保留。

提高效率:使用VAR生成图像的计算复杂度大大降低为O(n^{4}),相比之下,传统自回归模型的复杂度为O(n^{6})。这一效率提升来自于每个尺度内标记的并行生成。

(5)伪代码

算法1:多尺度VQVAE编码

 Imput:输入

im:原始图像

Hyperparameters:超参数

steps K :量化过程的尺度数,即图像会被编码成 K 个不同分辨率的token图。

resolutions(h_{k},w_{k})_{k=1}^{K}:每个尺度k的分辨率,用于调整图像特征图到目标分辨率。

f=E(im):使用编码器E对图像im提取特征图f,这是一个连续的特征表示,大小为(h\times w\times C)

R=[]:初始化一个空列表R,用于存储多尺度的离散token图。

for\: k=1,...,K\:do:遍历每个尺度 k,依次生成分辨率从低到高的离散标记图。

r_{k} =Q(interpolate(f,h_{k},w_{k})):使用插值方法将特征图 f调整到当前尺度的目标分辨率(h_{k},w_{k}),使用量化器Q对插值后的特征图进行量化,得到离散的token图 r_{k}

R=queuepush(R,r_{k}):将当前尺度的离散 token 图 r_{k} 压入列表 Q

z_{k}=lookup(Z,r_{k}):使用代码本 Z 对离散 token 映射 r_{k} 中的每个 token 查找对应的实际代码向量 z_{k},每个 token r_{k} 在代码本中都有唯一对应的连续向量表示。

z_{k}=interpolate(z_{k},h_{K},w_{K}):将z_{k} 从当前分辨率(h_{k},w_{k})插值到最高分辨率(h_{K},w_{K}),这是为了使z_{k} 能够与原始特征图 f 对齐,用于后面的残差计算。

f=f-\phi _{k}(z_{k}):使用卷积层\phi _{k} 处理 z_{k},得到当前尺度的信息贡献。从原始特征图 f 中减去该贡献,以得到残差特征图 f,残差特征图用于生成下一尺度的标记图,保证每个尺度的标记图捕获不同层次的信息。这一步是逐层剥离特征的过程,确保每个 r_{k} 只编码与其对应的尺度相关的独立信息。

return:mulit-scale \:token R;:返回包含K个尺度的离散token图的列表R=[r_{1},r_{2},...r_{K}]

算法2:多尺度VQVAE 重建

 \hat{f}=0:初始化一个零特征图,逐步累积每层的特征贡献。它将作为最后的重建输入传递给解码器D

r_{k}=queuepop(R):从队列 R 中取出当前分辨率的 token map r_{k}

z_{k} = lookup(Z, r_{k}):从共享的代码本Z中,查找 token r_{k}对应的嵌入向量z_{k}z_{k}是查找后的嵌入向量集合,表示当前层特征的连续化表示。

z_{k}= interpolate(z_{k}, h_{K}, w_{K}):将当前嵌入向量 z_{k} 插值到最高分辨率h_{K} \times w_{K}(最终解码分辨率),将低分辨率的嵌入对齐到最终图像的分辨率以便融合。

\hat{f}=\hat{f}+\phi _{k}(z_{k}):使用卷积层\phi_{k}对当前嵌入 z_{k}进行变换,得到本层的特征贡献。将本层的特征贡献累加到重建特征图\hat{f} 中。

\hat{im}=D(\hat{f}):使用解码器 D将累积的重建特征图\hat{f}转化为最终的重建图像 \hat{im}

5、拓展 

1、VQVAE

 

VQVAE(Vector Quantized Variational Autoencoder)是一种改进的变分自编码器(VAE)模型,结合了离散表示学习和自编码器的优点。VQVAE的核心思想是将图像或其他数据的连续特征表示通过向量量化映射到离散空间,并利用这种离散空间进行生成和重构。与传统的VAE不同,VQVAE引入了向量量化操作,帮助它学习到更加结构化和有意义的离散表示。

VQVAE模型包括三个主要部分:编码器(Encoder)、量化器(Quantizer)和解码器。

编码器(Encoder):编码器将输入数据(例如图像)映射到一个高维特征空间中。通常,编码器由一个卷积神经网络(CNN)组成,它将输入图像映射为一个连续的潜在空间表示 z_{e} 。

量化器(Quantizer):量化器是VQVAE的核心部分,它将编码器输出的连续潜在表示z_{e}映射到一个离散的表示空间中。具体而言,量化器使用一个预定义的离散向量集合(Embedding Space)来表示潜在空间的每一个点。给定一个输入特征向量,量化器会将其映射到代码本中最接近的向量,这个过程称为向量量化。量化后的离散向量称为z_{q} 。

解码器(Decoder:解码器将离散的潜在表示z_{q}转换回原始数据空间。在图像生成任务中,解码器将离散的token重新映射回图像数据。解码器通常由反卷积神经网络(Deconvolutional Network)组成。

2、VQGAN

VQGAN 实际上就是在 VQVAE 的基础上增加了一个判别器 D 。

(1)模块介绍:

编码器E :将输入的图像(左下角的狗图像)通过卷积神经网络(CNN)提取特征,生成一个潜在表示 \hat{z}\hat{z} 是一个连续的特征表示矩阵。

Quantization(量化):将编码器生成的连续特征\hat{z} 映射到一个离散的代码本(Codebook)Z 中,每个特征向量都会找到一个最接近的离散向量 z_{i}进行替换(通过argmin\left \| \hat{z}_{i}-z_{i} \right \|)。

解码器G将离散表示 z_{q}​(矢量量化后的矩阵)通过卷积神经网络解码为原始分辨率的图像。

 判别器D作为对抗网络的一部分,判别生成的图像是真实的还是伪造的。与解码器 G 对抗训练,提升生成图像的真实性。

Transformer:使用 Transformer 模型对离散化后的代码本表示进行序列建模,Transformer 学习序列分布 p(s),表示如何根据先前的离散代码片段s<i预测当前代码 s_{i}

(2)整体流程:
  1. 输入的图像经过 CNN 编码器 E,生成潜在表示\hat{z}
  2. 潜在表示\hat{z}经过矢量量化,映射到离散的代码本 Z,得到 z_{q}
  3. Transformer 对代码本中的离散表示进行建模,用于捕捉全局语义。
  4. 解码器 G 将离散表示 z_{q} 转换回高质量的图像。
  5. 判别器D 对生成图像进行真假判别,从而改进解码器(生成器) G
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值