图像生成(Text-to-Image)发展脉络

这篇博客对 图像生成(image generation) 领域的经典工作发展进行了梳理,包括重要的一些改进,目的是帮助读者对此领域有一个整体的发展方向把握,并非是对每个工作的详细介绍。

脉络发展(时间顺序)

GAN [MILA] (2014.06) → VQ-VAE [Google] (2017.11) DALL-E [OpenAI] (2021.02) DDPM [Google] (2020.06) DDIM [Stanford] (2020.10) improved DDPM [Google] (2021.02) Guided-diffusion [OpenAI] (2021.05) GLIDE [OpenAI] (2021.12)DALL-E 2 [OpenAI] (2022.04) Latent Diffusion Model [Heidelberg University] (2022.04) Stable Diffusion V1 [Stability AI] (2022.08) Stable Diffusion V1.5 [Stability AI] (2022.10) Stable Diffusion V2 [Stability AI] (2022.11) Stable Diffusion XL [Stability AI] (2023.06) DALL-E 3 [OpenAI] (2023.10) SDXL-Turbo [Stability AI] (2023.11) Stable Diffusion V3 [Stability AI] (2024.03)

主要发展路线分为自回归模型扩散模型两个大类,因此我们加下来会按照两大发展脉络来进行梳理具体的技术更新。

GAN

GAN的核心思想是“左右手互搏”,有两个网络,一个生成器G,一个判别器D。它刚提出时,被认为是深度学习领域当时最具创意的思想。

生成器的输入是随机噪声,输出是图像x’。判别器的输入是x‘和真实图像x,输出是二分类,表示x’是否是真实图片。生成器的目标是以假乱真,糊弄判别器。而判别器的目标是练就一双火眼金睛,识别伪造的图片。训练过程G和D不断提升,最后G生成非常逼真的图片。

GAN的目标函数就是为了以假乱真,所以GAN生成的图片保真度非常高。即便人眼也很难区分真假。使用GAN的DeepFake曾经十分火爆。

经过多年的优化,GAN现在很好用,但是它还有一些缺点。首先,训练不稳定。因为它要训练两个网络,不太好平衡。其次,它生成过程的随机性来自初始的随机噪声。这导致GAN生成的图片缺乏多样性和创造性。再者,GAN不是一个概率模型。它的生成都是隐式的,通过一个网络完成的。我们没法知道它具体做了什么,遵循什么分布。GAN在数学上不如后期的VAE、diffusion模型优美。

扩散模型

DDPM

扩散模型早在2015年就提出来了,但是它真正产生好的效果走入人们的视野是2020年DDPM[4]论文之后。

DDPM由Berkeley的三位大佬提出,它算是扩散模型在图像生成领域的开山之作。它的贡献主要有两个:
首先,之前人们在扩散过程中想直接实现X(t)到X(t-1)即图像到图像的转换。DDPM认为直接预测图像比较困难,它转而预测噪声,类似ResNet的思想。
其次,如果要预测正态分布(噪声),只需要学习它的均值和方差。DDPM发现甚至连方差都不用学习(设置成一个常数),只学习均值就能取得很好的效果,再次降低模型优化的难度。

也可以从VAE的角度理解DDPM,只不过有以下差别:

第一,DDPM的编码器是前向扩散过程,不需要学习。

第二,扩散过程每一步中间结果的维度都和输入一样,而VAE的中间结果维度比输入小。

第三,扩散模型有步数,time embedding的概念。每一步的U-Net模型共享参数。

如果想详细学习DDPM建议参考知乎文章和论文原文

DDIM

基于DDPM,DDIM论文主要提出了两项改进
第一,对于一个已经训练好的DDPM,只需要对采样公式做简单的修改,模型就能在去噪时「跳步骤」,在一步去噪迭代中直接预测若干次去噪后的结果。比如说,假设模型从T=100时刻开始去噪,新的模型可以在每步去噪迭代中预测10次去噪操作后的结果,也就是逐步预测时刻 t=90,80,…,0 的结果。这样,DDPM的采样速度就被加速了10倍。
第二,DDIM论文推广了DDPM的数学模型,从更高的视角定义了DDPM的前向过程(加噪过程)和反向过程(去噪过程)。在这个新数学模型下,我们可以自定义模型的噪声强度,让同一个训练好的DDPM有不同的采样效果。

