高质量Diffusion模型生成结果(原图来自DALLE-2)

DALLE

论文】【代码-非官方

DALL·E的名字是为了向艺术家萨尔瓦多·达利和皮克斯的机器人WALL-E致敬

DALLE-2

GLIDE

论文】【代码

GLIDE利用文本进行图像编辑
  • 算法流程:本篇论文并没有做过多的算法创新,更多的是验证性和实验工程相关的内容,其提出可以用文本当做条件去合成、控制和编辑图像。

  • 算法细节:

    • 比较了两种文本引导图像生成的方式:

      • Classifier-Free-Guidance:

        虽然该技术介绍过很多次,但是为了保证相对独立性,这里还是把本篇文章下的CFG公式写一下: 其中这里的专门代表文本条件。

      • CLIP Guidance: 其中分别表示从CLIP提取的图像特征和文本特征,两者相乘表示图像和文本之间的语义相似度 (其实就是CLIP中的相似矩阵),然后本文使用这个相似矩阵对计算梯度再和预测的均值、方差得到最终的结果,这里其实和Classifier-Guidance是一样的思路,只是计算原本是使用专门的分类器计算梯度,这里换成了CLIP。

      • 作者通过实验证明仍然还是Classifier-Free-Guidance效果好一点,原文的说法是:

        We hypothesize that CLIP guidance is finding adversarial examples for the evaluation CLIP model, rather than actually outperforming classifier-free guidance when it comes to matching the prompt.(简单说就是图文匹配度不够)

        而且CLIP Guidance方式有一个致命的缺点就是其和Classifier-Guidance一样都是需要专门在含噪声的图上训练所以就是一句话:用Classifier-Free Guidance就完事了!

    • 模型构成:64x64大小的基于文本控制的的Diffusion(参数量3.5B),256x256的文本控制的上采样Diffusion(参数量1.5B)。其中对于CLIP Guidance作者训练了一个在64x64噪声图上的CLIP模型。

    • 算法应用:基本文生图+图像Inpainting

Imagen

官网】【论文】【代码-非官方

Imagen流程示意图,图片来自原论文

Imagen是谷歌的工作,其相比同时期的其他方案(如DALL-E2、GLIDE、DDIM、VQ-GAN等)要好,主要得益于其在大语料下的预训练语言模型-T5对文本的强大的编码能力以及Diffusion本身在高保真图上的优质效果。另外本文的另一个贡献还是提出一个text-to-image的benchmark,为后来的文生图模型提供了一个评判基准数据集。

  • 算法流程: 在使用预训练好的文本编码模型(T5)提取文本Embedding后,该算法的整体流程包含三个部分:一个文生图Diffusion模型(文本到图像)和两个超分Diffusion模型(从超分到再到),这三个模型同时都接收文本条件进行控制。

  • 算法细节:

    • Text Encoder:文章对比了三种文本编码器:Bert(参数量0.11B)、T5(参数量11B)、CLIP(参数量63M),最终实验下来发现11B的T5效果更好。

    • Diffusion生成部分:该部分是Imagen中文生图的核心部分,负责生成大小的图像,同时也使用了Classifier-Free Guidance技术进行文本控制,不过不同于GLIDE的事,这里unconditional部分直接不指定空字符串:

    • Diffusion超分部分:该部分包含两个超分网络,负责将生成的大小的图像先超分到,再超分到,这两个超分模块能够避免生成模块直接生成超清大图,减小生成部分的压力,这部分使用的网路是在原本U-Net基础上做了一些改动,称为Efficient-UNet,具体改动点如下:

      • 对低分辨率使用更多的残差快,将参数量转移到低分辨率上。这因为低分辨率有着更多的通道数,这能在不夸张地增加计算量和显存的情况下,提升模型的容量。
      • 对跳跃连接进行缩放
      • 反转上/下采样层和卷积层的顺序。在标准UNet中,下采样层在卷积后,上采样层在卷积之前,这里对这两个均做了反转,速度提升了且并未发现效果下降。

      此外,Efficient-UNet去除了Self-Attention模块,保留文本cross-attention模块。

      总之以上本文提出的Efficient-UNet更简单、收敛更快、效率更高,更具体的细节可以看论文。

    • 其他tricks:动态阈值、噪声增强等。

    • DrawBench:提出了包含颜色、数数、文本等11个类别的的prompt模板,验证文生图模型在这些末班上的图像生成效果

Stable Diffusion

论文 】【代码-V1.5】【代码-V2.0

Stable Diffusion(下面简称SD模型)是CompVisStability AILAION等公司研发的一个文生图模型,可以说Stable Diffusion的优秀效果和开源精神完全引爆了AIGC的图像领域!!所以如果想要参与AIGC创作,那么Stable Duffusion是必须要了解的!!!该算法核心就是Latent Diffusion这篇论文:

Latent Diffuison模型架构(原图来自LDM)

