实验课上所使用的课件同步在学在浙大发布。
本次实验内容为课程作业,计算成绩。本次实验课内容分为两部分:
Lab6-学号-姓名.zip/7z
。请不要提交模型文件和数据集。
本次作业提交截止时间:2025年4月15日 23:59:59,逾期将要扣分。
本实验推荐使用 Linux / WSL 作为平台。
Diffusion models are incremental updates where the assembly of the whole gives us the encoder-decoder structure. The transition from one state to another is realized by a denoiser.
扩散模型是由一系列渐进式更新组成的,这些更新共同构建形成了编码器-解码器结构。 扩散模型中,一个状态向另一个状态的转变过程是通过去噪器实现的。
扩散模型是一种生成模型,在2020年提出的 DDPM (Denoising Diffusion Probabilistic Model) 是最基础的扩散模型。 扩散模型以其训练稳定性、生成数据的多样性和高质量而受到广泛关注,是目前生成式模型的前沿技术。
扩散模型的结构如下图所示。其核心思想是通过逐步添加噪声来破坏数据分布,然后学习如何去除这些噪声以恢复原始数据。
这包含两个阶段:正向的加噪过程和反向的去噪过程。加噪过程通过分布 q(x(t)|x(t-1))
向数据逐步添加噪声,是一个马尔可夫过程;
去噪过程则通过分布 p(x(t-1)|x(t))
进行转移。这两个分布通过神经网络参数化。
将原始真实图像记为 x(0)
,逐步添加高斯噪声得到的噪声图像记为 x(1),x(2),...,x(T)
,假设最终时间步的噪声图像满足
x(T)~N(0,I)
那么如果可以预测每一步添加的高斯噪声,就可以从 那么如果可以预测每一步添加的高斯噪声,就可以从 N(0,I)
中采样,
逐步去噪得到一张真实的图像 (0)~N(0,I)
。
中采样,并逐步去噪得到一张真实的图像 。
为了更好地实现扩散模型,这里有一些参考文献:
这里列出一些扩散模型的关键公式。首先是加噪公式:
α(t) = 1 - β(t)
是关于 t 单调递减的, 。
DDPM 去噪从一个分布p(x(t)|x(t-1))
中采样,这是一个高斯分布。故我们介绍 DDIM 的去噪公式:
ε(xt)
是模型预测出的噪声,ε(t)
是随机采样的单位高斯噪声。
是去噪过程中的噪声方差。当
当需要加速推断时,可以将公式中的 𝑡−1 替换为 𝑡−𝑘。
MNIST 数据集 (Mixed National Institute of Standards and Technology database) 是美国国家标准与技术研究院收集整理的大型手写数字数据库,包含 60,000 个示例的训练集以及 10,000 个示例的测试集。 通常可以通过 MNIST 数据集下载链接 下载数据集。 torchvision 中集成了包括 MNIST 的经典的数据集, 通过 datasets 的方法可以准备该数据集。 本实验基于 DDPM 建模 MNIST 手写数字的数据分布,从而能够采样生成新的手写数字图片。
本实验不要求搭建 U-Net 网络,将提供模块化实现的 unet.py。
在DDPM的实际训练循环中,对于每个 x(0)
,需要:
x(0)
加噪得到x(t)
。x(0)
到 x(t)
的噪声 εθ(t)(x(t))
。
本实验提供一个训练的基础代码 train.py,你需要完成代码中所有标记为
TODO
的部分。
在训练完得到模型后,本实验要求独立完成 infer.py ,能够载入预训练的 epsilon-prediction 模型,推断生成新的手写数字图片。
训练过程中的加噪和推理过程中生成新图片的采样均通过类 DDIMScheduler 实现。本实验提供一个训练的基础代码 scheduler.py,你需要完成代码中所有标记为
TODO
的部分,包括:
𝛽𝑡
等的代码。其中 sample 方法包括:
最终生成结果应如下:
根据论文 Progressive Distillation for Fast Sampling of Diffusion Models, 让模型预测一个速度 𝑣 会比直接预测噪声 𝜖 具有更好的数值稳定性。训练循环即变为:
x(0)
加噪得到x(t)
。x(0)
到 x(t)
的速度 vθ(t)(x(t))
。具体的实现须在 scheduler.py 中,你可以参考 博客 实现。
在这里重新列出所有提供的模板代码:
这些代码被打包在 code.zip 中。实验提供以下思考题以供探究:
- 模型预测类型对生成效果有什么影响?
- 推断步数对生成效果有什么影响?
- 回忆 DDIM 的去噪公式, 𝜂 的变化对生成效果有什么影响?