图像生成(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 详细讲解!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探究大语言模型(LLM)漏洞和安全优秀实践

你可能已听说过LLM强势亮相,至少ChatGPT就是代表。 大语言模型(LLM)指语言处理模型。这类模型经过训练,可以执行各种各样的语言任务:翻译、文本生成和问题回答等。 有几个LLM家族和架构,最著名的是GPT(生成式预训练Transformer)…

Grafana :利用Explore方式实现多条件查询

背景 日志统一推送到Grafana上管理。所以,有了在Grafana上进行日志搜索的需求,而进行日志搜索通常需要多条件组合。 解决方案 通过Grafana的Explore的方式实现多条件查询。 直接看操作步骤: 在主页搜索框中输入“Explore” 进入这个界面…

python—日期相差多少天(PythonTip)

[题目描述] 编写一个程序,计算两个日期之间的天数。 导入datetime模块。定义函数calculate_days_between()数,其中有两个参数:(date1, date2),类型为字符串,格式为YYYY-MM-DD。在函数内,将字符串转换为date…

全面战争模拟器免费下载地址,纯分享

全面战争模拟器以其独特的物理引擎和搞笑的战斗场面吸引了大量玩家,并在游戏社区中赢得了极高的评价。它不仅提供了丰富的策略性玩法,还通过滑稽的视觉效果和搞笑的战斗带来了极大的娱乐性。游戏的沙盒模式和自定义功能更是让玩家能够充分发挥创意&#…

磁盘的作业

1、新添加一块硬盘,大小为5g,给这块硬盘分一个mbr格式的主分区(大小为3g),给此主分区创建ext2的文件系统,挂载到/guazai1目录,并写入文件内容为"this is fist disk"文件名为1.txt的文件。 [rootwyk ~]# fdis…

02线性表 - 链表

这里是只讲干货不讲废话的炽念,这个系列的文章是为了我自己以后复习数据结构而写,所以可能会用一种我自己能够听懂的方式来描述,不会像书本上那么枯燥和无聊,且全系列的代码均是可运行的代码,关键地方会给出注释^_^ 全…

【时时三省】(C语言基础)函数和数组

山不在高,有仙则名。水不在深,有龙则灵。 ——csdn时时三省 函数 跟数学里面的函数很相似 数组 一组相同类型的元素的集合 比如把5个整形1-5存起来 int arr[10]={1,2,3&#x…

逻辑门的题目怎么做?

FPGA语法练习——二输入逻辑门,一起来听~~ FPGA语法练习——二输入逻辑门 题目介绍:F学社-全球FPGA技术提升平台 (zzfpga.com)

高功能自闭症:挑战与潜能并存

高功能自闭症是一种复杂的神经发育障碍,其患者通常在认知、语言和行为方面存在发育障碍,但保持相对正常的社交互动和自理能力。这种疾病由大脑神经发育异常引起,涉及神经递质、脑结构和功能连接等多个方面,导致信息处理和整合困难…

WebRTC音视频-前言介绍

目录 效果预期 1:WebRTC相关简介 1.1:WebRTC和RTC 1.2:WebRTC前景和应用 2:WebRTC通话原理 2.1:媒体协商 2.2:网络协商 2.3:信令服务器 效果预期 1:WebRTC相关简介 1.1&…

SpringCloud的认识和初步搭建

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

Docker核心技术:容器技术要解决哪些问题

云原生学习路线导航页(持续更新中) 本文是 Docker核心技术 系列文章:容器技术要解决哪些问题,其他文章快捷链接如下: 应用架构演进容器技术要解决哪些问题(本文)Docker的基本使用Docker是如何实…

Ubuntu20.04从零开搭PX4MavrosGazebo环境并测试

仅仅是个人搭建记录 参考链接: https://zhuanlan.zhihu.com/p/686439920 仿真平台基础配置(对应PX4 1.13版) 语雀 mkdir -p ~/tzb/catkin_ws/src mkdir -p ~/tzb/catkin_ws/scripts cd catkin_ws && catkin init catkin build cd…

RV1103使用rtsp和opencv推流视频到网页端

参考: Luckfox-Pico/Luckfox-Pico-RV1103/Luckfox-Pico-pinout/CSI-Camera Luckfox-Pico/RKMPI-example Luckfox-Pico/RKMPI-example 下载源码 其中源码位置:https://github.com/luckfox-eng29/luckfox_pico_rtsp_opencv 使用git clone由于项目比较大&am…

共享模型之无锁

一、问题提出 1.1 需求描述 有如下的需求,需要保证 account.withdraw() 取款方法的线程安全,代码如下: interface Account {// 获取余额Integer getBalance();// 取款void withdraw(Integer amount);/*** 方法内会启动 1000 个线程&#xf…

纯净IP代理网站解析与代理推荐

一、纯净IP代理网站解析 在浩瀚的代理服务市场中,纯净IP代理以其特有的优势脱颖而出。它们不仅提供高质量、无污染的IP资源,还注重服务的稳定性和安全性,确保用户在使用过程中能够享受到好的网络体验。纯净IP代理的优势在于其能够有效解决因…

科技论文在线--适合练习期刊写作和快速发表科技成果论文投稿网站

中国科技论文在线这个平台可以作为练手的一个渠道,至少可以锻炼一下中文写作,或者写一些科研方向的简单综述性文章。当然,如果你的老师期末要求也是交一份科技论文在线的刊载证明的话,这篇文章可以给你提供一些经验。 中国科技论…

【引领未来智造新纪元:量化机器人的革命性应用】

在日新月异的科技浪潮中,量化机器人正以其超凡的智慧与精准的操作,悄然改变着各行各业的生产面貌,成为推动产业升级、提升竞争力的关键力量。今天,让我们一同探索量化机器人在不同领域的广泛应用价值,见证它如何以科技…

皇后游戏1

先把这个推导看完 现在我们来讲一下总结 首先,我们要观察到 c i c_i ci​递增,这样才能更简单,就不用像国王游戏那样在交换前后比较 i i i和 j j j的max了(就是说,国王游戏需要比较 m a x ( c i , c j ) max(c_i,c_j)…

获取本地时间(Linux下,C语言)

一、函数 #include <time.h> time_t time(time_t *tloc);函数功能&#xff1a;获取本机时间&#xff08;以秒数存储&#xff0c;从1970年1月1日0:0:0开始到现在&#xff09;。返回值&#xff1a;获得的秒数&#xff0c;如果形参非空&#xff0c;返回值也可以通过传址调用…