— order: 32 —1 Hierarchical Text-Conditional Image Generation with CLIPLatents时间:2022.41.1 标题 & 摘要 & 引言技术路线:DALLECogViewNVWAGLIDE(OpenAI)ERNIE-ViLGDALLE2CogView2CogVideoImagen(Google)DALLE 沿用了 OpenAI 擅长的基于 GPT 的技术路线(GPT+VQ-VAE)在此之前,OpenAI 已于 2020 6 月发布了 Image-GPT图像生成大模型上小试牛刀。但是 DALEE2 采用了不同的技术方案:扩散模型。其效果比 DALLE 提升很多。标题:使用 CLIP 特征,基于文本信息层次化地生成图像。其实 DALLE2 就是 CLIP + GLIDE后者就是基于 difussion 的图像生成模摘要用一种 two-stage 的方法,先 prior 显式地生成 image embedding再用 decoder 生成 image这种显式方式可以显著增强diversity 而不会影响写实程度和文本图像匹配程度;而且用 CLIP 得到的 embedding space 允许 DALLE2 通过文本来修改图像,而且是 zero-shot CLIP encoderpriordecoderTextText embeddingImage embeddingImage引言首先说最近的 CV 领域进展主要是在 captioned images 上训练 scaling models比如 CLIPCLIP 可以看之前的论文阅读笔记然后是说扩散模型成为 CV 领域图像和视频生成最好的工具difussion 是从一个分布里去采样,它的多样性非常好,但是保真度比不过 GAN但后来各种 technique 比如 guidance 不断地去优化它,逐渐就成为 SOTA接着就是用一个图片九宫格卖一卖结果,又多样又逼真巴拉巴拉最后简单介绍一下模型。其实它就是 CLIP GLIDE 的融合,prior 模型通过把 CLIP text encoder 的结果作为输入,CLIP imageencoder 的结果作为 ground truth 进行训练,这样显式地得到图像的特征,然后再送入 decoder 生成图像论文的主体方法部分只有两页,默认读者有一定的了解,细节透露的也不多(CloseAI 一贯作风)。所以下面先去了解一下图像生成领域以前的方法和 difussion 的做法等其实在论文发布的时候,GPT 已经在文本生成领域取得巨大成功,但是图像生成任务依然没有很好地解决,文本生成和图像生成有何不同?之前的图像生成模型都是基于 GAN 的,但是 DALLE2 采用了扩散模型,这两者有何不同?1.相对而言,文本生成是一对一的任务,而图像生成是一对多的任务。如机器翻译,有比较确定性的正确答案;而图像生成,一个文本描述可以对应很多图像,图像生成时机器需要大量脑补(一文对多图)更本质地说,一般的机器学习任务,一个输入有一个确定性的标签(label)图像生成任务不一样,对一个输入,其输出是一个分因此 Image-GPT 这种直接拿 GPT 做图像生成效果相对不好。因为每个 pixel 单独生成,无法表达分布的约束。画一幅图,前一 pixel 可能往左跑,后一个 pixel 可能往右跑,单独看每个都没有问题,但是放在一起就不协调(其实感觉用 patch 思想能一定程度解决这个问题)2.一图胜千言,图像的信息量远远大于文本,同一张图片可以有不同的文本描述、包含多个视觉概念,生成任务需要把它们有机地融合在一起(一图对多文)3.再者,文本生成任务的基本概念单元 —— token是有限的、离散的、可枚举的;而图片任务不一样,它是无限的、连续的、不可穷举的。图像的像素表征有很多冗余,图像概念更像是在一个连续、渐变空间。例如,同一张图片,可以稍微做一点变换,生成一个大体相似,但有细微差别的图片。凡此种种,可以通过扩散模型比较好地解决扩散模型在文本之外引入额外的输入:随机噪声分布。使得输入变成了一个分布,输出也是一个分布。有了分布就有了约束,使得输出的视觉概念满足概率约束扩散模型的输出不是一步到位,而是多步到位。中间过程生成了大体相似却又有所差异的图片1.2 图像生成技术的演进1.2.1 GANGAN 的核心思想是左右手互搏,有两个网络,一个生成器(Generator)𝐺,一个判别器(Discrimitor)𝐷。它刚提出时,被认为是深度学习领域当时最具创意的思想生成器的输入是随机噪声,输出是图像𝑥。判别器的输入是𝑥和真实图像𝑥,输出是二分类,表示𝑥是否是真实图片。生成器的目标是以假乱真,糊弄判别器。而判别器的目标是练就一双火眼金睛,识别伪造的图片。训练过程中𝐺𝐷不断提升,最后𝐺能生成非常逼真的图片GAN 的目标函数就是为了以假乱真,所以 GAN 生成的图片保真度非常高,即便人眼也很难区分真假,使用 GAN DeepFake 曾经十分火爆。经过多年的优化,GAN 现在很好用,但是它还有一些缺点1.训练不稳定。因为它要训练两个网络,不太好平衡2.GAN 生成过程的随机性来自初始的随机噪声,导致生成的图片缺乏多样性和创造性3.GAN 不是一个概率模型。它的生成都是隐式的、通过一个网络完成的。我们没法知道它具体做了什么,遵循什么分布。GAN 在数学上不如后期的 VAE,diffusion 模型优美接下来是 AE 大家族1.2.2 AE & DAEAE原始图片𝑥,经过 encoder𝐸得到中间向量𝑧,再经过 decoder𝐷,输出图片𝑥𝑧的维度通常比原始图片小很多,所以又被称 bottleneck训练目标:𝑥尽量逼近𝑥。即重构原始图片DAEDAE AE 只有一个差别:输入的原始图片𝑥先加噪变成𝑥𝑐,再接入后续流程。训练目标仍是使输出𝑥逼近原始图片𝑥事实证明,加噪声很有用。它使得模型更稳健,鲁棒性更强,不容易过拟合究其原因,可能在于,图片信息冗余很大。即使原始图片被污染了,模型仍然能够抓住它的本质,把它重构出来。这一思想与扩散模型以及何恺明的 MAE 有异曲同工之妙无论是 AE, DAE 还是 MAE都是为了学习中间的 bottleneck 特征。然后再拿 bottleneck 特征做分类等任务。它并不是为了做生成式任务。原因是它学到的是固定的特征向量,而不是一个概率分布,不能用来做采样。于是,顺着这条思路衍生出来 VAE1.2.3 VAE & VQ-VAEVAEVAE 学习概率分布,它先假设这个分布符合高斯分布(有点添加语义先验的意思),于是 VAE encoder 部分的学习目标简化成学习高斯分布的均值和方差具体方法如下:1.原始图片𝑥encode 之后经过 FC 层预测得到均值𝜇、方差𝜎2.从该高斯分布采样得到𝑧3.通过 decoder 生成𝑥,训练目标是𝑥逼近𝑥整个过程从数学上看比较优雅。第一步,从𝑥得到𝑧,可以写作𝑃(𝑧|𝑥),是(𝑧的)后验概率。中间的𝑃(𝑧)是先验概率 prior面一步可以写作𝑃(𝑥|𝑧),是 likelihoodVAE 提出之后,有很多基于它的工作,包括 VQ-VAEVQ-VAE2 等。DALLE-1 就是在 VQ-VAE 的基础上做的VQ-VAEVQ 的含义是 Vector Quantised就是把 VAE 做量化虽然现实世界的很多信号,例如语音、图像等都是连续信号,但是我们在计算机处理它们时大多已经把它们处理成离散信号,那不如干脆就做离散任务。VQ-VAE 把针对连续信号的回归任务转化成针对离散信号的分类任务,把高斯连续分布的先验转化成codebook 的离散分布先验 VQ-VAE 中,不是直接学习中间变量的分布,而是用一个 codebook 代替它。codebook 的大小是𝐾𝐷(e.g.8192512)codebook 存储的向量可以理解为聚类的中心,也可以看作是 embedding𝐾个长度为𝐷 embedding向量)𝑥encode 之后得到特征图𝑓𝑓中的每一维向量都从 codebook 中找一个离它最近的向量𝐷替换,这样得到量化之后的特征向量𝑓𝑐,和原始特征图𝑓维度一样,语义相似,只不过它的元素取值只能从 codebook 中来,相当于缩小了空间1.2.4 DALLEDALLE 的模型十分简洁。输入文本通过编码(BPE)得到文本向量(256),图像通过事先训练好的 VQVAE 编码得到图片向量(3232=1024)。二者 concat 到一起得到一个序列(1280 token)有了输入序列接下来就是很常规的操作,接入 GPT并通过 mask 等方式训推理的时候,输入文本,得到文本序列,输入 GPT用自回归的方式生成图像 token 序列,得到图片DALLE 自回归输出得到多张图片,将图片的 CLIP embedding 与输入文本的 CLIP embedding 做对比,找到最相似的图片作为最终输1.2.5 Diffusion部分参考 AI论文精读-10:深入理解扩散模型和DALLE2扩散的概念来自物理学中的扩散过程。将一滴墨汁滴到一瓶清水中,它会逐渐扩散开来,最后墨汁和清水浑然一体,达到各向同性的正态分对一张原始图片,逐步加噪声,它最终会变成面目全非的白噪声。这个过程比作上述扩散过程。称作前向扩散,forward diffusion生成图片可以看作,输入高斯白噪声,然后一步一步地对它去噪,最后生成清晰的图片。这一过程称作反向扩散,reversediffusion是前向扩散的逆过程但从深度学习的角度来看,加噪声是为了构造自监督学习的 label它和 BERT GPT 通过 mask 或者预测下一个单词等方式构造label 有异曲同工之妙。有了稳健的自监督 label我们才能构造模型消费取之不尽、用之不竭的图片、文本等数据集,才能实现力出奇迹图像生成及推理过程,就是逐步去噪。模型推理时不是一步到位,而是步步为营𝑁次完成输入是白噪声(或者 prior 网络得到的分布,例如 DALLE2以及步数𝑡,模型推理预测上一个时间步的图片。重复这一过程𝑁次,最终得到输出图片。而这个图片跟前向过程的输入图片已经有很大不同了对于反向过程中的预测网络,选用了非常常规的 U-NetU-Net 最早是 2015 年提出,它是一种 CNN 网络。输入图片𝑥经过 encode 逐步下采样,压缩到一个中间结果,然后经过decoder 逐步上采样恢复到和输入同样维度的𝑥为了恢复得更好,encoder decoder 间有一些 skip connectionU-Net 输入和输出维度一致,刚好非常适合 diffusion 的场景几个疑问1.为何每一步的噪声预测网络参数可以共享?2.为何不同图片的噪声预测网络参数可以共享?3.噪声预测网络本质上学习并且存储的是什么?GPT 中不同序列能共享相同的网络参数是假设输入的文本数据集中同一个 token 不管在哪个句子出现,它遵循相同的生成概率。模型学习并存储(所有)token 以及 token 组合(句子)的生成概率。那 Diffusion Model 呢?1.2.5.1 扩散模型的演进DDPM扩散模型早在 2015 年就提出来了,但是它真正产生好的效果走入人们的视野是 2020 DDPM 论文之后。DDPM Berkeley 三位大佬提出,算是扩散模型在图像生成领域的开山之作。它的贡献主要有两个:1.之前人们在扩散过程中想直接实现𝑋𝑡𝑋𝑡1,即图像到图像的转换。DDPM 认为直接预测图像比较困难,它转而预测噪声,类似 ResNet 的思想。模型推理预测(前一步添加的)噪声,从输入中减去预测噪声得到一个稍微清晰一点的图片2.如果要预测正态分布(噪声),只需要学习它的均值和方差。DDPM 发现甚至连方差都不用学习(设置成一个常数),只学习均值就能取得很好的效果,再次降低模型优化的难度比较 VAE DDPM有以下差别:1.DDPM 这种扩散模型其实和 VAE 有点像,看成是 encoder-decoder 的架构2.DDPM encoder 是一步步走过来固定的过程,而 VAE encoder 是学习的3.扩散过程每一步中间结果的维度都和输入一样,而 VAE 的中间结果 bottleneck 维度比输入小4.扩散模型有 time step, time embedding 的概念。每一步的 U-Net 模型共享参数伪代码两个注意点1.训练时并没有迭代𝑇步,即没有扩散𝑇步。从数学上可以证明,前向过程中,𝑋𝑇可以直接从𝑋0叠加高斯噪声一步得到,无需𝑇步迭代。2.推理时,每一步去噪之后,又叠加了一个高斯噪声扰动项𝒛。这个小小扰动是为了增加 noise增加不确定性,实验证明它非常有效(正如在文本生成时只选取概率最大的 token 输出效果不好,需要采样增加随机性和多样性)improved DDPM DDPM 的常数方差也学了把产生噪声的 schedule 从线性改成余弦(可以类比学习率的线性余弦)Diffusion beats GANOpenAI 祭出传统艺能,把模型做得又大又宽用新的归一化方式 adaptive group normalization引入 classify guidance 引导图像生成,不仅让图像更逼真,也加速了反向采样速度classify guidance额外训练一个 classifier在加噪图片上),把反向过程的每一步输入传给它,结果去做交叉熵损失函数然后反传得到梯度。这个梯度暗含了图片是否包含物体或物体是否真实的信息,能够帮助模型训练。它告诉 U-Net 网络,去噪得到的图像不仅仅是意思到了就行,而是真的要包含这样一个逼真的物体某种程度上是牺牲一点多样性(但依旧比 GAN 好),换取逼真效果这个 guidance 的方法比较灵活,大家马上就想到使用 CLIP不光可以用梯度去引导,甚至可以将文本联系起来进行控制。而分开来,也分别可以用 image 去做特征和图像风格层面的引导,用 LLM 去做引导。所有的这些 guidance都可以被视为是一个条件变更进一步,又有人提出 classifer free guidance在没有另一个模型作为分类器的情况下自己指导自己。训练时要求两个输出𝑓𝜃(𝑥𝑡,𝑡,𝑦)𝑓𝜃(𝑥𝑡,𝑡,),相减得到差距,然后在推理时就大概能知道有条件的结果在哪个方向。这个方法进一步提高了训练开销,但确实是好用的方法GLIDE在之前工作的基础上引入 classifier free guidance只用 3.5B 就直逼之前 12B DALLE 模型1.3 DALEE2现在回到 DALEE2虚线上方是 CLIP 模型,下面是 Text2Image 文生图模型。CLIP 模型参数冻结,而文生图模型包含 prior decoder 两个部分输入文本𝑦通过 CLIP text encoder 模型得到 text embedding𝒛𝑡Prior 模型根据𝒛𝑡生成 image embedding𝒛𝑖,记作𝑃(𝒛𝑖|𝑦)Decoder 再根据𝒛𝑖生成图片𝑥文生图的过程像是 CLIP 的逆过程,所以在原论文中 DALLE2 被称为 unCLIP另外,上面这样变化的合理性有如下保证𝑃(𝑥|𝑦)=𝑃(𝑥,𝒛𝑖|𝑦)=𝑃(𝑥|𝒛𝑖,𝑦)𝑃(𝒛𝑖|𝑦)DecoderDecoder 继承自 GLIDE 模型。它同时采用了 CLIP guidance classifier free guidance随机生效为了生成高清晰度的图片,文章采用了级联的方式,训练了两个上采样模型。一个模型负责从6464256256,另一个模型负责从25625610241024另外由于扩散模型使用 U-Net 而不是 Transformer所以可以不用担心序列长度是否一致的问题,是直接可以去生成更清晰的图片PriorPrior 从输入文本生成一个符合 CLIP 多模态空间的图片向量。文章探索了 AR diffusion 两种方式(两种方式都使用了 classiferfree guidance),前者比较贵而不予采用,这里主要介绍 diffusion 方式输入:encoded text, CLIP text embedding, timestep embedding, noised CLIP image embedding, 占位符 embedding(cls token) 于做输出labelunnoised CLIP image embedding模型结构:decoder-only Transformer DDPM 开始大家发现预测 Diffusion 预测残差比较好,但这里最终目标不是图片而是 CLIP image embedding𝒛𝑖,所以没有用残其实,模型结构部分文章介绍很少。各种技术细节如果不看源代码很难解释清楚。在此只能简要介绍。另外,图像生成有很多技巧,有些有用有些没用。例如 AR 方式到底好不好用,到底预测噪声好还是预测原始图片好,不同的文章结论不完全一样。其实,这些奇技淫巧不是最重要的,最重要的是规模(scale)只要能把规模做上去,模型结构上的差异没有那么重要。1.4 结果 & 讨论文生图、图生图、图之间内插、文本图像内插局限性DALLE2 不能很好地把物体和它的属性结合起来。例如,输入 prompt “a red cube on top of a blue cube”DALLE2 不能识别ontop of” 的语义其原因可能在于 CLIP 模型只考虑了文本和图片的相似性,而没法学习on top of” 这种属性信息另一个例子,输入 prompt “a sign that says deep learning”生成的图片确实像一个标语牌,但是上面的文字五花八门,基本都是错误的其原因可能是文本编码采用了 BPE是编码词根词缀,不是编码整个单词后面的讨论提到,这个问题反映了 DALEE2 有一套自己的方言,跟人类语言映射错位。DALLE2 发明的这些黑话使得监管更加困难其它,例如公平性、伦理性、安全性等生成模型老生常谈的问题不再赘述脑洞:自动数据增强,无限套娃 GPT-3 输入一段 prompt用它生成一段文本,再将文本扔给 DALLE2 生成图片,得到无穷无尽的图像文本对,接下来可以用它们训练 CLIP DALLE2怀疑大公司早就在做了该领域后续发展飞快,google 马上提出 imagen然后又有开源的 stable diffusion ……