improved DDPM

改进主要包括:

第一,它没有采用常数方差,而是和均值一样,通过模型学习方差。

第二,改变增加噪声的schedule,从线性schedule变成余弦schedule,和学习率的schedule类似。

第三,尝试大模型,发现扩散模型scale非常好,增加模型参数量可以提升效果,可以大力出奇迹。

Guided Diffusion-“Diffusion Beats GAN”

出了一个新的思想,classifier guidance,引导模型做采样和生成。文章不仅提高了图片的质量,还大大提高了推理速度,只需25步就能完成反向扩散生成图片。

作者受目前GAN方法里通常会使用的类别信息辅助图像生成的原理启发,开发了一个将类别信息引入扩散模型中的方法Classifier Guidance Diffusion,这个方法通俗的说是会训练一个图片分类器,在扩散模型的生成过程中的中间的latend code会通过分类器计算得到一个梯度,该梯度会指导扩散模型的迭代过程。其实这一操作也比较make sense,有一个分类器的存在能更好的告诉U-Net的模型在反向过程生成新图片的时候,当前图片有多像需要生成的物体。有点类似GAN中存在一个判别器的意思。

在论文中提到使用Classifier Guidance的技术能更好的生成逼真的图像,同时能加速图像生成的速度。论文中也提到,通过使用Classifier Guidance的track会牺牲掉一部分的多样性,换取图片的真实性。

classifier guidance仅在扩散模型生成过程中使用,训练过程中不使用

在《Diffusion Models Beat GANs on Image Synthesis》中,通过在生成过程中的近似噪声中加入分类器梯度信息来进行指导:

生成过程:
在这里插入图片描述

然而,人们很快发现使用分类器来做引导存在几个致命的缺点:首先,我们需要相应的分类器来输出置信度。虽然在ImageNet和CIFAR等数据集上我们已经有了不错的分类模型,但仅可以引导特定类别的约束同时要基于用户提供的复杂描述训练一个适用的图片分类器却非常困难。其次,这些分类器都是在正常的图片上进行训练的,而扩散模型的输出 信噪比 很高,特别是在去噪的前几个阶段。因此,直接使用这些分类器可能会导致输入领域的偏移(Domain Shift),从而引导方向可能不准确。

GLIDE

于是openAI又提出了classifer-free guidance,诞生了GLIDE模型。
GLIDE在引导时不需要额外训练一个classifier。它用什么作为引导信号呢?
它在训练阶段,得到两个输出。一个是有条件的输出,一个是无条件的输出。举例来说,如果训练是图像-文本对,一个输出是有文本作为条件的输出Xy,一个是没有文本作为条件,即将文本随机置成空序列,得到的输出X,保留X与Xy之间的差距作为引导信号。先得到无条件的输出X,再叠加引导信号,可以得到有条件的输出。

classifier-free guidance训练过程中一定几率丢弃condition训练, 生成过程中使用一次去噪过程生成condition和uncondition结果,此处强烈建议看cfg部分源码理解操作。

if unconditional_conditioning is None or unconditional_guidance_scale == 1.:e_t = self.model.apply_model(x, t, c)
else:x_in = torch.cat([x] * 2)t_in = torch.cat([t] * 2)c_in = torch.cat([unconditional_conditioning, c])e_t_uncond, e_t = self.model.apply_model(x_in, t_in, c_in).chunk(2)e_t = e_t_uncond + unconditional_guidance_scale * (e_t - e_t_uncond)

训练过程:
在这里插入图片描述
生成过程:
在这里插入图片描述
在生成过程中,则是同时使用了 conditional model 和 unconditional model 进行计算,在使用一个 w 权重来调整两者的占比。
w越大的时候,conditional model 作用越大,则生成的图像越真实(符合用户需求),但是缺点是损失生成多样性和细节纹理恢复能力

Latent Diffusion Model

