该文章是openAI一系列文本图像生成工作的最新一篇,)下面给出这篇文章及代码的链接:paper code 视频参考链接
1. 发展
DALLE(21年5月 OPENAI推出的) ➡CogView(21年5月 清华支持中文生成图像) ➡(21年11月 女娲模型 微软和北大合作研发 不光能生成图像也能生成比较短的视频)➡GLIDE(21年12月 OPENAI推出的)➡ERNIE ViLG(百度21年12月份推出的支持中文模型有100亿参数比较大)➡DALLE2(22年4月份OPENAI推出的)➡ CogView2(22年4月份清华推出的)➡CogVideo(22年5月清华推出的)➡Imagen(22年5月份谷歌推出的)
2. 论文解读
1) 标题
论文标题Hierachical Text-Conditional Image Generation with CLIP Latents这里说的层级式的原因式因为DALLE2先生成小分辨率的图片比如64 * 64,再利用模型上采样到256 * 256,再利用模型上采样到1024 * 1024变成一个高清大图,所以是层级式的结构。该模型先训练好一个CLIP模型找到文本和图片的相联关系之后,这个时候给定一个文本,CLIP的文本编码器就可以把文本变成一个文本特征,然后DALLE2就训练一个prior模型,模型的输入式这个文本特征输出是这个图像特征接着把图像特征给解码器从而生成一个完整的图像,DALLE2模型其实就是CLIP模型加上GLIDE模型(GLIDE模型就是一个基于扩散模型的文本图像生成的方法)。
2)摘要
像对比学习CLIP能够学习很稳健的图像特征,既能够抓住语义信息,又能够抓住图像的风格信息,为了借助这些特征做图像生成任务,作者提出了一个两阶段的模型,分别是prior以及的decoder。给定一个文本描述,首先生成一个文本特征,prior它能够给我将文本特征生成一个图像特征(这里CLIP生成的图像特征用于作groundtruth),decoder相当于给定一个图像特征之后我能根据特征生成一个图像。文章作者发现通过显式的去生成这种图像特征方式能够很显著的提升图像的deversity(多样性),对图像的写实程度与文本匹配程度没有损失,就是说我生成的图像又多样又逼真,比GAN网络多了多样性,有创意。文章的解码器用了扩散模型,再prior的模型里使用了auto regressive和 diffusion 发现diffusion(扩散模型好,效率高且质量高)。
3)引言
CLIP有zero-shot能识别很多类,对分布偏移很稳健且CLIP在fine-tune能够在一系列的视觉或文本任务上取得很好的成绩。当然扩散模型也是图像生成领域非常好用的一个工具,其实扩散模型是一个概率分布模型,是从一个分布里去采样所以说多样性非常好,但是保真度比不过GAN, 因为GAN本身就是为了以假乱真去优化的(比如inception score 或者FID score这些方面GAN一直压着diffusion model),后面的扩散模型的保真度也有了进一步提升。
下面这张图主要描述了DALLE2的流程思路
作者将图画成了两部分上面是CLIP模型, 下面是GLIDE模型。上面的CLIP模型左边给定一个文本,右边给定一个图像匹配对,右边的文本通过文本编码器进行编码得到文本特征, 图像通过图像特征得到图像特征,如果是图像文本匹配对则是正样本,如果不是则是 负样本用这个思路训练模型,其实就是CLIP对比学习,这里就可以将文本编码器和图像编码器学习的很好,文本和图像特征是一个合并的多模态的一个特征空间。当图像编码器和文本编码器训练好之后就会被锁住了,训练好了上面的CLIP模型,下面介绍本文中的核心了就是该图的下方分别由prior以及decoder两个模块构成。其实这里可以直接用文本特征通过一个大模型生成图像特征,但是该方法效果肯定不好,个人觉得多样性也失去了,所以作者在这里先使用显式的生成图像特征的一个过程(就是先从文本生成文本特征然后再生成图像特征最后再有图像特征生成最后的图像)这样两阶段的方式就会好很多。
作者先用锁住的文本编码器生成文本特征,所以说这里的文本和文本特征都是固定的一对一的映射关系。下面我们就需要用文本特征通过prior模型来得到图像特征,同时我们用上面用上面CLIP的文本图像匹配对的图像特征做groundtruth用来做监督训练,再预测的时候就不需要上面的CLIP的部分了。这么说读者应该很明白了其实DALLE2的模型就是上半部分的CLIP与下半部分的GLIDE合在一起。
这篇文章作者并没有将文章起名DALLE2而是起名unCLIP, 这是因为对于CLIP来说是从输入到特征的过程,但是DALLE是从文本到文本特征再到图像特征最后到图像的过程,可以理解为是CLIP的反过程,就是特征转成图片。
4)背景知识
a. GAN网络
这里可以参考我写的这篇文章CycleGAN。GAN网络分别由生成器和判别器组成,让生成器生成的图片然判别器判别哪些是生成的哪些是真实的,让生成器和判别器相互较量不断提高自己,最后让生成器生成比较真实的图片。该方法的缺点主要是训练不够稳定,因为要同时训练生成器以及判别器所以就有一个平衡问题容易出现模型坍塌的问题,GAN主要是为了生成所以创造性不好,所以GAN就没有VAE以及扩散模型优美。
b. AutoEncoder
首先给定输入x然后过一个编码器然后得到编码特征,这个特征维度比较小(所以叫bottleneck),再过一个解码器得到图像,所以希望得到图像与输入一样。
c. DAE(Denosing AutoEncoder)
将输入进行扰动打乱得到输入再将其输入到encoder中后面与AE一样,最后还是希望输入与相似,让训练稳健不会过拟合,因为视觉图像信息像素冗余信息很高,就算被污染也可以被重建类似于MAE(掩码式对比学习)。这里的AE, DAE以及MAE都是为了学习bottleneck Z的,然后拿这个Z进行分类,检测等任务, 他并不能用来生成,学到的不是概率分布,无法进行采样,也就是说不想GAN里面的随机噪声,它是专门用来重建的特征
,我们如果用重建特征做生成呢?下面来看VAE。
d. VAE
这里与AE与DAE不一样的地方就是这里不是为了学习特征Z,而是学习一种分布,这里作者假设这个分布是一个高斯分布(这里用均值和方差来描述),当我们从编码器得到的特征,加入FC层来预测均值和方差,我们用公式,去采样一个z出来,这样VAE就可以做生成了,这样在训练好模型之后把Encoder编码器扔掉,然后z就可以从高斯随机噪声去抽样出来一个样本,然后通过解码器你就可以生成一张照片了,从贝叶斯角度分析,从给定x到z 的过程其实就是后验概率,学出来的distribution是先验分布,给定z预测x就是likelihood,我们这里做的就是maxmize likelihood,因为是从分布中抽样,所以他生成的图像的多样性就是比GAN好很多。
e. VQVAE
这里的VQ指的意思表示的是vector quantised, 就是把VAE做量化,类似于现实生活中我们的所有信号包括声音图像都是连续的,大部分任务都是回归任务,但是真正做的时候都离散化了,图像也变成像素,大部分比较好的模型都是分类模型,回归任务变成分类模型这里也一样,之前VAE不好将模型及尺寸变大,分布也不好学,所以 取而代之是不去做分布预测用codebook代替,这个可以理解为是聚类中心,维度是 ,一般就是8192,一般就是512或者768,相当有8192个长度为的向量在codebook里面。对应该图,我们将通过编码器编码得到的特征去跟codebook里的向量去做对比,看它与哪个聚类中心最接近,我们把最接近聚类中心的那个编码寸到z这个矩阵中,所以z里面存储的就是编号,例如编号10, 编码100等。一旦昨晚聚类分配就不需要前面特征 ,这样我们根据匹配的聚类中心编码拿出来获得特征(量化的特征),该特征都来自于codebook里面非随机的,所以优化起来相对容易。一旦有了特征图之后后面的流程都一样。
VQVAE非常有用不仅用到了后面的DALLE这个项目里,还有到了视觉这边用来做自监督学习例如BEIT,就是将DALLE训练好的codebook拿过去再将图片quantise成特征图,用这个做groundtruth。最近BEIT又出了VL(vision language)-BEiT,使用一个transformer做一个多模态工作。后面又出了VQVAE2不仅做局部的建模而且做全局的建模见了attention,根据codebook学习一个prioir。
f. Diffusion 扩散模型
这里的diffusion来源于热力学的一个词汇,比如说你有一些物质有高密度的也有低密度的,这个高密度的物质就会慢慢向低密度的去做扩散,比如说你喷了香水,香水就会慢慢扩散整个房间最后达到一种平衡,在这里的平衡表示的是各向同性的一种正态分布,就是趋近于随机噪声。这个和图像生成有什么关系呢?如果反过来向,如果我现在的输入是一个随机噪声也就是GAN里面的z现在找到一种方式或训练一个网络将这个噪声一点点恢复到原来图片他不就可以做图片生成嘛,就是上图说的reverse diffusion。推理过程中反向恢复的模型都是共享参数的一个模型,只不过要抽样生成很多次,一般这个T会选择1000步,所以是扩散模型的一个不足,非常慢, 要恢复的话要做1000步一点点恢复, 这个开销远远大于其他的生成模型的,这里的reverse diffusion可以使用UNet网络。
上面已经介绍了扩散模型的原理,下面介绍下扩散模型的发展历程。
DDPM(Denoising Diffusion Probabilistic Model)
该文章提出来不去预测 如何预测 ,我们只去预测噪声,就是用 去预测 ,我们的输入除了 还用到了time embedding, 主要是用来告诉UNet这个模型反向扩散了第几步,这里time embedding 就相当于transformer中的位置编码一样,它也是一个正弦的位置编码或者是一个傅里叶特征。在反向diffusion希望先生成比较粗糙的轮廓图像,随着扩散模型一点点传播快生成图像的时候我们希望它学习到一些高频的信息特征比如说物体的边边角角等细小特征,这样使得生成的图片更加逼真,所以需要用time embedding告诉模型哪里我需要更加逼真。通过下面的公式表示模型的目标函数(损失函数),表示的是给定 去预测 , 我们已知的噪声 (groundtruth,这里每一步添加的噪声都是我们自己加进去的)与我们预测出来的噪声 插值。 表示的上图我们UNet的网络结构。 表示的是输入
, 这里的 为预测噪音的均值和方差,但是作者这里说无需预测方差直接预测均值就可以了,方差只要是一个常数就可以了,极大降低工作量。
与VAE差异
1.
: 扩散模型编码器是一个固定过程(不断添加噪音),VAE的编码器是学习的过程
2.
: 扩散模型每一步中间过程与输入都是同样维度大小,但是AE,VAE中的bottleNeck维度比输入小很多。
3.
: 扩散模型有步数的概念,它从随机噪声开始要经过很多步骤才能生成一个图片,所以它有time step, time embedding这些概念,而且在所有的time step里,它的U-Net模型结构都是共享参数的,而在VAE是不存在的。
g. improved DDPM
改进点:
1.
: 这里对DDPM做了改进,把方差学了不用常数。
2.
: 它把怎么添加噪声的schedule改了,从一个线性的schedule变成了余弦的schedule
h. Diffusion beats GAN
改进点:
1.
: 把模型加大加宽,增加自注意力头(attention head)的数量 , 将single-scale attention换成了multi-scale的attention。
2.
: 提出了一个新的归一化方式叫做adaptive group normalization,根据步数做自适应归一化
3.
: 提出了classifier guidance的方法去引导模型做采样和生成,不仅让生成的图片更加逼真而且加速了反向采样的速度,论文说通过25次采样就可以从一个噪声变成图片(比一开始DDPM1000步少很多)
这里的原理相当于由噪音还原图像的过程中在训练一个图像分类器,分类器的作用就是当我们有一个图片之后,我把它直接扔给分类器,然后我们就直接去看他分类的对不对,就能算交叉熵损失函数,得到梯度,这个梯度可以帮助这个模型进行采样和图像生成,这里梯度可以暗含图片有没有物体,这个物体真不真实,就是生成的图片更像某类物体不是意思到了就可以,这个物体的颜色形状纹理等各种细节都需要尽量跟真实的物体匹配上,所以在classifier guidance diffusion上了之后,图像就逼真了很多, 在inception score以及FID score上分数上涨很大。这种方法牺牲了一部分的多样性换取了生成图像的写实性,但是多样性比GAN要好,所以说效果还是很能接受的。
扩散模型活了之后guided diffusion非常有效,除了这种简单classifier guided有效之外,我们还能用什么当作指导呢?首当其中的就是我们能不能把一个简单的这个图像分类器换成一个CLIP模型,利用文本和图像的联系使得文本可以作为guided来引导图像的采样和生成。比如在image上不仅可以在像素上面做这种特征层面的引导,也可以做图像风格方面的引导,只不过就用一个gram matrix就可以了,在text文本方面可以用很大的一些语言模型做引导,效果也非常好,所有这些引导就是上图目标函数中的。模型的输入就不光是输入, 同时还有一个condition,至于这个条件是什么根据我们所使用的应用而来。
i. GLIDE(classifier free guidance)
但是上述一系列的方法有一个缺陷就是它真的都是又用了另外一个模型去做这种引导要么就是我们拿一个直接pre-train好的模型要么我们还得去训练一个模型,不仅成本比较高,而且训练的过程也是不可控的。所以就引出来后续的一篇工作classifier free guidance,它提出来一个非常巧妙的技巧我们不想要这些classifier还能不能找到一种指导信号去让这个模型变得更好呢?就是在他训练模型的时候生成了两个输出如下公式中减数代表有条件下的输出,被减数代表没有条件下的输出。这里的意思是减数用条件文本生成一个图像与被减数用空序列代表文本再去生成另外一个输出让两者相减就知道两者在其空间上面的差距,等到最后在做反向扩散(图像生成),可以从没有条件生成的图片变成有条件生成的图片。
(这里的t指的是time embedding, y代表condition)
但是这种方法生成的时候消耗的资源很多,在训练的时候还要生成两个输出,一个有条件的一个没有条件,又增加了训练的成本,但是当时大家觉得这是一个不错的方法在后面的DALLE2也用到了这种方法。该方法只用到了3.5Billon的参数,但是生成的效果直逼DALLE的模型而DALLE又12Billon的参数,DALLE使用的是VQVAE的方法, 但是DALLE2使用的是扩散模型的方法去做
j. DALLE2
相较于GLIDE改进了几点:
1.
: 前面加了prior
2.
: 它使用了层级式的生成方式,从64到256,从256又到了1024使用了很多最新得技巧。
作者用一下公式解释为什么用两阶段生成图片
公式最左边 表示的意思是给定一个文本 我需要恢复 也就是图片, 进一步转化成中间的这种形式 表示的是给定一个文本 , 生成 这里表示的是图片的特征, 其实这里 与 是对等一一对映的关系.通过chain rule就可以生成等式最右边的形式了. 等式最右边 为prior, 相当于用这个图像的embedding去生成 这一步表示的是decoder.作者说明做两阶段的依据就是上述这么推导的.
decoder
: 就是GLIDE模型的变体,改动并不大,这里用了CLIP模型作为guidance, 稍微再修改了点.他们也用了classifier-free gudiance具体来说guidance信号要么来自于CLIP要么来自文本.作者先从64 * 64生成256 * 256,再训练一个模型从256 * 256生成1024 * 1024,为了训练的稳定性,在训练过程中加了很多的噪声, 他们这里没有用transformer 只用了卷积操作,所以在做推理可以用到任意尺度上,可以直接生成更清晰的图片.
prior
: 给定一个文本来生成图像特征 , 这样就好把 输送给解码器从而恢复出来图片.作者这里尝试了两种方案分别是Autoregressive prior(AR)
(和DALLE或者GPT很像,输入是文本特征也有CLIP来的图像特征,把图像遮住去自回归预测, 这种预测效率低)和Diffusion prior
,这两个方法都用了classifier-free guidance的方法,效果是不错的,所以作者训练了一个transformer decoder,这里输入输出是embedding所以用的transfomer处理序列.模型的输入非常多,从文本到CLIP文本特征还有time step(步数的embedding)还有就是加了噪音之后的CLIP的图像特征,还有就是Transformer自己本身的一个embedding,比如说之前我们说过的cls token.然后最终的embedding去预测没有加过噪音的CLIP图像特征.
效果
缺点:
- 对方位理解不好
- 文字理解不好
当然这里推荐唐宇迪介绍DALLE 的模型大家有空可以看下
【AI博士】由浅入深了解扩散模型Diffusion Model
【AI博士】OpenAI神作Dalle2理论和代码复现!