《Hierarchical Text-Conditional Image Generation with CLIP Latents》
Paper: https://cdn.openai.com/papers/dall-e-2.pdf
Project: https://openai.com/product/dall-e-2
Author: OpenAI
闲言碎语
时间线:2021.01推出DALL·E,2021年底推出GLIDE,2022.04推出DALL·E 2
DALL·E 2的能力:“DALL·E 2 can create original, realistic images and art from a text description. It can combine concepts, attributes, and styles.”
生成原创性的图片
组合concepts、attributes,and styles
DALLE 2 的hierarchical:先生成64*64小分辨率图片,再利用一个模型上采样到256*256,再利用一个模型上采样到1024*1024。
DALLE 2就是: CLIP模型+GLIDE模型(一个基于diffusion model的文本图像生成方法);
DALLE2 暂时不开源,不全面开发API,github上有dalle-mini库(但跟DALLE2 好像没太大关系)
前置知识
图像生成的一些方法回顾:
GAN
GAN的思想其实就是左右手互博,同时训练两个网络:生成器G和判别器D。
![](https://img-blog.csdnimg.cn/img_convert/8443a06c327bad8e7e724a91efff2680.png)
优点:因为GAN的目标就是以假乱真,所以其生成图像的保真度比较高
缺点:
1)训练不够稳定,因为要同时训练两个网络;
2)因为是以保真度为目标,所以生成图像的多样性较差;
3)不是概率模型,它的生成都是隐式完成的。你不知道它做了什么,不知道遵循了什么分布,因此GAN在数学上不如后续的VAE、扩散模型优美。
AE(Auto-encoder)
自编码器是很早的技术,目的是将高维的信息通过encoder压缩到一个低维的code内,然后再使用decoder对其进行重建,关于它的细节可参阅之前的文章:Auto-encoder系列。
VAE(Variational Auto-Encoder)
无论是AE,DAE,还是MAE,核心上都是学习bottleneck处这个特征的,然后去做目标检测、分割、分类这些下游任务,并不是去做生成的。原因就是中间特征c并不是一个概率分布,我们没法对它采样,它是一个用于重建的特征。因此就有了VAE,中间不再生成一个特征,而是生成一个分布(高斯)。
因为VAE学到的是一个概率分布,从分布里去抽样生成图像的多样性就会好很多。
VAE的本质思想是学习一个分布,而不是一个特征。后续的诸多工作也是基于这一本质思想进行展开的。
关于VAE的细节也可参阅之前的文章:Auto-encoder系列。
VQ-VAE(Vector Quantized Variational Auto-Encoder)
VQ-VAE 的核心思想是将连续的高维向量编码(例如语音信号、图像、视频等)离散化,从而减少模型的复杂度和存储需求。具体来说,VQ-VAE 通过将连续的编码向量映射到一组离散的“码本”(codebook)中的最近邻,从而将高维连续编码转换为低维的离散编码。在解码器中,这些离散编码被解码回原始的高维向量。
VQ-VAE就是将特征进行量化的VAE。相对于VAE,优化起来相对容易。codebook可以理解为聚类中心,有K*D个聚类中心。
![](https://img-blog.csdnimg.cn/img_convert/fffedcaa403decbd48997ff3e2020e2a.png)
但是VQ-VAE学习的是一个固定的codebook,因此无法像VAE一样做随机采样,因此VQ-VAE更像是VQ-AE。若想像VAE那样,就需要有一个prior网络。在VQ-VAE中,prior网络是一个用于生成离散码本(codebook)的神经网络。离散码本是一组预定义的离散向量,用于将连续的向量空间映射到一个离散的向量空间。这种离散化的表示方式使得VQ-VAE可以对输入数据进行高效地编码和解码。
具体来说,prior网络的输入是由编码器生成的连续向量,输出是一个由离散向量组成的码本。prior网络的训练目标是最小化输入向量和最近的码本向量之间的欧几里得距离,从而实现向量量化。在训练过程中,prior网络不仅学习生成码本,还学习将连续向量映射到码本中最近的向量。通过将编码器生成的连续向量量化为码本中最近的向量,VQ-VAE可以保留输入数据的局部结构信息,并且可以在编码和解码过程中实现高效的计算。因此,prior网络在VQ-VAE中起着非常重要的作用。
VQ-VAE 已经在许多领域得到了应用,包括图像生成、音频压缩、语音识别、自然语言处理等。DALL·E 第一版就是基于VQ-VAE做的。
DALL-E
对于一个图像文本对,文本用BPE编码生成256维的特征,图像用现成的VQ-VAE(codebook)编码为32*32维的特征,然后将这两个特征拼接成一个1280维的序列,再输入至GPT中。
![](https://img-blog.csdnimg.cn/img_convert/79926a2402f4a5ecff3e20f336ccd3fa.png)
训练时,将1280维序列的部分遮住,让GPT进行预测。
推理时,只需要输入文本的特征(256维),让GPT自回归的做预测就行。
Diffusion model
1)扩散模型的方法
扩散模型分为 forward diffusion 和 reverse diffusion 两个阶段。对于一个图像,forward diffusion 做的就是往
中不断添加噪声,一共添加T次,最后得到
。
![](https://img-blog.csdnimg.cn/img_convert/edb60aba6009eb37cafe016fc4887a4d.png)
为什么叫“扩散”,这启发于热力学。热力学中有一个名词叫“diffusion”,如果有两个物质分别是高密度和低密度的,那高密度的物质会慢慢地向低密度的做扩散,最后达到一种平衡。在Diffusion model 中,这种“平衡”的体现就是 forward diffusion 过程最后得到的趋近于各向同性的正态分布。
reverse diffusion过程要做的就是训练一个模型,使得从恢复至
,然后再训练一个模型,使得从
恢复至
,以此类推直至恢复至
。在reverse diffusion 过程中所有使用到的模型都是共享参数的,也就是说整体其实只有一个模型,只是需要抽样生成很多次。 因此扩散模型目前最大的不足就是:相比于其他生成模型,训练很慢,且推理是最慢的。因为对于一个随机采样的噪声,要往前推T次才能生成Image。此外,目前reverse diffusion 过程中的网络大部分选用的都是U-Net。
2)扩散模型的发展历程
扩散模型这个想法在2015年就有人提出来了,但是并不能训练很好,生成图像的效果并不如其他的生成模型,比如GAN等。直至2020年有一篇论文——DDPM对扩散模型的思想进行了改进,使得训练更方便,其核心思想是:在 reverse diffusion 过程中,给定,不去直接预测
(训练起来很难),而是预测使
变为
的噪声
。这将扩散模型的问题简化了很多,直接让网络去预测一个噪声即可(类似于ResNet中去预测一个残差),比如对于正态分布而言,就是预测均值和方差,DDPM作者还发现,将方差设为一个常数,只去预测均值的话,就已经可以使扩散模型生成很好的图像。
给U-Net中加入temporal embedding,目的是使 reverse diffusion 是一个 coarse-to-fine 的过程,让模型知道目前处于哪一步,希望在最开始先生成一些粗糙的信息,最后快结束时再生成一些细致的信息,即高频的信息(比如物体的边边角角)。损失函数就是:,
就是U-Net网络,t是temporal embedding,
是前向过程中添加的噪声,是已知的,因此可以拿来当作Ground truth,目的是希望U-Net在每一步预测的噪声与前向过程中的相同。
![](https://img-blog.csdnimg.cn/img_convert/ed80fa4437e83c43c100c13ee2290601.png)
DDPM与VAE其实是有相似之处,比如DDPM 也可以看做的一个 encoder-decoder 结构,分别对应forwar、reverse的过程。但他们也有不同,如下:
DDPM的前向过程是固定的,而VAE的encoder是学习的;
DDPM的每一步的特征维度都是相同的,而VAE的bottle neck的维度是比输入小很多的。
扩散模型有 step 的概念,有很多步;VAE没有;
在DDPM 证明了扩散模型可以work很好之后,后续出现了很多工作,比如2021年OpenAI的这篇论文《Diffusion Models Beat GANs on Image Synthesis》。在这篇论文出现之前扩散模型生成的图像已经很逼真了,但是在各项指标上还比不过GAN,然后这篇论文提出了一个Classifier guidance方法来引导模型生成图片,使得生成的效果更好,并且只做25次采样即可实现。
Classifier guided diffusion的意思是:在训练diffusion的同时,再去训练一个图片分类器(classifier,一般是在ImageNet的加了noise的图片上训练)。这个classifier的作用是:有了后,就可以丢给classifier计算一个类别损失,也就是计算出了一个梯度
来辅助U-Net的训练过程。这个梯度中暗含了
中是否有这个物体,或者说当前的这个物体真不真实的信息,以此来告诉U-Net要在生成的图片中在颜色、纹理等要跟真实的物体匹配上。
这个操作的核心思想是利用梯度来引导diffusion的生成,它牺牲了一定的diversity,来换取生成图片的逼真性。这种思想提出来之后,后续有人思考不用classifier来当作引导信号,而是用CLIP来进行引导,这样文本和图像就可以联系起来了,不再用梯度,而是用文本来引导引导diffusion的采样和生成。所有的引导都是目标函数中的y,也就是输入不只是
和t,同时还有一个condition(y),至于是什么就看你往里加入什么。
但是Classifier guided diffusion这类方法也有一个缺陷,就是:必须用另外一个模型来进行guidance,要么是pre-trained,要么是再训练一个,这样的话成本较高且不可控。因此就出现了后续的Classifier free guidance方法,GLIDE、DALLE·2、Imagen都是基于这类方法的思想。Classifier free guidance方法不想用之前的那种guidance,而是希望找到另外一种指导信号。它的思想就是在训练时同时做两个输出,一个有条件的,一个没条件的,最后就会知道二者的差距是多少,这样在测试时,在没有条件引导的情况下,也可以推测出有条件引导的输出是多少。但是这种训练成本也很高,同时要有两个输出。
![](https://img-blog.csdnimg.cn/img_convert/65cce3a1bc73bb9a247bc71b6c6f4ac5.png)
GLIDE采用了classifier free guidance的扩散模型,可以实现很好的图像生成。OpenAI也因此摒弃了DALL·E用VQ-VAE的思路,在DALL·E 2中转而使用扩散模型来进行图像生成,也就是基于GLIDE,并在其之前加入了prior网络,以及一些层级生成的技巧等。
摘要
像CLIP这些对比学习的模型已经可以学习到很稳健的图像特征,既能捕捉语义信息,又能捕捉风格信息。这种良好特征只用来做分类就很可惜,因此为了借助于这种良好特征来完成图像生成任务,我们提出了一个两阶段的模型:a prior (给定一个文本,先用现成的CLIP模型生成对应的textual embedding,然后接下来用这个textual embedding生成image embedding的过程就叫做prior),and a decoder(基于image embedding生成图像)。此外,由于是text-to-image任务,因此可以基于CLIP,可以实现zero-shot。
作者发现: 显式地生成图像特征的这种方式(就是先从文本生成image embedding,再将其解码为Image),可以很显著地提升生成图像的diversity(多样性)。
引言
对于一段话,DALLE 2是能够捕捉其中的层次关系,并在画图时也考虑进来的。比如给出下面这句话,DALLE 2 生成的图片,是真的把熊画在滑板之上了,也就是说捕捉到并解码出目标之间的关联关系的。
![](https://img-blog.csdnimg.cn/img_convert/878133543894846f0bf966938ca37fc0.png)
在DALLE 2这篇论文里,CLIP这个模型是锁住的,只是被用,没有被训练。DALLE 2模型的整体框架如下,虚线之上是CLIP 模型,虚线之下才是DALLE 2模型。unCLIP是指:CLIP的目的是从文本、图像中获取特征,本文的方法是为了从特征中还原出图像,因此叫unCLIP。
![](https://img-blog.csdnimg.cn/img_convert/94436a29e7b84e630354216567d66863.png)
DALLE 2的训练数据是图像文本对(x, y),过程分以下两个阶段:
Prior阶段:对于一个文本x,经由fixed CLIP可以产生一个texual embedding(蓝色)和Image embedding(红色),产生的texual embedding经过 autoregressive或difussion的prior模型生成Image embedding,这一个阶段用刚才CLIP中生成的Image embedding对其做监督。这样做的目的是:等在做推理的时候,即使只有文本特征,也可以生成比较好的图像特征。
Decoder阶段:用于从Image embedding中解码出图像。
如果DALLE 2的输入是图像的话,会通过CLIP生成文本特征,然后再经过prior、decoder生成图像。
方法
训练集是图像x-文本y对。和
分别是图像x经过CLIP输出的image和text embedding。DALL-E 2的数学描述如下:
![](https://img-blog.csdnimg.cn/img_convert/638ef77bc8d39b88a7c9cd13be6af952.png)
与x是一对一的关系,因为CLIP是锁住的,给定一个x,就只会输出一个
。P(zi|y)对应的是prior网络,P(x, zi|y)对应的是decoder。
在decoder阶段,使用的是 CLIP 引导的diffusion,然后技巧使用了 classifier free guidance。用的只是CNN,没有用attention。
在prior阶段,作者尝试了两种方案:Autoregressive prior和Diffusion prior。值得注意的是在两种尝试中作者都使用了classifier free guidance,证明这种方法对生成任务确实有效。
Autoregressive prior:输入是文本特征,也有CLIP输出的图像特征,然后与DALL-E、GPT类似地把他们拼接起来,然后将图像特征遮住,去自回归的预测。但是OpenAI在CLIP的文章中就已提到,这种自回归做预测的模型,训练效率太低。
Diffusion prior:训练了一个 decoder-only Transformer,输入有很多,具体请看原文~
应用
DALL·E 2的几种应用场景:
text-to-image
DALL·E 2可以生成各式各样的沙发,变换颜色、样式、位置
![](https://img-blog.csdnimg.cn/img_convert/37c0d48376fcc7e73fcaed07db38cb70.png)
image-to-image
给定一个图像,可以生成很多风格类似的图像(整体语义信息不变):
![](https://img-blog.csdnimg.cn/img_convert/aebb66461cfe1efb057304db3cc4c0a1.png)
通过对两个图像的特征做内插,生成新图像
![](https://img-blog.csdnimg.cn/img_convert/770c22a46988ccb5feaa6fcd20c83660.png)
通过对两个文本的特征做内插,生成新图像
![](https://img-blog.csdnimg.cn/img_convert/de61f3f28d56768db27e5f3e00c03251.png)
不足
1)DALL-E 2不能很好的将attribute绑定到 object 上。
比如下面这个图,object就是方块,属性就是颜色。给一句话:“a red cube on top of a blue cube”,GLIDE的效果要比DALL-E 2好很多。
![](https://img-blog.csdnimg.cn/img_convert/4f2ab76fc67c755e98204fe4b511b972.png)
作者解释很可能是使用CLIP的原因。虽然使用CLIP后可以是图像和文本的联系更紧密,这使得更容易去做文本生成图像的任务。但是CLIP模型学习的时候,只是考虑相似性,它只是去找红方块、蓝方块来把相似性提升到最高就行了,但是CLIP模型不了解"on top of"这种东西,不了解什么叫做“上下左右”,它从头到尾都在找物体间的相似性。
因此在做CLIP特征做下游任务的时候,就不能很好的区分object和其对应的attribute。
此外,在对图片进行重建时,decoder会将object的attribute混淆。
2)直接生成文字,效果很差
作者解释可能是使用BPE编码的原因,这种是词根词缀编码。但可能还有其他原因。
![](https://img-blog.csdnimg.cn/img_convert/4a14dd6e610edcc402ef488102f393cb.png)