参考:
文生图大模型三部曲:DDPM、LDM、SD 详细讲解!
Stable Diffusion ———LDM、SD 1.0, 1.5, 2.0、SDXL、SDXL-Turbo等版本之间关系现原理详解

主要创新点

  1. LDM提出了cross-attention的方法来实现多模态训练,使得条件图片生成任务也可以实现。论文中提到的条件图片生成任务包括:类别条件图片生成(class-condition), 文图生成(text-to-image), 布局条件图片生成(layout-to-image)。这也为日后Stable Diffusion的开发奠定了基础。本文在扩散过程中引入了条件机制(Conditioning Mechanisms),通过cross-attention的方式来实现多模态训练,使得条件图片生成任务得以实现。具体做法是通过训练一个条件时序去噪自编码器ϵ_θ (z_t,t,y),来通过 y来控制图片合成的过程。为了能够从多个不同的模态预处理 y ,论文引入了一个领域专用编码器τ_θ(在stable diffusion中替代为了预训练冻结的CLIP text encoder),它用来将 y 映射为一个中间表示τ_θ (y) ,这样我们就可以很方便的引入各种形态的条件(文本、类别等等)。最终模型就可以通过一个cross-attention层映射将控制信息融入到UNet的中间层。
  2. DDPM在像素空间上训练模型,需要反复迭代计算,因此训练和推理代价都很高。DLM提出一种在潜在表示空间上进行扩散过程的方法,能够显著减少计算复杂度,同时也能达到十分不错的图片生成效果。
  3. 相比于其它空间压缩方法,论文提出的方法可以生成更细致的图像,并且在高分辨率图片生成任务(如风景图生成,百万像素图像)上表现得也很好。

UNet的具体结构图:condition y是在cross-attention中引入,step t是在ResNet的两层卷积之间add进入
在这里插入图片描述

Stable Diffusion V1

这里正式开启Stable Diffusion发展路线,VAE压缩+去噪模型+条件控制。

概要

Stable diffusion是一种潜在的文本到图像的扩散模型。基于之前的大量工作(如DDPM、LDM的提出),并且在Stability AI的算力支持和LAION的海量数据支持下,Stable diffusion才得以成功。

Stable diffusion在来自LAION- 5B数据库子集的512x512图像上训练潜在扩散模型。与谷歌的Imagen类似,这个模型使用一个冻结的CLIP vit L/14文本编码器来根据文本提示调整模型。

Stable diffusion拥有860M的UNet和123M的文本编码器,该模型相对轻量级,可以运行在具有至少10GB VRAM的GPU上。

主要改进点

Stable diffusion是在LDM的基础上建立的,同时在LDM的基础上进行了一些改进:

数据集:在更大的数据集LAION- 5B上进行训练

条件机制:使用更强大的CLIP模型,代替原始的交叉注意力调节机制

除此之外,随着各种图形界面的出现、 微调方法的发布、控制模型的公开,SD进入全新架构SDXL时代,功能更加强大。

模型训练

SD的训练是采用了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提供了不同版本的模型权重可供选择:

SD v1.1:在laion2B-en数据集上以256x256大小训练237,000步,上面我们已经说了,laion2B-en数据集中256以上的样本量共1324M;然后在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。

条件控制

  • 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训练时所采用的设置),当输入text的tokens数量超过77后,将进行截断,如果不足则进行paddings,这样将保证无论输入任何长度的文本(甚至是空文本)都得到77x768大小的特征。 在训练SD的过程中,CLIP text encoder模型是冻结的。在早期的工作中,比如OpenAI的GLIDE和latent diffusion中的LDM均采用一个随机初始化的tranformer模型来提取text的特征,但是最新的工作都是采用预训练好的text model。比如谷歌的Imagen采用纯文本模型T5 encoder来提出文本特征,而SD则采用CLIP text encoder,预训练好的模型往往已经在大规模数据集上进行了训练,它们要比直接采用一个从零训练好的模型要好。
  • 下面是SD中使用的条件控制模型CLIP的结构示意图
    在这里插入图片描述

与其他模型对比

