CJ blog

不知名算法工程师

1 DINO

Title:Emerging Properties in Self-Supervised Vision Transformers
Paperhttps://openaccess.thecvf.com/content/ICCV2021/papers/Caron_Emerging_Properties_in_Self-Supervised_Vision_Transformers_ICCV_2021_paper.pdf
Codehttps://github.com/facebookresearch/dino

1.1 abstract

DINO 核心思想是通过大规模的无标签数据进行对比学习,学习出一组具有可传递性的视觉特征表示。在 DINO 中,作者通过引入一个新的对比学习方法,将原始图像的特征与随机裁剪的图像的特征进行对比,从而学习到更好的视觉通用表征,最终也获得了非常出色的效果。

1.2 method

图片

图片

网络结构

DINO 是采用自蒸馏(self-distillation)的方法学习的,其整体框架包含两个相同的架构,分别为教师网络和学生网络,具体的架构可以是 ViT 等 vision transformer 或者诸如 ResNet 等 CNNs 特征提取器,非常灵活方便。当然,通过下述消融实验也知道还是 ViT 的潜力更大。

图片

然而,这种学生和教师网络均输出相同 embeddings 的情况容易出现模式崩塌(mode collapse)的现象。在《Momentum Contrast for Unsupervised Visual Representation Learning》一文中提出了一种解决方案,即应用“动量教师”(momentum tearcher)模型,可以简单地理解为就是教师的模型不是基于反向传播更新的,而是再对学生模型进行梯度回传后,在通过指数移动平均(Exponentially Weighted Average, EWA),直接将学生网络学习到的模型参数更新给教师网络,换句话就是教师网络的权重更新自学生网络。

数据增强

DINO 中最核心的数据采样策略便是图像裁剪,这也是自监督学习领域应用非常广泛的主策略之一。一般来说,我们可以将裁剪后的图像分为两种:

  • Local views: 即局部视角,也称为 small crops,指的是抠图面积小于原始图像的 50%;
  • Global views: 即全局视角,也称为 large crops,指的是抠图面积大于原始图像的 50%;

在 DINO 中,学生模型接收所有预处理过的 crops 图,而教师模型仅接收来自 global views 的裁剪图。据作者称,这是为了鼓励从局部到全局的响应,从而训练学生模型从一个小的裁剪画面中推断出更广泛的上下文信息。

简单来说,就是把局部特征和全局特征分别交给不同的模型来学习,以便在处理整个图像时,能够更好地对局部细节和上下文进行综合判断。

此外,为了使网络更加鲁邦,DINO 中也采用一些其它的随机增强,包括:

  • 颜色扰动(color jittering)
  • 高斯模糊(Gaussian blur)
  • 曝光增强(solarization)

损失函数

图片

Centering and Sharpening

在 DINO 论文中,还有两个不得不提的点便是 CenteringSharpening,这是用于防止模式崩塌的两种有效方式。

在自监督学习中,mode collapse 是指网络的学习过程中出现了多样性减少的现象。具体来说,当网络学习到一组特征表示时,往往会出现多个输入数据映射到相同的特征表示的情况,这就是所谓的模式崩塌。这种现象通常是由于网络在优化过程中陷入了局部最优解,只能考虑到一部分数据的特征表示,而忽略了其它数据样本的模式和特征,从而导致了多样性缺失的现象,因此会对模型的鲁棒性产生很大的负面影响。

先来看下 Centering。首先,教师模型的输出经过一个 EMA 的操作,从原始激活值中减去得到一个新的结果。简单来说,可以表述为下列公式:

这个操作的目的是使得激活值有时候是正的(当它们高于平均值时),有时候是负的(当它们低于平均值时)。由于 softmax 函数在处理负数时会给出较小的概率值,而在处理正数时会给出较大的概率值,因此这种操作能够防止任何一个特征占据统治地位,因为平均值会在值的范围中间。

最后,再看看 Sharpening。这种技巧通过在 softmax 函数中加入一个 temperature 参数,来强制让模型将概率分布更加尖锐化。由于小差异会被夸大,这会防止所有激活值都是相同的,因为小的差异也会被放大。这个技巧和中心化操作搭配使用,可以使得激活值不断变化,从而引导学生模型更好地了解哪些特征应该变得更加强大。

2 DINO V2

2.1 abstract

DINO V2 提出了一种用于学习特征的判别式自监督方法,它是 DINO 和 iBOT 损失的结合,并引入了 SwAV 的居中方法。此外,我们还添加了一个正则项来扩展特征,并进行了一个短的高分辨率训练阶段。

简单点理解就是,这种自监督方法是由多个损失函数组成的,包括 DINO(Transformers之间的局部信息最大化),iBOT(特征之间的相似度最小化)和 SwAV(样本中心化)。同时,添加了一个正则项,以使特征在特征空间中更加均匀地分布。此外,DINOv2 中还进行了一个短暂的高分辨率训练阶段,以进一步提高特征的鲁棒性。这些方法的详细实现可以在相关的论文或我们的开源代码中找到。

2.2 方法

Image-level objective

这个方法被称为图像级目标,是一种用于学习特征的判别式自监督方法。其基本思想是将来自同一图像不同裁剪的视图作为正样本,将来自不同图像的视图作为负样本,使用交叉熵损失函数来衡量这些视图之间的相似性和差异性,从而训练一个学生网络。另外,我们使用指数移动平均方法构建一个教师网络,其参数是过去迭代的加权平均值,以减少训练中的波动。最终,我们使用这两个网络的类令牌特征作为特征表示。

Patch-level objective

这个方法是另一种用于学习特征的自监督方法,称为 Patch 级目标。在这种方法中,作者将输入的一些 Patch 随机地遮盖掉,只将未被遮盖的 Patch 提供给教师网络,然后使用交叉熵损失函数来衡量学生和教师网络在每个被遮盖的 Patch 上的特征表示的相似性和差异性,从而训练学生网络。同时,我们可以将 Patch 级别的损失与图像级别的损失相结合,以便在训练过程中兼顾整体和局部特征。

Untying head weights between both objectives

此方法是针对前两个方法的实验发现进行的改进。在前两个方法中,图像级别和Patch级别的损失函数都共享了一个网络的参数(权重)。但是经过实验观察发现,当两个级别的损失函数共享同样的参数时,模型在Patch级别会欠拟合,在图像级别会过拟合。因此,我们可以考虑将这些参数(权重)解绑,使得模型在两个级别都能够更好地学习特征表示。这个方法的优化目标是在两个级别都得到最佳的结果。

Sinkhorn-Knopp centering

这个方法是对 DINO 和 iBot 两种方法中的一些步骤进行改进。在原来的方法中,教师模型中的 softmax-centering 步骤在某些情况下可能导致不稳定性,因此本文采用了 Sinkhorn-Knopp(SK)批量归一化方法来代替。这个方法的核心思想是通过正则化来使学生和教师网络在特征表示上更加接近。在这个方法中,作者使用了 3 次 Sinkhorn-Knopp 算法迭代来实现归一化。对于学生网络,则仍然使用 softmax 归一化。通过这个方法,我们可以更好地训练学生模型,并获得更好的性能。

KoLeo regularizer

KoLeo regularizer 是一种正则化方法,它通过计算特征向量之间的差异来确保它们在批次内均匀分布。具体来说,它使用了一种名为 Kozachenko-Leonenko 差分熵估计的技术,这是一种估计随机样本密度的方法。在计算这个正则化器之前,特征向量会被进行“2-范数归一化”(将每个向量的所有元素平方和开根号并除以该和),以确保它们具有相同的长度。这个正则化器的作用是减少特征向量之间的差异,从而使它们在整个批次内均匀分布。

Adapting the resolution

这一步主要是涉及在预训练的最后一段时间内,将图像的分辨率提高到 518×518 ,便在下游任务中更好地处理像素级别的信息,例如分割或检测任务。高分辨率的图像通常需要更多的计算资源和存储空间,因此只在预训练的最后阶段使用这种方法,以减少时间和资源成本。

本文主要介绍常用的激活函数

image 1

ReLU激活函数**

最初的 Transformer 中 FFN 层使用的就是ReLU激活函数。

1
2
def relu(x):
return np.maxinum(0,x)

优点:计算简单,输出具有稀疏性。

缺点:

GELU激活函数

论文《Gaussian Error Linear Units(GELUs)》提出了GELU,这是ReLU的平滑版本。

1
2
def gelu(x):
return x * norm.cdf(x)

这是一个处处可微的非线性函数。

优点:具有更光滑的导数,避免梯度消失,提高模型的性能,加速收敛。

Swish激活函数

论文《Swish: a Self-Gated Activation Function》提出了Swish,这也是对带有非零负值梯度的ReLU平滑版本。

1
2
def swish(x, beta=1):
return x * (1 / (1 + np.exp(-beta * x)))

Swish同样是个处处可微的非线性函数,且有一个参数beta用于控制函数的形状。

GLU及其变体

GLU(Gated Linear Units)其实不算是一种激活函数,而是一种神经网络层。它是一个线性变换后面接门控机制的结构。其中门控机制是一个sigmoid函数(可以替换成其他激活函数)用来控制信息能够通过多少。

常见的多模态对齐方案

1、背景

LLM 只具备处理文本的能力,需要弥补自然语言和图像模态之间的差距。通过端到端的方式训练 LMM 代价非常高,并且可能会带来灾难性遗忘的风险。目前,通常的做法是基于预训练的视觉编码器和 LLM 来构建 VLM。图像生成领域,也通过类似模态对齐的结构来引入额外的信息控制生成。常见的模态对齐方案,主要分为以下两类:

  • 基于 Learnable Query 的方案,包括:
    • Perceiver Resampler
    • Q-Former
    • Cross-attention
  • 基于 Projection 的方案:
    • 单层 Linear 投影
    • 两层 MLP

2、模态对齐的方案

2.1 Cross attention

很多常见的模块的使用了 Cross attention,大多数文生图模型,text embedding 就是通过 cross attention 引入到 Unet 结构里面。

假设输入的 Query embedding 维度 32 x 768,输入的 image embedding 维度 257 x 1024 为例,如下所示,可以看出 Cross Attention 的过程,K 和 V 的维度为 1024 x 768,Q 的维度为 768 x 768,所以对应的 Attention Score 的维度为 32 x 257,最终也可以保持 Query embedding 维度不变,依然为 32 x 768(红框):

image-20240303234925136

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class CrossAttention(nn.Module):
"""
A cross attention layer.
Parameters:
query_dim (`int`): The number of channels in the query.
cross_attention_dim (`int`, *optional*):
The number of channels in the encoder_hidden_states. If not given, defaults to `query_dim`.
heads (`int`, *optional*, defaults to 8): The number of heads to use for multi-head attention.
dim_head (`int`, *optional*, defaults to 64): The number of channels in each head.
dropout (`float`, *optional*, defaults to 0.0): The dropout probability to use.
bias (`bool`, *optional*, defaults to False):
Set to `True` for the query, key, and value linear layers to contain a bias parameter.
"""
query = attn.to_q(hidden_states)
query = attn.head_to_batch_dim(query)

encoder_hidden_states = encoder_hidden_states if encoder_hidden_states is not None else hidden_states
key = attn.to_k(encoder_hidden_states)
value = attn.to_v(encoder_hidden_states)
key = attn.head_to_batch_dim(key)
value = attn.head_to_batch_dim(value)

attention_probs = attn.get_attention_scores(query, key, attention_mask)
hidden_states = torch.bmm(attention_probs, value)

使用 Cross attention 作为模态间对齐结构的 VLM 有:

  • Qwen-VL
  • 各种文生图模型

2.2 Percevier Resampler

img

Resampler 的结构如上图所示,可以看出它是一个常规的 transformer block, 其中 attention 使用 Cross attention,拿 Flamingo 举例,具体来说:

  • 每个图像经 Vision Encoder 会生成一个 [S, d] 的视觉特征,T 个图像对应 x_f 的维度为 [T, S, d]
  • x_f 加上维度为 [T, 1, d] 的 time_embeddings
  • 将时间和空间维度拉平,x_f -> [T*S, d]
  • 将 x_f 作为 transformer block 的 Key 和 Value 输入
  • 自定义的 R 个可学习的 Query Token,对应维度为 [R, d]
  • 然后经过 num_layers 层 transformer block 得到对应的新的视觉特征 x,维度为 [R, d],和可学习的 Query 维度一致。

使用 Resampler 结构的常见 VLM 模型有:

  • Flamingo
  • mPLUG-Owl

2.3 Q-former

Q-former 结构由 BLIP2 模型提出来的,在 Q-Former 中,作者额外创建了一组可学习的 Query embedding 作为输入(这与 Flamingo 中R 个可学习的 Query Token 作用一样)。这些 Query embedding 在 Self Attention 层相互交叉,并通过 Cross attention 层(每隔一个 transformer block 有一个 Cross attention)与冻结的 image encoder 输出的 image embedding 进行交叉。

截屏2024-03-04 00.07.50

使用 Q-former 结构的 VLM 模型有:

  • BLIP2
  • MiniGPT- v1
  • InstructBILP

[toc]

一、背景

为了更好的理解图像生成模型的演化过程,在这里,对这一系列模型进行总结,包括任务场景、评估指标、模型类型、效率优化、局限性等方面分别总结,以便更好地对比和理解。

二、任务场景

2.1 无条件生成

生成模型在生成图像时不受任何额外条件或约束的影响。模型从学习的数据分布中生成图像,而不需要关注输入条件。

无条件适用于那些不需要额外信息或上下文的场景。例如,针对人脸数据训练,那么就可以输入随机噪声,然后生成逼真的人脸图像,而不用考虑任何特定属性或描述。

