qidao123.com技术社区-IT企服评测·应用市场

标题: DiT(Diffusion Transformer)详解——AIGC期间的新宠儿 [打印本页]

作者: 尚未崩坏    时间: 2024-12-1 20:39
标题: DiT(Diffusion Transformer)详解——AIGC期间的新宠儿

扩散模型​相关知识点参考:小白也能读懂的AIGC扩散(Diffusion)模型系列解说

   
   
  
推荐阅读:
部分摘录于:https://zhuanlan.zhihu.com/p/684068402

论文

Scalable Diffusion Models with Transformers
定义

DiT是基于Transformer架构的扩散模型。用于各种图像(SD3、FLUX等)和视频(Sora等)视觉生成任务。
DiT证实了Transformer思想与扩散模型结合的有效性,并且还验证了Transformer架构在扩散模型上具备较强的Scaling能力,在稳步增大DiT模型参数目与加强数据质量时,DiT的生成性能稳步提升。
   此中最大的DiT-XL/2模型在ImageNet 256x256的种别条件生成上达到了当时的SOTA【最先进的(State Of The Art)】(FID为2.27)性能。同时在SD3和FLUX.1中也阐明了较强的Scaling能力。
  架构

DiT架构如下所示:

   图3.扩散Transformer(DiT)架构。左:我们训练条件潜在DiT模型。输入的潜在被分解成补丁和处置惩罚的几个DiT块。右图:DiT区块的详细信息。我们用标准Transformer块的变体进行了实验,这些块通过自适应层归一化交叉留意和**额外输入的令牌(上下文环境)**来进行调节。自适应层规范结果最好
  
   下文将按照这个架构进行论述,从左到右。
  与传统(U-Net)扩散模型区别

架构


噪声调理战略


   TODO: 【也有说在传统的U-Net扩散模型(SD)中,所采取的noise scheduler是带调优参数后的线性调理器(Linear Scheduler)。】
  与传统扩散的相同


输入图像的Patch化(Patchify)和位置编码

在图像领域使用Transformer,起首想到的模型就是ViT(参考:万字长文解读深度学习——ViT、ViLT),和ViT一样,DiT也需要经过Patch位置编码,如下图红框。

Patch化

DiT和ViT一样,起首采取一个Patch Embedding来将输入图像Patch化,主要作用是将VAE编码后的二维特征转化为一维序列,从而得到一系列的图像tokens,ViT具体如下图所示:

DiT在这个图像Patch化的过程中,设计了patch size超参数,它直接决定了图像tokens的大小和数目,从而影响DiT模型的团体计算量。DiT论文中共设置了三种patch size,分别是 2, 4, 8。patch size 为 2*2 是最理想的。(结论来自:视频生成Sora的全面剖析:从AI绘画、ViT到ViViT、TECO、DiT、VDT、NaViT等)
Latent Diffusion Transformer结构中,输入的图像在经过VAE编码器处置惩罚后,生成一个Latent特征,Patchify的目的是将Latent特征转换成一系列 T 个 token(将Latent特征进行Patch化),每个 token 的维度为 d。Patchify 创建的 token 数目 T 由补丁大小超参数 p 决定。如下图所示,将 p 减半会使 T 增长四倍,因此至少使整个 transformer Gflops 增长四倍。具体流程如下图所示:

   图4. DiT 的输入规格 。给定patch size是                                         p                            ×                            p                                  p \times p                     p×p,空间表现(来自 VAE 的加噪潜变量),其外形为                                         I                            ×                            I                            ×                            C                                  I \times I \times C                     I×I×C,会被“划分成补丁”(patchified)为一个长度为                                         T                            =                            (                            I                            /                            p                                       )                               2                                            T = (I/p)^2                     T=(I/p)2 的序列,埋伏维度为                                         d                                  d                     d。较小的补丁大小                                         p                                  p                     p 会导致序列长度更长,因此需要更多的计算量(以 Gflops 表现)。
  位置编码

