DALL·E2(生成模型串讲,从GANs、VE/VAE/VQ-VAE/DALL·E到扩散模型DDPM/ADM)
一、 前言
- 论文《Hierarchical Text-Conditional Image Generation with CLIP Latents》、DALL-E2官网、代码
- 参考李沐《DALL·E2论文精读》、《论文笔记:DALL-E2详解》
大一统视角理解扩散模型Understanding Diffusion Models: A Unified Perspective 阅读笔记
1.1 DALL·E简介
2021年1月, OpenAI发布了 包含120亿参数的大模型DALL·E 。只要「阅读」文本,DALL·E 就能根据文本的内容「自动」生成栩栩如生的大师级画像,因此已经发布,迅速火爆全网。当时,DALL·E 的画风是这样的:
OpenAI发现它具有多种功能,包括创建拟人化的动物和物体、以合理的方式组合无关概念、渲染文本并将转换应用于现有的 图像。
更多生成展示可以参考《OpenAI祭出120亿参数魔法模型》。
1.2 DALL·E2简介
OpenAI
继去年1月推出DALL·E
,年底推出GLIDE
之后,时隔一年又在2022.4 推出DALL·E2
。相比 DALL·E
,DALL·E2
可以生成更真实和更准确的画像:综合文本描述中给出的概念、属性与风格等三个元素,生成「现实主义」图像与艺术作品!分辨率更是提高了4倍!打开DALL·E2的官网,可以看到其介绍的DALL·E2有以下几个功能:
- 根据文本直接生成图片
DALL·E2
可以根据文本描述生成原创性的真实图片(因为模型将文本和图片的特征都学的非常好),它可以任意的去组合这些概念、属性或者风格。下面还给了一个例子——描述是泰迪熊,属性是做最新的AI研究,风格是1980年的月球上,然后模型生成了下面的图片:
如果改变这些变量,又会生成新的图片。又比如下面的例子:
2. 扩展图像
DALL·E2
可以将图像扩展到原始画布之外,创造出新的扩展构图。
- 根据文本编辑图片
DALL·E2
可以对已有的图片进行编辑和修改,添加和删除元素,同时考虑阴影、反射和纹理。比如下面的例子,在房间里加入火烈鸟。如果在2这个位置加入,就是一个火烈鸟的游泳圈,因为常识里,火烈鸟不大可能在水面。如果是3这个位置,还可以生成不同角度样式的火烈鸟,并且这些还有倒影:
- 给定一张图片,
DALL·E2
可以生成不同的变体,并保持原风格(不需要文本)
- 相比DALL·E ,给定同样的文本,
DALL·E2
可以生成4倍分辨率的图片。
最后,因为考虑到一些伦理道德(比如DALL·E2
有一些黑话可能绕过审查机制),所以DALL·E2
还没有开源,也不能release模型,甚至其API也是开放给了一小部分用户做内侧或者研究(主要是推特或reddit上的大V)。对于大部分没有排上waitlist的小伙伴,又想体验的用户,可以试试DALL·E Mini。
Boris Dayma等人根据论文创建了一个迷你但是开源的模型
Dall·E Mini
,只是训练集和模型都比较小,生成的质量会差一些。可以直接上打开github主页上提供的colab跑一跑,或者是huggingface
的spaces dalle-mini里面使用。
huggingface
提供了一个sapces,模型代码上传到里面之后,就可以做成一个APP直接玩。
1.3 文生图模型进展
无论是DALL·E还是DALL·E Mini,根据文字生成图片的效果都非常好,所以自从2021.1 DALL·E发布之后,后续就有一大批类似的工作跟进。
- 2021年:
- 1月OpenAI推出了DALL·E(GPT+VQ-VAE)
- 5月清华推出支持中文生成图像的CogView
- 11月微软和北大在推出的NUWA(女娲),可以生成图像和短视频
- 12月OpenAI又推出了GLIDE模型( Classifier-Free Guidance 扩散模型)
- 12月百度推出了ERNIE-ViLG模型,也支持中文。
- 2022年:
扩散模型是一个很火的方向。现在的扩散模型发展程度,就类似18年左右的GAN,还有很多可以改进的地方,而GAN已经做了五六年,被挖掘的已经差不多了。
二、 引言
论文题目——Hierarchical Text-Conditional Image Generation with CLIP Latents,意为根据CLIP
特征,来做层级式的、依托于文本特征(条件)的图像生成。这里层级式(Hierarchical)的意思是,DALL·E2
先生成小分辨率的图片(64*64),再生成256*256的图片,最后生成1024*1024的高清大图,所以是一个层级式的结构。另外DALL·E2
中还用到了CLIP模型训练的文本图片对特征,以及使用扩散模型来解码生成图片,后面会细讲。
论文的一作Aditya Ramesh参加过CLIP和DALL-E的工作,另外还有两个扩散模型的专家,以及GPT-3/codex的作者。
DALL·E2
其实就是CLIP
模型加上GLIDE
模型的融合。
2.1 摘要
之前的对比学习模型,比如OpenAI自己训练的CLIP
,是使用互相匹配的图片-文本对进行训练的,可以学习到很稳健的图像特征。这些特征既可以捕捉到语义信息,也可以捕捉到风格信息,如果仅仅用来做分类任务就有点可惜了。
为了借助CLIP
模型的特征来做图像生成,作者提出了一个两 阶段模型。首先给定文本描述,根据CLIP生成文本特征(这里的CLIP是冻住的,不再训练),然后:
prior
:根据文本特征生成类似CLIP的图像特征。作者试了AR(自回归模型)和扩散模型,后者效果更好。decoder
:根据prior输出的图像特征生成图像,这里使用的也是扩散模型
作者发现,显式的生成图片特征的方式(也就是prior这一步),可以显著的提升生成图像的多样性( diversity),并且对于图像的逼真程度以及和文本的匹配程度,都没有什么损失。而基于扩散模型的解码器,可以根据图片特征,生成多种多样的图片(风格相近但细节不一)。另外根据文本生成图像的架构,让模型很容易的可以利用CLIP的特性,从而达到可以利用文本直接编辑图像的功能,而且是zero-shot(直接推理,无需训练)。
这里也就是说这种两阶段生成的框架,得到的图片既逼真又有多样性。GAN生成的图片也很逼真,因为其本来的目标就是以假乱真;但是多样性不太好,生成的图片都差不多,不具备原创性。这也是最近的
DALL·E2
和Imagen
都使用扩散模型的原因,因为其多样性好,有创造力。
DALL·E2
在这里的成功,很重要的一点就是借助了CLIP
模型。
2.2 引言&模型结构
引言第一段,作者又吹了一下CLIP模型,说CLIP学到的图像特征非常的稳健(对各种分布/风格的鲁棒性都很强,比如不管是漫画的香蕉、素描的香蕉还是自然界的香蕉,都能分辨出来), 而且可以做zero-shot,在各种下游的视觉领域都被证明效果非常好。
扩散模型很早(15年之前)就提出了,它是一种概率分布模型,其生成的图片是从概率分布里采样的,所以多样性非常好。现在的扩散模型在图像和视频生成上,都达到了目前最好的效果。
扩散模型逼真度不如GAN(GAN的目标就是以假乱真,比如非常火爆的Deepface)。不过从20年开始,从DDPM到improved DDPM、Diffusion Models Beat GANs到最近的
DALL·E2
和Imagen
,使用了一系列的技巧来提高扩散模型的保真度,其中之一就是引导技巧guidance technique
。
guidance technique
可以牺牲一定的多样性来提高保真度,使得扩散模型的分数可以媲美GANs,而且多样性还是更强,成为当前的SOTA
模型。在DALL·E2
和中,作者都特意提到guidance technique
至关重要,使模型效果提高了很多。
下面是作者引言部分贴出的9张高清大图,比如柴犬带着贝雷帽,身穿黑色毛衣;疯狂的熊猫科学家将化学试剂混合在一起;土星上有一只身穿宇航员服的海豚等等。这些图片分辨率很高,细节生成的都很好。
模型结构
这里作者给出了DALL·E2的整体架构,上部分就是一个CLIP
,下部分才是DALL·E2
。
1. CLIP训练过程
如下图所示,CLIP
的输入是一对对配对好的的图片-文本对(比如输入是一张狗的图片,对应文本也表示这是一只狗)。这些文本和图片分别通过Text Encoder
和Image Encoder
输出对应的特征。然后在这些输出的文字特征和图片特征上进行对比学习。
假如模型输入的是n
对图片-文本对,那么这n
对互相配对的图像–文本对是正样本(下图输出特征矩阵对角线上标识蓝色的部位),其它 对样本都是负样本。这样模型的训练过程就是最大化n个正样本的相似度,同时最小化 个负样本的相似度(余弦相似性cosine similarity
)。
CLIP
使用的数据集是OpenAI
从互联网收集的4个亿的文本-图像对,所以模型的两个编码器训练的非常好,而且文本和图像特征紧紧的联系在一起,这也是CLIP
可以直接实现zero-shot
的图像分类的原因。
Text Encoder
可以采用NLP中常用的text transformer
模型;而Image Encoder
可以采用常用CNN
模型或者vision transformer
等模型。
zero-shot
分类,即不需要任何训练和微调,而且CLIP
分类不再受限于类别列表(open vocabulary)。在类别标签中随意的添加类别prompt(也就是下图A photo of {label}
这种句子),模型就可以将新的类别检测出来,所以CLIP
在ImageNet上可检测的类别远大于1000,这也是其最吸引人的地方。
2. DALL·E2
上面的CLIP训练好之后,就将其冻住了,不再参与任何训练和微调。DALL·E2训练时,输入也是文本-图像对,下面就是摘要提到的两阶段训练:
prior
:根据文本特征生成图像特征- 文本和图片分别通过锁住的
CLIP text encoder
和CLIP image encoder
得到编码后的文本特征和图片特征。(这里文本和文本特征是一一对应的,因为这部分是始终锁住的,图片部分也一样) prior
模型的输入就是上面CLIP编码的文本特征,其ground truth就是CLIP编码的图片特征,利用文本特征预测图片特征,就完成了prior
的训练。- 推理时,文本还是通过
CLIP text encoder
得到文本特征,然后根据训练好的prior
得到类似CLIP生成的图片特征(此时没有图片,所以没有CLIP image encoder
这部分过程)。此时图片特征应该训练的非常好,不仅可以用来生成图像,而且和文本联系的非常紧(包含丰富的语义信息)。
- 文本和图片分别通过锁住的
decoder
:常规的扩散模型解码器,解码生成图像。
这里的decoder就是升级版的GLIDE
,所以说DALL·E2=CLIP+GLIDE
。
其实最暴力的方法,就是直接根据文本特征生成图像,只要中间训练一个融合特征的大模型就行。但是就像之前作者再在摘要说的说的,如果有显式的生成图片特征的过程(也就是
文本→文本特征→图片特征→图片
),再由图像特征生成图像,模型效果就会好很多,所以采用了两阶段生成方式。另外论文中,作者将本文的模型称为
unCLIP
而非DALL·E2
,因为CLIP是从文本/图像训练得到特征,然后可以拿训练好的图像特征去做分类、检测等任务(本身是做分类,后续改进工作拿来做检测和分割等等),是一个从输入→特征的过程。而DALL·E2
是从文本特征→图片特征→图片
的过程,是CLIP的反过程,所以作者称其为unCLIP
。
三、 算法铺垫
DALL·E2
是基于GLIDE、CLIP和扩散模型做的,但作者这部分只讲了和GLIDE的区别及一些实现细节,prior部分也是实现细节,而没有讲方法本身。所以仅从这部分,无法知道整个模型的具体算法。
下面简单介绍一下图形生成之前的工作,从GANs到AE(Auto encoder)、VAE系列工作(Auto-Encoding Variational Bayes)再到扩散模型及一系列后续工作。
3.1 GANs
GANs
(Generative Adversarial Networks,生成对抗网络)是从对抗训练中估计一个生成模型,其由两个基础神经网络组成,即生成器神 经网络G
(Generator Neural Network) 和判别器神经网络D
(Discriminator Neural Network)。
生成器G
从给定噪声中(一般是指均匀分布或者正态分布)采样来合成数据,判别器D
用于判别样本是真实样本还是G生成的样本。G
的目标就是尽量生成真实的图片去欺骗判别网络D
,使D
犯错;而D
的目标就是尽量把G
生成的图片和真实的图片分别开来。二者互相博弈,共同进化,最终的结果是D(G(z)) = 0.5
,此时G生成的数据逼近真实数据(图片、序列、视频等)。
GAN就是对分布进行建模,希望模型可以生成各种分布。最理想的状态下,G可以生成足以“以假乱真”的图片G(z)。对于D来说,它难以判定G生成的图片究竟是不是真实的,因此
D(G(z)) = 0.5
,此时噪声分布接近真实数据分布。
GANs也有很多局限性,比如:
- 训练不够稳定。
因为要同时训练两个网络,就涉及到平衡问题。经常训练不好,模型就坍塌了,所以这个缺点非常致命。 - GANs生成的多样性不够好。
GANs其主要的优化目标,就是让图片尽可能的真实。其生成的多样性,主要就来自于初始给定的随机噪声,所以创造性(原创性)不够好。 - GANs是隐式生成,不够优美
GANs不是概率模型,其生成都是通过一个网络去完成,所以GANs的生成都是隐式的。不知道模型都训练了什么,也不知道其遵循什么分布,在数学上就不如后续的VAE或扩散模型优美。
3.2 AE
介绍:Autoencoder
AE
自编码器是一种瓶颈架构(bottleneck),它使用编码器将高维输入 转换为潜在的低维Code ,然后使用解码器将潜在Code 进行重构,得到最终的输出 。目标函数就是希望 能尽量的重建 。因为是自己重建自己,所以叫Autoencoder。
3.3 DAE/MAE
MAE论文《Masked Autoencoders Are Scalable Vision Learners》。其主要是将图片masked掉75%的像素区域之后,输入
ViT encoder
提取图片特征,然后用decoder
重构原图,所以是一个无监督的训练过程,数据集和模型都可以做得很大推理时,使用训练好的
MAE encoder
提取图片特征进行下游任务微调。
紧跟着AE之后,出来了DAE
(Denoising Autoencoder),就是先把原图 进行一定程度的打乱,变成 (corrupted x)。然后将 传给编码器,后续都是一样的,目标函数还是希望 能尽量的重建原始的 。
这个改进非常有用,会让训练出来的模型非常的稳健,也不容易过拟合,尤其是对于视觉领域来说。因为图像的像素信息,冗余性非常高。即使把图片进行一定的扰乱(污染),模型还是能抓取其主要特征,重构原图。
这一点也类似MAE
(Masked Autoencoder,掩码自编码器)的意思。作者在训练时,将图像75%的像素区域都masked掉(下图序列中灰色就是被masked的区域,不会传入decoder)。即使这样,模型也能将最终的图像重构出来,可见图像的冗余性确实是很高。作者在MAE论文中反复强调,高掩码率是非常重要的,所以说DAE或者MAE这种操作还是非常有效的。
3.4 变分自编码器VAE
上面的AE/DAE/MAE
都是为了学习中间的特征 ,然后拿这些特征去做后续的分类、检测、分割这些任务,而并不是用来做生成的。因为中间学到的 不是一个概率分布,只是一个专门用于重构的特征,所以没法对其进行采样。
VAE
(Variational Auto-Encoder)就是借助了这种encoder-decoder的结构去做生成,和AE最主要的区别就是不再去学习中间的bottleneck特征了,而是去学习一种分布。
作者假设中间的分布是一个高斯分布(用均值 和方差 来描述)。具体来说,就是将输入 进行编码得到特征之后,再接一些FC层,去预测中间分布的 和 。
和 训练好之后,就可以扔掉encoder了。推理时直接从训练好的分布去采样一些 出来( ),然后进行解码,这样VAE就可以用来做生成了。
从贝叶斯概率的角度看,前面的从x预测z的过程就是后验概率 ,学出来的分布就是先验分布。给定z预测x,就是likelihood,模型的训练过程就是maximize likelihood。这样从数学上看,就干净优美很多,而且VAE也有一些不错的性质,比如生成的多样性好。
VAE是从概率分布中去采样,所以其生成的多样性比GANs好得多。所以这也是为什么后续有一系列基于VAE的工作,比如VQ-VAE/VQ-VAE-2,以及基于VQ-VAE的DALL·E。
以下摘自苏建林老师的《变分自编码器(一):原来是这么一回事》:
后面内容(公式)太多了,感兴趣可以看看。
3.5 VQ-VAE/VQ-VAE2
- 论文:VQ-VAE《Neural Discrete Representation Learning》、VA-VAE-2《Generating Diverse High-Fidelity Images with VQ-VAE-2》
- 参考苏建林博客《VQ-VAE简明介绍》、CSDN博客《VQ-VAE-2》
VQ-VAE
(Vector Quantised - Variational AutoEncoder)首先出现在论文《Neural Discrete Representation Learning》,跟VQ-VAE-2一样,都是Google团队的大作。
VQ即Vector Quantised,它编码出的向量是离散的,也就是把VAE做量化,所以VQ-VAE
最后得到的编码向量的每个元素都是一个整数。
3.5.1 为何要做Quantised Vector?
现实生活中,很多信息(声音、图片)都是连续的,你的大部分任务都是一个回归任务。但是等你真正将其表示出来,等你真正解决这些任务的时候,我们都将其离散化了。图像变成了像素,语音也抽样过了,大部分工作的很好的也都是分类模型(回归任务→分类任务)。
如果还是之前VAE的模式,就不好把模型做大,分布也不好学。取而代之的不是去直接预测分布 ,而是用一个codebook
代替。codebook可以理解为聚类的中心,大小一般是K*D(K=8192,Dim=512/768),也就是有8192个长为D的向量(聚类中心)。
3.5.2 VQ-VAE算法
输入编码器得到高宽分别为 的特征图 ,然后计算特征图里的向量和codebook里的向量(聚类中心)的相似性。接着把和特征图最接近的聚类中心向量的编号(1-8192)存到矩阵 里面。
训练完成之后,不再需要编码特征 ,而是取出矩阵 中的编号对应的codebook里面的向量,生成一个新的特征图 (量化特征quantised feature)。最后和之前一样,使用 解码重构原图。此时这个量化特征就非常可控了,因为它们永远都是从codebook里面来的,而非随机生成,这样优化起来相对容易。
- 左图:
VQ-VAE
的模型结构 - 右图:
embedding space
可视化。编码器输出 会mapped到最相近(nearest)的点 。 - 红色线的梯度 迫使encoder在下一次forward时改变其输出(参数更新)。
- 由于编码器的输出和解码器的输入共享D维空间,梯度包含了编码器如何改 变参数以降低损失的有效信息。
下面是一些重构效果:
VQ-VAE
也可以用来做CV领域的自监督学习,比如BEIT
就是把DALL·E
训练好的codebook
拿来用。将图片经过上面同样的过程quantise
成的特征图作为ground truth
,自监督模型来训练一个网络。后续还有VL-BEIT
(vision language BEIT)的工作,也是类似的思路,只不过是用一个Transformer编码器来做多模态的任务。
3.5.3 局限性
VQ-VAE
学习的是一个固定的codebook
,所以它又没办法像VAE这样随机采样去做生成。所以说VQ-VAE不像是一个VAE,而更像是一个AE。它学到的codebook特征是拿去做high-level任务的(分类、检测)。
如果想让VQ-VAE做生成,就需要单独训练一个prior
网络,在论文里,作者就是训练了一个pixcl-CNN
(利用训练好的codebook去做生成)。
3.5.4 VQ-VAE2(图片生成效果超越 BigGAN)
本身是对VQ-VAE的简单改进,是一个层级式的结构。VQ-VAE2不仅做局部的建模,而且还做全局的建模(加入attention),所以模型的表达能力更强了。同时根据codebook学了一个prior,所以生成的效果非常好。总体来说VQ-VAE2是一个两阶段的过程:
- 训练编解码器,使其能够很好的复现图像
- 训练PixelCNN自回归模型,使其能够拟合编码表分布,从而通过随机采样,生成图片
stage1:训练一个分层的VQ-VAE用于图像编码到离散隐空间
- 输入图像 ,通过编码器生成向量 ,然后采用最近邻重构,将 替换为codebook的中的一个nearest prototype vector。
- codebook可以理解为离散的编码表,举一张人脸图像为例,codebook就包括头发颜色,脸型,表情和肤色等等。因此,量化就是通过编码表,把自编码器生成的向量 离散化:
- 解码器通过另一个非线性函数重建数据
作者提到其动机是把全局信息(如shape和geometry)以及局部信息(如纹理)分开建模。如图所示,
top level
用于model全局信息(256 * 256下采样得到 64 * 64),bottom level
用于model局部细节(64 * 64再降为32 * 32)。解码器分别从两个隐层中重建图像。原文中还有再加
middle level
,实验结果表明加了middle level之后,生成的图像清晰度更高。
stage2:在离散隐空间上拟合一个PixelCNN先验
- 经过Stage1,将图片编码为了整数矩阵,所以在Stage2用自回归模型PixelCNN,来对编码矩阵进行拟合(即建模先验分布)。
- 通过PixelCNN得到编码分布后,就可以随机生成一个新的编码矩阵,然后通过编码表 映射为浮点数矩阵,最后经过deocder重构得到一张图片。
生成效果
3.6 DALL·E
VQ-VAE的生成模式是pixcl-CNN +codebook
,其中pixcl-CNN
就是一个自回归模型。OpenAI 一看,这不是到了施展自己看家本领GPT
的时候了吗,所以果断将pixcl-CNN
换成GPT
。再加上最近多模态相关工作的火热进展,可以考虑使用文本引导图像生成,所以就有了DALL·E
。
DALL·E模型结构如下:
论文里没有画出模型结构,网上找了一圈暂时也没发现,只好贴出视频里的手绘图了,将就看一下
DALL·E和VQ-VAE-2一样,也是一个;两阶段模型:
- Stage1:Learning the Visual Codebook
- 输入:一对图像-文本对(训练时)。
- 编码特征
文本经过BPE编码得到256维的特征 ;图像(256×256)经过VQ-VAE得到图片特征 (就是上面训练好的VQ-VAE,将其codebook直接拿来用。