DALL-E2 :出自OpenAI,其基本原理和SD一样,都是源于最初的扩散概率模型(DDPM),与之不同发是,SD继承了LDM的思想,在潜在空间中进行扩散学习;而DALL-E2是在像素空间中进行扩散学习,所以其计算复杂度较高。

Imagen:由谷歌发布,采用预训练好的文本编码器T5,通过扩散模型,实现文本到低分辨率图像的生成,最后将低分辨率图像进行两次超分,得到高分辨率图像。

Stable Diffusion V1.5

Stable Diffusion 的 V1.5 版本,由 runway 发布,位于代码库 GitHub - runwayml/stable-diffusion: Latent Text-to-Image Diffusion 中。

该版本发布于 2022 年 10 月,主要包含两个模型:

sd-v1-5.ckpt:

复用 sd-v1-2.ckpt,在 LAION-aesthetics v2 5+ 上以 512x512 分辨率继续训练 595k step,使用了 Classifier Free Guidance 技术,以 10% 概率删除文本条件。

sd-v1-5-inpainting.ckpt:

复用 sd-v1-5.ckpt,在 LAION-aesthetics v2 5+ 上以 512x512 分辨率以 inpainting 训练了 440k step,使用 Classifier Free Guidance 技术,以 10% 概率删除文本条件。在 U-Net 的输入中额外加了 5 个 channel,4 个用于 masked 的图像,1 个用于 mask 本身。

对应的 FID 和 CLIP 分数如下图所示,可以看出,v1.5 相比 v1.4 的提升也不是很明显:
在这里插入图片描述

Stable Diffusion V2

Stable Diffusion 的 V2 版本,由 Stability-AI 发布,位于代码库 GitHub - Stability-AI/stablediffusion: High-Resolution Image Synthesis with Latent Diffusion Models 中。

V2 包含三个子版本,分别为 v2.0,v2.1 和 Stable UnCLIP 2.1:

v2.0:

发布于 2022 年 11 月,U-Net 模型和 V1.5 相同,Text encoder 模型换成了 OpenCLIP-ViT/H 中的 text encoder。

SD 2.0-base:分别率为 512x512

SD 2.0-v:基于 2.0-base 微调,分辨率提升到 768x768,同时利用 [2202.00512] Progressive Distillation for Fast Sampling of Diffusion Models 提出的技术大幅降低 Diffusion 的步数。

发布了一个文本引导的 4 倍超分模型。

基于 2.0-base 微调了一个深度信息引导的生成模型。

基于 2.0-base 微调了一个文本信息引导的修复模型。

v2.1:

发布于 2022 年 12 月,模型结构和参数量都和 v2.0 相同。并在 v2.0 的基础上使用 LAION 5B 数据集(较低的 NSFW 过滤约束)微调。同样包含 512x512 分辨率的 v2.1-base 和 768x768 分辨率的 v2.1-v。

Stable UnCLIP 2.1:

发布于 2023 年 3 月,基于 v2.1-v(768x768 分辨率) 微调,参考 OpenAI 的 DALL-E 2(也就是 UnCLIP),可以更好的实现和其他模型的联合,同样提供基于 CLIP ViT-L 的 Stable unCLIP-L 和基于 CLIP ViT-H 的 Stable unCLIP-H。

如下图所示为 v2.0 和 v2.0-v 与 v1.5 的对比,可见其都有明显提升:
在这里插入图片描述

Stable Diffusion XL (SDXL)

Stable Diffusion 的 XL 版本,由 Stability-AI 发布,位于代码库 Generative Models by Stability AI。

该版本发布于 2023 年 06 月,主要包含两个模型:

SDXL-base-0.9:基于多尺度分辨率训练,最大分辨率 1024x1024,包含两个 Text encoder,分别为 OpenCLIP-ViT/G 和 CLIP-ViT/L。

SDXL-refiner-0.9:用来生成更高质量的图像,不应直接使用,此外文本条件只使用 OpenCLIP 中的 Text encoder。

2023 年 07 月发布 1.0 版本,同样对应两个模型:

SDXL-base-1.0:基于 SDXL-base-0.9 改进。

