文生图中从扩散模子到流匹配的演变:从SDXL到Stable Diffusion3(含Flow Mat ...

打印 上一主题 下一主题

主题 951|帖子 951|积分 2853

前言

在此之前,本博客内已经先容了扩散模子、SD等相关的原理及其对应的详细推导
很明显,OpenAI的首个视频天生模子sora极大程度的提高了各人对文生图、文生视频的热情,也极大的扩展了各人对AIGC的想象力,于是有了此文
厥后,在写此文《π0——用于通用呆板人控制的流匹配VLA模子:一套框架控制7种机械臂(基于PaliGemma和ACT的3B模子)》的过程中,再次留意到了流匹配,故在本文最后增加了:第五部分 流匹配Flow Matching与修正流Rectified Flow

第一部分(选读) 一致性模子Consistency Model

注,本文第一部分最早写在23年11月份的这篇文章里《AI绘画神器DALLE 3的解码器:一步天生的扩散模子之Consistency Models》,后因与本文要先容的LCM关系密切,且也是文生图比力新的进展,故移到本文
1.1 什么是Consistency Models

1.1.1 Consistency Models的配景

关于我为何关注到这个一致性模子,说来话长啊,历程如下

  • 我司LLM项目团队于23年11月份在给一些B端客户做文生图的应用时,对比了各种同类工具,发现DALLE 3确实强,加之也要在论文100课上讲DALLE三代的三篇论文,故此文的2.3节中重点写了下DALLE 3的训练细节:AI绘画原明白析:从CLIP、BLIP到DALLE、DALLE 2、DALLE 3、Stable Diffusion
  • 在精读DALLE 3的论文时,发现其解码器用到了Consistency Models

    固然,厥后OpenAI首届开发者大会还正式发布了这个模子,让我对它越发好奇
  • Consistency Models的第一作者宋飏也证实了该模子是DALLE 3的解码器

    宋飏不算扩散圈的新人,由于早在2019年,斯坦福一在读博士宋飏和其导师通过此文《Generative Modeling by Estimating Gradients of the Data Distribution》提出了一种新方法来构建天生模子:即不需要估计数据的概率分布(数据概率的分布类似高维曲面),相反,它估计的是分布的梯度(分布的梯度可以看成是高维曲面的斜率)
  • 至此,已确定必须得研究下这个「AI绘画神器DALLE 3的解码器:一步天生的扩散模子之Consistency Models」了
1.1.2 什么是Consistency Models:何以颠覆原来的扩散模子

根据本博客内之前的文章可知,扩散模子广泛应用于DALLE、stable diffusion等文生图的模子中,但不绝以来扩散模子的一个缺点就是采样速率较慢,通常需要100-1000的评估步调才气抽取一个不错的样本
23年5月,OpenAI的Yang Song、Prafulla Dhariwal、Mark Chen、Ilya Sutskever等人提出了Consistency Models(GitHub地址),相比扩散模子,其使用1个步调就能获得不错的样本,团体服从至少提升100倍同时也极大地低落了算力本钱,其中一作是华人宋飏(其本毕清华,博毕斯坦福)

  • 其在连续时间扩散模子的概率流(PF)常微分方程(ODE)的底子上,其轨迹平滑过渡,将数据分布转化为可处理的噪声分布
  • 通过该一致性模子模子,可将任何时间步长的任何点映射到轨迹的出发点
    比如给定一个可将“数据”转换为“噪声”概率流(PF) ODE,可将ODE轨迹上的任何点「例如,下图中的
    ),映射到它的原点(例如,天生建模的
    )
    」。这些映射的模子被称为一致性模子,由于它们的输出被训练为在同一轨迹上的点(有着一致性)
    Given a Probability Flow (PF) ODE that smoothlyconverts data to noise, we learn to map any point (e.g., xt,xt1 , and xT ) on the ODE trajectory to its origin (e.g., x0)for generative modeling. Models of these mappings arecalled consistency models, as their outputs are trained to beconsistent for points on the same trajectory

相比扩散模子,它重要有两大上风:

  • 其一,无需对抗训练(adversarial training),就能直接天生高质量的图像样本
  • 其二,相比扩散模子可能需要几百乃至上千次迭代,一致性模子只需要一两步就能搞定多种图像任务——包括上色、去噪、超分等,都可以在几步之内搞定,而不需要对这些任务举行明白训练(固然,假如举行少样本学习的话,天生结果也会更好)
    原理上,一致性模子直接把随机的噪声映射到复杂图像上,输出都是同一轨迹上的同一点,以是实现了一步天生
1.1.3 Consistency Models的两种训练方法

一致性模子有两种训练方法

  • 一种是通过蒸馏预训练扩散模子举行训练(Consistency models canbe trained either by distilling pretrained diffusion models)
    即先使用数值ODE求解器和预训练的扩散模子来天生PF ODE轨迹上的相邻点对(The first methodrelies on using numerical ODE solvers and a pre-trained diffusion model to generate pairs of adjacent points on a PF ODE trajectory)
    之后通过最小化这些相邻点对的之间的差别,我们可以有效地将扩散模子提炼为一致性模子(这允许通过一次网络评估天生高质量的样本)
    By minimizing the difference between model outputs for these pairs, we can effectively distill a diffusion model into a consistency model, which allows generating high-quality samples with one network evaluation
  • 别的一种,也可以完全作为独立的天生模子举行训练
    该方法完全消除了对预训练扩散模子的需要,允许我们单独训练一致性模子。这种方法将一致性模子定位为一个独立的天生模子家族
