Dalle2模型 - 论文中为unCliP
目录
1. Dalle2的引言
论文:[2204.06125] Hierarchical Text-Conditional Image Generation with CLIP Latents
- Dalle2的特点是利用层级式的进行图像的解码的,从64*64再变到高分辨率的。
- 利用的Clip模型是预训练好的,目的主要是使用Clip的文本编码器,将其编码为向量进行输入的。
- Dalle2是个两阶段的模型。
- 第一个阶段叫prior,输入文本特征,可以帮我生成一个类似于Clip的图像特征嵌入。(需要文本特征**(作为输入)和图像特征(作为输出)**对应做输入和输出训练一个网络)
- 第二个阶段叫decoder(解码器),给定图像特征生成对应的图像。
- Dalle2的模型的解码器(低分辨率到高分辨率)是不是利用自编码的解码器,仍然是扩散模型。
2. GAN模型优缺点
优点
- 保真,生成的难以分辨真假。
- 需要的训练数据少。
- 多场景,风格,都可以用。
缺点
- 不稳定:常常有模式坍塌的问题(总是生成某一个风格或者某种图像),主要是因为生成器和鉴别器对抗导致的训练不稳定。
- 单个模型生成图像多样性不行:因为目标函数总是要让生成图像和目标图像接近,所以总是趋向于某个风格或者场景。
- 可解释性不行:因为不是一个概率模型,也就是生成不一定满足某种分布(VAE等应该隐空间满足正态分布),并且生成器和鉴别器都是一个模型,所以看不见内部的实现流程。不像Diffusion,可以在每次去噪后看见生成的结果,所以比较显式。
3. AE和DAE(denoising AE)
原理
-
AE:就是先编码后解码,然后让图片可以重建,也就是构建输入和输出之间的距离作为Loss。
-
DAE:和AE之间的区别,主要就是对输入先进行添加一个扰动,然后输入后生成原图,建立的仍然是原图和生成图像的距离。
- 优点,相对稳健,生成比较的稳定。
共同点
- 都是为了进行图像编码,然后进行特征匹配等等。也就是主要用的是编码器,用于提取图像的特征。因为我们中间生成的潜层空间不满足某个分布,所以无法进行潜层空间的分布采样生成,也就无法利用解码器进行图像生成了。
4. VAE(变分自编码器)
- 有个非常重要的区别就是中间会满足一个正态分布(因为拟合的就正态分布的均值和方差),所以可以进行采样,从而进行潜在空间的解码生成多样化的图像
优点
- 数学可解释性较好。
- 图像多样性会好很多。
5. VQVAE(向量自编码器)
原理
比较重要的一个点VQVAE主要是对中间的潜在空间有个标准的潜层向量表格,规格是K*D,K指的是有几个标准的向量,D是指单个潜在空间(或者说一类或者一个图像)的嵌入维度。
-
步骤:
- 编码:编码器对x编码生成潜在特征。
- 匹配:利用潜在特征向量去表格检索匹配,找出最相似的那个潜在空间向量Zq。
- 解码:然后利用标准向量进行解码生成图像。
-
Loss-损失函数
- 重构损失:也就是输入x和生成图像的距离。
- 量化损失 (Codebook Loss):用于更新生成器参数
常用的损失形式是:
L vq = ∥ sg [ z e ] − z q ∥ 2 2 {L}_{\text{vq}} = \| \text{sg}[z_e] - z_q \|_2^2 Lvq=∥sg[ze]−zq∥22
sg[⋅] 表示停止梯度传播(stop-gradient),即 Ze 不会更新,只更新 Zq。这使得代码本 Z_q 被优化以更好地适配 Ze。-
编码器一致性损失 (Commitment Loss):
常用的损失形式是:用于更新表格中的参数
L c o m m i t = β ∥ z e − s g [ z q ] ∥ 2 2 L_{commit}=β∥z e−sg[z q]∥_2^2 Lcommit=β∥ze−sg[zq]∥22
sg[⋅] 表示停止梯度传播(stop-gradient),即 Zq 不会更新,只更新 Ze。这使得代码本 Ze 被优化以更好地适配 Zq。
- 需要注意的一个点是:这里的后面俩是对特定的参数进行梯度计算,量化损失用于计算的梯度的参数是生成Zq相关的参数,促使对图像进行更加好的编码。编码器一致损失是对表格中对应最相似的那个标准特征向量进行梯度计算,促使表格中的标准向量更加的好。
优点
- 有个标准潜在空间表,训练起来更加的规范,稳健。但是缺少了一些随机性,也就是中间的潜在空间也是无法进行随机采样的,所以无法直接做生成任务,需要添加额外的模块。如果未添加新的prior网络,该网络还是用于提取图像特征,做分配匹配较多。
6. Dalle模型
原理
-
网络正向传播过程:
- 文本嵌入:文本利用BPE编码(某种编码方式)生成对应的文本embdding。
- 图像嵌入:利用VQVAE(预训练好的)获得匹配到的标准图像嵌入向量。
- 文本图像连接:将文本向量(16x16=256)和图像向量(32x32=1024)前后链接为一个向量(256+1024=1280)表示。
- 自回归训练:利用GPT,自回归训练。也就是利用前面的信息来进行预测被掩盖的向量,注意区分掩码训练,Bert里面常用的,掩盖一定的token然后进行填空的训练方法。
- 自回归损失:初始向量与预测的完整向量直接的距离。
-
训练完成的预测阶段:
- 文本编码:同BPE编码。
- 文本输入并预测:输入前256的向量值,相当于掩盖了后面1024换个向量,然后同训练一样预测后面1024个向量,然后利用VQVAE的解码器,进行图像解码,获得预测图像。
-
补充:
- 同文本不同图像如何判断生成效果:对于一个文本,生成了好多图像(这个多图像的出现是因为图像token的预测的时候,是一个概率分布,所以对其某个token的采样不是确定的,是以概率采样的),如何判断其生成效果的好坏,可以利用CliP,输入文本编码和不同图像编码,看看哪个分数Clip分数最高,就是好的。
7.Diffusion 模型
模型更新过程
-
最初的DDPM:
- 利用xt和t直接预测xt-1,导致效率低
-
改进的DDPM,Diffusion:
- 参照残差结构:利用xt和t预测噪声,然后减去得到xt-1
-
Diffusions beats GANs:
- 利用条件引导图像的生成:刚开始的条件是添加一个分类器得到的损失信息。目的是为了让生成的图像更加的贴近目标的类别,优点是真实性更高,缺点是减少了多样性,但是仍然多样性高于GAN,所以所在两个层面上开始超越GAN模型。
- 不同的条件引导图像的生成:后面的开始添加一些其他的引导信息,比如风格信息,文本信息,等等,其实最终都是改变下图中f函数中的y,去引导图像生成。
- 不用分类信息引导的图像生成:由于很多时候添加条件需要增加额外的训练模型,比如CliP,VAE等等。所以很多时候计算量大。所以提出了一种,不需要额外的模型生成的指导信息,来对模型进行指导生成。所以提出了,Classifier free guidance的想法。对于每次的扩散生成都生成两个图片,一个是有指导信息,一个是无指导信息的,计算两者的距离,了解两者之间差距,从而在无引导信息的情况下,往有引导信息的方向去生成。(具体可能得看下细节如何实现,目前还有点小蒙)
优点
- 生成效果稳定。
缺点:
- 推理速度慢:每次推理都要进行多次去噪,但是后续有x0和xt之间的推理公式后,可以直接跳过t次的扩散过程,效率在不断提升,这种采样的方法叫做DDIM,这也是DDPM和DDIM的最大区别。
8. Dalle2的具体实现
训练数据集:
- 类似与CliP的配对的图文训练数据集(x,y)x表示图片,y表示对应的文字。
网络结构:
Dalle2是个两阶段的模型(zi表示image嵌入,zt表示text嵌入):
-
第一个阶段叫prior,输入文本特征zt,可以帮我生成一个类似于Clip的图像特征嵌入zi,也就是P(zi|zt)。(需要文本特征zt**(作为输入)和图像特征zi(作为输出)**对应做输入和输出训练一个网络)
-
第二个阶段叫decoder(解码器),给定图像特征zi生成对应的图像,也就是P(x|zi,y)。其中y(文本信息)可有也可无,主要看结构,因为有的时候一些Diffusion模型需要不断的带上引导信息去指导图像的生成。
-
比如Stable Diffusion,y在扩散过程中一直带入引导(没记错的话,在 Stable Diffusion 模型中,文本引导信息不仅以嵌入向量的形式被输入,还通过 注意力机制 在生成图像的过程中进行引导)。
-
-
Stable Diffusion -
dit模型,y也一直带入,在vit模块中生成一些偏移量和放缩量(其中一种)。
-
-
Dit 模块
-
前向过程
- 预训练CliP模型:在训练之前,预训练CliP模型,获得文本编码器和图像编码器。并且获得配对的文本编码向量和图像编码向量。
- 阶段1:训练prior模型:
- 自回归 prior:利用自回归的模型进行获得文本编码。但是自回归的,虽然利用了一些降维的PCA方法,但是仍然说是不高效,所以主要还是以扩散的prior为主。
- 扩散模型 prior:连续的图像编码通过caption引导高斯扩散模型进行建模。其中预测的模型使用的不是U-net而是transformer,因为transformer更加适合这种序列的预测。并且他们发现,在这里直接预测噪声反而是效率低,所以他们利用了直接预测结果序列的方式。
- 阶段2:训练decoder模型:
- decoder模型:主要是利用了GLIDE模型(扩散模型的变种,可以输入嵌入提示)的变体,但是变动并不大。并利用的是CLiP嵌入作为指导(应该是利用CliP图像嵌入作为要加噪和去噪的那个图像输入,然后把文字嵌入作为指导,一起输入或者利用注意力机制去查询等等操作吧(可能类似Stable Diffusion那种))。
- 训练过程:不仅利用了CliP嵌入的指导,也利用了Classifier free guidance的指导方法。
- 小图上采样:64x64->256x256->1024x1024同样的是训练了两个Diffusion上采样模型进行生成的。并且为了训练的稳定性,作者还添加了一些噪声啥的。
9. 一些局限性
- 问题1(属性绑定):CLIP嵌入上调节图像的生成可以提高图像生成的多样性,但是也会带来一定的局限性。unCLIP在属性绑定上比GLIDE要差。这些属性涉及到一些抽象和复杂的概念,如位置属性,文字属性等, CLIP 嵌入本身没有显式地将属性绑定到对象,并且会经常混淆图像中多个对象的属性(也就是不知道谁在谁上面,位置信息等与对象无法进行绑定,可能因为CliP是整句话和图像的匹配度,所以可能只要有在某个的上面就行,但是对象不知到是谁)。如下图所示:
- 问题2(文本生成有问题):一个类似的相关的问题是unCLIP难以生成连贯的文本,如下图所示:
- CLIP的嵌入无法精确编码渲染文本的拼写信息,再加上BPE的编码模糊了caption中单词的拼写, 会让这个问题变得更糟。
- 问题3(复杂场景细节不行):模型很难在复杂的场景中生成细节。生成的小细节的地方可能都是无意义的元素点。这可能是解码器层次结构的限制,以更高分辨率训练unCLIP应该能够缓解这个问题,代价是额外的训练和推理计算。
- 问题4(安全问题):最后探讨安全问题。图像生成模型存在于欺诈和其他有害内容相关的风险,随着图像越来越真实,很容易将生成的图像误认为是真实的图像,这会带来一系列安全问题。