目录去噪扩散概率模型DDPM原理前向扩散过程逆向去噪过程改进与变体去噪扩散概率模型DDPM原理去噪扩散模型Denoising Diffusion Probabilistic Models, DDPM是一种基于马尔可夫链的生成模型通过逐步添加和去除噪声来学习数据分布。核心思想是将数据逐步转化为噪声再逆向学习去噪过程。前向扩散过程前向过程将数据通过 T 步逐步添加高斯噪声最终转化为近似各向同性的高斯分布其中是噪声调度参数控制每一步的噪声强度表示在步长 t 添加的噪声的方差。通过重参数化技巧可直接从计算任意步的无需迭代中间的步骤这里。则分布也是高斯分布逆向去噪过程逆向过程通过神经网络学习逐步去噪逆转前向加噪过程通过逐步采样得到真实数据点即从噪声重建数据。每一步的条件分布为通常固定方差网络仅预测均值。通过参数化预测噪声损失函数简化为神经网络通常采用U-Net网络架构U-Net架构最初为生物学图像分割设计如细胞显微镜图像分析后因其高效处理空间信息和高分辨率数据的能力逐步应用于医学影像、卫星图像等领域并成为扩散模型如Stable Diffusion中的核心噪声预测组件。以下是关于DDPM去噪扩散概率模型的前向加噪和反向去噪的核心代码实现使用PyTorch框架import torch import torch.nn as nn # 前向加噪过程 def forward_diffusion(x0, t, beta_schedule): x0: 原始数据 [batch_size, channels, height, width] t: 时间步 [batch_size] beta_schedule: 噪声调度参数 [T] 返回: 加噪后的数据 x_t 和实际噪声 epsilon # 计算累积乘积 α_bar_t ∏(1-β_s) for s1 to t alpha_bar torch.prod(1 - beta_schedule[:t1]) # 采样随机噪声 epsilon torch.randn_like(x0) # 计算加噪数据: x_t √(ᾱ_t) * x0 √(1-ᾱ_t) * ε x_t torch.sqrt(alpha_bar) * x0 torch.sqrt(1 - alpha_bar) * epsilon return x_t, epsilon # 反向去噪网络简化UNet结构 class DenoiseNet(nn.Module): def __init__(self, channels): super().__init__() self.time_embed nn.Embedding(1000, 128) # 时间嵌入 self.conv1 nn.Conv2d(channels, 64, 3, padding1) self.down1 nn.Sequential( nn.Conv2d(64, 128, 3, stride2, padding1), nn.ReLU() ) self.mid_block nn.Sequential( nn.Conv2d(128, 128, 3, padding1), nn.ReLU() ) self.up1 nn.Sequential( nn.ConvTranspose2d(128, 64, 3, stride2, padding1, output_padding1), nn.ReLU() ) self.out_conv nn.Conv2d(64, channels, 3, padding1) def forward(self, x, t): # 时间嵌入 t_emb self.time_embed(t).unsqueeze(-1).unsqueeze(-1) # 主干网络 x self.conv1(x) x self.down1(x) t_emb x self.mid_block(x) x self.up1(x) return self.out_conv(x) # 反向去噪过程 def reverse_diffusion(model, x_t, t, beta_schedule): model: 噪声预测网络 x_t: 当前时刻数据 t: 当前时间步 beta_schedule: 噪声调度参数 返回: 去噪后的数据 x_{t-1} # 预测噪声 predicted_noise model(x_t, t) # 计算参数 beta_t beta_schedule[t] alpha_t 1 - beta_t alpha_bar_t torch.prod(1 - beta_schedule[:t]) alpha_bar_t_prev torch.prod(1 - beta_schedule[:t-1]) if t 0 else 1 # 计算均值和方差 mu (1 / torch.sqrt(alpha_t)) * (x_t - beta_t / torch.sqrt(1 - alpha_bar_t) * predicted_noise) variance (1 - alpha_bar_t_prev) / (1 - alpha_bar_t) * beta_t # 采样 x_{t-1} if t 0: return mu else: return mu torch.sqrt(variance) * torch.randn_like(x_t) # 噪声调度示例余弦调度 def cosine_beta_schedule(T, s0.008): steps torch.arange(T 1) f_t torch.cos((steps / T s) / (1 s) * torch.pi / 2) ** 2 alpha_bar f_t / f_t[0] betas torch.clamp(1 - (alpha_bar[1:] / alpha_bar[:-1]), max0.999) return betas实际应用需要更完整的UNet架构、更精细的噪声调度和大量的训练迭代以下仅供参考。# 伪代码 for x0 in data_loader: t uniform_sample(1, T) x_t, true_noise forward_diffusion(x0, t, beta_schedule) pred_noise model(x_t, t) loss F.mse_loss(pred_noise, true_noise) loss.backward()训练与采样训练步骤从数据集中采样。随机选择时间步。采样噪声。计算损失并更新网络参数。采样步骤从开始。从 ( tT ) 到 ( t1 ) 逐步去噪预测噪声。计算并添加剩余噪声若 ( t1 )。输出作为生成结果。改进与变体噪声调度优化线性或余弦调度调整平衡前向过程的噪声添加速率。加速采样通过减少采样步数如 DDIM或修改逆向过程如 DPM-Solver提升效率。条件生成引入类别标签、文本描述等条件信息扩展模型应用场景。数学公式与算法需结合具体实现调整参数实际应用中需注意噪声调度和网络结构的设计对生成质量的影响。本文来源于网络学习后通过个人总结等完成感谢各位前辈的总结如有不妥或有误的地方欢迎大家来讨论批评指正