DiT:latent 扩散内部的 Transformer
交互教程
DiT 改变去噪网络;原始系统仍靠 VAE 在图像与 latent 间转换。
前置阅读:扩散与 Flow Matching · ViT · 变分自编码器
之前已经能做什么
Section titled “之前已经能做什么”Latent diffusion 已通过在压缩图像空间去噪降低采样成本,U-Net 负责去噪主干。DiT 在这一角色中研究可扩展 Transformer,并比较模型大小、patch 尺寸与条件设计。
改变了什么,为什么
Section titled “改变了什么,为什么”对带噪 VAE latent 做 patchify,加入固定二维正弦余弦位置,用 Transformer 处理全部位置。时间与类别嵌入通过 adaLN-Zero 调节归一化及残差门控。门控零初始化使残差分支初始关闭。输出头预测噪声与方差项,再恢复 latent 网格。
阅读顺序从左到右。点击模块,将它与计算和代码对应。代码为教学伪代码;来源链接提供论文方法或已核查的实现。
latent patches
patch size 2 作用于 latent 网格,而非原始像素网格。
z = patch_embed(noisy_latent) + fixed_2d_positionadaLN-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)逐步理解机制
Section titled “逐步理解机制”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 |
训练与采样的区别
Section titled “训练与采样的区别”训练时对现有 VAE 产生的 latent 加噪并学习去噪。生成时反复去噪采样 latent,再调用 VAE 解码器得到 RGB。附录 D 的解码器对照保持编码器、DiT-XL/2 与 CFG=1.5 一致,衡量最终生成质量,并非 tokenizer 重建。
论文证据(并非本地复现)
Section titled “论文证据(并非本地复现)”| 条件 | 指标 | 数值 | 解释 |
|---|---|---|---|
| ImageNet 256²;LDM / ft-MSE / ft-EMA 解码器 | gFID ↓ | 2.46 / 2.30 / 2.27 | 附录 D,同一 DiT-XL/2,CFG 1.5 |
这些结果不能证明什么
Section titled “这些结果不能证明什么”原始 DiT 不替换图像 tokenizer,也不使用 RoPE。若想让 Transformer 本身负责重建,应像 FlowMo 一样,将图像编码作为像素去噪器的条件。固定 DiT 仓库采用 CC-BY-NC-4.0;本页片段为独立编写的教学伪代码。
DiT 得到干净 latent 后,RGB 图像就完成了吗?
没有,还需 VAE 解码器将 latent 映射到像素。
来源与后续阅读
Section titled “来源与后续阅读”本页图形与伪代码为教学重绘。论文报告、固定实现观察和解析示例分别标记;未运行研究模型。