CelebA-HQ(人脸)、FFHQ(人脸)、LSUN-Churches(教堂) 和 LSUN-Bedrooms(卧室) 都是常见的无条件评估任务。

  • CelebA-HQ 包含 30,000 1024x1024 分辨率的高质量人脸图像。(https://paperswithcode.com/dataset/celeba-hq)
  • FFHQ 同样是高质量的人脸数据集,包含 70,000 张 1024x1024 分辨率的高质量人脸图像,有不同的种族、肤色和背景等。(https://github.com/NVlabs/ffhq-dataset)
  • LSUN 数据集包含 10 个场景类别,包括卧室、厨房、教堂等等,每个图像的大小都为 256x256 分辨率,每个类别包含 120,000 到 3,000,000 张图像。

如下图所示为分别基于以上数据集训练之后(4 个模型)生成的图像示例(来自 LDM):

9ad8b9515f0b4f5cf85f21ad37f9d01a

2.2 有条件生成

有条件生成可以通过cross attention的方式引入各式各样的条件控制图像生成。

2.2.1 类别条件生成

类别条件生成是非常常见的一种场景,也有许多相关的任务,其中 ImageNet 是最常见的一种,ImageNet 常用于图像分类任务,每个图像都有一个类别标签,总共有 1000 个类别。在图像生成领域,可以指定对应的类别标签,然后让模型按照类别生成图像。

2.2.2 文本条件生成

当前最常见的图像生成范式,输入自然语言描述,模型即可生成相应的图像。

2.2.3 位置条件

有些时候我们会对图像中物体的布局,或主体的位置有特殊的要求,此时可以结合上述的类别条件和文本条件来约束模型。

如下图所示,左侧图中指定了图片中物体的位置关系(以边界框坐标表示),最终模型按要求生成了对应的图像(图片来自 LDM,模型基于 COCO 数据集训练):

6f2aa993ca449d9bc52dd72740e46ef6

2.2.4 图像扩充 (Outpainting) and 图像内编辑 (inpainting)

给定图像,将其扩展为更大的图片;市面上比较火的应用,如 ai扩图,商品图背景生成,基本上都是基于outpainting 的方式。

image (9)tmpi1mj8me6

c_rawtmpiliondnx

640

inpaint 和 outpaint 模型的训练方式基本相同,都是用文生图模型的权重进行初始化,然后改变 Unet 输入的 channels(5 additional input channels ,4 for the encoded masked-image and 1 for the mask itself),新增的channels zero-initialized。

但是需要注意的是 inpaint 和 outpaint 训练时的mask方式根据推理时mask的特点而有所不同,二者可以混合在一起训练。

2.2.6 图像内文字生成

有些时候需要图片中包含特定的文本内容,也可以以条件的形式输入。但是当前大部分文生图的模型直接生成文字效果都不太好 (Dalle3 生成文字比较准确,文字不易变形)

3f98ca6187b332eb475ee4ce532c6c5d

Meta的文生图模型Emu 采用 channel数更大的VAE可以改善生成文字畸变的情况。

image-20240125163857323

对于文字概念,需要训练数据中的caption描述更加准确和详细。

2.2.7 多种条件生成

有些场景会包含多种条件,比如给定图像、文本等多种条件,模型综合考量这些条件才能生成满足要求的图像。如下图所示:

237055b77e0004a0a54bc7fa67b8464d

三、评估指标

公司内部模型迭代上线,一般采取人工评测的方式,从开源评测集以及真实用户输入数据中随机按一定比例挑选 prompt 生成图片后,由人工从多个维度如,图文相关性,美观度,合理性等角度进行评测。

3.1 IS (Inception Score)

IS(Inception Score):用于评估生成图像质量和多样性的指标。它结合了两个方面的考量:

  • 生成图像的真实性(真实图像的概率,在对应类别上的概率应该尽量高)
  • 生成图像的多样性(类别分布的熵,生成不同类别图像应该尽量均匀)

IS 的计算方法包含两个步骤:

  • 首先,通过分类模型提取生成图像在每个类别的概率分布
  • 然后,计算这些概率分布的 KL 散度,最终的 IS 是这些 KL 散度的指数平均值

3.2 FID (Frechet Inception Distance)

FID(Frechet Inception Distance):用于反映生成图片和真实图片之间的距离,数值越低越好。

FID 的计算方法包含两个步骤:

  • 首先,通过模型提取真实图像和生成图像的特征向量。
  • 然后,计算这两个特征向量分布之间的 Frechet 距离,也就是均值和协方差的 Frechet 距离。

图片

在实际使用中,通常使用 IS 来评估真实性,使用 FID 来评估多样性。

3.3 CMMD

谷歌在最新的文章 Rethinking FID 中提出了一个新的图像生成评估指标,并指出 FID 的缺陷。

code:https://github.com/google-research/google-research/tree/master/cmmd

FID 估计真实图像的 Inception-v3 特征分布与算法生成的图像的分布之间的距离。FID 的重要缺点:Inception 对现代文本到图像模型生成的丰富多样的内容的表示不佳、不正确的正态性假设以及样本复杂性较差。

image-20240204155257324

image-20240125175818071

How to Calculate?

CMMD使用了 MMD 距离来计算真实图像分布和生成图像分布之间的距离。对于两个概率分布 $P\in R^d,Q\in R^d$, 相对于正定核 $k$ MMD距离定义如下:

image-20240204160143429

其中 x 和 x’ 独立分布于 P,y 和 y’ 独立分布于 Q。

下面是 官方Jax版本的 CMMD 距离的计算code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# coding=utf-8
"""Memory-efficient MMD implementation in JAX."""

import jax
import jax.numpy as jnp

Array = jnp.ndarray

# The bandwidth parameter for the Gaussian RBF kernel. See the paper for more
# details.
_SIGMA = 10
# The following is used to make the metric more human readable. See the paper
# for more details.
_SCALE = 1000


@jax.jit
def mmd(x, y):
"""Memory-efficient MMD implementation in JAX.

Args:
x: The first set of embeddings of shape (n, embedding_dim).
y: The second set of embeddings of shape (n, embedding_dim).

Returns:
The MMD distance between x and y embedding sets.
"""
x = jnp.asarray(x)
y = jnp.asarray(y)

# jnp.matmul(x, x.T) etc. are not cached to avoid OOM when x has many rows.
x_sqnorms = jnp.diag(jnp.matmul(x, x.T))
y_sqnorms = jnp.diag(jnp.matmul(y, y.T))

gamma = 1 / (2 * _SIGMA**2)
k_xx = jnp.mean(
jnp.exp(
-gamma
* (
-2 * jnp.matmul(x, x.T)
+ jnp.expand_dims(x_sqnorms, 1)
+ jnp.expand_dims(x_sqnorms, 0)
)
)
)
k_xy = jnp.mean(
jnp.exp(
-gamma
* (
-2 * jnp.matmul(x, y.T)
+ jnp.expand_dims(x_sqnorms, 1)
+ jnp.expand_dims(y_sqnorms, 0)
)
)
)
k_yy = jnp.mean(
jnp.exp(
-gamma
* (
-2 * jnp.matmul(y, y.T)
+ jnp.expand_dims(y_sqnorms, 1)
+ jnp.expand_dims(y_sqnorms, 0)
)
)
)

return _SCALE * (k_xx + k_yy - 2 * k_xy)

3.4 CLIP Score

CLIP 模型由 OpenAI 发布,其模型包含一个图像 encoder 和一个文本 encoder,训练的目的是实现图文特征的对齐。因此常用两个 encoder 分别提取文本和图像的 embedding,然后计算相似性得分,距离越大证明相似性越低,也就是图像和文本越不相关。常用于评估模型以文本作为条件生成的图像是否很好满足文本要求。

3.5 DrawBench

在 Imagen 中,Google 同步提出了 DrawBench,这是一个全面且具有挑战性的文本生成图片模型评测基准。

如下图 Table A.1 所示,DrawBench 基准包含 11 个类别的 200 个文本提示:

9d6bf15e3563d1b2bef2404e66382764

针对这个基准的评估,会对每个类别进行独立的人工评估。对于每个提示,评分员都会看到两种图像,一组来自模型 A,一组来自模型 B。每组包含来自相应模型的 8 个随机生成结果,针对每组图像,评分员都会被问两个问题:

  • 哪个图像质量更高?
  • 哪个图像与文本描述更匹配?

这些问题是为了评估生成图像的质量以及文本-图像匹配度。对于每个问题,评分员都有三种选择:

  • 更喜欢 A
  • 无法确定
  • 更喜欢 B

3.6 PartiPrompts

在 Parti 中,Google 作者构建了 PartiPrompts 评估基准,其包含 1600 个英文提示,并将其按照两个维度进行划分:Category 和 Challenge,具体的分布如下所示:

7b6a1d9ee4ddf9cdc79c3bde46d80cd1

四、常用模型

4.1 模型结构

图像生成任务中通常会包含几个子模型,常见的结构有 CNN、AutoEncoder、U-net、Transformer 等。

其中 AutoEncoder 模型和 U-Net 模型结构上非常相似,也通常是各种模型的主干。主要不同表现在:

  • AutoEncoder 包含 Encoder 和 Decoder,它们训练完后可以单独使用:
    • Encoder 通常用于对输入进行编码(压缩),比如将图像 X 映射到隐空间(Latent Space)L。
    • Decoder 通常用于使用编码重构输入(解压缩),比如从隐空间 L 恢复出图像 X。
  • U-Net:U-Net 模型结构和 AutoEncoder 模型很类似,主要是在 Encoder 和 Decoder 的不同分辨率之间添加了 Skip Connection,如下图所示,也就是说,此时的 Decoder 不仅依赖 Latent code 还依赖输入,也就不能分开单独使用:

c249d790a2143bec2be8f4bc5cb9ad54

4.2 VAE

基于latent的图像生成模型都需要一个 vae 模型,将图片压缩,然后再压缩空间内进行扩散训练。autoencoder是一个基于encoder-decoder架构的图像压缩模型,对于一个大小为 $H\times W \times 3H$的输入图像,encoder模块将其编码为一个大小为 $h\times w \times c$ 的latent,其中$f=H/h=W/h$为下采样率(downsampling factor)。在训练autoencoder过程中,除了采用L1重建损失外,还增加了感知损失(perceptual loss,即LPIPS,具体见论文The Unreasonable Effectiveness of Deep Features as a Perceptual Metric)以及基于patch的对抗训练。辅助loss主要是为了确保重建的图像局部真实性以及避免模糊,具体损失函数见latent diffusion的loss部分。同时为了防止得到的latent的标准差过大,采用了两种正则化方法:第一种是KL-reg,类似VAE增加一个latent和标准正态分布的KL loss,不过这里为了保证重建效果,采用比较小的权重(~10e-6);第二种是VQ-reg,引入一个VQ (vector quantization)layer,此时的模型可以看成是一个VQ-GAN,不过VQ层是在decoder模块中,这里VQ的codebook采样较高的维度(8192)来降低正则化对重建效果的影响。

4.3 Text Encoder

4.3.1 CLIP模型

CLIP 是 OpenAI 发布的在大规模图文数据对(4亿)上通过对比学习进行预训练的图文对齐模型。如下图左侧是其对比预训练过程,在一个 batch 中对应的图文特征作为正对,图片特征和其他文本特征作为负对。如下图右侧,可广泛用于 zero-shot 的图像分类等任务。由于其强大的表征能力,其 Text Encoder 和 Image Encoder 常被其他模型使用,用于对图像或文本编码。

89e07698ff3038a219f065e5c61f9048

4.3.2 T5系列

在 Imagen 中增加语言模型的大小比增加图像扩散模型的大小更能提高样本逼真度以及实现更好的图像-文本对齐。与此类似,Parti 中作者同样发现使用更大的 Text Encoder 可以实现更好的文本-图像对齐。后续的大规模训练的文生图模型通常都采用更大的 Text Encoder如,T5系列。

如下图 Figure A.5 所示为 Imagen 中作者对比的不同大小 T5 模型的影响:

903fac13d3f00a8f82a2ae9ba3a45307

五、模型类型

5.1 VAE 系列

VAE 系列模型的发展大概分为几个阶段,首先是从 AE(AutoEncoder)发展到 VAE(Variational Autoencoder),然后依次出现了 VQ-VAE(Vector Quantised VAE)、VQ-VAE-2 以及 VQ-GAN、ViT-VQGAN 和 MaskGIT 等工作。然而这些工作往往用于无条件生成,或者简单的类别条件、图像条件等,其往往不支持文本输入,或者相关能力很弱。从 21 年初 DALL-E 的发布,文生图的模型开始大量出现,进一步出现 DALL-E mini、 CLIP-VQ-GAN、Parti、Muse 等模型。如下图所示,为这一系列模型的演进路径:

图片

5.1.1 AE

AE(AutoEncoder,可以称作自编码器)是一种人工神经网络,可以用于学习无标签数据的有效编码。AE 的目的是:学习对高维度数据进行低维度表示(Representation),也就是压缩,因此常用于降维。

AutoEncoder 有两个主要的部分组成:

  • Encoder(编码器):用于对输入进行编码(压缩)
  • Decoder(解码器):用于使用编码重构输入(解压缩)

fb9f488d416a381068984a8a3551c56a

5.1.2 VAE

VAE (Variational AutoEncoder,也称变分自编码器)主要是在 AE 的基础上引入概率生成模型的概念,通过在隐空间引入概率分布,使模型能够生成多样性的样本,并且在学习过程中可以更好地理解数据的分布。

a8e276e9d7984e2b4aaf355354d453bb

5.1.3 VQ-VAE

VQ-VAE(Vector Quantization)主要是在 VAE 的基础上引入离散的、可量化的隐空间表示,有助于模型更好地理解数据中的离散结构和语义信息,同时可以避免过拟合。VQ-VAE 与 VAE 的结构非常相似,只是中间部分不是学习概率分布,而是换成 VQ 来学习 Codebook。

e482da18c0de663daae469b67e28630e

5.1.4 VQ-GAN

VQ-GAN 相比 VQ-VAE 的主要改变有以下几点:

  • 引入 GAN 的思想,将 VQ-VAE 当作生成器(Generator),并加入判别器(Discriminator),以对生成图像的质量进行判断、监督,以及加入感知重建损失(不只是约束像素的差异,还约束 feature map 的差异),以此来重建更具有保真度的图片,也就学习了更丰富的 codebook。
  • 将 PixelCNN 替换为性能更强大的自回归 GPT2 模型(针对不同的任务可以选择不同的规格)。
  • 引入滑动窗口自注意力机制,以降低计算负载,生成更大分辨率的图像。

2fd67a6c6cd150333e5b67a5e04dc10b

5.1.5 ViT-VQGAN

如下图 Figure 1 所示,ViT-VQGAN 的模型结构与 VQGAN 基本一致,主要是将 Encoder 和 Decoder 从 CNN 结构替换为 ViT 模型。

  • Encoder:对应 Patch 大小为 8x8,没有重叠,因此 256x256 的图像会生成 32x32=1024 个 Token 序列。推理阶段不再需要。
  • Quantization:将 1024 个 Token 序列映射到 Codebook 空间,Codebook 的大小为 8192。
  • Decoder:从 1024 个离散 Latent code 中恢复原始图像。
  • Autoregressive Transformer:用于生成离散 Latent code。训练中可以直接利用 Encoder 生成好的离线 Latent code 作为 Target,计算交叉熵损失。

e3e2d7cf919d5203b5e624890552c6c4

5.1.6 Parti

相比原始的 VQ-GAN 和 ViT-VQGAN 中使用 Decoder Only 的 Transformer 来生成离散 latent code,Parti 中作者将其扩展为 Encoder + Decoder 的 Transformer,这样可以使用 Encoder 来对文本编码,生成文本 embedding,然后文本 embedding 作为条件在 Transformer Decoder 中作为 K 和 V 通过 Cross Attention 与视觉 Token 交叉。

f68c546ba8ba4a43d1c953b513831e8b

5.1.7 MaskGIT

MaskGIT 采用 VQGAN 的模型范式,与 VQGAN 不同的是,VQGAN 中的 Transformer 采用序列生成的方式,在推理阶段其图像 Token 要一个一个预测,性能比较差,而 MaskGIT 中,Transformer 生成模型采用 Masked Visual Token Modeling 方式来训练(采用类似 Bert 的双向 Transformer 模型),也就是随机遮挡部分图像 Token,模型训练的目标是预测这些遮挡的 Token。以此方式训练的 Transformer 可以充分利用并行解码(Parallel Decoding)方式加速生成效率。

f5712e7c963de4f73185ac6d7e2be335

5.1.8 Muse

Muse 采用预训练的 LLM 提取文本 embedding,和 MaskGIT 一样,被训练用于预测随机 Mask 的图像 Token。作者发现,直接预测 512x512 分辨率的图像会导致模型更关注一些低级的细节,同时发现使用级联模型更有帮助。首先生成 16x16 的 latent map(对应 256x256 分辨率的图像),然后基于 16x16 的 latent map 使用超分模型上采样 64x64 的 latent map(对应 512x512 分辨率的图像)。

如下图 Figure 3 所示为 Muse 模型的整体架构,可以看出,其包含多个组件,主要是三个部分:

  • Text Encoder:用于提取文本 embedding
  • 256x256:低分辨率 Token 预测,包含 VQ Tokenizer 和 Base Transformer
  • 512x512:高分辨率 Token 预测,包含 VQ Tokenizer 和 SuperRes Transformer

5a36f94abe364e7042847dc4d2baa2dd

5.1.9 DALL-E

与 VQ-GAN 类似,DALL-E 的训练也是分为两个阶段,第一阶段是训练 VAE,不过并没有使用 VQ-VAE,而是使用 Discrete VAE(dVAE),整体来说与 VQ-VAE 类似,主要的区别是引入 Gumbel Softmax 来训练,避免 VQ-VAE 训练中 ArgMin 不可导的问题。

8b61b46863918fc922628bc78b04dd19

5.1.10 VQGAN-CLIP

VQGAN-CLIP 的思路很简单:使用初始图像通过 VQ-GAN 生成一个图像,然后使用 CLIP 对生成图像和 Target Text 提取 embedding,然后计算相似性,并将其误差作为反馈对隐空间的 Z-vector 进行迭代更新,直到生成图像和 Target Text 对应的 embedding 很相似为止。

f086b8acb2025280465b00e48c7388ea

5.2 Diffsion 系列

Diffusion 模型的发展路径如下图所示,主要是 OpenAI 系列模型,Stable Diffusion 系列模型,和 Google 的 Imagen、Imagen 2。其他的开源模型有 kandinsky系列。

e5b762a35bb56d73325c0d5669166902

5.2.1 DDPM

扩散模型包含两个过程:前向过程(Forward Process,也称为扩散过程 Diffusion Process)和逆向过程(Reverse Process)。无论是前向还是逆向,都是一个马尔科夫链形式(Markov Chain),其中前向过程是不断地向图片中添加高斯噪声,逆向过程是不断地去除高斯噪声,重建图像。

ff475021fcfb86dd901049005ef4e373

5.2.2 Diffusion Model Beat GANS

这也是 OpenAI 的工作,本文的工作主要有两点:

  • 验证了无条件图像生成中不同模型结构对效果的影响,进行了大量的消融实验。
  • 引入 classifier guidance 来提升生成质量。

对模型结构的修改主要有以下几个方面:

  • 保持模型大小不变,增加深度,降低宽度
  • 增加 Attention 头的数量
  • 不只是在 16x16 分辨率使用 Attention,在 32x32 和 8x8 也使用
  • 在上采样和下采样激活时使用 BigGAN 的 residual block
  • 在 residual connection 中采用 1/sqrt(2) 的缩放

如下图 Table 1 所示为不同配置的影响,可以看出,使用更多的 Attention 头、在多个分辨率使用 Attention 以及采用 BigGAN 的 residual block 获得了最好的结果,提出的模型称作 ADM(Ablate Diffusion Model),这个模型也为 OpenAI 后续的生成模型奠定了基础,Stable Diffusion 的模型也有参考:

ee96a536861dd5c4b7085da4cb11ced6

5.2.3 GLIDE

GLIDE 模型中作者将 Diffusion 模型应用于文本条件图像生成,GLIDE 主要包含两个子模型:

  • 文本条件+扩散模型(3.5B)
    • Text encoding Transformer(1.2B,24 个 residual block,width 2048)。
    • 扩散模型(64x64 分辨率,2.3B),采用 Diffusion Model Beat GANs 中的 ADM(Ablated Diffusion Model), width 扩展到 512 channels,并在此基础上扩展了文本条件信息。
  • 文本条件+上采样模型(1.5B)
    • 和上一步类似的 Text Transformer 模型,不过 width 从 2048 降低到 1024
    • 上采样模型同样来自 ADM-U(分辨率从 64x64 扩展到 256x256,channel 从 192 扩展到 384)

5.2.4 DALL-E 2

在 GLIDE 中尝试了文本引导图像生成,取得了不错的结果。在本文中,作者充分利用强大的 CLIP 模型,提出了一个两阶段图像生成模型,整体的模型结构如下图 Figure 2 所示:

04493eedf06a325b6b037b1ad0ab65e4

  • img encoder:对应 CLIP 模型的 image encoder,给定图像,并生成图像 embedding zi,这个 embedding zi 在训练中用于 prior 生成的 target,也就是训练中 prior 生成的 embedding 要与 CLIP img encoder 生成的 embedding 尽量相似。训练中 img encoder 保持冻结,推理生成阶段不再需要 img encoder。
  • text encoder:用于在训练阶段和图像生成阶段对文本进行编码,生成 embedding zt,作为 prior 的输入。训练和推理阶段都需要 text encoder,并且始终保持冻结。
  • prior:用于从文本 embedding zt 生成图像 embedding zi。
  • decoder:用于从图像 embedding zi 生成最终图像(文本条件为可选项)。

5.2.5 DALL-E 3

DALL-E 3 是 OpenAI 最新的文生图模型,作者发现传统的文生图模型难以遵循详细的图像描述,并且经常出现忽略单词或混淆提示的语义,作者猜测可能是训练集中的噪声或者不准确的图像描述导致的。因此,作者首先训练了一个图像描述器,然后生成了一系列高度描述性的图像描述,之后将其用于文生图模型训练,其大大提高了文生图的指令跟随能力。

作者只在附录中用很小的篇幅介绍了 DALL-E 3 的部分模型组件,包括 Image decoder 和 latent decoder。

如下图所示,其 image decoder 参考了 Stable Diffusion 的实现,采用 3 阶段的 latent diffusion 模型。

  • 其 VAE 和 Stable Diffusion 一样,都是 8x 的下采样,训练的图像分辨率为 256x256,会生成 32x32 的隐向量。
  • 时间步长条件:采用 GroupNorm,并学习了 scale 和 bias。
  • 文本条件:使用 T5 XXL 作为 text encoder,然后将输出的 embedding 和 xfnet 进行 Cross Attention。在 OpenAI 的 Paper 中并没有找到 xfnet 相关介绍,不过在 GLIDE 的开源代码里确实有 xf model。

a4d752cf60a335984ffbe6c9be91f277

如下图所示,作者同样训练了一个 latent decoder,可以用来提升图像细节,比如文本和人脸。其同样是参考 Stable Diffusion 的实现。不过这个 diffusion decoder 采用的是 DDPM 中描述的空间卷积 U-Net,此外,也基于 [2303.01469] Consistency Models 的蒸馏策略将去噪步数降低到 2 步,极大降低推理代价。

1102103845a6060740450931813e5325

5.2.6 stable diffusion

LDM 和其他扩散生成模型结构类似,整体来说包含三个组件:

  • Auto Encoder:下图左侧部分,包含红框的 Encoder 和蓝框的 Decoder,其中 Encoder 主要用于训练中生成 target z,推理阶段不需要。而 Decoder 用于从隐空间编码(latent code)恢复出图像。
  • Conditioning:下图右侧部分,用于对各种条件信息进行编码,生成的 embedding 会在扩散模型 U-Net 中使用。不同的条件可能会有不同的 Encoder 模型,也有不同的使用方式(对应下图中的 switch),比如:
    • 对于文本类型条件,可以使用 Bert Encoder,也可以使用 CLIP 中的 Text Encoder 将文本编码为 embedding。
    • 对于图像类型条件,比如图像修复、分割条件,可以将其编码后与噪声 Concat 作为输入,而不是通过 Attention 机制交叉。
  • Denoising U-Net:下图中间部分,用于从随机噪声 zT 中通过几步迭代生成 latent code,然后使用 Decoder 恢复出图像。其中的各种条件信息都会通过 Cross Attention 进行交叉融合。需要说明的是,U-Net 生成的目标是 x 经 Encoder 编码后的 embedding,通常也称为隐向量,而不是直接生成图像像素,因此说 U-Net 是作用在隐空间(Latent Space)。

f301399b271b39302f3e911abacb87f9

5.2.7 SDXL

SDXL 相比 SD 主要的修改包括(模型总共 2.6B 参数量,其中 text encoder 817M 参数量):

  • 增加一个 Refiner 模型,用于对图像进一步地精细化。
  • 使用 CLIP ViT-L 和 OpenCLIP ViT-bigG 两个 text encoder。
  • 基于 OpenCLIP 的 text embedding 增加了一个 pooled text embedding。

59522404e4b0979c96b20996ba69c164

a5ab65454a275ac3437cf94401345379

5.2.8 SDXL-Turbo

SDXL-Turbo 在模型上没有什么修改,主要是引入蒸馏技术,以便减少 LDM 的生成步数,提升生成速度。大致的流程为:

  • 从 Tstudent 中采样步长 s,对于原始图像 x0 进行 s 步的前向扩散过程,生成加噪图像 xs。
  • 使用学生模型 ADD-student 对 xs 进行去噪,生成去噪图像 xθ。
  • 基于原始图像 x0 和去噪图像 xθ 计算对抗损失(adversarial loss)。
  • 从 Tteacher 中采样步长 t,对去噪后的图像 xθ 进行 t 步的前向扩散过程,生成 xθ,t。
  • 使用教师模型 DM-student 对 xθ,t 进行去噪,生成去噪图像 xψ。
  • 基于学生模型去噪图像 xθ 和教师模型去噪图像 xψ 计算蒸馏损失(distillation)。
  • 根据损失进行反向传播(注意,教师模型不更新,因此会 stop 梯度)。

833e48d05789f1a87502b398912f276c

5.2.9 Imgen

Imagen 是 Google 推出的基于扩散模型的文生图模型,其具有前所未有的逼真度和深层次的语言理解能力。Imagen 结合了大型 Transformer 语言模型的强大能力和扩散模型的高保真图像生成能力。

整体来说,模型包含四个基础组件:

  • Frozen Text Encoder:将文本编码为 embedding,作者对比了 T5 系列模型和 CLIP 的 text Encoder,最终选择 T5-XXL。
  • Text-to-Image Diffusion Model:采用 U-Net 结构的 Diffusion 模型,并将步数 t 和上一步的文本 embedding 作为条件。共 2B 参数量。
  • 第一 Super-Resolution Diffusion Model:采用本文优化过的高效 U-Net,将 64x64 图像超分为 256x256 图像,同样使用文本 embedding 作为条件。共 600M 参数量。
  • 第二 Super-Resolution Diffusion Model:采用本文优化过的高效 U-Net,将 256x256 图像超分为 1024x1024 图像,同样使用文本 embedding 作为条件。共 400M 参数量。

e8c67004fbee80b979088cdf64836973

5.2.10 Instruct Imagen

Instruct-Imagen 是一个图像生成模型,其可以处理多种图像生成任务,并泛化到之前没有见过的任务中。作者引入用于图像生成的多模态指令,其使用自然语言来合并不同的模态(例如,文本、边缘、风格、主题等),以便以统一的格式标准化不同的生成意图。

作者通过两阶段来训练 Instruct-Imagen 模型(并非从 0 开始):

  • 使用检索增强训练方法(Re-Imagen)来训练模型,以增强模型基于额外的多模态上下文来生成图像的能力。
  • 使用各种需要视觉-语言理解的生成任务来微调模型。每个任务都有对应的多模态指令模板。

基于各种图像生成数据集的人工评估表明,Instruct-Imagen 达到或超过了之前针对特定任务的模型,并在未见过任务和更复杂任务上展示了良好的泛化能力。

image-20240226231701321

如下图所示为本文的 Instruct-Imagen 模型,其相比 Imagen 模型主要有以下几点变化:

  • Frozen Text Encoder:和 Imagen 一样,同样采用预训练的 T5-XXL 模型,并且在整个训练过程中保持冻结。
  • Text-to-Image Diffusion Model(Image Encoder + Image decoder):同样采用 U-Net 结构的 Diffusion 模型,不过生成图像分辨率变为 128x128,而 Imagen 为 64x64。
  • Super-Resolution Diffusion Model:Imagen 有两个超分模型,而 Instruct-Imagen 只有一个超分模型,分辨率从 128x128 -> 1024x1024。
  • Multimodal Context:新增的多模态上下文模块,这里复用上述的子模型,只增加额外的 Cross-Atten 模块(每个文本-图像对都会编码为一个多模态 Embedding):
    • Frozen Text Encoder:用于对文本指令进行编码,获得文本 Embedding。
    • Image Encoder:对图片条件进行编码,并且会与文本 Embedding 进行交叉融合,输出融合后的多模态 Embedding。
    • Cross-Atten:唯一新增的模块,添加在 image decoder 之前,用于融入多模态上下文。模型参数量增加很少,从 2.51B 增加到 2.76B,只增加 10%。

相比 Imagen 中的 Text-to-Image Diffusion 模型,作者将分辨率从 64x64 提升到 128x128,并只保留一个超分模型。除此之外,作者还对基础的 U-Net 结构进行了升级,主要是更新其中的 DBlock 和 UBlock:

  • 在 Imagen 中,每个分辨率下只有一个 DBlock 和一个 UBlock,在每个 Block 中都有多个 ResNet Block。
  • 在 Instruct-Imagen 中,每个分辨率下有多个 DBlock 和多个 UBlock,每个 Block 中只有一个 ResNet Block。这样就可以插入更多的 Attention 层。

5.2.11 wurschen

image-20240218140602925

image-20240218142258132

wurschen 三阶段级联结构,目标的是为了降低训练和推理的计算要求和时间,并且保持生成图像的质量。核心是通过在非常低维的 latent space 上以 42:1 的高压缩比来训练扩散模型来实现。

  • 首先使用文本条件的 LDM(阶段 C)以强压缩比创建图像的低维潜在表示。
  • 随后,使用这个潜在表示和text-condition一起调节另一个 LDM(阶段B),产生在更高维度(较少压缩)的潜在空间中的潜在表示,该模型负责进行重建(阶段B)。
  • 最后,通过 VQGAN 解码器对中间分辨率的潜在表示解码,生成完整分辨率的输出图像(阶段A)。

5.2.12 stable cascade

stable cascade是基于Wuerstchen架构包含三阶段的文生图扩散模型,相比Stable Diffusion XL,它不仅更快而且效果更好。

截图20240218144038

最重要的一个阶段是Stage C,它是一个基于文本作为条件来生成图像的latents的扩散模型,只不过这里的latents和SD中的latents有些区别,之前的SD是采用一个VAE将图像编码成下采样8x的latents,而这里是采用一个Semantic Compressor来将3×1024×1024的图像压缩成16×24×24的latents,空间下采样约42x,这比SD的VAE要狠的多(不过特征维度高了)。这里的Semantic Compressor采用的是EfficientNetV2-S模型

1
2
3
4
5
6
7
8
9
10
11
class EfficientNetEncoder(nn.Module):
def __init__(self, c_latent=16):
super().__init__()
self.backbone = torchvision.models.efficientnet_v2_s(weights='DEFAULT').features.eval()
self.mapper = nn.Sequential(
nn.Conv2d(1280, c_latent, kernel_size=1, bias=False),
nn.BatchNorm2d(c_latent, affine=False), # then normalize them to have mean 0 and std 1
)

def forward(self, x):
return self.mapper(self.backbone(x))

对于3x1024x1024的图像,首先resize到3x768x768,然后经过EfficientNetV2-S后得到1280x24x24的特征,这里再额外加了一个Conv和BN层将特征映射为16x24x24。 Stage C的text encoder采用的是OpenCLIP ViT-G,这里是提取了token embeddings(77x1280)以及全局pooled embedding(1x1280),其中pooled embedding映射为4个token特征,和token embeddings拼接在一起送入Stage C的UNet作为条件,这里采用的条件机制还是通过cross- attention。此外,Stage C在训练过程中还引入CLIP image encoder的image embedding作为条件,这里是采用openai CLIP ViT-L提取的image embedding,然后映射为4个tokens和text tokens拼接在一起,不过训练过程中对image embedding采用比较大的drop比例(90%)。CLIP image embedding的引入可以让模型类似DALLE-2那样支持image variation。 从本质上看,这里的Stage C其实就是想当于一个SD主模型(UNet),只不过采用了不同的autoencoder所提取的latents,相比较而言,Stage C采用了压缩率更大的latents,这也使得模型更高效。这里开源的Stage C也有两个不同大小的版本:一个是1B,一个是3.6B,但是肯定是3.6B的模型效果更好,也是主推模型。

Stage C可以将文本转成图像的latents,要想生成最终的图像,还需要解码器,这就是Stage B和Stage A了。Stage B和Stage A和在一起,就是一个latent decoder,它是将16x24x24的latents解码为一个3x1024x1024的图像,从功能上就相当于SD中的VAE decoder。

5.3 其他开源系列

kandinsky系列是俄罗斯一个团队开源的文生图模型,致力于多语言条件生成能力。

5.3.1 kandinsky 2.1

img

如上图所示,kandinsky2.1 结合了 Dalle 和 stable diffusion 中比较有效的结构。

整体来说模型包含五个组件:

  • text-encoder:为了进行多语言生成,kandinsky使用了多语言的文本编码器, XLM-Roberta-Large-Vit-L-14, 参数约 560M。
  • prior:prior模型采用了 DiT 结构,利用扩散生成的目标来对齐 CLIP文本和图像的embedding。参数约 1B。
  • CLIP image encoder: 将图像编码成 embedding 作为 prior 训练的 groundtruth。
  • latent diffusion Unet:此时训练的条件不仅是来自文本的 embedding,也包含以文本为条件通过prior模型产生的 image clip embedding。参数规模约 1.22B。
  • MoVQ编码器/解码器:将图像编码到 latent space。

5.3.2 kandinsky2.2

img

Kandinsky 2.2 对其前身 Kandinsky 2.1 进行了重大改进,引入了新的、更强大的图像编码器 - CLIP-ViT-G 和 ControlNet 支持。改用 CLIP-ViT-G 作为图像编码器显着提高了模型生成更美观的图片和更好地理解文本的能力,从而提高了模型的整体性能。

架构细节:

  • 文本编码器 (XLM-Roberta-Large-Vit-L-14) - 560M
  • 扩散图像先验 — 1B
  • CLIP 图像编码器 (ViT-bigG-14-laion2B-39B-b160k) - 1.8B
  • 潜在扩散 U-Net - 1.22B
  • MoVQ编码器/解码器 - 67M

另一个相较于 2.1 的重大改进是,训练 U-net的时候只用 image encoder产生的 embedding 作为条件。

5.3.3 kandinsky 3.0

kandinksky 3.0 的pipeline包括一个 text encoder, unet,vae

没有采用 kandinsky2.x 和 sdxl 的两段式结构。kandinsky3.0的整体参数量是 kandinsky2.2 的三倍,sdxl的3.6倍,采用一个更大的text encoder FLAN-UL2的encoder,光这部分的参数量就到了8.6B。unet的架构也提升到了3.0B。

image-20231211152627128

image-20231211153134797

作者通过大量实验得到以下两个 insight:

  • 在实践中,增加网络的深度,同时减少总的参数,可以在训练中获得更好的结果。
  • 在初始阶段,在高分辨率下,仅使用卷积块来处理图像,同时更多的压缩表示送到transformer层,确保图像元素的全局交互。

5.3.4 RAPHAEL

image-20230704192147695

作者观察到不同的文本概念在生成过程中影响不同的图像区域,而传统的交叉注意层通常很难在图像中充分保留这些不同的概念。为了缓解这个问题,我们采用了一个扩散模型,堆叠了数十个专家混合 (MoE) 层 ,包括空间 MoE 层和时间 MoE 层。具体来说,空间 MoE 层负责描绘特定图像区域中的不同概念,而时间 MoE 层则专注于在不同的扩散时间步长上绘制这些概念。

image-20230704195433571

另外,利用一个旁支的网络来根据注意力图预测输入图像的边缘图, 复杂的边界可以作为监督来指导模型保留各种风格的详细图像特征。

RAPHAEL的损失函数包含两部分:$L = L_{denoise}+L_{edge}$

image-20240130114154739

5.3.5 Muse

image-20230609181214290

Muse是在离散 token 空间,通过 mask modeling 任务训练的:T5-XXL预训练的文本编码器生成文本embedding,用于 Base Transformer 和 SuperRes Transformer中,和 image token进行cross attention。Base model使用在低分辨率上256256训练的VQGAN,并生成 16\16的token,序列以每个样本的可变速率被mask,然后交叉熵损失学习预测mask的image token。一旦训练了 Base model,重建的较低分辨率token和 文本embedding 就被传递到超分辨率模型中,然后超分辨率模型学习以较高分辨率预测 masked tokens。

5.3.5 PixArt-alpha

目前 sota 的文生图模型需要大量的训练成本,训练数据。$pixart-\alpha$正如题目中提到的 fast training,主打低成本训练。采用了 meta 提出的 DiT 架构。模型参数只有0.6B,它的训练时长只有SD 1.5的10.8%,而且只使用了 25M 数据进行训练。

下面是和目前的主流模型的训练成本:

image-20231102171712747

为了实现降低训练的计算成本同时保持图像的生成质量, pixart-alpha提出了三个关键设计。

  1. training strategy decomposition

将复杂的文本到图像的任务分解成三个简化的子任务:(1) 学习自然图像的像素分布,(2)学习文本图像对齐,(3)增强图像的美学质量。对于第一个子任务,使用低成本的类条件模型初始化 T2I 模型,从而显着降低学习成本。对于第二个和第三个子任务,制定了由预训练和微调组成的训练范式:对信息密度丰富的文本图像对数据进行预训练,然后对具有优越美学质量的数据进行微调,提高训练效率。

  1. Efficient T2I Transformer

结合了交叉注意模块来注入文本条件并简化计算密集型类条件分支以提高效率。此外,我们引入了一种重新参数化技术,允许调整后的文本到图像模型直接加载原始类条件模型的参数。因此,我们可以利用从 ImageNet 中学到的有关自然图像分布的先验知识,为 T2I Transformer 提供合理的初始化并加速其训练。

  1. High-information data

目前的文本图像对数据集如 Laion 其中文本标题经常缺乏信息内容,并且严重的长尾效应(及大量名词以极低的频率出

3现)。这些都影响模型的训练效率。pixart-alpha利用 LLaVA 在 SAM 数据集上生成 caption。

5.3.6 PanGu-Draw

image-20240130155824264

如上图所示,目前文生图的大多采用多阶段训练策略来提高生成图片的质量和分辨率。PanGu-Draw 提出的时间解耦训练策略在资源效率方面超越了级联训练和分辨率提升训练。

作者从扩散过程的去噪轨迹中得到灵感,其中初始去噪阶段主要塑造图像的结构基础,而后期阶段则完善其纹理复杂性。基于以上事实,引入时间解耦训练策略,将综合文生图模型划分为在不同时间间隔上运行的专用子模型:结构生成器和纹理生成器,每个模型是原始模型的一半。每个子模型都是在不同的时间间隔下单独训练的。

模型结构方面采用 ==SDXL 的VAE模型,并基于其 Unet 模型的架构构建结构和纹理生成器==,为了实现双语文本到图像的生成(中文和英文),在中文训练数据集上预训练中文文本编码器 。然后,我们将来自中文文本编码器的文本嵌入与来自预训练的英文文本编码器的文本嵌入连接起来,作为去噪模型的最终文本嵌入。对于多分辨率图像生成,我们选择 1024x1024 左右的图像分辨率范围,并进一步根据与图像分辨率索引相对应的正弦位置嵌入来调节去噪模型。

promptenhancement:为了进一步提升生成质量,利用LLM将用户的简洁输入与模型所需的详细输入保持一致。

image-20240130162205337

image-20240130162255805

从结果来看,pangu 模型训练数据 caption 应该也是通过 LLM 处理过的,类似于 Dalle3 和 pixart-alpha提到的。

扩散模型可控生成的方法总结

文生图模型可控生成可以分为结构控制和内容控制

结构控制以ControlNet和T2I-Adapter为代表,通过用户输入的 canny, sketch, depth map等来控制生成图像的结构,主要通过改变原始unet不同分辨率的中间特征来达到目的。controlnet是将额外网络的得到特征加到unet deocder上,T2I-Adapter是将额外网络得到的特征加到对应的Unet encoder上。

概念控制以 IP-Adapter为代表,通过引入新的输入来控制生成图像的内容。很多文章都验证了 cross attention layers 是控制图像空间布局与条件提示之间对应关系的关键,简言之,生成图像的语义主要通过cross attention来控制。prompt to prompt通过将原始prompt生成的 attention map和修改后的prompt生成的attention map结合到一起来达到图像编辑的功能。一些工作通过各种各样的方式得到新的特征,然后将其与文本特征连接或者是通过替换原始文本特征,将合并后的特征输入到扩散模型的UNet中,以指导图像生成,如photomaker。

接下来我们介绍一下可控生成的代表性工作Contronet,Adapter,后续很多的工作大多基于此做的改进来达到自己期望的结果。

1、Controlnet

1.1 背景

在 controlnet 之前的图像扩散模型,像 stable diffusion,只支持文本来控制图像生成。如果要生成符合期望,有特定细节的图像,需要调整 seed 和 prompt,耗时比较长。借助 ControlNet,可以使用各种输入条件如(outlines, human poses, depth mpas,edge maps等)控制图像生成。

image-20240204114115794

1.2 方法

image-20240204114212325

ControlNet 是一种 “辅助式” 的神经网络模型结构,可以增强具有特定任务条件的预训练图像扩散模型。如 Figure 2 所示,Controlnet 可以应用于任意神经网络结构。Controlnet 主要在 trainable copy 上施加控制条件,然后将施加控制条件之后的结果和原来SD模型的结果相加获得最终的输出结果。

其中,原模型的权重保持不变,在训练中 frozen, 保留了原模型原本的能力;与此同时,使用额外数据对 trainable copy进行微调,学习我们想要添加的条件。ContorlNet 模型中有两个 zero convolution 模块,它们是 $1\times1$卷积,并且权重和偏置都初始化为零。这样一来,在我们开始训练ControlNet之前,所有zero convolution模块的输出都为零,使得ControlNet完完全全就在原模型的能力上进行微调训练,不会产生大的能力偏差,也会降低破坏原模型能力的风险**

tmp

上面是应用在开源文生图模型 Stable Diffusion上 ControlNet 的整体结果,其主要在Stable Diffusion的U-Net中起作用,ControlNet主要将Stable Diffusion U-Net的Encoder部分进行复制训练,在Stable Diffusion U-Net的Decoder模块中通过skip connection加入了zero convolution模块处理后的特征,以实现对最终模型与训练数据的一致性。

具体地,ControlNet包含了12个编码块和1个Stable Diffusion U-Net中间块的“可训练”副本。这12个编码块有4种分辨率,分别是64×64、32×32、16×16和8×8,每种分辨率对应3个编码块 。ControlNet的输出被添加到Stable Diffusion U-Net的12 个残差结构和1个中间块中。同时由于Stable Diffusion U-Net是经典的U-Net结构,因此 ControlNet架构有很强的兼容性与迁移能力,可以用于其他扩散模型中。

ControlNet一开始的输入Condition怎么与SD模型的隐空间特征结合呢?在这里ControlNet主要是训练过程中添加了四层卷积层,将图像空间Condition转化为隐空间Condition。这些卷积层的卷积核为4×4,步长为2,通道分别为16,32,64,128,初始化为高斯权重,并与整个ControlNet模型进行联合训练。

1.3 总结

优点

  1. 即插即用:controlnet不会影响SD模型原本的生成能力。
  2. 可控生成:controlnet在原本文本指导下,增加各种条件控制模型生成。
  3. 泛化能力强:可以和社区现有不同 finetune SD模型结合。
  4. 灵活:既适用于小规模数据训练(只连接 mid block),也适用于大规模数据训练(先训练contorlnet,再解锁冻结的sd 权重一起训练)。

缺点

  1. 模型比较大(模型文件通常在一点几GB),增加了推理的时间。
  2. 当模型错误理解输入图像的语义时,模型很难生成正确的内容。

2、T2I-Adapter

T2I-Adapter 和 ControlNet 模型一样,能够作为控制条件控制SD模型生成图片的过程。

image-20240204192311798

与 ControlNet 不同的是,T2I-Adapter通过一个 Adapter 额外模型去输入额外的条件,Adapter由四个特征提取模块和三个下采样模块组成,每个特征提取模块 scale由以及个卷积层和两个residual blocks组成。每个scale产生的特征维度与对应的unet层类似,然后和对应的Unet encoder 中间特征相加。

优点:

  • 即插即用:T2I-Adapter算法不会影响SD模型原本的生成能力。
  • 简单且小巧:它们可以轻松地与SD模型结合,T2I-Adapter模型大约只有77M的参数和大约300M的存储空间,且几乎不影响原本模型的推理速度。
  • 灵活组合:可以轻松与多个ControlNet模型组合使用,以实现多条件控制。
  • 泛化能力:在不同的SD模型上具备较好的泛化控制性能。

缺点

  • 生成质量相比ControlNet 略差。
  • 预训练的模型相比ControlNet少。

3. IP-Adapter

Stable Diffusion系列模型在正常情况下是只支持文本提示词的输入,而IP-Adapter算法能够在SD模型的图像生成过程中引入图像提示词(Image Prompt),从而能够识别输入图像的风格和内容,然后控制SD模型生成相似风格或者内容的图片,同时也可以搭配其他类型的ControlNet一起使用。

image-20240204195928381

IP-Adapter的关键设计是:解耦的交叉注意机制,它将文本特征和图像特征的交叉注意层分开。在这之前一些工作做法是 CLIP 图像编码器提取的图像特征通过可训练网络映射到新特征,然后与文本特征连接或者是通过替换原始文本特征,将合并后的特征输入到扩散模型的UNet中,以指导图像生成。

image-20240205111424762

优点:

  • 即插即用:IP-Adapter不会影响原本模型的能力。
  • 简单轻量:总训练参数约22M。
  • 灵活组合:可以与controlnet等结构控制的模型结合使用。
  • 泛化能力:在不同的SD模型上具备较好的泛化控制性能。

缺点:

  • 只能生成内容和风格与参考图像相似的图像。

4. 应用

接下来我们介绍一些应用以上技术,在社区比较火的工作。

4.1 AnyDoor

AnyDoor的任务是 ViT-ALL 即 virtual try-all,zero-shot将任何参考图像放在任意场景图像的指定位置。

image-20240202152533469

模型架构如上,可以看做是 IP-Adapter和ControlNet的结合,这里的通过一个自监督的图像编码器提取图像特征然后替代文本特征输入到Cross attention中。Detail Extractor是一个Controlnet网络结构。训练时候,只冻结U-net encoder,

关键创新点利用一个自监督的图像表示模型-DINO-V2来提取更加细粒度的图像特征,而不是CLIP

image-20240205143940328

4.2 PhotoMaker

photomaker的任务是identity-preserving image synthesis,即生成ID一致的人物图像。

image-20240205153137031

模型结构如上图所示,通过将image encoder提取到 image embedding 与 text embedding融合再替换text embedding中的对应的token,来达到引入 ID 图像信息。训练的时候,原本Unet是一起训练的,无法做到即插即用。效果看起来跟IP-adapter接近,输入的参考图像的数量越多生成效果越好。

image-20240205153851008

image-20240205153925988

4.3 InstantID

InstantID的任务是 identity-preserving image synthesis,即生成ID一致的人物图像。

image-20240205144907436

模型结构如上图,也可以看作是 IP-Adapter 和 ControlNet的结合。其中,IP-Adapter的输入是通过 Face Encoder 模型来提取脸部特征。ControlNet的输入是面部关键点图,条件输入去除了文本特征,只使用 Face embedding。训练的时候,Unet完全冻结。

image-20240205153944668

ECLIPSE: A Resource-Efficient Text-to-Image Prior for Image Generations

image-20240104202314415

1、背景

目前 unCLIP 类型的文生图模型,如 DALLE2,kandinsky2.2, Karlo,先验模型参数太大,对计算资源和训练数据的要求比较高。论文利用对比学习的方法,来训练先验模型,仅使用 3.3%参数和2.8%的数据进行训练就能超过baseline的先验模型,且可以和预训练的扩散图像解码器搭配使用。

现有 diffusion prior model 的问题

论文通过实验说明 prior model steps的增加并不能提高最终生成图片的质量。因此扩散的训练方式存在很多不必要的计算。

image-20240105191501550

image-20240105191509560

图a是

2、方法

image-20240105115308506

论文采用非扩散的训练方式,目标函数有两个,第一个目标函数如下:

image-20240105193153414

将文本embedding投影到视觉embedding上,通过以上近似扩散先验模型的目标函数来实现。这里没有 CFG。但这种相当于直接学习一个函数将文本embedding映射成视觉embedding,泛化性可能比较差。

第二个目标函数如下:

image-20240105194510830

利用对比损失来对齐图像和文本。

最终的损失函数为:image-20240105194826376$\lambda$ 设置为 0.2

3、实验

image-20240105195206469

可以看到 eclipse的方式大大减少了使用的数据量和模型的参数。

image-20240105195231282

image-20240105195311653

对比损失对于图像和文本之间的对齐是有帮助的。

4、总结

unclip的模型结构,decoder的训练直接通过一个image encoder来编码图像得到image embedding,先验模型的任务理论上就是学习一个模型来对齐文本和图像之间的embedding,对齐的越好,那么对于decoder生成越有帮助。并非只能通过扩散的方式来学习先验模型。

1. 背景

此文是为了更好的理解 stable diffusion以及DALL-E 3等最新的图像生成模型,回顾一下在它们之前更早的模型。stable diffusion的作者也是 VQ-GAN的作者,DALL-E3之前还有 DALL-E,DALL-E2。

2. AE

img

作用:可以用于学习 无标签数据的有效编码, 学习对高维数据的进行低维表示,常用于降维,数据去噪,特征学习。

基本思想:AE(auto-encoder)是很早之前的技术了,思路也非常简单:用一个编码器(Encoder)把输入编码为 latent vector;然后用 Decoder 将其解码为重建图像,希望重建后的图像与输入图像越接近越好。通常 latent vector 的维度比输入、输出的维度小,因此称之为 bottleneck。AE 是一个自重建的过程,所以叫做“自-编码器”。

特点:但是模型在 Latent Space 没有增加任何的约束或者正则化,意味着不知道 Latent Space 是如何构建的, 所以很难使用 latent space 来采样生成一个新的图像。

DAE

DAE(Denoising autoencoder)将原始输入图像进行一定程度的打乱,得到 corrupted input。然后把后者输入AE,目标仍然是希望重建后的图像与原始输入越接近越好。DAE 的效果很不错,原因之一就是图像的冗余度太高了,即使添加了噪声,模型依然能抓取它的特征。而这种方式增强了模型的鲁棒性,防止过拟合。

3. VAE

img

论文[1312.6114] Auto-Encoding Variational Bayes

作用:除了AE的作用之外,还广泛应用于生成新的、与训练数据相似但不完全相同的样本。

基本思想:VAE(Variational autoencoder)仍然由一个编码器和一个解码器构成,并且目标仍然是重建原始输入。但中间不再是学习 latent vector z ,而是学习它的后验分布 $p(z|x)$ ,并假设它遵循多维高斯分布。具体来说,编码器得到两个输出,并分别作为高斯分布的均值和协方差矩阵的对角元(假设协方差矩阵是对角矩阵)。然后在这个高斯分布中采样,送入解码器。实际工程实现中,会用到重参数化(reparameterization)的技巧。

重参数就是把带有随机性的z变成确定性的节点,同时把随机性转嫁给另一个输入节点 ϵ例如,这里用正态分布采样,原本从均值为x和标准差为ϕ的正态分布N(x,ϕ2)中采样得到 z,将其转化成从标准正态分布N(0,1)中采样得到 ϵ, 再通过重参数技巧计算得到 z=x+ϵ⋅ϕ。这样一来,采样的过程移出了梯度反向传播的路径,计算图里的参数(均值x和标准差ϕ)就可以用梯度更新了,而新加的 ϵ 的输入分支不做更新,只当成一个没有权重变化的输入。
用博客《The Gumbel-Softmax Distribution》的说法再复述一遍,重参数就是把原来完全随机的节点分成了确定的节点和随机的节点两部分:z∼N(0,1)→z=μ+σϵ where ϵ∼N(0,1)

特点:VAE训练目标除了重构误差,还包括最小化隐空间的KL散度,以确保隐空间与标准正态分布接近。但VAE最大的问题也是这个,使用了固定的先验分布。具体推导涉及 ELBO,如下图

截屏2024-03-09 23.08.49

截屏2024-03-09 23.10.07

4. VQ-VAE

VQ(vector quantization)是一种数据压缩和量化的技术,它可以将连续的向量映射到一组离散的具有代表性的向量中。在深度学习领域,VQ通常用来将连续的隐空间表示映射到一个有限的、离散的 codebook 中。

VAE 具有一个最大的问题就是使用了固定的先验(高斯分布),其次是使用了连续的中间表征,导致模型的可控性差。为了解决这个问题,VQ-VAE(Vector Quantized Variational Autoencoder)选择使用离散的中间表征,同时,通常会使用一个自回归模型来学习先验(例如 PixelCNN),在训练完成后,用来采样得到 $z_e$。

img

图像首先经过encoder,得到$z_e$,它是$H\times W$个 $D$ 维向量。$e_1,e_2,…,e_k$是 $K$ 个 $D$ 维向量,称为codebook。 对于 $z_e$ 中的每个 $D$ 维向量,都可以在 codebook 中找到最接近的 $e_i$, 构成 $z_q$, 这就是decoder的输入。一般 $k=8192, D=512 or 768$。

从 $z_e(x)$ 到 $z_q(x)$ 这个变化可以看成一个聚类,$e_1,e_2,…,e_k$ 可以看作 K 个聚类中心。这样把 encoder 得到的 embedding 离散化了,只由聚类中心表示。

4.1 VQ-VAE的训练

在VQ中使用 Argmin来获取最小的距离,这一步是不可导的,因为无法将 Decoder 和 Encoder联合训练,针对这个问题,作者添加了一个trick,如上图红线所示:直接将 $z_q(x)$的梯度cooy给$Z_e(x)$, 而不是给 codebook里面的embedding。

推推截图_20240112000325

VQ-VAE的loss如上所示,分成三部分,第一项用来训练 encoder和decoder,第二项叫 codebook loss,只训练 codebook,让codebook中的embedding向各自最近的$Z_e(x)$靠近。第三项叫 commitment loss,只训练encoder, 目的是encourage the output of encoder to stay close to the chosen codebook vector to prevent it from flucturating too frequently from one code vector to another, 即防止encoder的输出频繁在各个codebook embedding之间跳

具体代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class VectorQuantizer(nn.Module):
def __init__(self, num_embeddings, embedding_dim, commitment_cost):
super(VectorQuantizer, self).__init__()

self._embedding_dim = embedding_dim
self._num_embeddings = num_embeddings

self._embedding = nn.Embedding(self._num_embeddings, self._embedding_dim)
self._embedding.weight.data.uniform_(-1/self._num_embeddings, 1/self._num_embeddings)
self._commitment_cost = commitment_cost

def forward(self, inputs):
# convert inputs from BCHW -> BHWC
inputs = inputs.permute(0, 2, 3, 1).contiguous()
input_shape = inputs.shape

# Flatten input
flat_input = inputs.view(-1, self._embedding_dim)

# Calculate distances
distances = (torch.sum(flat_input**2, dim=1, keepdim=True)
+ torch.sum(self._embedding.weight**2, dim=1)
- 2 * torch.matmul(flat_input, self._embedding.weight.t()))

# Encoding
encoding_indices = torch.argmin(distances, dim=1).unsqueeze(1)
encodings = torch.zeros(encoding_indices.shape[0], self._num_embeddings, device=inputs.device)
encodings.scatter_(1, encoding_indices, 1)

# Quantize and unflatten
quantized = torch.matmul(encodings, self._embedding.weight).view(input_shape)

# Loss
e_latent_loss = F.mse_loss(quantized.detach(), inputs)
q_latent_loss = F.mse_loss(quantized, inputs.detach())
loss = q_latent_loss + self._commitment_cost * e_latent_loss

quantized = inputs + (quantized - inputs).detach()
avg_probs = torch.mean(encodings, dim=0)
perplexity = torch.exp(-torch.sum(avg_probs * torch.log(avg_probs + 1e-10)))

# convert quantized from BHWC -> BCHW
return loss, quantized.permute(0, 3, 1, 2).contiguous(), perplexity, encodings

4.2 VQ-VAE + PixelCNN

有了上述的 VQ-VAE 模型,可以很容易实现图像压缩、重建的目的,但是无法生成新的图像数据。当然可以随机生成 Index,然后对应生成量化后的 latent code,进而使用 Decoder 来生成输出图像。但是这样的 latent code 完全没有全局信息甚至局部信息,因为每个位置都是随机生成的。因此,作者引入了 PixelCNN 来自回归的生成考虑了全局信息的 latent code,进而可以生成更真实的图像,如下图所示:

image-20240112001504547

PixelCNN 和 VQ-VAE 的一作是同一个人,来自 Google DeepMind,对应的论文为:Conditional Image Generation with PixelCNN Decoders。此处我们不再对 PixelCNN 展开,只需要知道它是一个自回归生成模型,可以逐个像素的生成,因为其是自回归模型,所以每个位置都能看到之前位置的信息,这样生成的 latent code 能够更全面的考虑到空间信息,有助于提高模型生成图像的质量和多样性。

4.3 VQ-VAE-2

VQ-VAE-2 的模型结构如下图所示,以 256x256 的图像压缩重建为例:

  • 训练阶段:其首先使用 Encoder 将图像压缩到 Bottom Level,对应大小为 64x64,然后进一步使用 Encoder 压缩到 Top Level,大小为 32x32。重建时,首先将 32x32 的表征经过 VQ 量化为 latent code,然后经过 Decoder 重建 64x64 的压缩图像,再经过 VQ 和 Decoder 重建 256x256 的图像。
  • 推理阶段(图像生成):使用 PixelCNN 首先生成 Top Level 的离散 latent code,然后作为条件输入 PixelCNN 以生成 Bottom Level 的更高分辨率的离散 latent code。之后使用两个 Level 的离散 latent code 生成最终的图像。

图片

当然,基于这个思想作者也进一步验证了使用 3 个 Level 来生成 1024x1024 分辨率的图像,相应的压缩分辨率分别为 128x128、64x64、32x32。

5 VQ-GAN

5.1 概述

paper:https://openaccess.thecvf.com/content/CVPR2021/html/Esser_Taming_Transformers_for_High-Resolution_Image_Synthesis_CVPR_2021_paper.html

code:https://github.com/CompVis/taming-transformers

image-20230512112944268

VQ-GAN 相比较 VQ-VAE 的主要改变有以下几点:

  • 引入 GAN 的思想,将 VQ-VAE 当做生成器(Generator),并加入判别器(Discriminator),以对生成图像的质量进行判断、监督,以及加入感知重建损失(不只是约束像素的差异,还约束 feature map 的差异),以此来重建更具有保真度的图片,也就学习了更丰富的 codebook。
  • 将 PixelCNN 替换为性能更强大的自回归 GPT2 模型(针对不同的任务可以选择不同的规格)
  • 引入滑动窗口自注意力机制,以降低计算负载,生成更大分辨率的图像。

VQ-GAN 也是 stable diffusion的作者。

5.2 方法

模型结构如上图所示,实际训练的时候是分为两阶段训练的

如下图所示,第一阶段训练,相比 VQ-VAE 主要是增加 Discriminator, 以及将重建损失替换成 LPIPS损失:

  • Discriminator:对生成的图像块进行判别,每一块都会返回 True 和 False,然后将对应的损失加入整体损失中。
  • LPIPS:除了像素级误差外,也会使用 VGG 提取 input 图像和 reconstruction 图像的多尺度 feature map,以监督对应的误差(具体可参考 lpips.py - CompVis/taming-transformers · GitHub)。

image-20240113215830827

6. DALL-E (dVAE, DALL-E)

6.1 概述

DALL-E 最主要的贡献是提供了不错的文本引导图片生成的能力,其不是在 VQ-VAE 基础上修改,而是首先引入 VAE 的变种 dVAE,然后在此基础上进一步训练 DALL-E。可惜的是,OpenAI 并不 Open,只开源了 dVAE 部分模型,文本引导生成部分并没有开源,不过 Huggingface 和 Google Cloud 团队进行了复现,并发布对应的 DALL-E mini 模型。

DALL-E 对应的论文为:[2102.12092] Zero-Shot Text-to-Image Generation。对应的代码库为:GitHub - openai/DALL-E: PyTorch package for the discrete VAE used for DALL·E.。

DALL-E mini 对应的文档为:DALL-E Mini Explained,对应的代码库为:GitHub - borisdayma/dalle-mini: DALL·E Mini - Generate images from a text prompt。

6.2 dVAE

dVAE(discrete VAE)与VQ-VAE的区别在于引入 Gumbel Softmax 来训练, 避免 VQ-VAE 训练中 ArgMin 不可导的问题。

image-20240113222402539

6.3 模型训练

有了 dVAE 模型之后,第二阶段就是就是训练 Transformer(此阶段会固定 dVAE),使其具备文本引导生成的能力。DALL-E 使用大规模的图像-文本对数据集进行训练,训练过程中使用 dVAE 的 Encoder 将图像编码为离散的 latent code。然后将文本输入 Transformer,并使用生成的 latent code 来作为 target 输出。以此就可以完成有监督的自回归训练。推理时只需输入文本,然后逐个生成图像对应的 Token,直到生成 1024 个,然后将其作为离散的 latent code 进一步生成最终图像。

image-20240113222517785

最终作者在 1024 个 16G 的 V100 GPU 上完成训练,batch size 为 1024,总共更新了 430,000 次模型,也就相当于训练了 4.3 亿图像-文本对(训练集包含 250M 图像-文本对,主要是 Conceptual Captions 和 YFFCC100M)。

6.4 DALL-E mini 模型概述

如下图所示,DALL-E mini 中作者使用 VQ-GAN 替代 dVAE,使用 Encoder + Decoder 的 BART 替代 DALL-E 中 Decoder only 的 Transformer。

dalle-e mini infer

在推理过程中,不是生成单一的图像,而是会经过采样机制生成多个 latent code,并使用 VQ-GAN 的 Decoder 生成多个候选图像,之后再使用 CLIP 提取这些图像的 embedding 和文本 embedding,之后进行比对排序,挑选出最匹配的生成结果。

image-20240113222818173

6.5 DALL-E mini 和 DALL-E 对比

DALL-E mini 和 DALL-E 在模型、训练上都有比较大的差异,具体体现在:

  • DALL-E 使用 12B 的 GPT-3 作为 Transformer,而 mini 使用的是 0.4B 的 BART,小 27 倍。
  • mini 中使用预训练的 VQ-GAN、BART 的 Encoder 以及 CLIP,而 DALL-E 从头开始训练,mini 训练代价更小。
  • DALL-E 使用 1024 个图像 Token,词表更小为 8192,而 mini 使用 256 个图像 Token,词表大小为 16384。
  • DALL-E 支持最多 256 个文本 Token,对应词表为 16,384,mini 支持最多 1024 文本 Token,词表大小为 50,264。
  • mini 使用的 BART 是 Encoder + Decoder 的,因此文本是使用双向编码,也就是每个文本 Token 都能看到所有文本 Token,而 DALL-E 是 Decoder only 的 GPT-3,文本 Token 只能看到之前的 Token。
  • DALL-E 使用 250M 图像-文本对训练,而 mini 只使用了 15M。

7 CLIP+VQ-GAN(VQGAN-CLIP)

Katherine 等人将 VQ-GAN 和 OpenAI 发布的 CLIP 模型结合起来,利用 CLIP 的图文对齐能力来赋予 VQ-GAN 文本引导生成的能力。其最大的优势是不需要额外的预训练,也不需要对 CLIP 和 VQ-GAN 进行微调,只需在推理阶段执行少量的迭代即可实现。

image-20240113223222191

如上图所示:使用初始图像通过 VQ-GAN 生成一个图像,然后使用 CLIP 对生成图像和 Target Text 提取 embedding,然后计算相似性,并将其误差作为反馈对隐空间的 Z-vector 进行迭代更新,直到生成图像和 Target Text 对应的 embedding 很相似为止。

参考文献

  1. https://arxiv.org/abs/1312.6114
  2. https://arxiv.org/abs/1711.00937
  3. https://arxiv.org/abs/1606.05328
  4. https://arxiv.org/abs/1906.00446
  5. https://arxiv.org/abs/2012.09841
  6. https://github.com/CompVis/taming-transformers
  7. https://arxiv.org/abs/2102.12092
  8. https://wandb.ai/dalle-mini/dalle-mini/reports/DALL-E-Mini-Explained--Vmlldzo4NjIxODA
  9. https://github.com/borisdayma/dalle-mini
  10. https://arxiv.org/abs/2204.08583
  11. https://python.plainenglish.io/variational-autoencoder-1eb543f5f055
  12. https://ljvmiranda921.github.io/notebook/2021/08/08/clip-vqgan/

补充

Gumbel-softmax

Gumbel softmax允许模型中有从离散的分布中采样的这个过程变得可微,从而允许反向传播时可以用梯度更新模型参数。 Gumbel max trick与softmax的组合。

Gumbel-Max Trick也是使用了重参数技巧把采样过程分成了确定性的部分和随机性的部分,我们会计算所有类别的log分布概率(确定性的部分),然后加上一些噪音(随机性的部分),上面的例子中,噪音是标准高斯分布,而这里噪音是标准gumbel分布。在我们把采样过程的确定性部分和随机性部分结合起来之后,我们在此基础上再用一个argmax来找到具有最大概率的类别。自此可见,Gumbel-Max Trick由使用gumbel分布的Re-parameterization Trick和argmax组成而成,正如它的名字一样。
用公式表示的话就是:$z=argmax_i(log(\pi_i)+g_i)$ 其中 $g_i=-log(-log(u_i)),u_i\in U(0,1)$

这一项就是从 gumbel 分布采样得到的噪声,目的是使得 $z$ 的返回结果不固定,它是标准gumbel分布的CDF的逆函数

那为什么随机部分要用gumbel分布而不是常见的高斯分布呢?这是因为gumbel分布是专门用来建模从其他分布(比如高斯分布)采样出来的极值形成的分布,而我们这里“使用argmax挑出概率最大的那个类别索引 $Z$就属于取极值的操作,所以它属于极值分布

多模态论文综述

持续更新中。。。

1. ALBEF

1.1 背景

在Vision-and-Language Pre-training (VLP) 已有工作中,主要是靠一个预训练的图像检测器来提取图像特征,并用多模态的encoder编码器将图像特征和文本特征融合,然后使用“完形填空、图文匹配”等下游任务来训练多模态encoder。

但是这些工作存在着一下问题:

  1. 用于抽取图像特征和文本特征的模型是分别单独训练的,也就是说他们的特征不在一个空间内,这就是使得多模态encoder不能有效的学习如何去融合两种特征;
  2. 使用目标检测模型作为图像特征的抽取器是一件很“昂贵”的事情,在预训练阶段,需要标注物体的box位置,在预测阶段需要有高分辨率的图片;
  3. 目前被广泛使用的图像-文本数据集存在着固有的噪声,这些噪声会影响模型性能。

基于这些问题,这篇文章提出了ALBEF模型。

1.2 方法

截屏2024-01-29 23.26.57

如上图所示,ALBEF使用ViT-B/16(12层的transformer)作为图像输入的编码器,并用ImageNet-1k上预训练的权重初始化它;使用6层的transfomer作为文本输入的编码器,并用 $Bert_{base}$ 的前6层作为初始化;使用 $Bert_{base}$ 的后6层权重作为模态融合层的初始化。通过多模态编码器各层的交叉注意,实现图像特征与文本特征的融合。

预训练的任务:

ITC:ITC任务想要解决“研究动机”中提出的第一个问题,通过该任务使得图像编码器的向量空间与文本编码器的向量空间做对齐。

ITM:构建负样本的时候用到了ITC任务,在一个batch里,通过计算特征相似度,寻找一张图片除它本身对应的文本之外相似度最高的文本作为负样本。这样就能构建一批hard negatives,从而提升训练难度。

MLM:完形填空

1.3 总结

  1. 通过ITC任务实现了图像向量和文本向量的对齐;
  2. 使用VIT代替了图像检测模块,抽取图像特征,减少了图像的标注成本;
  3. 通过Momentum Distillation的方式,降低了训练数据中噪声的影响。

2. VLMO

2.1 背景

第一个动机是多模态的模型呈现了两个不同的发展方向,但都有各自的缺点。一种是CLIP,在图文检索上效果比较好,推理速度快,但是这种方法在视觉推理类任务上表现不理想。一个可能的原因是双编码器的结构在编码阶段缺乏模态之间的交互,这样模型在编码阶段并不能充分利用另一个模态的信息。另一种是以ViL-BERT为代表的融合类模型,它们一般会通过一个融合模块来融合文本模态和图像模态编码的特征。但是这类算法在进行视觉推理时的速度却非常慢。

第二个动机是:多模态的数据集不够用,但是分开来看,视觉和NLP各自都有比较大的数据集。

考虑到以上的原因,VLMO提出了一个混合模态专家 Transformer (Mixture-of-Modality-Experts Transformer)。另一个贡献是多模态数据的预训练策略。

2.2 方法

截屏2024-01-30 23.58.45

我们从下向上看这个图,首先它的输入是一个多模态的输入。接着是个一个共享的多头自注意力层,这一部分主要的作用是供不同模特的输入特征进行交互。再往上是一个模态混合专家(Swithcing Modality Expert,SME),SME的作用是根据输入数据的类型选择训练不同的由前馈神经网络(Feed Forward Network,FFN)。根据输入数据的三种类型,SME也是由三个不同的专家组成,分别是视觉专家(V-FFN),语言专家(L-FFN),视觉-语言专家(VL-FFN)。

因为涉及了多个模态的数据和专家,VLMo的预训练任务也分成了几种不同的类型:对纯图像数据的训练,对纯文本数据的训练,以及混合模态数据的训练,包括对比学习、图像-文本对匹配、掩码语言模型三个任务,如上图右边所示。

分阶段预训练的策略

因为MoME-Transformer中使用了参数共享的MSA以及参数独立的三个专家,并且VLMo中也引入了三种不同输入数据的预训练任务,因此我们需要一个合适的调度算法来训练模型,VLMo将其命名为阶段预训练(Stagewise Pre-training)。

在进行模型预训练时,一个常见的策略是先使用易获得的海量数据进行训练,使模型优化到一个比较好的参数值后,再在比较难获得的数据上进行微调,从而使得模型在样本数较少的数据上也能获得不错的泛化能力。基于这个思想,VLMo提出的阶段预训练如下图所示。它首先冻结语言专家和视觉-语言专家的参数,通过MIM预训练任务在纯图像数据上训练视觉专家。然后再冻结共享的MSA以及视觉专家和视觉-语言专家的参数,通过MLM预训练任务在纯文本数据上训练语言专家。最后它再解冻所有参数,通过图文数据集的三个任务训练所有的参数。

截屏2024-01-31 00.01.45

可以看到在视觉数据上训练的self-attention直接拿来做文本训练,且不需要再 finetune

截屏2024-01-31 00.04.25

从实验结果来看,效果也是比较好的。

2.3 总结

VLMO 提出了一个可切换不同结果的名为 MoME-Transformer的结构,解决了双编码器结构模型以及特征融合结构模型的问题,并在VQA,VR任务达到了主流效果。

3. BLIP

3.1 背景

从模型的角度,最近的一些方法,只使用 encoder-only的模型无法直接运用到 text generaton的任务中如 image captioning;使用 encoder-decoder 结构的模型又无法直接适用于 image-text retrieval 任务。

从数据的角度,大部分方法的数据都是比较 noise的。

BLIP 引入了 encoder-decoder的多模态混合结构 MED(Multimodal mixture of Encoder-Decoder),能够有效地进行多任务雨训练和迁移学习。

3.2 方法

MED包括两个单模态编码器(lmage Encoder,Text Encoder),一个以图像为基础的编码器(image-grounded text encoder)和一个以图像为基础的解码器(image-grounded text decoder)。

截屏2024-01-31 23.30.15

通过三个损失函数联合进行预训练:*

(i)图像-文本对比损失 ITC(Image-Text Contrastive Loss):针对图像编码器和文本编码器,通过正负图文对的对比学习,来对齐图像和文本的潜在特征空间。

(ii)图像-文本匹配损失 ITM(Image-Text Matching Loss):针对以图像为基础的文本编码器,通过对图文匹配性进行二分类,建模图文多模态信息的相关性。

(iii)语言建模损失 LM(Language Modeling Loss ):针对以图像为基础的文本解码器,通过交叉熵损失进行优化,训练模型以自回归的方式生成目标caption。

网络上获得的大量图文对,通常包含许多不准确甚至错误的信息,为了有效利用这种形态的数据,BLIP提出caption生成和过滤模块CapFilt(Captioning and Filtering),首先从噪声图文对中学习,然后生成和过滤产生新的数据集,再去迭代优化原模型。

CapFilt包含两个模块:一个是captioner,给网络图像生成caption,另一个是Filter,过滤原始网络文本和合成文本中的噪声caption。实验结果表明,通过captioner和filter的协作,BLIP模型能够在各种下游任务上取得了稳定的性能提升,包括图像-文本检索、图像标题、视觉问答、视觉推理和视觉对话。

截屏2024-01-31 23.33.55

Captioner和Filter都是从预训练的模型初始化的,并在人工标注数据集上单独进行微调。

(i)Captioner是image-grounded text decoder,它在人工标注数据集上以LM为目标进行微调,对给定的图像进行文本解码,这里给定网络图片,Captioner生成合成caption 。

(ii)Filter是image-grounded text encoder,它根据ITCITM的目标进行微调,以学习文本是否与图像匹配,去除原始网络文本和合成文本中的噪音文本。

(iii)Bootstrap过程,Captioner生成的图文对与Filter过滤后的网络图文,再加上人工标注的图文对结合起来,形成一个新的数据集,重新预训练一个新模型。

3.3 总结

BLIP提出了一个encoder-decoder结构,统一了理解和生成的任务,并且提出了一个用训练好的模型去清洗数据反过来再去迭代原模型的方法。

4. CoCa

截屏2024-02-01 00.13.24

CoCa结构与ALBEF类似,但是将 encoder换成了 decoder,并且通过 ITC和LM 的任务进行预训练。

(1)Autoregressive decoder 的设计可以在几乎不增加计算量的前提下结合 full

sentence 的对比loss和 subword-level 的 LM loss。(2)CoCa的另一个动机是simVLM证明了 生成任务可以简单高效地训练多模态模型且具备 zero-shot的能力。

CoCa构建在encoder-decoder基础上,不过这里将text decoder均分成两个部分:unimodal text decoder和multimodal text decoder。然后增加一个cls token在文本的最后,unimodal text decoder不参与对图像特征的cross-attention,这样cls token经过unimodal text decoder之后就能够得到整个句子的全局特征。同时采用attention pooling对image encoder得到特征提取图像的全局特征,两个全局特征就可以实现图像-文本的对比学习,这里的attention pooling其实就是一个multi-head attention,只不过key和value是image encoder得到的特征,而query是预先定义的一个可训练的embedding,由于我们只需要提取一个全局特征,所以只需要定义一个query就好了。

multimodal text decoder将用来执行生成任务,这里也通过一个attention pooling对image encoder得到的特征进行提取,不过这里query数量定义为256,这样attention pooling可以得到256个特征,它作为multimodal text decoder的cross-attention的输入。

CoCa训练使用的数据比较大,最后得到的效果也刷新的当时很多项多模态任务的榜单。

5 BEiT V3

5.1 背景

无论是 NLP,CV 还是 多模态领域,模型大一统是大势所趋,也就是在超大的数据集上做大规模预训练,一旦模型训练好了之后,就可以直接应用到下游任务中,成为一个通用的 Foundation Model。Beit V3正是朝着这个目标,对之前的工作进行总结和改进之后实现的。

主要亮点是 Beit v3 直接将图像和文本以相同的方式处理,并通过一个预训练任务进行训练,也就是 mask data modeling。

5.2 方法

模型结构采用和 VLMO 相同的 MOME,训练目标是 mask data modeling,可能是遮住了图像,可能是遮住了文本,模型训练学习如何去恢复它就可以。

下游任务实现框架:

5.3 总结

目标函数不是越多越好,要看目标函数是否有互补的特性。数据的质量也很关键。

6 BLIP2

6.1 背景

使用大规模模型和数据集进行端到端训练需要较高的计算成本。

为了利用预先训练好的单模态模型进行视觉语言预训练,促进跨模态对齐是关键。然而,由于 LLM 在单模态预训练期间没有看到图像,因此冻结它们使视觉-语言对齐特别有挑战。现有方法诉诸于图像到文本的生成损失,作者表明这不足以弥补模态间的差距。

为了实现与冻结的单模态模型的有效视觉-语言对齐,作者提出了一种通过两阶段预训练策略进行预训练的 Query Transformer(Q-Former)。如下图 Figure 1 所示,Q-Former 是一个轻量级的 Transformer,它使用一组可学习的Query 向量来从冻结的 image encoder 中提取视觉特征。它充当了冻结的 image encoder 和冻结的 LLM 之间的信息屏障(bottleneck),为 LLM 提供最有用的视觉特征,以输出所需的文本。

image-20240221232233626

6.2 方法

6.2.1 模型结构

image-20240221232331395

模型中唯一可训练的模块就是提出的 Q-Former,它能够从图像编码器中提取固定数量的输出特征与输入图像分辨率无关。Q-Former 的结构如上图所示,其由两个共享 Self Attention的 Transformer 子模块组成(也就是说,图中橙色的 Self Attention 是共享的,灰色的 Cross Attention、紫色的 Feed Forward 和绿色的 Feed Forward 都是独立的):

  • Q-Former 左侧为 image transformer:与冻结的 image encoder 交互以进行视觉特征提取
  • Q-Former 右侧为 text transformer:可以用文本 encoder 和 文本 decoder

在 Q-Former 中,作者额外创建了一组可学习的 Query embedding 作为 image transformer 的输入。这些 Query embedding 在 Self Attention 层相互交叉,并通过 Cross attention 层(每隔一个 transformer block 有一个 Cross attention)与冻结的 image encoder 输出的 image embedding 进行交叉。此外,这些 Query embedding 还通过相同的 Self Attention 与 text embedding 相交叉。作者使用 Bert Base 的预训练权重来初始化 Q-Former,其中的 Cross Attention 是随机初始化的,Q-Former 总共包含 188M 个参数(包括 Query embedding)。

根据预训练任务不同,作者会使用不同的 Self Attention Mask 来控制 Query embedding 和 text embedding 的交互。

6.2.2 第一阶段-表征学习阶段

作者将 Q-Former 连接到冻结的 Image encoder 上,使用图像文本对进行预训练。目标是训练 Q-Former,以便 Query 可以学习提取对文本信息量最大的视觉表征。受 BLIP 的启发,作者联合了三个具有相同输入格式和模型参数的预训练目标。每个目标在 Query 和 Text 之间采用不同的 Attention Mask 策略来控制它们之间的交互。分别是:

6.2.2.1 ITC 图像文本对比学习

ITC 的目的是使图像表征和文本表征对齐,以便最大化它们之间的交互信息。作者使用对比损失,通过对比正对和负对的相似性来实现这一点(正对的距离尽量近,负对的距离尽量远)。具体来说,作者将 image transformer 的输出 Query 表征 Z 与 text transformer 输出的文本表征 t 对齐,其中 t 对应 [CLS] Token 的输出 embedding。由于 Z 包含多个输出 embedding(32 个 Query,对应 32 个 embedding 向量),因此作者首先计算每个 Query 表征与 t 之间的成对相似度(32 个),然后选择最高的一个作为图像-文本相似度。为了避免信息泄露,作者采用了单模态的 Self-Attention Mask,也就是如下图红框所示 Mask,其不允许 Query 和 Text 相互看到。其中的负例都从 batch 数据中选择(图像-文本是成对存在的,每个图像都有 1 个正对,其余图像对应的文本都可以作为负对,也就是每个图像有 batch size - 1 个负样本),而不是 BLIP 中的动量队列.

image-20240222000314502

6.2.2.2 ITG 基于图像文本生成

ITG 的目的是以给定输入图像作为条件来训练 Q-Former 生成文本。由于 Q-Former 的架构不允许 Text Token 与 image encoder 之间直接交互,因此必须先由 Query 和 image encoder 交互提取生成文本所需的信息,然后通过 Self-Attention 传递给 Text Token。也就是说,Query 被强制提取有关文本的所有信息的视觉特征。作者采用多模态因果自注意力掩码(Multi-modal Causal Self-Attention Mask)来控制 Query-Text 之间的交互。如下图红框内所示,类似于 UniLM 中使用的 Mask,Query 可以相互关注到,但不能关注到 Text。每个 Text Token 都可以关注到所有 Query Token,以及之前的 Text Token。此外作者还将 [CLS] Token 换成了 [DEC] Token,作为发出解码任务信息的第一个 Text Token。

图片

6.2.2.3 ITM 图像文本匹配

ITM 的目的是学习图像和文本之间的细粒度对齐。这是一个二元分类任务,要求模型预测图像-文本对是正(匹配)还是负(不匹配)。此时作者使用双向自注意力掩码(Bi-directional Self-Attention Mask),如下图红框内所示,也就是 Query 和 Text 都可以相互看到。因此 Query 表征 Z 可以捕获到多模态信息。之后,作者将 Z 中的每个 embedding(32)都输入到二元分类 Linear 层以获得 logit,并将所有 Query 的 logit 平均输出为匹配分数。作者采用了 [2107.07651] Align before Fuse: Vision and Language Representation Learning with Momentum Distillation 中的 hard 负样本挖掘策略来创建信息丰富的负对。

图片

6.2.3 第二阶段

在第二阶段的预训练阶段,作者将 Q-Former(带有冻结的 image encoder)连接到冻结的 LLM,以获得 LLM 强大的语言生成能力。如下图 Figure 3 所示,作者将 Q-former 的输出 Z 通过全连接(FC)投影到与 LLM 的 text embedding 相同的维度中(类似 LLaVA-1.5 中直接将 image encoder 的输出通过一个 MLP 投影到 text embedding 相同维度,并实现模态对齐)。然后,将投影的 Query embedding 附加到输入的 text embedding 之前。它们可以充当 soft visual prompts,也就是使 LLM 以 Q-Former 提取的视觉表征为条件。由于 Q-Former 已经经过预训练以提取语言相关(language-informative)的视觉表征,因此它有效的充当了信息瓶颈(bottleneck),将最有用的信息提供给 LLM,同时删除不相关的视觉信息。这减轻了 LLM 学习视觉-语言对齐的负担,从而减轻了灾难性遗忘问题。

作者尝试了两种类型的 LLM:

  • Decoder-Only 的 LLM:使用语言建模损失进行预训练,其中冻结的 LLM 的任务是生成基于 Q-Former 的视觉表征的文本。
  • Encoder + Decoder 的 LLM:使用 prefix 语言建模损失进行预训练,将文本分成两部分,prefix 文本与视觉表征连接在一起作为 LLM Eecoder 的输入,suffix 文本用作 LLM Decoder 的生成目标。
  • image-20240222000603115

6.3 总结

本文中作者提出了 BLIP-2,这是一种通用且计算高效的视觉-语言预训练方法,它利用了冻结的预训练 image encoder 和 LLM。BLIP-2 在各种视觉语言任务上实现了 SOTA,同时在预训练期间具有很少的可训练参数。BLIP-2 还展示了 zero-shot 指示图像到文本生成的能力。作者认为 BLIP-2 是构建多模态对话式 AI 代理的重要一步。

Latest Personnalization Overview

Dreambooth

dreambooth是一种个性化文生图模型:给定几张参考图作为输入,通过微调预训练的文生图模型(整体微调 or lora),将一个独特的标识符该输入图片的物体绑定。这样就可以通过含有该标识符的prompt在不同场景下,生成包含该物体的新颖图片。

原理

作者为微调模型设计了一种prompt格式:a [identifier] [class noun],即将所有输入图片的promt都设置成这种形式,其中identifier是一个与输入图片中物体相关联的特殊标记符,class noun是对物体的类别描述。这里之所以在prompt中加入类别,是因为作者想利用预训练模型中关于该类别物品的先验知识,并将先验知识与特殊标记符相关信息进行融合,这样就可以在不同场景下生成不同姿势的目标物体。

截屏2024-03-16 18.59.26

问题

  1. 特殊标识符选择什么比较好?

选择的罕见词作为特殊标识符,避免预训练模型对于特殊标识符有很强的先验知识。

  1. 为什么要加入Class-specific Prior Preservation Loss?

如果只是普通的微调,会出现两个问题:

(1) 过拟合

(2) language drift: 在大量数据下训练的模型,在特定任务微调的时候,它会逐渐忘记通用的知识,而仅仅适配特定的任务。

做法:将预训练模型通过基于要训练的物体所属的类作为prompt,生成的图片加入到训练数据中一起微调。

ZipLoRA

time: 2023.11

source: google

title: ZipLoRA: any subject in any style by Effectively merging loras

截图20231205114657

ziplora主要基于一些事实的观察:

  1. 通过sd1.x, sdxl能够仅通过一张图片就能学习到图片的风格;
  2. lora 权重是稀疏的,大多数值都很小,对生成质量和逼真度影响很小;
  3. 两个独立训练的 LoRA 的权重矩阵的列彼此之间可能具有不同程度的“对齐”,例如通过余弦相似度来测量。 我们发现直接对具有高余弦相似度的列求和会降低合并模型的性能;

image-20231205150545862

ziplora通过优化以下的损失:

image-20231205151130045

image-20231205150554367

前两项是,最小化合并后的lora与内容lora、风格lora之间的差异,来保留合并后的lora生成参考风格和内容能力;

最后一项是,最小化内容和风格lora之间的余弦相似度;

训练的时候,只优化 合并系数 , 文章只需要100次参数更新就能达到很好的效果。

AnyText

time: 2023.12

source: alibaba

title:ANYTEXT: MULTILINGUAL VISUAL TEXT GENERATION AND EDITING

code:https://github.com/tyxsspa/AnyText

paper:https://arxiv.org/abs/2311.03054

概述

作者介绍了一下现有开源文生图模型生成特定文字效果比较差及其原因,主要由以下三点:

  1. 模型的训练数据集,如 LAION-5B 缺乏文本内容的手动注释或者OCR结果。
  2. 开源的模型使用的文本编码器采用基于词汇的分词器,无法直接访问字符。
  3. 大多数扩散模型的loss中缺乏对文本区域的专门监督。

作者提出的 AnyText 框架,在 text-control diffusion pipeline的基础上,增加了两个组件:辅助潜在模块将文本字形、位置和遮罩图像等辅助信息编码到潜在空间中以辅助文本生成和编辑;文本嵌入模块采用 OCR 模型将笔画信息编码为嵌入,然后与来自分词器的图像caption embedding 融合,以呈现与背景无缝混合的文本;最后,引入图像空间中的文本感知损失以进一步提高书写准确性。

方法

image-20240116113204422

模型的loss包含两个部分:image-20240116113426377

第一部分损失如下:

image-20240116113559130

第二部分损失是 text perceptual loss,利用 文字的位置条件 $lp$,准确定位到生成文本的区域,利用 PP-OCRv3 模型通过裁剪、仿射变换、填充和归一化等操作对位置 $l_p$ 处的原始图像$x_0$ 和 去噪重建后图像 $x^\prime_0$ 进行处理, 利用全连接层之前的特征图 $\hat{m}_p$ 和 $\hat{m}_{p}^\prime$分别表示原始图像和预测图像中位置 p 处的文本书写信息。文本感知损失表示为

image-20240116115109747

Auxiliary latent module 利用三种类型的辅助条件来产生 latent feature amp $z_a$ 分别是,字形 $l_g$,位置 $l_p$,masked image $l_m$。

image-20240116114237703

$f$ 是一个卷积的fusion layer。$z_a$ 的 channels 数量和 $z_t$ 一致。

Text embedding module 将字形线渲染到图像中,利用预先训练的视觉模型,PP-OCRv3 的识别模型对字形信息进行编码,并从caption标记中替换它们的嵌入,然后一起送到 基于 Transformer 的文本编码器中。

实验

论文开源了一个数据集用于文本生成 AnyWord-3M

image-20240116141058257

可以看到 OCR 的信息对于效果提升是最大的。

Stable Diffusion 系列模型

1. 背景

image-20240116234259305

stable diffusion系列从 LDM 到SDXL 一直是开源工作里传播和使用最广的,大量工作都在此基础上展开。

从 2021年5月 openai 发表的 DM beat GANS 开始,diffusion model 的效果开始超过传统的 GAN 模型,进一步推动了 DM 在图像生成领域的应用。

早期的 DM 作用于像素空间,训练和推理的成本很高,为了实现在有效的计算资源上训练 DM,同时保持其质量和灵活性,作者提出将 DM 应用于强大的预训练 AutoEncoder 的隐空间(Latent Space),这也就是为什么提出的模型叫 LDM。此外,作者还在模型中引入交叉注意力层,可以将文本、边界框等条件很方便地引入到模型中,将 DM 转化为强大而灵活的生成器,实现高分辨率的生成。作者提出的 LDM 模型同样在图像修复、类别条件生成等方面取得很好的效果,同时与基于像素空间的扩散模型相比,大大降低计算要求。

2. 演进

2.1 Latent Diffusion

Stable Diffusion 之前的版本,对应的正是论文的开源版本,位于代码库 High-Resolution Image Synthesis with Latent Diffusion Models 中。

该版本发布于 2022 年 4 月,主要包含三个模型:

  • 文生图模型:基于 LAION-400M 数据集训练,包含 1.45B 参数。
  • 图像修复模型:指定区域进行擦除。
  • 基于 ImageNet 的类别生成模型:在 ImageNet 上训练,指定类别条件生成,获得了 3.6 的 FID 分数。使用了 Classifier Free Guidance 技术。

代码实现参考了 OpenAI 的 Diffusion Models Beat GANs 代码实现。

2.2 stable diffusion V1

V1 系列的模型结构和LDM类似基本没有变化;

img

该版本发布于 2022 年 8 月,该模型包含 2 个子模型:

  • AutoEncoder 模型:U-Net,8 倍下采样,包含 860M 参数。
  • Text Encoder 模型:使用 CLIP ViT-L/14 中的 Text encoder。

模型首先在 256x256 的分辨率下训练,然后在 512x512 的分辨率下微调。总共包含 4 个子版本:

  • sd-v1-1.ckpt:
    • 在 LAION-2B-en 数据集上以 256x256 分辨率训练 237k step。
    • 在 LAION-high-resolution(LAION-5B 中超过 1024x1024 分辨率的 170M 样本)上以 512x512 分辨率继续训练 194k step。
  • sd-v1-2.ckpt:
    • 复用 sd-v1-1.ckpt,在 LAION-aesthetics v2 5+(LAION-2B-en 中美观度分数大于 5.0 的子集) 上以 512x512 分辨率继续训练 515k step。
  • sd-v1-3.ckpt:
    • 复用 sd-v1-2.ckpt,在 LAION-aesthetics v2 5+ 上以 512x512 分辨率继续训练 195k step,使用了 Classifier Free Guidance 技术,以 10% 概率删除文本条件。
  • sd-v1-4.ckpt:
    • 复用 sd-v1-2.ckpt,在 LAION-aesthetics v2 5+ 上以 512x512 分辨率继续训练 225k step,使用了 Classifier Free Guidance 技术,以 10% 概率删除文本条件。

对应的 FID 和 CLIP 分数如下图所示:

image-20240116235722441

2.3 Stable Diffusion V1.5

Stable Diffusion 的 V1.5 版本,由runway发布,

该版本发布于 2022 年 10 月,主要包含两个模型:

  • sd-v1-5.ckpt:
    • 复用 sd-v1-2.ckpt,在 LAION-aesthetics v2 5+ 上以 512x512 分辨率继续训练 595k step,使用了 Classifier Free Guidance 技术,以 10% 概率删除文本条件。
  • sd-v1-5-inpainting.ckpt:
    • 复用 sd-v1-5.ckpt,在 LAION-aesthetics v2 5+ 上以 512x512 分辨率以 inpainting 训练了 440k step,使用 Classifier Free Guidance 技术,以 10% 概率删除文本条件。在 U-Net 的输入中额外加了 5 个 channel,4 个用于 masked 的图像,1 个用于 mask 本身。

2.4 Stable Diffusion V2

Stable Diffusion 的 V2 版本,由 Stability-AI 发布

V2 包含三个子版本,分别为 v2.0,v2.1 和 Stable UnCLIP 2.1:

  • v2.0:
    • 发布于 2022 年 11 月,U-Net 模型和 V1.5 相同,Text encoder 模型换成了 OpenCLIP-ViT/H 中的 text encoder。
    • SD 2.0-base:分别率为 512x512
    • SD 2.0-v:基于 2.0-base 微调,分辨率提升到 768x768,同时利用 [2202.00512] Progressive Distillation for Fast Sampling of Diffusion Models 提出的技术大幅降低 Diffusion 的步数。
    • 发布了一个文本引导的 4 倍超分模型。
    • 基于 2.0-base 微调了一个深度信息引导的生成模型。
    • 基于 2.0-base 微调了一个文本信息引导的修复模型。
  • v2.1:
    • 发布于 2022 年 12 月,模型结构和参数量都和 v2.0 相同。并在 v2.0 的基础上使用 LAION 5B 数据集(较低的 NSFW 过滤约束)微调。同样包含 512x512 分辨率的 v2.1-base 和 768x768 分辨率的 v2.1-v。
  • Stable UnCLIP 2.1:
    • 发布于 2023 年 3 月,基于 v2.1-v(768x768 分辨率) 微调,参考 OpenAI 的 DALL-E 2(也就是 UnCLIP),可以更好的实现和其他模型的联合,同样提供基于 CLIP ViT-L 的 Stable unCLIP-L 和基于 CLIP ViT-H 的 Stable unCLIP-H

图片

从结果来看,V2版本相对于V1.5提升比较明显,但是实际体验效果比较一般,而且V2版本难以finetune。

SD 2.1 相较于 SD1.5 的改进主要在模型结构和训练数据。

  • 模型结构
    • text encoder使用更大的 openclip Vit-H/14,而SD1.5使用的是CLIP-Vit-L/14,参数量扩大了约3倍。
    • SD 2.0提取的是text encoder倒数第二层的特征,而SD 1.x提取的是倒数第一层的特征。由于倒数第一层的特征之后就是CLIP的对比学习任务,所以倒数第一层的特征可能部分丢失细粒度语义信息。
    • SD 2.0不同stage的attention模块是固定attention head dim为64。
    • 在图像分辨率是768*768上进行了微调,并且采用美学评分更低的laion-2b子集进行训练。

3.4 Stable Diffusion XL

Stable Diffusion 的 XL 版本,由 Stability-AI 发布,位于代码库 Generative Models by Stability AI。

该版本发布于 2023 年 06 月,主要包含两个模型:

  • SDXL-base-0.9:基于多尺度分辨率训练,最大分辨率 1024x1024,包含两个 Text encoder,分别为 OpenCLIP-ViT/G 和 CLIP-ViT/L。
  • SDXL-refiner-0.9:用来生成更高质量的图像,不应直接使用,此外文本条件只使用 OpenCLIP 中的 Text encoder。

2023 年 07 月发布 1.0 版本,同样对应两个模型:

  • SDXL-base-1.0:基于 SDXL-base-0.9 改进。
  • SDXL-refiner-1.0:基于 SDXL-refiner-0.9 改进。

2023 年 11 月发表 SDXL-Trubo 版本,通过引入蒸馏技术来优化加速的版本。

0%