ddpm生成
时间: 2025-05-16 19:00:53 浏览: 28
### 去噪扩散概率模型 (DDPM) 的生成过程
#### 正向扩散过程
正向扩散过程是一个逐步将噪声加入数据的过程。初始输入通常是一张清晰的图像,在一系列离散的时间步 $ t \in [1, T] $ 中逐渐添加高斯噪声,最终使得原始信号完全被噪声覆盖。这一过程可以用以下公式描述:
$$ q(x_t | x_{t-1}) = \mathcal{N}(x_t; \sqrt{1-\beta_t}x_{t-1}, \beta_t I) $$
其中 $\beta_t$ 是预先定义的小常数序列[^1]。
#### 反向扩散过程
反向扩散过程的目标是从纯噪声中恢复出原始的数据分布。这一步骤依赖于一个神经网络(通常是 U-Net 架构),该网络学习预测每一步所要移除的噪声量。具体而言,给定带噪声的样本 $ x_t $ 和时间步 $ t $ ,目标是估计对应的去噪后的样本 $ x_{t-1} $ 。此过程中引入了一个 time embedding 层来编码当前时间步的信息并将其融入到整个网络之中[^2]。
以下是基于 PyTorch 实现的一个简单版本的 DDPM 训练框架代码片段:
```python
import torch.nn as nn
import torch
class TimeEmbedding(nn.Module):
def __init__(self, dim):
super().__init__()
self.dim = dim
def forward(self, timesteps):
half_dim = self.dim // 2
emb = math.log(10000) / (half_dim - 1)
freqs = torch.exp(torch.arange(half_dim).to(device=timesteps.device) * -emb)
args = timesteps[:, None].float() * freqs[None]
return torch.cat([torch.sin(args), torch.cos(args)], dim=-1)
class UNetModel(nn.Module):
def __init__(...): ...
def p_sample(model, x_t, t, noise_fn=torch.randn_like):
betas = get_betas()
alpha = 1. - betas[t]
sqrt_alpha_recip = 1./torch.sqrt(alpha)
pred_noise = model(x_t, t)
mean_pred = sqrt_alpha_recip*(x_t - ((1-alpha)/torch.sqrt(1.-alpha_cumprod[t]))*pred_noise)
if t == 0:
return mean_pred
else:
posterior_variance = betas[t]*((1.-alpha_cumprod_prev[t])/(1.-alpha_cumprod[t]))
eps = noise_fn(x_t)
return mean_pred + torch.sqrt(posterior_variance)*eps
```
上述代码展示了如何利用 `UNet` 模型以及 `Time Embedding` 来完成单次逆向采样的操作。
#### 扩散损失函数
在训练期间,主要优化的是重构误差加上KL散度项构成的整体变分下界(VLB),即所谓的“扩散损失”。通过最小化这个损失,可以使模型更好地拟合真实的后验分布,并提高生成质量。然而,由于前向扩散过程中不可避免地会带来一些信息丢失现象,因此实际应用时常需借助外部指导机制进一步提升效果[^3]。
#### 高分辨率图像生成策略
针对更高分辨率下的图片合成任务,有研究者提出了两阶段的方法论:先使用较低尺寸的基础解码器生成初步结果;再经由专门设计用于放大细节特征的 Upsampler 子模块执行逐级增强处理直至达到期望大小为止。例如 Glide v2 就采用了类似的架构设置——基础 decoder 使用了规模达 3.5B 参数级别的 GLIDE 模型实例作为核心组件之一;而对于 upsampling 则分别配置了不同类型的随机扰动规划方案(linear vs cosine schedules)[^4]。
---
阅读全文
相关推荐


