在执行 patchify 之后,我们对全部输入 token 应用标准的 ViT 基于频率的位置嵌入(正弦-余弦版本)。图像tokens后,还要加上Positional Embeddings进行位置标记,DiT中采取经典的非学习sin&cosine位置编码技术
ViT(vision transformer)采取的是2D Frequency Embeddings(两个1D Frequency Embeddings进行concat操作),详情请参考:深度学习——3种常见的Transformer位置编码【sin/cos、基于频率的二维位置编码(2D Frequency Embeddings)、RoPE】
DiT Block模块详细信息

DiT在完成输入图像的预处置惩罚后,就要将Latent特征输入到DiT Block中进行特征的提取了,与ViT不同的是,DiT作为扩散模型还需要在Backbone(主干)网络中嵌入额外的条件信息(不同模态的条件信息等),这里的条件信息就包罗了Timesteps以及种别标签(文本信息)。
DiT中的Backbone网络进行了两个主要工作:
额外信息都可以采取一个Embedding来进行编码,从而注入DiT中。DiT论文中为了加强特征融合的性能,一共设计了四种 【三种】方案来实现两个额外Embeddings的嵌入(说白了,就是怎么加入conditioning)。实现方式如下图模型架构的后半部分(红框):
   【有的文章表现设计了四种,其实是将AdaLN和AdaLN-Zero分为两种,这里按照论文中图进行解释,分为三种】
  

Diffusion Transformer模型架构图中由右到左的次序分别是:

下面将按次序详细先容。
上下文条件化

实现机制:

这与 ViT 中的 cls tokens 类似,它允许我们无需修改就使用标准的 ViT 模块。在最后一个模块之后,我们从序列中移除条件化 tokens。这种方法对模型的新 Gflops 增长可以忽略不计。
交叉留意力模块

实现机制:

这种方式是Stable Diffusion等文生图大模型常用的方式,交叉留意力对模型的 Gflops 增长最多,约莫增长了 15% 的开销
adaLN-Zero 模块

起首需要了解什么是Adaptive Layer Normalization(AdaLN),而AdaLN之前又要先知道LN,下面将一步步优化解说:
Layer Normalization(LN)

起首在理解AdaLN之前,我们先简单回首一下Layer Normalization。
   其他归一化方法参考:深度学习——优化算法、激活函数、归一化、正则化
  
Layer Normalization的处置惩罚步骤主要分成下面的三步:
LN 的公式
                                         LN                            (                            x                            )                            =                            γ                            ⋅                                                   x                                  −                                  μ                                          σ                                      +                            β                                  \text{LN}(x) = \gamma \cdot \frac{x - \mu}{\sigma} + \beta                     LN(x)=γ⋅σx−μ​+β
此中:

在条件生成任务(如扩散模型)中,需要让条件信息(如时间步 (t) 或种别 (c))对生成过程产生影响。为此,传统的 LN 被改进为 自适应层归一化(adaLN),可以动态调解归一化的参数以包含条件信息。
Adaptive Layer Normalization(AdaLN)

在 GANs 和具有 UNet 骨干的扩散模型中广泛使用自适应归一化层之后,探索用自适应层归一化(adaLN)替换 transformer 模块中的标准归一化层。adaLN 并不是直接学习维度规模的缩放和偏移参数 γ 和 β,而是从 t 和 c 的嵌入向量之和中回归得到它们。
AdaLN的核心思想是根据输入的不同条件信息自适应地调解Layer Normalization的缩放参数                                         γ                                  \gamma                     γ 和偏移参数                                         β                                  \beta                     β增长的 Gflops 非常少,得当大规模任务
adaLN 相比LN的改进

AdaLN的核心步骤

AdaLN的核心步骤包罗以下三步【详细的步骤会在下一节 adaLN-Zero的核心步骤总结】:
在我们探索的三种模块设计中,adaLN 增长的 Gflops 最少,因此是最计算高效的。它也是唯一一个限制对全部 tokens 应用相同函数的条件化机制。
adaLN-Zero