SDXL-refiner-1.0:基于 SDXL-refiner-0.9 改进。

2023 年 11 月发表 SDXL-Trubo 版本,也就是优化加速的版本。

SDXL 模型概览

如下图所示,SDXL 相比 SD 主要的修改包括(模型总共 2.6B 参数量,其中 text encoder 817M 参数量):

  1. 增加一个 Refiner 模型,用于对图像进一步地精细化
  2. 使用 CLIP ViT-L 和 OpenCLIP ViT-bigG 两个 text encoder
  3. 基于 OpenCLIP 的 text embedding 增加了一个 pooled text embedding
    在这里插入图片描述

微条件(Micro-Conditioning)

(一)以图像大小作为条件
在 SD 的训练范式中有个明显的缺陷,对图像大小有最小长宽的要求。针对这个问题有两种方案:

  1. 丢弃分辨率过小的图像(例如,SD 1.4/1.5 丢弃了小于 512 像素的图像)。但是这可能导致丢弃过多数据,如下图 Figure 2 所示为预训练数据集中图像的长、宽分布,如果丢弃 256x256 分辨率的图像,将导致 39% 的数据被丢弃。

在这里插入图片描述
2. 另一种方式是放大图像,但是可能会导致生成的样本比较模糊。 针对这种情况,作者提出将原始图像分辨率作用于 U-Net 模型,并提供图像的原始长和宽(csize = (h, w))作为附加条件。并使用傅里叶特征编码,然后会拼接为一个向量,把它扩充到时间步长 embedding 中并一起输入模型。如下图所示,在推理时指定不同的长宽即可生成相应的图像,(64,64)的图像最模糊,(512, 512)的图像最清晰:
在这里插入图片描述

(二)以裁剪参数作为条件
此外,以前的 SD 模型存在一个比较典型的问题:生成的物体不完整,像是被裁剪过的,如下图 SD1.5 和 SD 2.1 的结果。作者猜测这可能和训练阶段的随机裁剪有关,考虑到这个因素,作者将裁剪的左上坐标(top, left)作为条件输入模型,和 size 类似。如下图 Figure 4 中 SDXL 的结果,其生成结果都更加完整:
在这里插入图片描述
如下图 Figure 5 所示,在推理阶段也可以通过裁剪坐标来控制位置关系:
在这里插入图片描述
(三)多分辨率训练
真实世界的图像会包含不同的大小和长宽比,而文本到模型生成的图像分辨率通常为 512x512 或 1024x1024,作者认为这不是一个自然的选择。受此启发,作者以不同的长宽比来微调模型:首先将数据划分为不同长宽比的桶,其中尽可能保证总像素数接近 1024x1024 个,同时以 64 的整数倍来调整高度和宽度。如下图所示为作者使用的宽度和高度。在训练过程中,每次都从同样的桶中选择一个 batch,并在不同的桶间交替。此外,和之前的 size 类似,作者会将桶的高度和宽度 (h, w)作为条件,经傅里叶特征编码后添加到时间步 embedding 中:
在这里插入图片描述
(四)训练
SDXL 模型的训练包含多个步骤:

基于内部数据集,以 256x256 分辨率预训练 6,000,000 step,batch size 为 2048。使用了 size 和 crop 条件。

继续以 512x512 分辨率训练 200,000 step。

最后使用多分辨率(近似 1024x1024)训练。

根据以往的经验,作者发现所得到的的模型有时偶尔会生成局部质量比较差的图像,为了解决这个问题,作者在同一隐空间训练了一个独立的 LDM(Refiner),该 LDM 专门用于高质量、高分辨率的数据。在推理阶段,直接基于 Base SDXL 生成的 Latent code 继续生成,并使用相同的文本条件(当然,此步骤是可选的),实验证明可以提高背景细节以及人脸的生成质量。

