扩散模型:原理、训练与应用全解析
立即解锁
发布时间: 2025-08-31 00:05:20 阅读量: 9 订阅数: 14 AIGC 

### 扩散模型:原理、训练与应用全解析
#### 1. 扩散模型概述
扩散模型作为一种强大的生成模型,融合了概率建模和随机映射的思想。它由编码器和解码器两部分构成。编码器将输入的数据样本 $x$ 经过一系列中间潜在变量 $z_1, z_2, \cdots, z_T$ 进行映射,该过程是预先指定的,通过逐渐将输入与白噪声样本混合,最终使得最终潜在变量的条件分布 $q(z_T|x)$ 和边际分布 $q(z_T)$ 都变为标准正态分布。解码器则是反向过程,从 $z_T$ 开始,通过一系列网络将数据映射回 $z_{T - 1}, \cdots, z_1$,直至最终重新创建出数据点 $x$。在编码器和解码器中,映射都是随机的而非确定性的。具体流程如下:
```mermaid
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A([输入数据 x]):::startend --> B(编码器):::process
B --> C(z1):::process
C --> D(z2):::process
D --> ...(...):::process
... --> E(zT):::process
E --> F(解码器):::process
F --> G(zT-1):::process
G --> H(zT-2):::process
H --> ...2(...):::process
...2 --> I(z1):::process
I --> J([输出数据 x]):::startend
```
由于编码器过程是预先指定的,所以所有需要学习的参数都在解码器中。解码器中的一系列网络经过训练,用于在相邻的潜在变量对 $z_t$ 和 $z_{t - 1}$ 之间进行反向映射,损失函数促使每个网络反转相应的编码器步骤,从而逐渐从表示中去除噪声,直到得到一个看起来真实的数据示例。
#### 2. 编码器(正向过程)
编码器的正向过程是将数据示例 $x$ 按照以下规则映射到一系列与 $x$ 大小相同的中间变量 $z_1, z_2, \cdots, z_T$:
- $z_1 = \sqrt{1 - \beta_1} \cdot x + \sqrt{\beta_1} \cdot \epsilon_1$
- $z_t = \sqrt{1 - \beta_t} \cdot z_{t - 1} + \sqrt{\beta_t} \cdot \epsilon_t$,其中 $\forall t \in \{2, \cdots, T\}$,$\epsilon_t$ 是从标准正态分布中抽取的噪声。
这里的超参数 $\beta_t \in [0, 1]$ 决定了噪声混合的速度,它们共同被称为噪声调度。正向过程也可以等价地写成概率形式:
- $q(z_1|x) = \mathcal{N}_{z_1}[\sqrt{1 - \beta_1}x, \beta_1I]$
- $q(zt|zt−1) = \mathcal{N}_{zt}[\sqrt{1 - \beta_t}zt−1, \beta_tI]$,$\forall t \in \{2, \cdots, T\}$
这是一个马尔可夫链,因为 $z_t$ 的概率完全由前一个变量 $z_{t - 1}$ 的值决定。经过足够多的步骤 $T$,原始数据的所有痕迹都会被去除,$q(z_T|x) = q(z_T)$ 变为标准正态分布。
##### 2.1 扩散核 $q(z_t|x)$
为了训练解码器来反转这个过程,我们需要在时间 $t$ 为同一个示例 $x$ 使用多个样本 $z_t$。当 $t$ 很大时,使用上述公式顺序生成这些样本会很耗时。幸运的是,存在一个封闭形式的表达式 $q(z_t|x)$,它允许我们在不计算中间变量 $z_1, \cdots, z_{t - 1}$ 的情况下,直接根据初始数据点 $x$ 抽取样本 $z_t$,这就是扩散核。通过推导可得:
$z_t = \sqrt{\alpha_t} \cdot x + \sqrt{1 - \alpha_t} \cdot \epsilon$,其中 $\alpha_t = \prod_{s = 1}^{t} (1 - \beta_s)$。等价的概率形式为:
$q(z_t|x) = \mathcal{N}_{z_t}[\sqrt{\alpha_t} \cdot x, (1 - \alpha_t)I]$
对于任何起始数据点 $x$,变量 $z_t$ 都服从具有已知均值和方差的正态分布。因此,如果我们不关心通过中间变量 $z_1, \cdots, z_{t - 1}$ 的演化历史,就可以很容易地从 $q(z_t|x)$ 生成样本。
##### 2.2 边际分布 $q(z_t)$
边际分布 $q(z_t)$ 是在给定可能的起始点 $x$ 的分布以及每个起始点的可能扩散路径的情况下,观察到 $z_t$ 值的概率。它可以通过考虑联合分布 $q(x, z_{1...t})$ 并对除 $z_t$ 之外的所有变量进行边缘化来计算:
$q(z_t) = \int \int q(z_{1...t}, x) dz_{1...t - 1} dx = \int \int q(z_{1...t}|x) Pr(x) dz_{1...t - 1} dx$
由于我们现在有了一个可以“跳过”中间变量的扩散核 $q(z_t|x)$ 的表达式,所以也可以等价地写成:
$q(z_t) = \int q(z_t|x) Pr(x) dx$
因此,如果我们反复从数据分布 $Pr(x)$ 中采样,并将扩散核 $q(z_t|x)$ 叠加在每个样本上,结果就是边际分布 $q(z_t)$。然而,由于我们不知道原始数据分布 $Pr(x)$,所以边际分布不能写成封闭形式。
##### 2.3 条件分布 $q(z_{t - 1}|z_t)$
我们将条件概率 $q(z_t|z_{t - 1})$ 定义为混合过程。为了反转这个过程,我们应用贝叶斯规则:
$q(z_{t - 1}|z_t) = \frac{q(z_t|z_{t - 1})q(z_{t - 1})}{q(z_t)}$
由于
0
0
复制全文
相关推荐










