跳转到内容
English

DiT:latent 扩散内部的 Transformer

交互教程

DiT 改变去噪网络;原始系统仍靠 VAE 在图像与 latent 间转换。

前置阅读:扩散与 Flow Matching · ViT · 变分自编码器

Latent diffusion 已通过在压缩图像空间去噪降低采样成本,U-Net 负责去噪主干。DiT 在这一角色中研究可扩展 Transformer,并比较模型大小、patch 尺寸与条件设计。

对带噪 VAE latent 做 patchify,加入固定二维正弦余弦位置,用 Transformer 处理全部位置。时间与类别嵌入通过 adaLN-Zero 调节归一化及残差门控。门控零初始化使残差分支初始关闭。输出头预测噪声与方差项,再恢复 latent 网格。

阅读顺序从左到右。点击模块,将它与计算和代码对应。代码为教学伪代码;来源链接提供论文方法或已核查的实现。

latent patches

patch size 2 作用于 latent 网格,而非原始像素网格。

z = patch_embed(noisy_latent) + fixed_2d_position

adaLN-Zero 模块

时间与类别控制偏移、缩放及残差门。

shift, scale, gate = modulation(time + class_embedding)
h = layer_norm(z)*(1+scale)+shift
z = z + gate*attention(h)

去噪后输出像素

原始输出含噪声与方差通道,独立 VAE 输出像素。

noise, variance = unpatchify(head(z)).chunk(2,dim=1)
clean_latent = diffusion_sampler(model)
image = vae.decode(clean_latent)

查看固定版本来源

h←h+α(c) F((1+γ(c))LN⁡(h)+β(c))h\leftarrow h+\alpha(c)\,F((1+\gamma(c))\operatorname{LN}(h)+\beta(c))

256² 像素经常用 VAE 得到 32 × 32 × 4 latent。DiT patch size 为 2 时有 16 × 16 个 Transformer 位置。这是 latent patch,不是 2 × 2 RGB patch。一次去噪调用更新全部带噪位置,并非从左到右自回归。

门控演示初始 α=0。改变条件缩放 γ,分支仍关闭;再增大 α,条件才会影响残差输出。例子仅分离门控机制,不模拟完整层归一化或学习时间嵌入。

改变参数,查看计算值,再把它与上方的真实模型说明对照。

解析教学模型 · 控件改变的是例子,不是训练后的研究模型。

α = 0 时残差分支关闭,即使条件变化也不影响输出。这里是门控残差的标量示例。

当前例子的计算值
量值
x-1, 0, 1
x + α(γx + 1)-1.000, 0.000, 1.000

训练时对现有 VAE 产生的 latent 加噪并学习去噪。生成时反复去噪采样 latent,再调用 VAE 解码器得到 RGB。附录 D 的解码器对照保持编码器、DiT-XL/2 与 CFG=1.5 一致,衡量最终生成质量,并非 tokenizer 重建。

条件指标数值解释
ImageNet 256²;LDM / ft-MSE / ft-EMA 解码器gFID ↓2.46 / 2.30 / 2.27附录 D,同一 DiT-XL/2,CFG 1.5

原始 DiT 不替换图像 tokenizer,也不使用 RoPE。若想让 Transformer 本身负责重建,应像 FlowMo 一样,将图像编码作为像素去噪器的条件。固定 DiT 仓库采用 CC-BY-NC-4.0;本页片段为独立编写的教学伪代码。

DiT 得到干净 latent 后,RGB 图像就完成了吗?

没有,还需 VAE 解码器将 latent 映射到像素。

返回学习地图

本页图形与伪代码为教学重绘。论文报告、固定实现观察和解析示例分别标记;未运行研究模型。