(五)实验结果
如下图所示,作者基于用户评估,最终带有 Refiner 的 SDXL 获得了最高分,并且 SDXL 结果明显优于 SD 1.5 和 SD 2.1。
在这里插入图片描述
如下图 Figure 10 所示为 SDXL(没有 Refiner) 和 Midjourney 5.1 的对比结果,可见 SDXL 的结果略胜一筹:在这里插入图片描述
如下图 Figure 11 所示为 SDXL(带有 Refiner) 和 Midjourney 5.1 的对比结果,可见 SDXL 的结果同样略胜一筹:
在这里插入图片描述

SDXL-Turbo

SDXL-Turbo 在模型上没有什么修改,主要是引入蒸馏技术,以便减少 LDM 的生成步数,提升生成速度。大致的流程为:

  1. T s t u d e n t T_{student} Tstudent 中采样步长 s,对于原始图像 x 0 x_0 x0 进行 s 步的前向扩散过程,生成加噪图像 x s x_s xs
  2. 使用学生模型 ADD-student 对 x s x_s xs 进行去噪,生成去噪图像 x θ x_θ xθ
  3. 基于原始图像 x 0 x_0 x0 和去噪图像 x θ x_θ xθ 计算对抗损失(adversarial loss)。
  4. T t e a c h e r T_{teacher} Tteacher 中采样步长 t,对去噪后的图像 x θ x_θ xθ 进行 t 步的前向扩散过程,生成 x θ , t x_{θ,t} xθ,t
  5. 使用教师模型 DM-teacher 对 x θ , t x_{θ,t} xθ,t 进行去噪,生成去噪图像 x ψ x_ψ xψ
  6. 基于学生模型去噪图像 xθ 和教师模型去噪图像 x ψ x_ψ xψ 计算蒸馏损失(distillation)。
  7. 根据损失进行反向传播(注意,教师模型不更新,因此会 stop 梯度)

在这里插入图片描述

需要说明的是,通常 ADD-student 模型需要预训练过程,然后再蒸馏。此外, T s t u d e n t T_{student} Tstudent 的 N 比较小,作者设置为 4,而 T t e a c h e r T_{teacher} Tteacher 的 N 比较大,为 1000。也就是学生模型可能只加噪 1,2,3,4 步,而教师模型可能加噪 1-1000 步。
在这里插入图片描述

此外,作者在训练中还用了其他技巧,比如使用了 zero-terminal SNR;教师模型不是直接作用于原始图像 x0,而是作用于学生模型恢复出的图像 xθ,否则会出现 OOD(out of distribution) 问题;作者还应用了 Score Distillation Loss,并且与最新的 noise-free score distillation 进行了对比。

Stable Diffusion V3

参考:Stable Diffusion 3 论文及源码概览

文章的核心贡献如下:

  1. 从方法设计上:
    首次在大型文生图模型上使用了整流模型。
    用一种新颖的 Diffusion Transformer (DiT) 神经网络来更好地融合文本信息。
    使用了各种小设计来提升模型的能力。如使用二维位置编码来实现任意分辨率的图像生成。
  2. 从实验上:
    开展了一场大规模、系统性的实验,以验证哪种扩散模型/整流模型的学习目标最优。
    开展了扩增模型参数的实验 (scaling study),以证明提升参数量能提升模型的效果。

流匹配原理简介
流匹配是一种定义图像生成目标的方法,它可以兼容当前扩散模型的训练目标。流匹配中一个有代表性的工作是整流 (rectified flow),它也正是 SD3 用到的训练目标。我们会在本文中通过简单的可视化示例学习流匹配的思想。

SD3 中的 DiT
我们会从一个简单的类 ViT 架构开始,学习 SD3 中的去噪网络 DiT 模型是怎么一步一步搭起来的。读者不需要提前学过 DiT,只需要了解 Transformer 的结构,并大概知道视觉任务里的 Transformer 会做哪些通用的修改(如图块化),即可学懂 SD3 里的 DiT。

SD3 模型与训练策略改进细节
除了将去噪网络从 U-Net 改成 DiT 外,SD3 还在模型结构与训练策略上做了很多小改进:

  1. 改变训练时噪声采样方法
  2. 将一维位置编码改成二维位置编码
  3. 提升 VAE 隐空间通道数
  4. 对注意力 QK 做归一化以确保高分辨率下训练稳定