紧张的是,这两种方法都不需要对抗性训练,并且它们都对架构施加了较小的约束,允许使用灵活的神经网络对一致性模子举行参数化
实验结果表明,一致性模子在一步和少步采样方面优于现有的蒸馏技术,如渐进式蒸馏,且当作为独立的天生模子举行训练时,一致性模子可以与现有的一步非对抗天生模子在尺度基准测试汇总媲美,如CIFAR-10、ImageNet 64×64和LSUN 256×256
2.1 Consistency Models的推导

2.1.1 对扩散模子推导的回顾

起首回顾一下diffusion的算法原理

  • 假设我们有数据分布 
     , 扩散模子通过如下的随机微分方程(SDE)对数据分布举行
    Let pdata(x) denote the data distribution. Diffusion models start by diffusing pdata(x) with a stochastic differential equation (SDE)



    其中,
    是一个固定的常数,
    是漂移系数,
    是扩散系数,
    是维纳过程的增量
  • 为了通过该式得到一个常微分方程(ODE),需要消除随机项
    ,在某些扩散模子中,比如Score-Based Generative Models,可以使用概率密度函数
    来取代漂移项,进而定义一个无随机项的轨迹,称为ODE轨迹
  • 一致性模子的作者宋飏等人推导出,上述 SDE 存在一个ODE形式的解轨迹(ODE trajectory)



    其中
    是 
    的得分函数,而这个得分函数是diffusion model 的直接大概间接学习目的
  • 采用 EDM 中的 setting,设置
    ,训练一个得分模子


    可将上述 ODE 转为

  • 得到 ode 的详细形式后,使用现有的数值 ODE solver,如 Euler, Heun, Lms 等,即可解出 x(.)
    固然,思量到数值精确性,我们往往不会直接求出原图即
     ,而是计算出一个
    ,持续这个过程来求出

// 待更
2.2.2 Consistency Models 的推导与源码解读


// 待更


第二部分 Latent Consistency Models(LCM)

2.1 LCM与通用加速器LCM-LoRA

