全网最简单的扩散模型DDPM教程

作者 | 刘伟杰 编辑 | 自动驾驶之心

 原文链接:https://zhuanlan.zhihu.com/p/566618077

点击下方卡片,关注“自动驾驶之心”公众号

戳我-> 领取自动驾驶近15个方向学习路线

>>点击进入→自动驾驶之心『扩散模型』技术交流群

本文只做学术分享,如有侵权,联系删文

1. 前言

DDPM可用于由随机噪声生成图片,其效果堪比甚至优于GAN、VAE等模型。近年大火的多种扩散模型都是以此为基础的。一讲到扩散模型DDPM,很多博客上来就是堆公式推导,用变分推断和隐变量模型将读者砸晕,让读者望而生畏。笔者在琢磨了一段时间后,剥离那些复杂的公式,将要点总结于此,如果有错误的地方,欢迎批评指正。

2. DDPM模型要点

对于使用者只需要理解前向过程、反向过程、如何训练和如何使用这四点即可。

2.1 前向过程(扩散)

前向过程(forward process)又称为扩散过程(diffusion process),简单理解就是对原始图片 通过逐步加高斯噪声变成 ,从而达到破坏图片的目的,如下图

DDPM的前向过程
DDPM的前向过程

用公式表示就是

其中 是预先设定好的超参数,被称为Noise schedule,通常是一些列很小的值。 是高斯噪声。由公式(1)迭代推导,可以直接得出 的公式(详细过程可见[2]),如下,

其中 ,这是随Noise schedule设定好的超参数, 也是一个高斯噪声。公式(1)或(2)就可以用来描述前向过程了,(1)用于将一张图片逐步破坏,(2)用于一步到位破坏。

2.2 反向过程(去噪)

反向过程就是通过估测噪声,多次迭代逐渐将被破坏的 恢复成 ,如下图

DDPM的反向过程
DDPM的反向过程

用公式表示就是

由于公式(2)中的真实噪声 在复原过程中不允许使用,因此DDPM的关键就是训练一个由 估测噪声的模型 ,其中 就是模型的训练参数, 也是一个高斯噪声 ,用于表示估测与实际的差距。在DDPM中,使用U-Net作为估测噪声的模型。

2.3 如何训练(获得噪声估计模型)

上文提到,DDPM的关键是训练 模型,使其预测的 与真实用于破坏的 相近,用L2距离刻画相近程度就好,因此我们的Loss就是如下公式。

训练过程如下图描述。

DDPM训练过程
DDPM训练过程

用原论文中的伪代码表示也很容易理解。

论文中的训练伪代码
论文中的训练伪代码

这里有读者会有疑问,在训练过程中 表示的是从t到t-1时刻的噪声,而却用0到t的真实噪声 进行拟合,会不会有些不妥呢? 我的理解是0到t的真实噪声 只是指导方向,方向大概正确即可,后续用于生成时也不要求恢复出原图,只要能生成一个可看的图片即可,所以这样做是可以的。

2.4 如何使用(生成图片)

在得到噪声估测模型 后,想要生成模型就很简单了。从N(0,1)中随机生成一个噪声作为 ,然后再用该模型逐步从估测噪声,并用去噪公式逐渐恢复到 即可,见如下伪代码。

论文中生成的伪代码
论文中生成的伪代码

贴一些论文里生成的图片看一看,效果还是很惊艳的(论文实验的超参数  )。

3. 总结DDPM

DDPM就是训练一个噪声估计模型 ,然后由一个随机噪声迭代生成图片。在训练模型时,先随机生成噪声 ,然后用此噪声破坏模型,再用破坏的图片预估噪声 ,期望预估的噪声与真实的噪声相近。想要深入理解DDPM,推荐看[1][2][3]三篇文献。

References

[1] Denoising Diffusion Probabilistic Models,https://arxiv.org/pdf/2006.11239.pdf

[2] 小小将, 扩散模型之DDPM,https://zhuanlan.zhihu.com/p/563661713

[3] 苏剑林,生成扩散模型漫谈(一):DDPM = 拆楼 + 建楼,https://zhuanlan.zhihu.com/p/53

自动驾驶之心

论文辅导来啦

知识星球交流社区

近4000人的交流社区,近300+自动驾驶公司与科研结构加入!涉及30+自动驾驶技术栈学习路线,从0到一带你入门自动驾驶感知(大模型、端到端自动驾驶、世界模型、仿真闭环、3D检测、车道线、BEV感知、Occupancy、多传感器融合、多传感器标定、目标跟踪)、自动驾驶定位建图(SLAM、高精地图、局部在线地图)、自动驾驶规划控制/轨迹预测等领域技术方案、大模型,更有行业动态和岗位发布!欢迎加入。

