DDPM前向加噪过程详细推导

之前整体探索了SD稳定扩散模型的理论基础。

https://blog.csdn.net/liliang199/article/details/156280004

这里尝试进一步详细推导DDPM的前向加噪过程,逐步展示从基本定义到闭式解的完整数学推导。

DDPM前向过程理解扩散模型的基础,也是反向去噪过程推导的前提,关键结论整理如下。

1)闭式解:可以直接从采样任意 ,无需逐步计算

2)可调节性:通过调度控制噪声添加速度

3)理论保证:当 时,收敛到标准高斯分布

4)计算高效:训练时可以随机采样t,直接计算

1. 前向过程定义

1.1 马尔可夫链定义

前向过程是一个马尔可夫链,逐步向数据添加高斯噪声:

其中每一步的转移概率为:

参数说明:

  • :噪声调度参数,满足

  • :保留的信号比例

-:单位矩阵

1.2 重参数化表示

使用重参数化技巧,可以从采样

或者用![\alpha_t](https://latex.csdn.net/eq)表示:

2 递归展开推导

第一步:展开

从定义出发:

第二步:代入

的表达式代入:

代入得:

第三步:展开括号

第四步:合并噪声项

现在有两个独立的噪声项,它们都服从

令:

则A + B是两个独立高斯随机变量的和。

3 高斯分布的性质

性质1:独立高斯变量的线性组合

,且独立,则:

性质2:重参数化

,则:

应用到我们的情况

对于A + B:

  • A的方差系数:

  • B 的方差系数:

总方差系数:

化简:

因此:

用重参数化表示:

其中是一个新的标准高斯噪声。

4 得到递推关系**

将合并的噪声代回的表达式:

其中 \(\epsilon \sim \mathcal{N}(0, I)\)。

4 完全归纳推导

继续之前的的推理过程。

第一步:从,经过2步


代入得:

第二步:合并噪声项

两个独立噪声项的方差和为:

因此:

这里的关键是:系数应该是,而不是从1到t的所有α的乘积。

第三步:推广到从

如果要得到从的闭式解,需要归纳推导:

归纳假设:假设对于从有:

验证k=1:

成立,其中

归纳步骤:假设对k成立,证明对k+1成立:

合并噪声项:

所以:

正确结论:

直接到的闭式解:

其中

但是,如果只从(经过k步),则:

5 闭式解

概率分布形式

前向过程的闭式解为:

重参数化采样

要采样 \(x_t\),可以直接使用:

6 性质分析

6.1 信号衰减

  • 当t=0时,(原始数据)

  • 当t增加时,单调递减

  • 时,

6.2 方差变化

  • 方差 从 0 单调增加到 1

  • 时,信号和噪声的权重相等

6.3 噪声调度设计

通常选择:

例如线性调度:

7 代码示例

以下是噪声调度过程中保留信号比例变化的代码示例。

复制代码
import torch
import numpy as np

def linear_beta_schedule(timesteps, beta_start=1e-4, beta_end=0.02):
    """线性噪声调度"""
    return torch.linspace(beta_start, beta_end, timesteps)

def cosine_beta_schedule(timesteps, s=0.008):
    """余弦噪声调度"""
    steps = timesteps + 1
    x = torch.linspace(0, timesteps, steps)
    alphas_cumprod = torch.cos(((x / timesteps) + s) / (1 + s) * torch.pi * 0.5) ** 2
    alphas_cumprod = alphas_cumprod / alphas_cumprod[0]
    betas = 1 - (alphas_cumprod[1:] / alphas_cumprod[:-1])
    return torch.clip(betas, 0.0001, 0.9999)

def forward_diffusion(x0, t, betas):
    """前向扩散过程采样"""
    # 计算累积参数
    alphas = 1 - betas
    alphas_cumprod = torch.cumprod(alphas, dim=0)
    
    # 采样噪声
    epsilon = torch.randn_like(x0)
    
    # 提取对应时间步的参数
    sqrt_alpha_bar_t = torch.sqrt(alphas_cumprod[t]).reshape(-1, 1, 1, 1)
    sqrt_one_minus_alpha_bar_t = torch.sqrt(1 - alphas_cumprod[t]).reshape(-1, 1, 1, 1)
    
    # 计算加噪后的图像
    xt = sqrt_alpha_bar_t * x0 + sqrt_one_minus_alpha_bar_t * epsilon
    
    return xt, epsilon

# 示例使用
timesteps = 1000
betas = linear_beta_schedule(timesteps)
alphas = 1 - betas
alphas_cumprod = torch.cumprod(alphas, dim=0)

# 可视化alpha_bar的变化
import matplotlib.pyplot as plt
plt.plot(alphas_cumprod.numpy())
plt.xlabel('Timestep')
plt.ylabel('ᾱ_t')
plt.title('Signal Preservation Schedule')
plt.show()

8 数学验证

验证1:均值正确性

这与分布的均值一致。

验证2:方差正确性

假设(已标准化),则:

这确保了方差保持为单位矩阵。

reference


DDPM前向加噪过程详细推导

https://blog.csdn.net/liliang199/article/details/156280004

相关推荐
liliangcsdn12 小时前
基于人类反馈的强化学习框架-RLHF&PPO
人工智能·机器学习
猫天意12 小时前
YOLOv11魔改高效涨点 | 注意力篇 | 坐标注意力CoordAttention:将位置信息硬核嵌入通道,精准捕获长程空间依赖,即插即用,涨点神器!!!
开发语言·人工智能·深度学习·神经网络·yolo·目标检测·低光照增强
irizhao12 小时前
《高质量数据集 分类指南》解读(TC609-5-2025-03)由全国数据标准化技术委员会发布
大数据·人工智能
观无12 小时前
VisionPro 视觉检测工具基础知识点
人工智能·计算机视觉·视觉检测
爱编码的傅同学12 小时前
【今日算法】Leetcode 581.最短无序连续子数组 和 42.接雨水
数据结构·算法·leetcode
min18112345612 小时前
HR人力资源招聘配置流程图制作教程
大数据·网络·人工智能·架构·流程图·求职招聘
ai_xiaogui12 小时前
Stable Diffusion Web UI 绘世版 v4.6.1 整合包:一键极速部署,深度解决 AI 绘画环境配置与 CUDA 依赖难题
人工智能·stable diffusion·环境零配置·高性能内核优化·全功能插件集成·极速部署体验
Σίσυφος190012 小时前
线性与非线性 、齐次非齐次
算法
(❁´◡`❁)Jimmy(❁´◡`❁)12 小时前
4815. 【NOIP2016提高A组五校联考4】ksum
算法
Elastic 中国社区官方博客12 小时前
使用 Elasticsearch 管理 agentic 记忆
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索