微型扩散
Source: Dev.to
请提供您希望翻译的正文内容,我会按照要求将其译成简体中文并保留原有的格式、Markdown 语法以及技术术语。谢谢!
前向扩散
扩散是热力学中描述的将能量从高能态转移到低能态的过程。在扩散模型中,我们通过逐渐向图像添加噪声来模拟这一过程。
想象把墨水滴入一杯水中:墨水最初呈现出明确的形状,随后扩散开来,直至水体颜色均匀。
同理,我们从一张干净的图像开始,在每一步重复加入少量噪声,直至图像变成纯噪声。这称为 前向扩散。
逆向扩散
如果我们拍摄墨水扩散的过程并倒放视频,就会看到均匀的颜色重新形成原始的墨点。
在训练过程中,我们让模型预测加入的噪声并将其减去,从而有效地学习如何逆转扩散过程。这就是 逆向扩散。
调度器决定在每个时间步添加多少噪声,而算法(通常是 U‑Net 或扩散 Transformer)学习去除这些噪声。
将扩散扩展到视频
对于二维扩散,我们只需要对单帧进行去噪。视频增加了第三维——时间——因此必须保证时间一致性。
如果第 1 帧被去噪成“3”,第 2 帧被去噪成“5”,生成的动画就会出现闪烁。为避免这种情况,模型使用 时间注意力,在当前帧前后查看相邻帧。
在我们的实验中,我们使用带掩码的欧氏距离变换将静态的 28×28 MNIST 数字转换为 15 帧的批次。于是每个数字成为一个包含 15 张图像的序列,表示其随时间的变化,为视频感知架构提供了所需的数据。
Architecture
该骨干网络遵循 DDPM 论文的设计,但针对视频进行了适配:
- 空间分支 – 使用大小为 (1 × 3 × 3) 的卷积核处理空间信息。
- 时间分支 – 使用大小为 (3 × 1 × 1) 的卷积核处理时间信息。
# Spatial convolution
nn.Conv3d(in_ch, out_ch, kernel_size=(1, 3, 3), padding=(0, 1, 1)),
nn.BatchNorm3d(out_ch),
nn.ReLU(),
# Temporal convolution
nn.Conv3d(out_ch, out_ch, kernel_size=(3, 1, 1), padding=(1, 0, 0))
Time Embedding
原始 DDPM 使用正弦嵌入(类似于 Transformer 的位置编码)。在我们的简易任务中,采用了一个基础的 MLP:
self.time_mlp = nn.Sequential(
nn.Linear(1, t_dim),
nn.ReLU(),
nn.Linear(t_dim, t_dim)
)
由于任务是从欧氏距离变换(低频、线性函数)预测几何形状,简单的嵌入已经足够。真实的视频扩散包含低频和高频成分以及复杂的物理过程,通常更适合使用正弦嵌入。
Source: …
调度器与训练循环
调度器决定在每一步添加多少噪声。在原始的 DDPM 中,达到第 500 步需要 500 次连续的噪声添加,这非常慢。利用向高斯噪声中再加入高斯噪声仍会得到高斯噪声的性质,我们可以直接从干净图像 (x_0) “瞬移”到任意噪声步 (x_t)。
损失函数很直接:取一帧干净图像,在随机时间步加入噪声,预测该噪声,计算预测噪声与真实噪声之间的均方误差(MSE),并进行反向传播。
在训练期间我们可以使用再参数化技巧跳过步骤,但在采样时必须遵循逆扩散链。标准的 DDPM 需要约 1000 步;更快的替代方案是 DDIM,它可以在最多 50 步内生成样本。在模型预测要减去的噪声后,采样器执行减噪操作。
Temporal Consistency (The “Secret Sauce”)
确保连续帧保持一致对于视频扩散至关重要。时间注意力和双分支(空间 + 时间)卷积设计有助于在逆向扩散过程中保持这种一致性。
结论
- 数据: 将静态 MNIST 数字转换为短时序序列。
- 架构: 将 3‑D 卷积拆分为独立的空间分支和时间分支。
- 嵌入: 简单的 MLP 时间嵌入已足以完成低频任务。
- 训练: 使用调度器的标准 DDPM 损失;可选的 DDIM 采样用于加速。
虽然这个原型并未捕捉现代视频扩散模型的全部复杂性(这些模型通常会基于文本并使用复杂的时间先验),但它提供了一个清晰的概念基础。
若想更深入理解概念,可观看 3Blue1Brown 和 Welch Lab 关于 AI 图像和视频工作原理的视频。
您也可以在我的 GitHub repository 中查看完整代码。