denoising-diffusion-pytorch
PyTorch实现的去噪扩散概率模型(DDPM),理解Stable Diffusion等主流图像生成工具核心原理的最佳学习参考
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
PyTorch实现的去噪扩散概率模型(DDPM),理解Stable Diffusion等主流图像生成工具核心原理的最佳学习参考
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象一下:你有一张被噪音彻底淹没的照片——就像老旧电视的雪花屏——而现在,有人告诉你,可以通过「一步一步猜」的方式,把这张照片从雪花中「恢复」出来。这听起来像是魔术,但这正是去噪扩散概率模型(DDPM)正在做的事。
lucidrains/denoising-diffusion-pytorch 就是这个「魔术」最优雅的 PyTorch 实现之一。它将 2020 年由 Ho 等人提出的 DDPM 论文,用最纯粹、最易读的方式翻译成了代码。截至 2026 年初,该项目已累计超过 10,500 颗 GitHub 星标,成为扩散模型领域最具影响力的学习参考之一。

图1:DDPM 的核心思想——从噪声中逐步恢复原始数据(来源:项目 README)
扩散模型(Diffusion Model)在 2022-2024 年间彻底改变了 AI 生成领域。在 Midjourney、DALL·E 3、Stable Diffusion 等图像生成工具背后,驱动它们的核心技术都可以追溯到 DDPM 这一类算法。
这个项目的作者 Phil Wang(lucidrains) 是 GitHub 上极为高产的独立开发者。他的账号下拥有数百个高质量 PyTorch 实现,几乎涵盖了生成式 AI 的每一个前沿方向:Transformer 架构、Perceiver IO、-video 生成模型、MusicGen……而 denoising-diffusion-pytorch 是他最早、最经典的代表作之一。
从技术演进的视角看,这个项目是一个绝佳的「起点」:它帮助你理解扩散模型最原教旨的实现方式——没有蒸馏、没有 ControlNet、没有 SDXL 的复杂工程包装——就是一个干净的正向加噪 + 逆向去噪循环。搞懂这个,你就能看懂 Stable Diffusion 背后的数学直觉。
扩散模型的核心思想异常优雅:先破坏,再重建。
正向过程(Forward Process):向真实图片逐步添加高斯噪声,直到图片彻底变成纯噪声。这个过程是可预测的——给定原始图片,我们精确知道第 T 步的图片是什么样。
逆向过程(Reverse Process):训练一个神经网络,让它「猜」:给定一个噪声图片,它应该预测出噪声之前的那一步是什么。这是一个学习任务:网络学会将噪声一步一步还原回数据分布。
原始图片 → +噪声 → +噪声 → ... → +噪声 → 纯噪声
纯噪声 ← 去噪 ← 去噪 ← ... ← 去噪 ← 初始输入
DDPM 的训练目标本质上是去噪得分匹配(Denoising Score Matching):网络学习预测添加的噪声。如果能准确预测噪声,那么从噪声中减去它就能恢复原始信号。
这个项目的实现中,核心损失函数非常简单:
loss = diffusion(training_images)
loss.backward()
GaussianDiffusion 类自动处理了从加噪到去噪的完整流程,开发者只需要提供训练数据和模型架构。
项目使用 U-Net 作为去噪网络的核心。U-Net 最初在医学图像分割中成名,其特点是「编码器-解码器 + 跳跃连接」结构:编码器提取特征,解码器还原分辨率,跳跃连接保留空间信息。这种结构恰好适合「输入噪声图、输出预测噪声」的去噪任务。
项目中实现了三种 U-Net 变体:
项目的源码结构体现了清晰的工程分层思想:
| 文件 | 功能 | 重要性 |
|---|---|---|
denoising_diffusion_pytorch.py | 核心 DDPM 实现 | ★★★★★ |
karras_unet.py | Karras magnitude-preserving U-Net | ★★★★ |
elucidated_diffusion.py | Elucidated 采样改进 | ★★★★ |
weighted_objective_gaussian_diffusion.py | 损失加权策略 | ★★★ |
continuous_time_gaussian_diffusion.py | 连续时间扩散 | ★★★ |
simple_diffusion.py | 简化版扩散 | ★★ |
repaint.py | 图像修复(RePaint 算法) | ★★ |
karras_unet_1d.py / 3d.py | 1D/3D 数据扩散 | ★★ |
attend.py | Flash Attention 封装 | ★★★★ |
classifier_free_guidance.py | 无分类器引导 | ★★★ |
最令人印象深刻的是 attend.py——它封装了 Flash Attention,使得在处理高分辨率图像时显存占用大幅降低。这意味着在相同硬件条件下,你可以训练更大的模型或生成更高分辨率的图像。
Trainer 类是项目最用户友好的入口。它将数据加载、训练循环、EMA(指数移动平均)模型维护、检查点保存等全部封装起来,开发者只需:
trainer = Trainer(diffusion_model, 'path/to/images',
train_batch_size=32, train_num_steps=700000)
trainer.train()
从行业视角看,denoising-diffusion-pytorch 体现了开源社区在 AI 研究中的关键作用:它将论文中抽象的数学公式转化为可运行的代码,让全球开发者能够在几个小时内在自己的数据集上复现最新研究。
2020-2022 年,扩散模型从学术论文走向主流产品经历了爆发式增长。而 lucidrains 的这个项目,正好位于这一浪潮的早期——它是无数研究者「第一个扩散模型实验」的起点,也是理解后来 Stable Diffusion 全部复杂工程的基础设施。
截至 2026 年初,项目持续活跃维护(最近更新于 2026 年 2 月),作者不断引入 Karras U-Net、Elucidated Diffusion 等新架构。如果你正在寻找一个既能深入理解扩散模型原理、又能快速实验验证想法的代码库,这仍然是最好的选择之一。

图2:项目生成的样本图像展示 DDPM 在 128×128 分辨率下的表现(来源:项目 README)
安装(5 分钟):
pip install denoising_diffusion_pytorch
最简示例(10 行代码训练模型):
import torch
from denoising_diffusion_pytorch import Unet, GaussianDiffusion, Trainer
model = Unet(dim=64, dim_mults=(1,2,4,8), flash_attn=True)
diffusion = GaussianDiffusion(model, image_size=128, timesteps=1000)
trainer = Trainer(diffusion, 'path/to/your/images',
train_batch_size=32, train_num_steps=700000)
trainer.train()
推理生成:
sampled_images = diffusion.sample(batch_size=4)
# sampled_images.shape → (4, 3, 128, 128)
显存不够? 减小 dim 参数和 image_size,同时开启 flash_attn=True 可显著降低显存占用。