AdaLN-Zero 在 AdaLN 的基础上新增了 残差缩放参数                                         α                                  \alpha                     α,用于动态控制残差路径的影响。通过将                                    α                              \alpha                  α 初始化为零,模型的初始状态被设置为恒等函数,从而确保输出在训练初期的稳定性。这种设计显著提升了模型的训练稳定性和收敛速度。
   之前的 ResNets 工作发现,将每个残差块初始化为恒等函数是有益的。例如,在监督学习环境中,将每个块中最后的批量归一化缩放因子 γ 零初始化可以加速大规模训练。
扩散 U-Net 模型使用了类似的初始化战略,在任何残差连接之前零初始化每个块中的终极卷积层。
我们探索了对 adaLN DiT 模块的修改,它做了同样的事变。除了回归 γ 和 β,我们还回归了在 DiT 模块内的任何残差连接之前作用的 dimension-wise 的缩放参数 α。初始化 MLP 以输出全部 α 为零向量;这将完整的 DiT 模块初始化为恒等函数。与标准的 adaLN 模块一样,adaLNZero 对模型的 Gflops 增长可以忽略不计。
  adaLN-Zero的核心步骤

下面将根据下图来论述:


adaLN-Zero的核心步骤包罗以下三步,和adaLN的步骤相似,只不外需要在过程中加入维度缩放参数                                         α                                  \alpha                     α
   需要做的额外工作如下:
       【在 DiT Block 中,MSA(多头自留意力模块)MLP(多层感知机模块) 都需要分别进行一次 adaLN-Zero 归一化处置惩罚。每个模块的 Layer Normalization(LN) 都会被替换为 adaLN-Zero,并且两者的 归一化参数                                             (                               γ                               ,                               β                                      (\gamma, \beta                        (γ,β)残差路径缩放参数                                             (                               α                               )                                      (\alpha)                        (α) 是独立的(需要分别提取),具体如下:】
    Transformer 模块由 MSA 和 MLP 两部分构成,而它们在功能上的分工导致必须对每部分单独设计对应的条件化机制。这是因为:
  
  
初始化 MLP 以输出全部 α 为零向量;这将完整的 DiT 模块初始化为恒等函数。adaLNZero 对模型的 Gflops 增长可以忽略不计,与标准的 adaLN 模块一样。
阐明


DiT中具体的初始化

设置如下所示:
   图5.比较不同的条件反射战略。adaLN-Zero在训练的各个阶段都优于交叉留意和情境条件反射。
  DiT论文中对四种方案进行了对比试验,发现采取AdaLN-Zero结果是最好的,所以DiT默认都采取这种方式来嵌入条件Embeddings。与此同时,AdaLN-Zero也成为了基于DiT架构的AI绘画大模型的必备战略。
U-ViT(U-Net Vision Transformer)

参考:此文U-ViT部分:视频生成Sora的全面剖析:从AI绘画、ViT到ViViT、TECO、DiT、VDT、NaViT等
DiT 和 U-ViT 的对比

特性DiTU-ViT模型设计灵感基于 ViT 的纯 Transformer 架构结合 U-Net 和 ViT 的混淆架构网络结构标准 Transformer 堆叠Encoder-Transformer-Decoder 框架局部特征建模依赖 Patch Embedding 和 MLP,局部建模较弱使用 U-Net 的卷积模块,局部特征建模强全局特征建模完全由 Transformer 捕捉全局上下文信息通过嵌入 ViT 加强全局建模能力跳跃连接(Skip)无跳跃连接具有跳跃连接,保存细粒度信息输入表现Patch Embedding 序列化输入原始图像直接输入实用任务高分辨率潜在空间生成任务低分辨率生成任务计算复杂度随序列长度增长计算复杂度显著提升U-Net 局部操作高效,团体复杂度较低


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




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4