受到上文的Consistency Models的启发「其采用了一种一致性映射技术,巧妙地将平常微分方程(ODE)轨迹上的点映射到它们的劈头,从而实现了快速的一步天生」,清华大学交错信息研究院一团队(包括骆思勉和谭亦钦等人)于2023年11月推出Latent Consistency Models(潜一致性模子,简称LCM)
其通过将引导的逆扩散过程视为增广概率流ODE(PF-ODE)的解决方案,LCMs能够熟练地预测潜伏空间中这些ODE的解(By viewing the guided reverse diffusion process as the resolution of an augmented Probability Flow ODE (PF-ODE), LCMs adeptly predict the solution of such ODEs in latent space),该方法显著减少了迭代步调的需求

  • LCMs是从预训练的潜伏扩散模子(LDMs)中提炼出来的(其paper:https://huggingface.co/papers/2311.05556、其项目主页:https://latent-consistency-models.github.io/),仅需要约32个A100 GPU训练小时
  • 且思量到对于专门的数据集,如动漫、照片逼真或幻想图像,还得使用潜伏一致性微调LCF对LCM举行微调(或使用潜伏一致性蒸馏LCD将预训练的LDM蒸馏为LCM),故为避免这种额外的步调拦阻LCMs在差别数据集上的快速部署,该团队还提出了LCM-LoRA

    使得可以在自定义数据集上实现快速、无需训练的推理,比如可以直接将该LoRA(即通过LCM蒸馏获得的LoRA参数)插入各种稳定扩散模子中,包括SD-V1.5(Rombach等,2022年),SSD-1B(Segmind,2023年)和SDXL(Podell等,2023年)等

和需要多步迭代传统的扩散模子(如Stable Diffusion)差别,LCM仅用1 - 4步即可达到传统模子30步左右的结果,LCM将文生图天生速率提升了5-10倍,世界自此迈入及时天生式AI的期间

2.2 LCM-LORA

潜伏一致性模子LCM使用一阶引导蒸馏方法举行训练,使用预训练自编码器的潜伏空间将引导扩散模子蒸馏成LCM。该过程涉及解决增强概率活动ODE(PF-ODE,确保天生的样本遵照导致高质量图像的轨迹),以下是LCD的伪代码

由于潜伏一致性模子LCM的蒸馏过程是在预训练扩散模子的参数之上举行的,我们可以将潜伏一致性蒸馏视为扩散模子的微调过程。因此,能够使用LoRA
LoRA通过应用低秩分解来更新预训练的权重矩阵

  • 给定一个权重矩阵
    ,更新表示为
    ,其中
    ,且秩

  • 在训练过程中,
    保持不变,只对A和B应用梯度更新,对于输入
    ,修改后的前向传播过程为

在这个方程中,
代表输出向量,
的输出在乘以输入
后相加。 通过将完整的参数矩阵分解为两个低秩矩阵的乘积,LoRA显著减少了可训练参数的数量,从而低落了内存使用量

2.3 LCM与其他类似项目的对比

模子名称
先容
天生速率
训练难度
SD生态兼容性
DeepFloyd IF
高质量、可天生文字,但架构复杂
更慢
更慢
不兼容
Kandinsky 2.2
比SDXL发布更早且质量同样高;兼容ControlNet
类似
类似
不兼容模子和LoRA,兼容ControlNet等部分插件
Wuerstchen V2
质量和SDXL类似
2x - 2.5x
更轻易
不兼容
SSD-1B
由Segmind蒸馏自SDXL,质量略微下降
1.6x
更轻易
部分兼容
PixArt-α
华为和高校相助研发,高质量
类似
SD1.5十分之一
兼容ControlNet等部分插件
LCM (SDXL, SD1.5)
训练自DreamShaper、SDXL,高质量、速率快
5x -10x
更轻易
部分兼容
LCM-LoRA
体积小易用,插入即加速;捐躯部分质量
5x -10x
更轻易
兼容全部SD大模子、LoRA、ControlNet,大量插件
停止至2023/11/22,已支持LCM的开源项目:


  • Stable Diffusion发行版,包括WebUI(原生支持LCM-LoRA,LCM插件支持LCM-SDXL)、ComfyUI、Fooocus(LCM-LoRA)、DrawThings
  • 小模子:LCM-LoRA兼容其他LoRA,ControlNet
  • AnimateDiff WebUI插件

第三部分 从Stable Diffusion XL Turbo到SDXL-Lightning

3.1 SDXL Turbo:给定prompt 及时相应成图

Stability AI 推出了新一代图像合成模子 Stable Diffusion XL Turbo(其论文地址),使得只用在文本框中输入你的想法,SDXL Turbo 就能够迅速相应,天生对应内容。一边输入,一边天生,内容增加、减少,丝绝不影响它的速率
   

  还可以根据已有的图像,更加精致地完成创作。手中只需要拿一张白纸,告诉 SDXL Turbo 你想要一只白猫,字还没打完,小白猫就已经在你的手中了

SDXL Turbo 模子的速率达到了近乎「及时」的程度,于是有人直接连着游戏,获得了 2fps 的风格迁移画面:

据官方博客先容,在 A100 上,SDXL Turbo 可在 207 毫秒内天生 512x512 图像(即时编码 + 单个去噪步调 + 解码,fp16),其中单个 UNet 前向评估占用了 67 毫秒,云云,我们可以判断,文生图已经进入「及时」期间
3.2 SDXL关键技术:对抗扩散蒸馏

3.2.1 两个训练目的:对抗丧失和蒸馏丧失

在SDXL之前

  • 一致性模子(Consistency Models)通过对ODE轨迹施加一致性正则化(by enforcing a consistency regularization on the ODE trajector)来解决即便迭代采样步调减少到4-8步,依然能保持较好的性能,且在少样本设置下展示了强大的像素模子性能
  • 而LCMs专注于在提炼潜伏扩散模子并在4个采样步调中便取得了不错的结果
  • 包括LCM-LoRA则引入了一种低秩适应[22]训练方法,以高效学习LCM模块,可以插入到SD和SDXL [50, 54]的差别查抄点中(LCMs focus on distilling latent diffusion models and achieve impressive performance at 4 sampling steps. Recently, LCM-LoRA [40] introduced a low-rank adaptation [22] training for efficiently learning LCM modules, which can be plugged into different checkpoints for SD and SDXL [50, 54]
  • InstaFlow [36]提出使用修正流[35]来促进更好的蒸馏过程(InstaFlow [36]propose to use Rectified Flows [35] to facilitate a better distillation proces)
但以上这些方法都有共同的缺陷:在4个步调中合成的样本通常看起来含糊,并且存在明显的伪影
思量到GANs也可以作为独立的单步模子举行文本到图像合成的训练 [25,59],且采样速率不错,固然,性能落伍于基于扩散的模子。那何不在不破坏平衡的情况下,扩展GAN并整合神经网络架构呢?


  • 而SDXL则引入了一种名为对抗扩散蒸馏(Adversarial Diffusion Distillation,ADD)的技术,可以在仅1-4步内高效采样大规模底子图像扩散模子,并保持高图像质量(a novel training approach that efficiently samples large-scale foundational image diffusion models in just 1–4 steps while maintaining high image quality)
  • 其使用得分蒸馏来使用大规模现成的图像扩散模子作为教师信号,结合对抗性丧失,以确保即使在一到两个采样步调内也能保持高图像保真度(We use score distillation to leverage large-scale off-the-shelf image diffusion models as a teacher signal in combination with an adversarial loss to ensure high image fidelity even in the low-step regime of one or two sampling steps)
详细而言,研究者引入了两个训练目的的组合:


  • 对抗丧失,对抗丧失迫使模子在每次前向传递时直接天生位于真实图像流形上的样本,避免了其他蒸馏方法中常见的含糊和其他伪影
  • 分数蒸馏采样SDS 相对应的蒸馏丧失,蒸馏丧失使用另一个预训练(且固定)的扩散模子作为教师(比如可以使用预训练的扩散模子权重初始化模子),有效使用预训练diffusion model的丰富知识,从而显著改善对抗性丧失的训练,类似通过CLIP改善文本对齐
    最后,不使用仅解码器的架构来举行GAN训练,而是采用尺度的扩散模子框架
3.2.2 训练的详细过程

ADD-student从预训练的UNet-DM中初始化权重
,具有可训练权重
的辨别器,以及具有冻结权重
的DM teacher(The ADD-student is initialized from a pretrained UNet-DM with weights θ, a discriminator with trainable weights ϕ, and a DM teacher with frozen weights ψ)

在训练过程中

  • ADD-student从噪声数据
    天生样本
    。 噪声数据点是通过正向扩散过程从真实图像数据集
    天生的
    。 在我们的实验中,我们使用与门生DM相同的系数
    ,并从选择的门生时间步长聚集
    中均匀采样
  • 天生的样本
    和真实图像
    被传递给辨别器Discriminator,辨别器的目的是区分它们
  • 为了从DM teacher那里获得知识,我们将门生样本
    通过教师的前向过程扩散到
    (we diffuse student samples ˆxθ with the teacher’s forward process toˆxθ,t),并使用教师的去噪预测
    作为蒸馏丧失的重建目的
    (use the teacher’s denoising prediction ˆxψ (ˆxθ,t, t)as a reconstruction target for the distillation loss Ldistill)

    因此,总体目的是

// 待更
3.3 SDXL-Lightning

// 待更

第四部分 SD最新版Stable Diffusion3

思量到stable diffusion的原理在此文《AI绘画原明白析:从CLIP、BLIP到DALLE、DALLE 2、DALLE 3、Stable Diffusion》中已经讲的很清晰了,故本文重要讲下最新版本的SD3(其对应的paper为《Scaling Rectified Flow Transformers for High-Resolution Image Synthesis》)
由于固定的文本表示直接输入模子并不抱负(e.g., via cross-attention (Vaswani et al.,2017; Rombach et al., 2022))

  • 起首,24年5月份提出的SD3相比之前的SD一个最大的变化是采用Rectified Flow来作为天生模子,Rectified Flow在Flow Straight and Fast: Learning to Generate and Transfer Data with Rectified Flow被起首提出

    但其实也有同期的工作比如Flow Matching for Generative Modeling提出了类似的想法
  • 其次,Stability AI在U-ViT、DiT(这两架构的先容见此文的第2.3节)的底子上并提出了一种新的架构,该架构包含可学习的streams,用于图像和文本token,从而实现了它们之间的双向信息活动(which enables a two-way flow of information between them)
4.1 流匹配Flow Matching:提高采样器性能(含Rectified Flow的详解)

请参见下文的第五部分
4.2 模子结构:

对于文本条件下的图像采样,模子必须同时思量文本和图像两种模态

  • 类似LDM (Rombach et al., 2022),用于在预训练自编码器的潜空间中训练文本到图像模子。类似于将图像编码为潜空间表示,我们还遵照之前的方法(Saharia et al., 2022b; Balaji et al., 2022),使用预训练的冻结文本模子对文本条件c 举行编码
    Our general setup follows LDM (Rombach et al., 2022) for training text-to-image models in the latent space of a pretrained autoencoder. Similar to the encoding of images to
    latent representations, we also follow previous approaches (Saharia et al., 2022b; Balaji et al., 2022) and encode the text conditioning c using pretrained, frozen text models. Details can be found in Appendix B.2

  • DiT仅思量类条件图像天生,并使用调制机制将网络与扩散过程的时间步长和类标签相关联(DiT only considers class conditional image generation and uses a modulation mechanism to condition the network on both the timestep of the diffusion process and the class label)

      类似地,我们使用时间步长
     和 
    的嵌入作为调制机制的输入。 然而,由于汇集的文本表示仅生存关于文本输入的粗粒度信息(Podell等人,2023),网络还需要来自序列表示的信

    Similarly, we use embeddings of the timestep t and cvec as inputs to the modulation mechanism. However, as the pooled text representation retains only coarse-grained infor- mation about the text input (Podell et al., 2023), the network also requires information from the sequence representation cctxt.

      因此,我们构建一个由文本和图像输入的嵌入组成的序列。详细而言,我们将“位置编码宁静坦化的 2 × 2像素表示的patch编码
     ”添加到长度为
    的patch编码序列中
    We construct a sequence consisting of embeddings of the text and image inputs. Specifically, we add positional encodings and flatten 2 × 2 patches of the latent pixel rep-resentation x∈ Rh×w×c to a patch encoding sequence of length 1 2 · h · 12 · w.

    在将此patch编码和文本编码
    嵌入到相同的维度之后,连接这两个序列
    After embedding this patch encoding and the text encoding cctxt to a common dimensionality concatenate the two sequences
4.3.1 借鉴DALLE 3的重字幕技术:提高文本-图像数据集的质量

由于DALLE 3已经证实了人类对图像本身的标题或描述通常忽略图片的许多细节(包括图中的配景、特定的场景、出现的文字等),而假如用视觉语言模子为图像数据集打上更详细的表明,则可以更好的训练text2image模子 
故,SD3使用视觉语言模子CogVLM为他们的图像数据集创建合成的表明(synthetic annotations),不过思量到合成标题可能导致文本到图像模子忘记VLM知识语料库中不存在的某些概念,故他们使用50%的原始标题和50%的合成标题(且做了实验,证实这种一半原始标题 一半合成标题的结果确实明显好于100%都是原始标题的情况)
4.3.2 在DiT的底子上,提出MM-DiT

遵照DiT并应用一系列调制留意力和MLP(We then follow DiT and apply a sequence of modulated attention and MLPs)



  • 对于 MM-DiT,如上图左侧a所示,我们比力具有两组权重和三组权重的模子,其中后者分别处理CLIP、T5 token
    请留意,DiT(使用文本和图像标记的串联)可以被表明为MM-DiT的一个特例,其中只有一个所有模态共享的权重集
  • 由于文本和图像嵌入在概念上非常差别,SD3为两种模态使用两套独立的权重,如上图右侧b所示,这相当于为每种模态拥有两个独立的transformer,但在留意力操作中连接两种模态的序列,以便两种表示可以在各自的空间中工作,同时思量另一种表示
    Since text and image embeddings are conceptually quite different, we use two separate sets of weights for the two modalities. As shown in Figure 2b, this is equivalent to having two independent transformers for each modality, but joining the sequences of the two modalities for the attention operation, such that both representations can work in their own space yet take the other one into account
// 待更


第五部分 流匹配Flow Matching与修正流Rectified Flow

5.1 流匹配Flow Matching

5.1.1 配景知识:从Normalizing Flows(NFs)到Continuous Normalizing Flows(CNFs)

根据此文的先容,可知
// 待更
5.1.2 流匹配的推导:FM其实是可以看成扩散模子

随着Stable Diffusion 3的发布,Flow Matching技术渐渐进入公众视野,成为了学术界和工业界关注的焦点,Flow Matching对应的论文为《Flow Matching for Generative Modeling》
Flow Matching是创建在continuous normalizing flows的底子上,这里将天生模子定义为一个常微分方程(ODE)


  • 这里t∈[0,1],而
    称之为向量场(vector field)
    云云,可以用这样的一个ODE来构建一个概率路径(probability path)
    ,它可以实现从一个噪音分布
    到别的一个数据分布
    的变化(可以称之为a flow
    ps,留意这里在时间上是和FM论文中的定义是相反的,重要是为了和扩散模子统一起来
  • 这里的噪音分布采用高斯噪音,即
    ,而
    是要建模的数据分布

    一旦知道了
    ,就可以用ODE的求解器比如欧拉方法(Euler method)实现从一个噪音到真实数据的天生
接下来,可以用一个参数为θ的神经网络
来建模向量场
,FM的优化目的为:

这里的
是目的向量场
,它可以产生噪音分布
到真实数据分布
的概率路径
。以是其实FM的优化目的就是直接回归目的向量场
   究竟上,有许多的概率路径可以满足
,但是假如没有任何先验,
是不可知的,FM的优化目的也就无法实现
  
  一个解决思路是先预先构建一个目的向量场
,并让它能够包管我们的目的概率路径

  为此,FM论文中引入了条件概率路径
,这里的条件是真实数据
,这个条件概率采用如下的高斯分布:


  • 这个高斯分布的均值为
    ,而方差为
    ,这里的
    都是和
    有关的函数,并且是可导的
  • 同时,当
     要满足
    ,
    ,这样

    而当
    要满足
    ,
    ,这样


    这样,这里定义的条件概率路径
    能够包管噪音分布
    到真实数据分布
    的变化。 仔细的你可能会发现
    和扩散模子的扩散过程有相同的形式
其实,引入条件概率路径,就是相当于定义了一个前向过程:

   很快,我们也会看到FM其实是可以看成扩散模子,只是采用了不一样的优化目的(等价于采用差别的loss权重)
  5.1.3 条件流匹配CFM:等价于流匹配FM的优化目的

接下来,来看一个新的优化目的,那就是Conditional Flow Matching (CFM)目的:

这里的条件向量场
产生条件概率路径

其实,对于CM目的和CFM目的,一个很紧张的结论是两者之间只相差一个与参数θ无关的常量,这也就意味着:

换句话说,使用CFM目的来训练θ是和采用CM目的来训练θ是等价的。为何云云呢,感兴趣的可以看FM论文中的证实

  • 一个直观的表明是,采用CFM目的来训练θ也是能够达到我们的目的,那就是从噪音分布
    到真实数据分布
    ,只不过人工设定了一个路径
    而已
  • 而且后面我们会看到差别的天生模子的差别除了优化目的之外就在于定义的路径(前向过程)的差别

    虽然
    是不可知的,但是引入条件后的
    是可以计算出来的:

  • 进一步根据前向过程有:
    根据
    一计算,便可得到
    」,将其代入上式,可以得到


    再定义信噪比
    ,进而有
    ,以是有:

  • 将上式代入CFM目的
    中,就可以得到:


    这里对
    进一步定义为:


    代入CFM优化目的可得到:

此时相当于神经网络酿成了预测噪音,这和扩散模子DDPM预测噪音是一样的「
,此优化公式来自此文《图像天生发展劈头:从VAE、VQ-VAE、扩散模子DDPM、DETR到ViT、Swin transformer》2.3节的最后
」,但是优化目的的多了一个和
有关的权重系数
以是,FM其实可以看成一个采用差别的权重系数的扩散模子
   据此文的先容,Google的这篇论文《Understanding Diffusion Objectives as the ELBO with Simple Data Augmentation》提出了一个统一的视角,即差别的天生模子包括DDPM,SDE,EDM以及FM等的优化目的都可以统一为:
  

  差别的天生模子所采用的优化目的差别,等价于采用差别的权重

  

  • 对于DDPM所采用的
    ,这里

  • 而对于FM的
    ,有

  更详细地说,差别类型的天生模子差别在于前向过程和预测目的的差别
  

  • 差别的前向过程采用差别
    ,导致差别的概率路径
  • 而预测目的可以为预测噪音ϵ(DDPM),预测分数s(SDE),以及预测向量场v(FM)等等,但是它们都可以终极统一为基于预测噪音ϵ的优化目的,只是权重
    的差别
  5.2 Rectified Flow:从图像分布X1/x0走直线到噪声分布X0/


5.2.1 通过示意图对比:ϵ-prediction、v-prediciton与rectified flow

关于修正流Rectified Flow有两篇最紧张的论文

  • [Submitted on 7 Sep 2022]
    Flow Straight and Fast: Learning to Generate and Transfer Data with Rectified Flow
    作者:Xingchao Liu, Chengyue Gong, Qiang Liu
  • [Submitted on 29 Sep 2022]
    Rectified Flow: A Marginal Preserving Approach to Optimal Transport
    作者:Qiang Liu
但为了普通期间,先总结一下比力popular的sampler方案

  • ϵ-prediction 噪声预测型,直接预测在每个时间步添加的噪声,属于DDPM类型
    简单来说,DDPM加噪过程


    而DDPM去噪过程,学习的就是对噪声的估计


    总之,云云文所说,这种可以称作 ϵ-prediction的方法。ϵ-prediction就是数据从一些真实样本,通过添加高斯噪声天生的潜伏空间中渐渐变得含糊,终极到达纯噪声的状态

    其实,云云文《stable diffusion加噪去噪的直观表明&Rectified Flow》所说,sd或DDPM一趟一趟的加噪和去噪,可以明白为空间的映射,从一个空间映射到另一个空间。假如说能从图像空间到噪声空间创建好映射关系,那就能天生一个噪声-->映射出一个图像
    1)sd就是这么做的,不过多了几步,sd认为这个映射一趟完不成,多弄了几趟,这样模子好训练,如下图所示「先在二维空间上思量,最上边是图像空间X0,坐标原点是高斯噪声空间Xn

    可以看到,随着空间的映射变换,空间的分布形态是有变化的,从不规则的高维盛行的图像空间,渐渐变换到了高维圆形的高斯噪声空间

    那对于空间里详细的一个点,是怎么映射的呢?如下图所示,从右上角到左下角,还是加噪「这里的每一个点,其实就对应于图像空间的一张图,大概噪声空间的一组噪声

    看完了正向的映射过程,来看看反向去噪(从左下角到右上角)是怎么做的

    总之,反向的时候就是在去噪,就不是严格的从某个点映射到某个点了。而是从高斯噪声空间随机采样一个点,然后依次往回映射。假设模子已经训练好了,这时候其实靠的就是模子的泛化能力了。假如在高斯噪声空间,你采样了个红点附近的噪声,那么模子只能包管你映射回图像的时候也在红点附近

    更多,详见此文《图像天生发展劈头:从VAE、VQ-VAE、扩散模子DDPM、DETR到ViT、Swin transformer》
  • v-prediciton 速率预测型,重点在于预测数据如安在时间序列中演变,属于DDPM类型
    通过计算数据在潜伏空间中的“梯度”或“方向”预测下一步的数据分布,也可以看作是对数据分布的偏导数举行预测

    从加噪的过程看,干净图像和高斯噪声的权重平方是
    ,那么就可以用单位向量来明白干净图像和高斯噪声的关系。借助《Progressive Distillation for Fast Sampling of Diffusion Models》中的插图,y轴就是干净图像,x轴是高斯噪声,z就是


    可以这么明白DDPM加噪的物理意义,即:从干净图像开始,以一定的步长,混合一定比例的高斯噪声,直到最后完全酿成高斯噪声

    如上图所示,对角度求导就能得到
    。别的加上DDPM本身的加噪公式


    组合化简可以得到
    的映射关系


    v-prediction就是通过预测 
    来预测干净的图像。v的物理意思就是所加噪声变化的速率

    为了进一步明白v-prediction相比ϵ-prediction的区别,需要明白SNR(信噪比),SNR一般如下定义,套进DDPM的加噪过程
    ,就可以得到DDPM过程的信噪比


    当反向去噪的时候,开始的时候SNR很小,乃至为0,虽然后续t变得小的时候会修正到精确的预测轨道,但是初始的状态的噪声预测和信号基本上没有关系

    v-prediciton的loss如下「带入 
    可以等效转化为 
    和干净图像 
    的关系」:


    可以看到,上面loss最后得到的最前面系数不就是DDPM的SNR吗,v-prediction 的loss weight 刚比如DDPM的SNR多一个1,缓解 在去噪前期的信号弱问题

    实际上作者还尝试了如下形式的loss,同样也是避免SNR为0的情况。最后实验发现两种形式的loss都差不多



    总结下,v-prediction 可以看作 ϵ-prediction的一个变种,学习的是噪声变化的速率,训练相对稳定一些

    但v-prediction 方法的loss funciton 有什么问题呢?


    当t比力大的时候,信号比例小,前面的weight 比力小,但是后面的MSE比力大
    而当t比力小的时候,信号比例大,前面的weight 比力大,但是后面的MSE比力小

    对于多任务学习,这似乎得到了一种平衡,但是,t比力大的时候,多任务训练会更加难啊,以是理论上应该给予更大的关注,这点有许多针对难易样本的训练的paper都指出了。

    Min-SNR weighting用了一个非常简单的方法,设置一个超参数
    ,默认是5。对于比力简单的case(t比力小),权重最大为5,迫使网络不要关注简单case。而对于比力难的case,权重保持不变,以此让网络关注难样本

  • rectified flow 差别于前两者的DDPM类型,这种方法直接建模数据如何活动
    关注的是数据从初始分布变换到目的分布的路径,属于 flow matching型

    其意在解决两个分布的传输问题。如下图,有两个分布X0∼π0,X1∼π1

    映射T通过连续活动系统(也叫常微分方程ODE、流模子)来隐式定义

    对于X0,X1在图像/视频天生领域,
    就是高斯噪声,
    就是clean image大概clean video。ODE方法就想直接从
    传输到
    ,但是有个问题啊,
    的分布在测试的时候不知道啊

    以是ODE方法就想学一个速率v(留意区分v-prediction的v,不是一个v)直接学习从
    传输到
    ,非常的直接!

    其中
    就是一个线性插值的建模
    那么


    则丧失函数一下子就跃然纸上,如下:


    还可以对比下DDPM类型方法,此时
    就是高斯噪声
    就是clean image大概clean video
    ,从而有
    ,便是


    云云,就可以发现rectified flow到底和DDPM有什么接洽


    可以看到从插值的角度,DDPM建模的是相对比力复杂的曲线活动,而RF建模的就黑白常简单的直线活动

    最后再用两张图来普通易懂的表明下(来自此文),且其实,Rectified Flow方法和和蒸馏对比着看更轻易明白
    起首,SD的蒸馏如下图,假设一个SD已经训练好了,蒸馏是在这后面做:

    蒸馏就是拿出来你训好的X0和Xt,想让unet这个噪声天生器,一下子就天生从X0到Xt的噪声,然后一步去噪就成功天生图像了。留意必须是先把sd训好,你才气有这样的配对关系

    其次,Rectified Flow跟这个差不多,但是差一点,详细如图:

    Rectified flow就是:把那条蓝色箭头线,通过绿色箭头一点一点的拉着它,让它跟黑色线去靠近,靠的越近不就越直了嘛,假如说蓝色箭头组成的线叫一个流,那黑色线所对应的方法就叫整流或修正流——Rectified flow

    蓝色线对应到公式里,是
    , 拉着蓝色线所代表的图像分布
    /
    靠近黑色线所代表的噪声分布
    /
    的公式,是:


    留意,别忘了上面说过的「此时
    就是clean image大概clean video
    就是高斯噪声
    ,从而有
    ,便是

5.2.2 Rectified Flow的普通示例

别的,某乎上也有相关的朋友对此Rectified Flow举行解读,并举了相对比力普通的示例

  • 定义:一个分布π0转化成另一个分布π1的问题,详细π0和π1选择差别就可以是差别的问题,比如从噪声分布到真实图片分布,大概从某类图像分布到另一类图像的分布
    比如用两个差别的高斯混合模子来表示两个分布,并分别采样10000个样本点
    1. ```python
    2. import torch
    3. import numpy as np
    4. import torch.nn as nn
    5. from torch.distributions import Normal, Categorical
    6. from torch.distributions.multivariate_normal import MultivariateNormal
    7. from torch.distributions.mixture_same_family import MixtureSameFamily
    8. import matplotlib.pyplot as plt
    9. import torch.nn.functional as F
    10. # 定义常量D,代表维度
    11. D = 10.
    12. # 定义常量M,代表D+5
    13. M = D+5
    14. # 定义常量VAR,代表方差
    15. VAR = 0.3
    16. # 定义常量DOT_SIZE,代表点的大小
    17. DOT_SIZE = 4
    18. # 定义常量COMP,代表组件的数量
    19. COMP = 3
    20. # 初始化混合分布的类别概率
    21. initial_mix = Categorical(torch.tensor([1/COMP for i in range(COMP)]))
    22. # 初始化混合分布的组件,每个组件是一个二元正态分布
    23. initial_comp = MultivariateNormal(torch.tensor([[D * np.sqrt(3) / 2., D / 2.], [-D * np.sqrt(3) / 2., D / 2.], [0.0, - D * np.sqrt(3) / 2.]]).float(), VAR * torch.stack([torch.eye(2) for i in range(COMP)]))
    24. # 创建初始混合模型
    25. initial_model = MixtureSameFamily(initial_mix, initial_comp)
    26. # 从初始混合模型中采样10000个样本
    27. samples_0 = initial_model.sample([10000])
    28. # 定义目标混合分布的类别概率
    29. target_mix = Categorical(torch.tensor([1/COMP for i in range(COMP)]))
    30. # 定义目标混合分布的组件,每个组件是一个二元正态分布
    31. target_comp = MultivariateNormal(torch.tensor([[D * np.sqrt(3) / 2., - D / 2.], [-D * np.sqrt(3) / 2., - D / 2.], [0.0, D * np.sqrt(3) / 2.]]).float(), VAR * torch.stack([torch.eye(2) for i in range(COMP)]))
    32. # 创建目标混合模型
    33. target_model = MixtureSameFamily(target_mix, target_comp)
    34. # 从目标混合模型中采样10000个样本
    35. samples_1 = target_model.sample([10000])
    36. # 打印采样的形状
    37. print('Shape of the samples:', samples_0.shape, samples_1.shape)
    38. # 设置绘图的尺寸
    39. plt.figure(figsize=(4,4))
    40. plt.xlim(-M,M)
    41. plt.ylim(-M,M)
    42. plt.title(r'Samples from $\pi_0$ and $\pi_1$')
    43. plt.scatter(samples_0[:, 0].cpu().numpy(), samples_0[:, 1].cpu().numpy(), alpha=0.1, label=r'$\pi_0$')
    44. plt.scatter(samples_1[:, 0].cpu().numpy(), samples_1[:, 1].cpu().numpy(), alpha=0.1, label=r'$\pi_1$')
    45. plt.legend()
    46. # 自动调整子图参数,使之填充整个图像区域
    47. plt.tight_layout()
    48. ```
    复制代码
    代码如下(为了方便各人的明白,我特意给相关代码都添加了表明)
    上述代码中,有两个地方需要表明阐明下
    1) 初始化混合分布的组件(二元正态分布)的均值(mean)和协方差(covariance)矩阵
    均值(mean):

    协方差(covariance)矩阵(每个组件的协方差矩阵相同,都是VAR乘以单位矩阵):


    2) 目的混合分布的组件(二元正态分布)的均值(mean):

    均值

    协方差矩阵


    总之,实验上述程序后,可以得到

  • 基于上面两个分布的样本点,我们想要学习一个模子(映射关系),能够将π0上的点映射(活动)到π1,用常微分方程表示就是流模子(flow):


    两点之间直线最短,假如分布π0上的点通过两点之间的连线活动到π1,那不就很完美

    可以定义两个点之间的插值如下


    前面提到的flow就等价于“拉直的流模子(Rectified Flow)”


    也就是学习一个
    ,使得它尽可能靠近


  • 可以假设这个
    是一个三层的神经网络
    1. class MLP(nn.Module):
    2.     def __init__(self, input_dim=2, hidden_num=100):
    3.         super().__init__()
    4.         self.fc1 = nn.Linear(input_dim+1, hidden_num, bias=True)
    5.         self.fc2 = nn.Linear(hidden_num, hidden_num, bias=True)
    6.         self.fc3 = nn.Linear(hidden_num, input_dim, bias=True)
    7.         self.act = lambda x: torch.tanh(x)
    8.    
    9.     def forward(self, x_input, t):
    10.         inputs = torch.cat([x_input, t], dim=1)
    11.         x = self.fc1(inputs)
    12.         x = self.act(x)
    13.         x = self.fc2(x)
    14.         x = self.act(x)
    15.         x = self.fc3(x)
    16.         return x
    复制代码
    然后定义RectifiedFlow类,包含获得训练样本和从常微分方程采样

    再定义丧失函数
    1. def train_rectified_flow(rectified_flow, optimizer, pairs, batchsize, inner_iters):
    2.     """
    3.     训练RectifiedFlow模型的函数。
    4.     :param rectified_flow: RectifiedFlow类的实例,包含模型和采样步数。
    5.     :param optimizer: 用于优化模型参数的优化器。
    6.     :param pairs: 包含成对数据的集合,用于训练。
    7.     :param batchsize: 每次迭代的批量大小。
    8.     :param inner_iters: 内部迭代次数。
    9.     :return: 返回训练好的RectifiedFlow实例和损失曲线。
    10.     """
    11.     loss_curve = []  # 用于存储损失曲线的列表
    12.     for i in range(inner_iters + 1):  # 进行inner_iters + 1次迭代
    13.         optimizer.zero_grad()  # 清零梯度
    14.         indices = torch.randperm(len(pairs))[:batchsize]  # 随机选择一个批次的数据
    15.         batch = pairs[indices]  # 获取批次数据
    16.         z0 = batch[:, 0].detach().clone()  # 获取批次中的第一个状态并克隆
    17.         z1 = batch[:, 1].detach().clone()  # 获取批次中的第二个状态并克隆
    18.         z_t, t, target = rectified_flow.get_train_tuple(z0=z0, z1=z1)  # 获取训练元组
    19.         pred = rectified_flow.model(z_t, t)  # 使用模型预测状态变化
    20.         loss = (target - pred).view(pred.shape[0], -1).abs().pow(2).sum(dim=1)  # 计算损失
    21.         loss = loss.mean()  # 计算平均损失
    22.         loss.backward()  # 反向传播
    23.         optimizer.step()  # 更新模型参数
    24.         loss_curve.append(np.log(loss.item()))  # 存储损失曲线的对数值
    25.     return rectified_flow, loss_curve  # 返回训练好的RectifiedFlow实例和损失曲线
    复制代码
  • 1-Rectified Flow的训练样本对是随机从两个分布举行选取的
    1. x_0 = samples_0.detach().clone()[torch.randperm(len(samples_0))]
    2. x_1 = samples_1.detach().clone()[torch.randperm(len(samples_1))]
    3. x_pairs = torch.stack([x_0, x_1], dim=1)
    4. print(x_pairs.shape)
    复制代码
    训练后
    1. iterations = 10000
    2. batchsize = 2048
    3. input_dim = 2
    4. rectified_flow_1 = RectifiedFlow(model=MLP(input_dim, hidden_num=100), num_steps=100)
    5. optimizer = torch.optim.Adam(rectified_flow_1.model.parameters(), lr=5e-3)
    6. rectified_flow_1, loss_curve = train_rectified_flow(rectified_flow_1, optimizer, x_pairs, batchsize, iterations)
    7. plt.plot(np.linspace(0, iterations, iterations+1), loss_curve[:(iterations+1)])
    8. plt.title('Training Loss Curve')
    复制代码
    可以得到



    可以发现由于两个样本的点是随机选择来组成训练样本对的,可能导致从一个分布的点走到另一分布有点“走弯路”
  • 因此,2-Rectified Flow则是用1-Rectified Flow的模子的采样点来组成样本对
    1. z10 = samples_0.detach().clone()
    2. traj = rectified_flow_1.sample_ode(z0=z10.detach().clone(), N=100)
    3. z11 = traj[-1].detach().clone()
    4. z_pairs = torch.stack([z10, z11], dim=1)
    5. print(z_pairs.shape)
    复制代码
    同样再训练一下
    1. reflow_iterations = 50000
    2. rectified_flow_2 = RectifiedFlow(model=MLP(input_dim, hidden_num=100), num_steps=100)
    3. import copy
    4. rectified_flow_2.net = copy.deepcopy(rectified_flow_1) # we fine-tune the model from 1-Rectified Flow for faster training.
    5. optimizer = torch.optim.Adam(rectified_flow_2.model.parameters(), lr=5e-3)
    6. rectified_flow_2, loss_curve = train_rectified_flow(rectified_flow_2, optimizer, z_pairs, batchsize, reflow_iterations)
    7. plt.plot(np.linspace(0, reflow_iterations, reflow_iterations+1), loss_curve[:(reflow_iterations+1)])
    复制代码
    可以得到



    可以看到如今一个分布的点可以险些以“直线的方式”走到另一个分布

参考文献与推荐阅读


  •  图像天生发展劈头:从VAE、扩散模子DDPM、DETR到ViT、Swin transformer
  • AI绘画原明白析:从CLIP、BLIP到DALLE、DALLE 2、DALLE 3、Stable Diffusion
  • 几篇新闻稿
    4.13,OpenAI新天生模子开源炸场!比Diffusion更快更强,清华校友一作
    11.9,OpenAI上线新功能太强了,服务器瞬间被挤爆
    11.11,OpenAI救了Stable Diffusion!开源Dall·E3同款解码器,来自Ilya宋飏等
  • Consistency Models
    Yang Song, Prafulla Dhariwal, Mark Chen, Ilya Sutskever
  • 一步天生的扩散模子:Consistency Models
  • SDXL Turbo、LCM相继发布,AI画图进入及时天生期间:字打多快,出图就有多快
  • Stable Diffusion 3震撼发布,采用Sora同源技术,文字终于不乱码了
  • Scalable High-Resolution Pixel-Space Image Synthesis with Hourglass Diffusion Transformers,提出了HDiT
  • ..

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农妇山泉一亩田

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表