Stable Diffusion模型主要包含三个模块:

  • AutoEncoder:感知压缩网络,将图像压缩至维度更小的latent空间模型参数大小为84M

  • CLIP text encoder:将文本prompt转换成text embedding形式,采用CLIP ViT-L/14,模型大小为123M

  • UNet:Diffusion模块的去噪网络,参数大小为860M

所以SD模型的总参数量约为1B。(这里是Stable Diffusion的参数量,和原始论文中Latent Diffusion的参数量-1.45B还是有点区别的)。Latent Diffusion算法创新性地提出了在latent空间进行扩散操作,起相比较于之前DDPM之类的在图像空间做Diffusion的算法相比,在latent空间能够极大程度减少计算量,提高训练和推理效率。

AutoEncoder

  • 除了采用L1重建损失外,还增加了感知损失(perceptual loss,即LPIPS损失)以及基于Patch的对抗训练,同时为了防止得到中间latent的标准差过大,尝试了两种正则化方法:第一种是KL-reg,类似VAE增加一个latent和标准正态分布的KL loss;第二种是VQ-reg,引入一个VQ (vector quantization)层,此时的Autoencoder可以看成是一个VQ-GAN,不过VQ层是在Decoder模块中,这里VQ的CodeBook采样较高的维度(8192)来降低正则化对重建效果的影响。最终采用KL-reg。

  • 这里要明确的一点是,SD中感知压缩这部分用的是AutoEncoder,并非是VAE!即Encoder部分输出的就直接是维度更低的特征图而并非是VAE中的均值和方差,因为这部分主要的目的还是降维和重建,并非为了生成。

  • AutoEncoder对图像输入进行感知压缩,可以看到过小的压缩比例(比如1和2)导致模型收敛速度慢,扩散模型需要较长的学习;而过大的压缩比例导致数据损失大,生成质量较差。压缩比例在4~16取得相对较好的效果,论文中采用的是8倍压缩(即特征图尺寸从)

  • AutoEncoder是单独训练好的,其在后续Diffuison训练是完全固定住的!具体地,SD的Diffusion模块在训练过程只需要Encoder部分,而在推理过程只需要Decoder部分

  • AutoEncoder既然是感知压缩的,那么不管是压缩比例多少最后的重建结果都是有损的,会存在轻微的变形(比如比如文字和人脸的畸变),为了改善这种畸变,Stability.Ai在发布SD 2.0时同时发布了两个在LAION子数据集上精调的AutoEncoder,注意这里只精调Autoencoder的Decoder部分

  • 补充知识【选读】:由于SD采用的autoencoder是基于KL-reg的,所以这个AutoEncoder在编码图像时其实得到的是一个高斯分布的均值和方差,然后通过调用sample方法来采样一个具体的latent。但是由于KL-reg的权重系数非常小,实际得到Latent的标准差还是比较大的,这篇论文中提出了一种rescaling方法:首先计算出第一个batch数据中的了atent的标准差,然后采用的系数来缩放 latent,这样就尽量保证latent的标准差接近1,然后扩散模型也是应用在缩放后的latent上,在解码时只需要将生成的latent除以,然后再送入AutoEncoder的Decoder即可。对于SD所使用的AutoEncoder,这个rescaling系数为0.18215。

CLIP Encoder

  • SD采用CLIP text encoder来对输入text提取text embeddings,具体的是采用目前OpenAI所开源的最大CLIP模型:clip-vit-large-patch14,这个CLIP的text encoder是一个transformer模型(只有encoder模块):层数为12,特征维度为768,模型参数大小是123M。对于输入text,送入CLIP text encoder后得到最后的hidden states(即最后一个transformer block得到的特征),其特征维度大小为77x768(77是token的数量),这个细粒度的text embeddings将以cross attention的方式送入UNet中
  • 值得注意的是,这里的tokenizer最大长度为77(CLIP训练时所采用的设置),当输入prompt的tokens数量超过77后,将进行截断,如果不足则进行paddings,这样将保证无论输入任何长度的文本(甚至是空文本)都得到77x768大小的特征。在训练SD的过程中,CLIP text encoder模型是冻结的。在早期的工作中,比如OpenAI的GLIDE和latent diffusion中的LDM均采用一个随机初始化的tranformer模型来提取text的特征,但是最新的工作都是采用预训练好的text model。比如谷歌的Imagen采用纯文本模型T5 encoder来提出文本特征,而SD则采用CLIP text encoder,预训练好的模型往往已经在大规模数据集上进行了训练,它们要比直接采用一个从零训练好的模型要好。

Unet

  • SD的扩散模型是一个860M的UNet网络,其主要结构如下图所示(输入和输出latent的尺寸均为64x64x4)不过多做文字介绍。
  • 从CLIP获取的Text Condition信息则通过CrossAttention模块嵌入进来,其中Attention的Query是UNet的中间特征,而Key和Value则是Text Embeddings。
SD的UNet结构(原图来自机器学习算法工程师.Ai小将)