大型消融实验
对于想训练大型文生图模型的开发者,SD3 论文提供了许多极有价值的大型消融实验结果。本文会简单分析论文中的两项实验结果:各训练目标在文生图任务中的表现、SD3 的参数扩增实验结果。

自回归模型 (待填坑~)

参考文献

本博客总结归纳了许多以下博客的内容,如果想对生成模型有进一步的了解,可以进一步关注以下高质量的博文,同时也感谢以下博主对知识的共享!
https://huggingface.co/blog/annotated-diffusion
DDIM 简明讲解与 PyTorch 实现:加速扩散模型采样的通用方法 (系列文章)
生成扩散模型漫谈:DDIM = 高观点DDPM (系列文章)
AI论文精读-10:深入理解扩散模型和DALLE2
Diffusion Models 10 篇必读论文(4)Classifier-Free Diffusion Guidance
Stable Diffusion ———LDM、SD 1.0, 1.5, 2.0、SDXL、SDXL-Turbo等版本之间关系现原理详解
文生图大模型三部曲:DDPM、LDM、SD 详细讲解!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/381370.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WGS84经纬度坐标 GCJ02火星坐标 BD09百度坐标互相转换

WGS84经纬度坐标 GCJ02火星坐标 BD09百度坐标互相转换 背景:uniapp做的微信小程序,使用到了相机拍照并获取位置坐标信息;在腾讯地图上展示坐标点位置信息; 由于业务需要我们的PC端用的不是腾讯地图,需要使用WGS84坐标或…

uniapp判断h5/微信小程序/app端+实战展示

文章目录 导文使用条件编译的基本语法常见的平台标识符示例实战展示使用场景举例注意事项 导文 这里是导文 当你在开发Uni-app时,需要根据不同的平台(比如App端、H5端、微信小程序等)来执行不同的代码逻辑,可以使用条件编译来实现…

03 Git的基本使用

第3章:Git的基本使用 一、创建版本仓库 一)TortoiseGit ​ 选择项目地址,右键,创建版本库 ​ 初始化git init版本库 ​ 查看是否生成.git文件(隐藏文件) 二)Git ​ 选择项目地址&#xff0c…

Redis分布式系统中的主从复制

本篇文章主要对Redis的主从复制进行讲解。主要分析复制的原理,包括:建立复制、全量复制、部分复制、全量复制、心跳检测等。希望本篇文章会对你有所帮助。 文章目录 一、主从复制简介 二、配置主从复制模式 断开主从复制 安全性 只读 传输延迟 三、拓扑结构 四、主…

Java开发之Java容器

#来自ゾフィー(佐菲) 1 总览 1.1 List ArrayList: Object[]数组Vector:Object[]数组LinkedList: 双向链表,JDK1.6 之前为循环链表,JDK1.7 取消了循环 1.2 Set HashSet:无序&#xf…

mybatis 报CannotGetJdbcConnectionException

目录 报错起因 报错截图 运行环境 数据库配置 解决思路 报错起因 在web项目上拉取代码启动web服务抛CannotGetJdbcConnectionException。 报错截图 运行环境 windows idea maven tomcat springMVC mybatis 数据库配置 urlxxx driverClassNamexxx usernamexxx pass…

docker compose 容器 编排分组

遇到问题:执行docker compose up -d 后docker compose 创建的容器们 在desktop-docker 中都在docker下一堆 搜索想着能不能把这个docker名字改一下,但是都没有找到这样的一个方案; 最后发现,我执行docker compose up -d 命令所在…

【数据结构】二叉树OJ题_对称二叉树_另一棵的子树

对称二叉树 题目 101. 对称二叉树 - 力扣(LeetCode) 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true示例 2: 输入:root [1,2…

Linux文件和目录常用命令

1.操作命令 查看目录内容 ls 切换目录 cd 创建和删除操作 touch rm mkdir 拷贝和移动文件 cp mv 查看文件内容 cat more grep 其他 echo 重定向 > 和 >> 管道 | 1.1 终端实用技巧 1>自动补全 在敲出 文件/目录/命令 的前几个字母之后,按下…

git实操之线上分支合并

线上分支合并 【 1 】本地dev分支合并到本地master上 # 本地dev分支合并到本地master上# 远程(线上)分支合并# 本地dev分支合并到本地master上# 远程(线上)分支合并#####本地和线上分支同步################ #### 远程创建分支,拉取到本地####-远程创建分支&#…

FPGA:频闪灯设计

1、需求 若在FPGA上实现LED灯一秒闪烁一次,先进行计算,1秒闪烁一次,即周期为1秒,开发板XC7A35TFFG-2的基本时钟输入由板载 50MHz 有源晶振提供,即频率为f 50MHz 。 则一个周期为 T 1 f 1 50 M H z 20 n s T\frac{…

git使用、git与idea结合、gitee、gitlab

本文章基于黑马程序javase模块中的"git"部分 先言:git在集成idea中,不同版本的idea中页面显示不同,操作时更注重基于选项的文字;git基于命令操作参考文档实现即可,idea工具继承使用重点掌握 1.git概述 git是目前世界上最先进的分布式文件版本控制系统 分布式:将…

FastAPI(六十六)实战开发《在线课程学习系统》接口开发--用户注册接口开发

在前面我们分析了接口的设计,那么我们接下来做接口的开发。 首先,我们先设计下pydantic用户参数的校验: """ -*- encodingutf-8 -*- Time: 2024/7/19 16:48 Author: lc Email: 15101006331163.com File: schemas.py "&…

基于单片机的智能医疗监护系统设计

1.简介 随着社会的发展,智能化电子设备成为了人们生活中不可或缺的一部分,尤其是在人们对于身心健康更加注重的今天,智能医疗监护系统应运而生。本套电子监护设备集体温测量、心电采集、心率监测、血氧监测于一体,带有语音播报模块…

Thinkphp开发文档二次整理版

基础部分 安装 环境要求 ​ *php>7.1.0 命令下载 通过Composer进行下载,操作步骤下载软件 phpstudy --->点击软件管理 --->安装Composer --->再点击网站 --->点击管理 --->点击Composer --->复制如下命令代码: ​ 稳定版&…

甄选范文“论面向方面的编程技术及其应”,软考高级论文,系统架构设计师论文

论文真题 针对应用开发所面临的规模不断扩大、复杂度不断提升的问题,面向方面的编程(Aspect Oriented Programming,AOP)技术提供了一种有效的程序开发方法。为了理解和完成一个复杂的程序,通常要把程序进行功能划分和封装。一般系统中的某些通用功能,如安全性、持续性、日…

构建高效Node.js中间层:探索请求合并转发的艺术

🎉 博客主页:【剑九 六千里-CSDN博客】 🎨 上一篇文章:【CSS盒模型:掌握网页布局的核心】 🎠 系列专栏:【面试题-八股系列】 💖 感谢大家点赞👍收藏⭐评论✍ 引言&#x…

Java-Stream流

流 不同的数据有不同的方式得到其stream 单列集合&#xff1a;使用Collection中的默认方法&#xff1a;default Stream<E> stream双列集合&#xff1a;没有直接获取stream的方法&#xff0c;只能把他转化为单列集合数组&#xff1a;Arrays中的静态方法&#xff1a;publ…

SpringCloud的认识和初步搭建

目录 一.认识SpringCloud 二.SpringCloud的部署 2.1开发环境 2.2数据库的建立 2.3SpringCloud的部署 第一步&#xff1a; 创建Maven项目 第二步&#xff1a;完善pom文件 第三步&#xff1a;创建两个子项目 第四步&#xff1a;声明项目依赖以及构建插件 第五步&#xf…

NVIDIA Container Toolkit 安装与配置帮助文档(Ubuntu,Docker)

NVIDIA Container Toolkit 安装与配置帮助文档(Ubuntu,Docker) 本文档详细介绍了在 Ubuntu Server 22.04 上使用 Docker 安装和配置 NVIDIA Container Toolkit 的过程。 概述 NVIDIA 容器工具包使用户能够构建和运行 GPU 加速容器。即可以在容器中使用NVIDIA显卡。 架构图如…