Files
Notes/机器学习/深度学习模型/04-扩散模型/2-DDPM与SD/1-DDPM-Diffusion扩散模型.md
2026-05-16 17:16:51 +08:00

218 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: 1-DDPM-Diffusion扩散模型
draft: false
tags:
- DDPM
- 扩散模型
- 生成模型
- 深度学习
---
# Diffusion 扩散模型 (DDPM) 核心理论与严格推导
![[Pasted image 20260516171530.png]]
## 一、 概述与核心思想
Diffusion 扩散模型是一个类似多层 VAE变分自编码器架构的生成模型。它的核心思想可以提炼为两个互逆的过程
1. **前向过程(加噪)**:通过输入一个具体的真实样本 $x_0$,在给定的时间步长 $T$ 内,通过不断注入高斯噪声,使整个样本最终完全失去原有特征,退化到一个已知的标准正态分布状态(纯噪声)。
2. **逆向过程(去噪)**:然后,模型通过神经网络拟合前向过程确定的**真实后验分布**,最终学习到一个近似的逆向转移概率 $p_\theta(x_{t-1}|x_t)$,从而实现从纯噪声中逐步生成真实数据的目的。
---
## 二、 第一部分:前向过程(噪声处理与马尔可夫链)
前向过程Forward Process是一个参数固定的马尔可夫链Markov Chain。我们人为定义每一步的加噪过程如下
$$x_t = \sqrt{\alpha_t} x_{t - 1} + \sqrt{1 - \alpha_t} \epsilon_t$$
其中,$\epsilon_t \sim \mathcal{N}(0, I)$ 是引入的标准高斯噪声,$\alpha_t$ 是预设的超参数(通常随着时间步 $t$ 的增加,$\alpha_t$ 会逐渐减小,这意味着越往后加入的噪声比例越大)。为了书写和推导方便,通常也定义 $\beta_t = 1 - \alpha_t$。
这个式子可以等价改写为条件概率分布的形式:
$$q(x_t|x_{t-1}) = \mathcal{N}(x_t; \sqrt{\alpha_t} x_{t - 1}, (1 - \alpha_t) I)$$
其中,前一部分 $\sqrt{\alpha_t} x_{t - 1}$ 是均值,后一部分 $(1 - \alpha_t) I$ 是协方差矩阵(方差)。
### 多步跳跃推导(重参数化技巧)
由马尔可夫链的性质,每一个 $x_t$ 只和上一个时间的 $x_{t-1}$ 状态有关。我们可以将上述式子展开,推导任意时刻 $x_t$ 与初始状态 $x_0$ 的直接关系:
$$x_t = \sqrt{\alpha_t} x_{t - 1} + \sqrt{1 - \alpha_t} \epsilon_t$$
$$x_{t-1} = \sqrt{\alpha_{t-1}} x_{t - 2} + \sqrt{1 - \alpha_{t-1}} \epsilon_{t-1}$$
将 $x_{t-1}$ 代入 $x_t$ 的表达式中:
$$x_t = \sqrt{\alpha_t} (\sqrt{\alpha_{t-1}} x_{t - 2} + \sqrt{1 - \alpha_{t-1}} \epsilon_{t-1}) + \sqrt{1 - \alpha_t} \epsilon_t$$
$$x_t = \sqrt{\alpha_t \alpha_{t-1}} x_{t - 2} + \sqrt{\alpha_t (1 - \alpha_{t-1})} \epsilon_{t-1} + \sqrt{1 - \alpha_t} \epsilon_t$$
根据高斯分布的可加性:两个独立的高斯分布 $\mathcal{N}(0, \sigma_1^2 I)$ 和 $\mathcal{N}(0, \sigma_2^2 I)$ 相加,结果仍是高斯分布 $\mathcal{N}(0, (\sigma_1^2 + \sigma_2^2) I)$。
上述两个噪声项的方差之和为:$\alpha_t (1 - \alpha_{t-1}) + (1 - \alpha_t) = 1 - \alpha_t \alpha_{t-1}$。
合并噪声项后得到:
$$x_t = \sqrt{\alpha_t \alpha_{t-1}} x_{t - 2} + \sqrt{1 - \alpha_t \alpha_{t-1}} \bar{\epsilon}$$
依次代入上述式子直到 $x_0$,我们定义 $\bar{\alpha}_t = \prod_{i=1}^t \alpha_i$,化简后得到最终的一步到位公式:
$$x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon'$$
_(注意此处 $\epsilon' \sim \mathcal{N}(0, I)$ 是累积合成后的标准高斯噪声)_
这一个结论可以衍生出以下**三个极其重要的等价推论**
1. 可以直接反解出真实输入:
$$x_0 = \frac{1}{\sqrt{\bar{\alpha}_t}}(x_t - \sqrt{1 - \bar{\alpha}_t} \epsilon')$$
2. 随机变量的分布表达:
$$x_t \sim \mathcal{N}(\sqrt{\bar{\alpha}_t} x_0, (1 - \bar{\alpha}_t) I)$$
3. 概率密度函数表达:
$$q(x_t|x_0) = \mathcal{N}(x_t; \sqrt{\bar{\alpha}_t} x_0, (1 - \bar{\alpha}_t) I)$$
---
## 三、 第二部分:逆向过程与学习真实后验分布
我们希望模型能够学习到逆向过程的条件分布 $p_\theta(x_{t-1} | x_t)$。为了训练这个神经网络,我们需要一个目标,即用前向过程的**真实后验分布** $q(x_{t-1} | x_t, x_0)$ 作为指导。
_(训练时的近似目标:$q(x_{t-1} | x_t, x_0) \approx p_\theta(x_{t-1} | x_t)$)_
### 1. 贝叶斯公式展开
将已知条件 $x_0$ 视作先验条件,由条件贝叶斯公式 $P(A|B,C) = \frac{P(B|A,C) P(A|C)}{P(B|C)}$,我们得到:
$$q(x_{t-1} | x_t, x_0) = \frac{q(x_t | x_{t-1}, x_0) q(x_{t-1} | x_0)}{q(x_t | x_0)}$$
由于马尔可夫链的性质,$x_t$ 只依赖于 $x_{t-1}$,所以等式右边第一项中的 $x_0$ 可以消掉(即 $q(x_t | x_{t-1}, x_0) = q(x_t | x_{t-1})$),得到:
$$q(x_{t-1} | x_t, x_0) = \frac{q(x_t | x_{t-1}) q(x_{t-1} | x_0)}{q(x_t | x_0)}$$
### 2. 高斯分布的配方推导
根据第一部分的结论,公式右侧的三个概率分布均为已知的高斯分布:
- $q(x_t | x_{t-1}) = \mathcal{N}(x_t; \sqrt{\alpha_t} x_{t - 1}, (1 - \alpha_t) I)$
- $q(x_{t-1} | x_0) = \mathcal{N}(x_{t-1}; \sqrt{\bar{\alpha}_{t-1}} x_0, (1 - \bar{\alpha}_{t-1}) I)$
- $q(x_t | x_0) = \mathcal{N}(x_t; \sqrt{\bar{\alpha}_t} x_0, (1 - \bar{\alpha}_t) I)$
我们将单变量正态分布的概率密度函数 $\rho(x) = \frac{1}{\sqrt{2\pi \sigma^2}} e^{-\frac{(x - \mu)^2}{2 \sigma^2}}$ 代入。由于我们只关心 $x_{t-1}$ 的分布形式,可以省略常数项,只看指数部分(高斯乘积与除法操作):
$$q(x_{t-1} | x_t, x_0) \propto \exp \left\{ -\frac{1}{2} \left[ \frac{(x_t - \sqrt{\alpha_t} x_{t-1})^2}{1 - \alpha_t} + \frac{(x_{t-1} - \sqrt{\bar{\alpha}_{t-1}} x_0)^2}{1 - \bar{\alpha}_{t-1}} - \frac{(x_t - \sqrt{\bar{\alpha}_t} x_0)^2}{1 - \bar{\alpha}_t} \right] \right\}$$
由于我们要求的是关于 $x_{t-1}$ 的分布,我们将括号内式子展开,并提取包含 $x_{t-1}^2$ 和 $x_{t-1}$ 的项,将其凑成 $a x_{t-1}^2 - 2b x_{t-1} + c$ 的形式:
$$= \exp \left\{ -\frac{1}{2} \left[ \left( \frac{\alpha_t}{1-\alpha_t} + \frac{1}{1-\bar{\alpha}_{t-1}} \right) x_{t-1}^2 - 2 \left( \frac{\sqrt{\alpha_t}}{1-\alpha_t} x_t + \frac{\sqrt{\bar{\alpha}_{t-1}}}{1-\bar{\alpha}_{t-1}} x_0 \right) x_{t-1} + C(x_t, x_0) \right] \right\}$$
配方后,它必然构成一个新的高斯分布 $\mathcal{N}(x_{t-1}; \tilde{\mu}_t, \tilde{\beta}_t I)$,其中:
- 方差的倒数(精度):$\frac{1}{\tilde{\beta}_t} = \frac{\alpha_t}{1-\alpha_t} + \frac{1}{1-\bar{\alpha}_{t-1}} = \frac{\alpha_t - \bar{\alpha}_t + 1 - \alpha_t}{(1-\alpha_t)(1-\bar{\alpha}_{t-1})} = \frac{1-\bar{\alpha}_t}{(1-\alpha_t)(1-\bar{\alpha}_{t-1})}$
- 均值:$\tilde{\mu}_t = \tilde{\beta}_t \times \left( \frac{\sqrt{\alpha_t}}{1-\alpha_t} x_t + \frac{\sqrt{\bar{\alpha}_{t-1}}}{1-\bar{\alpha}_{t-1}} x_0 \right)$
### 3. 后验分布的最终形态
经过上述代数计算,我们最终得到真实后验分布的参数:
$$q(x_{t-1} | x_t, x_0) = \mathcal{N}\left( x_{t-1}; \tilde{\mu}_t(x_t, x_0), \tilde{\beta}_t I \right)$$
**其中均值(与 $x_0$ 和 $x_t$ 有关):**
$$\tilde{\mu}_t(x_t, x_0) = \frac{\sqrt{\bar{\alpha}_{t-1}} \beta_t}{1 - \bar{\alpha}_t} x_0 + \frac{\sqrt{\alpha_t} (1 - \bar{\alpha}_{t-1})}{1 - \bar{\alpha}_t} x_t$$
_(这里记 $\beta_t = 1 - \alpha_t$)_
**其中方差(这是一个随时间 $t$ 变化的超参数/常量):**
$$\tilde{\beta}_t = \frac{1 - \bar{\alpha}_{t-1}}{1 - \bar{\alpha}_t} \cdot \beta_t$$
这个 $q(x_{t-1} | x_t, x_0)$ 就是训练时用于指导模型 $p_\theta$ 学习的”Ground Truth”近似函数。
---
## 四、 ELBO 分解:从变分下界到噪声预测
### 4.1 变分推断框架
DDPM 的训练目标可以通过**变分下界 (Evidence Lower Bound, ELBO)** 推导。设真实数据分布为 $x_0 \sim q(x_0)$,我们希望学习一个生成模型 $p_\theta$。
ELBO 的分解如下:
$$\log p_\theta(x_0) \geq \mathcal{L}_{\text{ELBO}} = \underbrace{\mathbb{E}_{q(x_1|x_0)} \left[ \log p_\theta(x_0|x_1) \right]}_{\text{Reconstruction Term}} + \sum_{t=1}^{T} \underbrace{\mathbb{E}_{q(x_t|x_0)} \left[ \text{KL}(q(x_{t-1}|x_t, x_0) \| p_\theta(x_{t-1}|x_t)) \right]}_{\text{Latent Matching Term}}$$
**直觉解释**
- **Reconstruction Term**:给定 $x_1$,要求模型能够重建 $x_0$。这对应于解码器的重建能力。
- **Latent Matching Term**:要求模型学习到的逆向分布 $p_\theta(x_{t-1}|x_t)$ 尽可能接近真实后验 $q(x_{t-1}|x_t, x_0)$。$t$ 越大(越接近纯噪声),这一项的权重通常越大。
### 4.2 从 ELBO 到噪声预测损失的严格推导
关键步骤在于**重参数化与均值替换**。
已知真实后验均值:
$$\tilde{\mu}_t(x_t, x_0) = \frac{\sqrt{\bar{\alpha}_{t-1}} \beta_t}{1 - \bar{\alpha}_t} x_0 + \frac{\sqrt{\alpha_t} (1 - \bar{\alpha}_{t-1})}{1 - \bar{\alpha}_t} x_t$$
由前向过程反解 $x_0$
$$x_0 = \frac{1}{\sqrt{\bar{\alpha}_t}}(x_t - \sqrt{1 - \bar{\alpha}_t} \epsilon)$$
代入 $\tilde{\mu}_t$,化简后得到:
$$\tilde{\mu}_t(x_t, x_0) = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{\beta_t}{\sqrt{1 - \bar{\alpha}_t}} \epsilon \right)$$
由于 $p_\theta(x_{t-1}|x_t) = \mathcal{N}(x_{t-1}; \mu_\theta(x_t, t), \Sigma_t)$,且 $\Sigma_t$ 为固定常量,最小化 KL 散度等价于最小化均方误差:
$$\| \tilde{\mu}_t - \mu_\theta \|^2 \propto \left\| \epsilon - \underbrace{\sqrt{1 - \bar{\alpha}_t} \cdot \mu_\theta(x_t, t)}_{\text{网络预测的等效噪声}} \right\|^2$$
**结论**:网络 $\epsilon_\theta(x_t, t)$ 直接预测噪声 $\epsilon$,与预测均值 $\mu_\theta$ 在最优解下完全等价。
---
## 五、 模型优化与损失函数
在实际训练中,我们希望神经网络预测的概率分布 $p_\theta(x_{t-1}|x_t) = \mathcal{N}(x_{t-1}; \mu_\theta(x_t, t), \Sigma_\theta)$ 尽可能的逼近上述推导出的真实后验分布 $q$。
通过最小化两者之间的 KL 散度KL Divergence由于两者的方差都被设定为确定的常数这个优化问题直接简化为**拟合两个高斯分布的均值**(即让 $\mu_\theta$ 去逼近 $\tilde{\mu}_t$
$$L \propto \| \tilde{\mu}_t - \mu_\theta \|^2$$
进一步地,如果我们将前向过程中推导出的 $x_0 = \frac{1}{\sqrt{\bar{\alpha}_t}}(x_t - \sqrt{1 - \bar{\alpha}_t} \epsilon)$ 代入到均值表达式 $\tilde{\mu}_t$ 中,会发现拟合均值本质上等价于**让神经网络去预测前向过程中加入的噪声 $\epsilon$**。
最终通过严密的化简DDPM的损失函数化简为一个极其优雅的噪声预测损失Noise Prediction Loss
$$L_{simple} = \mathbb{E}_{t, x_0, \epsilon} \left[ \| \epsilon - \epsilon_\theta(x_t, t) \|^2 \right]$$
这意味着,网络 $\epsilon_\theta$ 只需要根据当前的带噪图像 $x_t$ 和时间步 $t$,预测出这一步中注入的噪声 $\epsilon$ 即可。
### 5.1 采样过程(反向过程)
训练完成后,我们通过以下步骤从纯噪声生成样本:
**Algorithm: DDPM Sampling**
1. **初始化**$x_T \sim \mathcal{N}(0, I)$(纯噪声)
2. **迭代去噪**:对 $t = T, T-1, \dots, 1$ 执行:
$$x_{t-1} = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{\beta_t}{\sqrt{1 - \bar{\alpha}_t}} \epsilon_\theta(x_t, t) \right) + \sqrt{\tilde{\beta}_t} \cdot z, \quad z \sim \mathcal{N}(0, I)$$
其中 $\epsilon_\theta$ 是训练好的噪声预测网络,$\tilde{\beta}_t = \frac{1 - \bar{\alpha}_{t-1}}{1 - \bar{\alpha}_t} \cdot \beta_t$。
3. **输出**$x_0$ 即为生成的样本
**物理意义**:每一步迭代,模型根据当前带噪状态 $x_t$ 预测注入的噪声,然后减去这部分噪声(即”去噪”),再加上少量的随机方差 $\sqrt{\tilde{\beta}_t} z$ 以保持概率流的对齐。
---