训练

  • 训练数据:SD在LAION 2B-en数据集上训练的,它是LAION-5B数据集的一个子集,更具体的说它是LAION-5B中文本为英文的数据集。Laion-5B数据集是从网页数据Common Crawl中筛选出来的“图像-文本”成对数据集,包含5.85B的"图像-文本"对,其中文本为英文的数据量为2.32B,即LAION 2B-en数据集。

    • LAION 2B-en数据集的基本信息统计:图片的宽高均在256以上的样本量为1324M,在512以上的样本量为488M,而在1024以上的样本为76M;文本的平均长度为67。
  • 训练过程:训练主要分为两个阶段:1.训练一个AutoEncoder;2.在latent空间训练duffusion去噪网络。

  • 训练超参(从该网址抄过来mark一下):采用了32台8卡的A100机器(32 x 8 x A100_40GB GPUs)。单卡的训练batch size为2,并采用gradient accumulation,其中gradient accumulation steps=2,那么训练的总batch size就是32x8x2x2=2048。训练优化器采用AdamW,训练采用warmup,在初始10,000步后学习速率升到0.0001,后面保持不变。至于训练时间,文档上只说了用了150,000小时,这个应该是A100卡时,如果按照256卡A100来算的话,那么大约需要训练25天左右

  • 条件注入:SD允许接收CLIP的文本embedding或者图像作为引导控制生成结果,具体控制方法则是通过Cross Attention的方式送入UNet中 其中: 以上表示UNet网络展开后的中间特征,则表示提取的条件特征(该条件可以是CLIP提取的文本Embedding,也可以是图像、语义分割图等,每种特征有专门的编码器)。上式的均表示可学习的映射矩阵用于将具体的特征转换到Q、K、V。

  • 损失函数:SD在固定好AutoEncoder和CLIP Encoder的权重后,整个训练过程就是在优化UNet网络的权重,其损失函数在原DDPM的损失上做了两个改动:

    • 红色改动:即LDM的核心,在latent空间进行扩散和去噪,使用AutoEncoder的编码器提取latent
    • 蓝色改动:添加了条件控制,如文本、分割图等

    在具体训练的时候使用了Classifier-Free-Guidance保证模型的条件控制能力,具体做法就是:在使用上述损失函数训练带条件扩散模型的同时也训练一个无条件的扩散模型(只需要随机概率10%将条件置空就行,比如文本设置为空字符串),然后在推理的时候使用带条件的噪声进行去噪: 上面的guidance scale可以看成是引导权重,利用该参数对有条件和无条件的噪声做插值,或者从另一个角度来看改写上面公式: 即可以看成对无条件和有条件噪声作差作为条件的方向,然后将无条件的噪声沿着这个方向移动作为最终的噪声,其实有点类似于InterFaceGAN中利用latent空间差向量进行属性编辑。

  • 不同的SD版本:

    SD的训练是多阶段的(先在256x256尺寸上预训练,然后在512x512尺寸上精调),不同的阶段产生了不同的版本(直接从该网址抄过来mark一下):

    • SD v1.1:在laion2B-en数据集上以256x256大小数据(共1324M)训练237,000步;然后在laion5B的高分辨率数据集以512x512尺寸训练194,000步,然后在laion5B的高分辨率数据集以512x512尺寸训练194,000步,这里的高分辨率数据集是图像尺寸在1024x1024以上,共170M样本。
    • SD v1.2:以SD v1.1为初始权重,在improved_aesthetics_5plus数据集上以512x512尺寸训练515,000步数,这个improved_aesthetics_5plus数据集上laion2B-en数据集中美学评分在5分以上的子集(共约600M样本),注意这里过滤了含有水印的图片(pwatermark>0.5)以及图片尺寸在512x512以下的样本。
    • SD v1.3:以SD v1.2为初始权重,在improved_aesthetics_5plus数据集上继续以512x512尺寸训练195,000步数,不过这里采用了CFG(以10%的概率随机drop掉text)。
    • SD v1.4:以SD v1.2为初始权重,在improved_aesthetics_5plus数据集上采用CFG以512x512尺寸训练225,000步数。
    • SD v1.5:以SD v1.2为初始权重,在improved_aesthetics_5plus数据集上采用CFG以512x512尺寸训练595,000步数。

    SD v1.3、SD v1.4和SD v1.5其实是以SD v1.2为起点在improved_aesthetics_5plus数据集上采用CFG训练过程中的不同checkpoints,目前最常用的版本是SD v1.4和SD v1.5

    我的理解是在SD1.1和SD1.2虽然没有用CFG进行条件控制,但是其内部的Cross-Attention机制已经做了条件控制的事情,只是效果可能没有显式的CFG效果好~

  • 评估指标:

    • FID(越低越好):衡量生成图像的逼真度
    • CLIP score(越大越好):生成的图像与输入文本的一致性

    当CFG的gudiance scale参数设置不同时,FID和CLIP score会随之发生变化,越大则CLIP score但是FID也会升高,SD模型默认采用7

  • 算法应用:

    • text-2-image(文生图)
    • layout-2-image或segmentation-2-image
    • 图像超分
    • Inpainting

参考: