第3章:扩散模型的数学原理
逆向去噪过程:从噪声中恢复数据
核心思想
逆向去噪过程是扩散模型的核心创新,其目标是通过学习逐步逆转正向扩散过程,从纯噪声数据中重建原始数据分布。该过程可视为一个参数化的马尔可夫链,通过一系列逐步细化的去噪步骤实现数据生成。
数学形式化
给定正向扩散过程定义的噪声数据分布 ,逆向过程定义为一个参数化的转移分布:
其中每个逆向步骤 被建模为高斯分布(对于连续数据):
关键推导
变分推断视角:
- 通过最小化逆向过程与真实后验 的KL散度推导目标函数
- 真实后验的闭式解(当扩散系数较小时):
其中
分数匹配联系:
- 逆向过程可表示为对数据对数概率梯度(分数函数)的学习:
- 通过朗之万动力学实现采样:
- 逆向过程可表示为对数据对数概率梯度(分数函数)的学习:
训练目标
简化后的损失函数(噪声预测形式):
算法实现
def reverse_process(model, x_T, T, betas):
"""
逆向去噪采样过程
Args:
model: 训练好的噪声预测模型
x_T: 初始噪声样本
T: 总时间步数
betas: 噪声调度参数
"""
alphas = 1 - betas
alphas_cumprod = torch.cumprod(alphas, dim=0)
x_t = x_T
for t in reversed(range(T)):
# 预测噪声分量
epsilon_theta = model(x_t, t)
# 计算均值
alpha_t = alphas[t]
alpha_cumprod_t = alphas_cumprod[t]
mean = (x_t - (1-alpha_t)/torch.sqrt(1-alpha_cumprod_t)*epsilon_theta)/torch.sqrt(alpha_t)
# 添加噪声(最后一步除外)
if t > 0:
noise = torch.randn_like(x_t)
x_t = mean + torch.sqrt(betas[t]) * noise
else:
x_t = mean
return x_t
可视化案例
图示:逆向去噪过程逐步将噪声数据(右)转化为清晰样本(左),每个步骤基于学习的噪声预测模型调整数据分布
理论性质
- 渐进精确性:当步长时,逆向过程可精确匹配数据分布
- 稳定训练:与GAN不同,扩散模型的逆向过程训练目标提供平滑的梯度信号
- 表达能力:通过足够多的扩散步骤,理论上可以建模任意复杂的数据分布
实际考虑
- 噪声调度:的选择影响训练稳定性和生成质量(线性/余弦调度等)
- 采样加速:可通过DDIM等非马尔可夫方法减少必要采样步数
- 条件生成:通过修改的输入实现条件控制(见第11章)
注:实际书籍内容应包含:
1. 更多数学推导细节(如ELBO分解)
2. 不同参数化方式的比较(预测噪声vs预测均值)
3. 与随机微分方程理论的联系
4. 实际训练技巧(学习率调度、梯度裁剪等)
5. 配套的完整代码实现(含U-Net架构示例)