Diffusion Model详解:扩散模型原理与PyTorch实现
大家好,这里是道满PythonAI!今天我们拆解的是让Midjourney和Sora爆火的技术核心——Diffusion Model扩散模型。
如果说GAN是在博弈中“伪造”数据,CycleGAN是在循环中“翻译”风格,那么扩散模型就是2021年后图像生成的绝对霸主。它的灵感并非来自艺术,而是非平衡热力学:先“倒放”墨水扩散成黑液的过程,把噪声还原成清晰数据。
1. 扩散模型两大核心
扩散模型是一种生成模型,分为固定前向毁灭和可学习反向重建两个阶段:
1.1 前向毁灭:加噪变废图
向原始图 x₀ 中不断加入微小高斯噪声,经过 T 步(通常1000-4000)后,x_T 变成完全无法辨认的标准正态分布噪声。这一步不需要训练,是预先设定的马尔可夫链。
1.2 反向重建:去噪变新图
模型学习预测每一步中被加入的噪声 ε,再用数学公式从 x_t 反推 x_{t-1}。经过数千次微小去噪,最终从 x_T 生成一张有意义的新图像。
2. 数学极简推导
2.1 前向公式:一步到位算加噪
原始马尔可夫加噪公式是逐步叠加的,但用重参数化技巧可以直接从 x₀ 算任意步 t 的 x_t:
其中:
αₜ = 1 - βₜ,βₜ是噪声调度(越大加噪越快,但不能超过0.02)$\bar{\alpha}_t = \prod_{s=1}^t \alpha_s$,是前t步的α乘积
2.2 反向训练:预测噪声即可
扩散模型的损失函数非常简单——直接让模型预测的噪声 ε_θ 与真实加入的噪声 ε 做均方误差(MSE):
3. DDPM核心实现
DDPM(Denoising Diffusion Probabilistic Models)是扩散模型的开山经典,我们用PyTorch实现核心模块。
3.1 核心网络:带时间嵌入的简化U-Net
扩散模型需要知道当前是“第几步加噪”,所以要加入正弦位置编码把时间步 t 编码成向量,和图像特征融合:
3.2 噪声调度与辅助函数
3.3 训练与采样循环
4. 主流改进与应用
4.1 Latent Diffusion(Stable Diffusion核心)
在像素空间训练扩散模型太占显存(一张1024×1024的图有300万+像素),所以Stable Diffusion把图压缩到1/8分辨率的潜在空间(4通道)再训练:
- 用预训练VAE压缩/解压图像
- 用CLIP文本编码器把提示词转成条件向量
- 带条件的U-Net在潜在空间去噪
4.2 核心应用场景
- 文生图/图生图:Midjourney、Stable Diffusion WebUI
- 视频生成:Sora、Pika Labs(在时空潜在空间扩散)
- 图像修复:Inpainting、Outpainting、超分辨率
- 科学研究:分子生成、材料设计
5. 道满的实践建议
5.1 快速上手
- 先复现MNIST/CIFAR-10的简化DDPM
- 再用Stable Diffusion WebUI玩文生图
- 最后读源码理解条件控制和潜在空间
5.2 避坑指南
- 图像必须归一化到[-1, 1]
- 时间步用
torch.long类型 - 采样时尽量用混合精度(FP16)加速
总结
扩散模型凭借稳定训练、高质量生成、强可控性三大优势,已经成为AI生成领域的绝对核心。从DDPM到Stable Diffusion再到Sora,它的演进速度极快,应用场景也越来越广。
如果有兴趣深入学习,推荐阅读开篇的三篇扩展论文哦!
🔗 扩展阅读