独家专业课程

端到端自动驾驶大模型、VLA、仿真测试、自动驾驶C++、BEV感知、BEV模型部署、BEV目标跟踪、毫米波雷达视觉融合、多传感器标定、多传感器融合、多模态3D目标检测、车道线检测、轨迹预测、在线高精地图、世界模型、点云3D目标检测、目标跟踪、Occupancy、CUDA与TensorRT模型部署、大模型与自动驾驶、NeRF、语义分割、自动驾驶仿真、传感器部署、决策规划、轨迹预测等多个方向学习视频

学习官网:www.zdjszx.com

内容概要:本文档介绍了Intel oneAPI工具集及其行业倡议,旨在提供跨架构编程解决方案,支持加速计算并打破专有锁定。oneAPI允许开发者选择最佳硬件加速技术,实现跨CPU、GPU、FPGA及其他加速器的性能优化。它兼容多种编程语言和模型(如C++、Python、SYCL、OpenMP等),并通过开放标准确保未来兼容性和代码重用。文档详细描述了oneAPI工具包的功能,包括渲染、高性能计算(HPC)、物联网(IoT)、AI分析等领域的应用。此外,还介绍了DPC++(数据并行C++)编程语言及其在不同硬件架构上的执行方式,以及Intel提供的各种优化库和分析工具,如Intel MKL、IPP、VTune Profiler等。最后,通过实际案例展示了oneAPI在医疗成像和超声产品中的成功应用。 适合人群:软件开发人员、硬件工程师、系统架构师、OEM/ODM厂商、ISV合作伙伴,特别是那些需要在多种硬件平台上进行高效编程和性能优化的专业人士。 使用场景及目标:①为跨架构编程提供统一的编程模型,简化多硬件平台的应用开发;②利用开放标准和工具集,提高代码可移植性和重用性;③通过优化编译器和技术库,提升应用程序的性能表现;④借助分析和调试工具,快速识别并解决性能瓶颈。 其他说明:Intel oneAPI工具集不仅支持现有编程语言和模型,还提供了强大的中间件和框架支持,适用于多样化的应用负载需求。开发者可以通过Intel DevCloud获取实际操作经验,同时利用DPC++兼容性工具将现有CUDA代码迁移到SYCL环境。此外,文档还提供了详细的性能优化指南和未来产品路线图,帮助用户更好地规划技术演进路径。
“班级网站设计源代码”项目是网页设计初学者及有一定基础的设计师的理想学习资源。它提供了完整的源代码,涵盖构建可运行班级网站所需的所有文件。网页设计包含前端开发、后端开发和用户体验设计等多个方面,而这个项目能帮助你深入理解这些技术的实际应用。 首先,HTML是网页的基础,它通过标签定义网页的结构,如标题、段落、图片和链接等。在这个项目中,你可以清晰地看到如何利用HTML搭建网页的框架。其次,CSS用于控制网页的样式和布局,赋予网页视觉美感。通过设置颜色、字体、布局以及响应式设计,CSS确保网站能在不同设备上良好显示。项目中的源代码展示了如何运用CSS实现多样化的样式效果。 JavaScript则是实现网页动态功能的关键,它能够处理用户交互、数据操作和动画效果。在这个班级网站中,JavaScript代码可能用于实现按钮点击事件、表单验证或页面动态更新等功能。此外,响应式设计是现代网页设计的重要组成部分。借助媒体查询和流式布局,该班级网站能够自动适应手机、平板和桌面电脑等不同设备的屏幕尺寸。 为了提高开发效率,现代网页设计常常会引入前端框架和库,如Bootstrap或Vue.js。这些工具提供了一套预设的样式和组件,简化了网页的构建过程。虽然具体是否使用了这些框架需要查看源代码,但了解它们的工作原理对于提升网页设计能力至关重要。 如果班级网站包含用户登录、留言等功能,那么后端技术(如PHP、Node.js或Python)和数据库(如MySQL或MongoDB)也会被涉及。这部分代码主要负责处理数据的提交、验证和存储,以及与服务器的通信。 用户体验(UX)和界面设计也是网页设计的重要方面。一个优秀的网站不仅要有美观的外观,还要具备良好的易用性。通过观察和分析这个班级网站的布局和交互设计,你可以学习如何提升用户体验,例如如何设计清晰的导航、易读的信息和直观的操作流程。 通过深入研究“
<think>好的,用户想了解扩散模型DDPM的实现和解释。首先,我需要回忆一下DDPM的基本概念。扩散模型主要包括正向过程和反向过程,正向过程逐步添加噪声,反向过程学习去噪。用户可能对这两个过程的具体实现感兴趣。 接下来,我需要考虑如何用中文清晰解释这些概念。根据用户提供的引用[2],生成模型的目标是建模复杂数据分布,并通过简单分布进行采样。这可能涉及到正向过程如何将数据逐渐变为噪声,反向过程如何从噪声恢复数据。 用户还提到实现方法,可能需要代码示例。我需要确保代码正确,使用PyTorch框架,并遵循用户对LaTeX格式的要求,例如数学公式用$...$或$$...$$。比如,正向过程的公式应该是: $$q(x_t|x_{t-1}) = \mathcal{N}(x_t; \sqrt{1-\beta_t}x_{t-1}, \beta_t\mathbf{I})$$ 然后,反向过程需要参数化网络来预测噪声,损失函数可能是MSE。代码部分要展示如何定义噪声调度、UNet模型和前向传播过程。 用户可能对如何训练模型和采样过程有疑问,所以需要详细解释训练循环和采样步骤。此外,引用[1]提到的采样步骤可能涉及到反向去噪的迭代过程,这部分需要结合引用内容。 最后,生成相关问题时要覆盖原理、数学、优化和应用等方面,确保问题有针对性,帮助用户深入理解。比如,损失函数的设计、与VAE的区别、优化方法等。 需要检查所有数学表达式是否符合格式要求,代码是否正确缩进,引用标识是否正确添加。确保回答结构清晰,分点解释,并自然融入引用内容。</think>### 扩散模型DDPM详解与实现 扩散模型(Denoising Diffusion Probabilistic Models, DDPM)通过逐步加噪与去噪过程实现数据生成,核心包含**正向扩散过程**和**反向去噪过程**[^2]。 #### 1. 核心原理 - **正向扩散过程**:将数据$x_0$通过$T$步逐渐添加高斯噪声,得到$x_T \sim \mathcal{N}(0,\mathbf{I})$: $$q(x_t|x_{t-1}) = \mathcal{N}(x_t; \sqrt{1-\beta_t}x_{t-1}, \beta_t\mathbf{I})$$ 其中$\beta_t$为噪声调度参数,控制噪声添加速度[^1]。 - **反向去噪过程**:通过神经网络学习从$x_t$恢复$x_{t-1}$: $$p_\theta(x_{t-1}|x_t) = \mathcal{N}(x_{t-1}; \mu_\theta(x_t,t), \Sigma_\theta(x_t,t))$$ #### 2. 关键实现步骤 ```python import torch import torch.nn as nn class UNet(nn.Module): def __init__(self): super().__init__() # 定义包含时间嵌入的UNet结构 self.time_embed = nn.Embedding(1000, 64) self.conv1 = nn.Conv2d(3, 64, 3, padding=1) # 添加下采样和上采样层... def forward_diffusion(x0, t, beta): """正向扩散过程""" sqrt_alpha = torch.sqrt(1 - beta[t]) noise = torch.randn_like(x0) xt = sqrt_alpha * x0 + torch.sqrt(beta[t]) * noise return xt, noise # 噪声调度设置(线性/余弦) T = 1000 beta = torch.linspace(1e-4, 0.02, T) ``` #### 3. 训练与采样 - **训练目标**:最小化预测噪声的MSE损失: $$\mathcal{L} = \mathbb{E}_{t,x_0,\epsilon}\left[\|\epsilon - \epsilon_\theta(x_t,t)\|^2\right]$$ - **采样过程**:从$x_T \sim \mathcal{N}(0,1)$开始迭代去噪: $$x_{t-1} = \frac{1}{\sqrt{\alpha_t}}(x_t - \frac{\beta_t}{\sqrt{1-\bar{\alpha}_t}}\epsilon_\theta(x_t,t)) + \sigma_t z$$ #### 4. 代码实现要点 ```python def train_step(model, x0, beta): t = torch.randint(0, len(beta), (x0.size(0),)) xt, noise = forward_diffusion(x0, t, beta) pred_noise = model(xt, t) loss = F.mse_loss(pred_noise, noise) return loss def sample(model, shape, beta): x = torch.randn(shape) for t in reversed(range(T)): x = denoise_step(model, x, t, beta) return x ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值