目录
-
- 前言
- [1. 引言](#1. 引言)
- [2. 内容脉络](#2. 内容脉络)
- [3. 结论先行](#3. 结论先行)
- [4. 前向加噪公式推导](#4. 前向加噪公式推导)
- [5. 介绍反向引入优化目标](#5. 介绍反向引入优化目标)
前言
学习 UP 主 霹雳吧啦Wz 的 DDPM介绍与公式推导 视频,了解下 DDPM 论文中相关公式使用以及详细推导过程,记录下个人学习笔记,和大家一起分享交流😄
本篇文章主要记录前向加噪公式推导以及介绍反向去噪引入优化目标。
video :DDPM介绍与公式推导
1. 引言
本篇文章我们跟着 UP 主学习有关 DDPM 的相关内容以及对应的一些公式的推导,在讲解之前,UP 提供了一些学习资料,大家感兴趣的可以看看:
- Deep Unsupervised Learning using Nonequilibrium Thermodynamics Sohl-Dickstein+ 2015
- 2015 原始论文,解释扩散模型为什么会被提出。
- Denoising Diffusion Probabilistic Models Ho+ 2020
- 现代 DDPM 的核心原论文,把扩散模型变成了一个结构简洁、容易训练并且能够生成高质量图像的方法。
- Understanding Diffusion Models: A Unified Perspective Luo 2022
- 一篇关于 DDPM 理论综述和教学型论文,把扩散模型的各种数学视角统一起来。
- Diffusion Models Explained with Math From Scratch video
- YouTube 视频,从零开始使用数学解释扩散模型,可以帮助快速建立动态直觉。
- 一文解释 Diffusion Model (一) DDPM 理论推导 article
- 知乎推导文章,逐行代数与概率推导 DDPM。
- 扩散模型(Diffusion Model)详解:直观理解、数学原理、PyTorch 实现 blog
- 周弈帆博客,建立 DDPM 理论与代码之间的桥梁。
需要提前说明的是,扩散模型并不是在 DDPM 这篇论文中提出的,它最早其实是在 Sohl-Dickstein+ 2015 这篇论文里面提出来的,这篇论文年份比较早了,大概是在 15 年的样子。但 DDPM 这篇工作把之前复杂的扩散框架进行了大幅的简化,让扩散模型变得高效,易训练,生成效果更好,也是目前主流的扩散应用技术框架。
2. 内容脉络
那本期分享的一个内容脉络大概如下图所示:

首先我们会去讲一下结论,因为部分同学可能对数学推导不太感兴趣,所以讲完这个结论之后,大家就可以根据一些开源的项目,自己对照去看一下代码了。
那对于有更高要求的同学,我们可以接着往后走,那后面呢我们会去先讲一下前向加噪的系数是如何得到的,然后我们再去推导一下前向单步和多步加噪的公式。
讲完前向加噪过程之后,我们再通过介绍反向去噪过程来引入我们的优化目标,接着我们去推导优化目标 ELBO 或者 VLB,接着我们再去推导反向去噪的单步公式,根据这个公式,我们能够再进一步去推导我们的优化训练目标 L t − 1 L_{t-1} Lt−1 项,然后我们再去推导优化目标 L 0 L_0 L0 项,最后我们再看一下论文当中给出简化后的优化目标,最后的最后我们再来做一个结论的回顾。
OK,那我们正式进入到本次内容的分享。
3. 结论先行
首先结论先行,关于扩散模型的一个加噪过程,我们可以看一下下面这个示意图:

其中 x 0 x_0 x0 对应的是我们真实没有加噪过的清晰图片,那么我们随着不断往里面加入噪声,这里的噪声我们一般都是指的高斯噪声,可以看到我们的图片会慢慢的变噪,最终会得到一个类似于纯高斯噪声的一个图片。
而反向呢就是要从一个纯高斯噪声慢慢去噪,最终得到一张我们想要的清晰图片:

整个完整流程如下面这张动态图所示:

在 DDPM 工作当中,最核心的就是论文当中给出的 Algorithm 1 以及 Algorithm 2:

Algorithm 1 对应的就是我们训练的一个流程,这里简单看一下:
首先这里的 q ( x 0 ) q(\mathbf{x}_0) q(x0) 对应的就是我们的训练集,那这里我们会先从我们的训练集当中采样出一些训练数据;然后我们会再去采样一个时间步 t t t ,这个时间步 t t t 它是在 { 1 , ... , T } \{1, \dots, T\} {1,...,T} 里面去进行一个采样的,而这里的 T T T 我们一般用的是 1000。
接着我们会再去采样一个噪声 ϵ \boldsymbol{\epsilon} ϵ ,它是服从于一个标准多元正态分布的,或者说高斯分布;然后我们会根据我们采样的训练数据 x 0 \mathbf{x}_0 x0 以及我们采样的噪声 ϵ \boldsymbol{\epsilon} ϵ 去计算我们的 x t \mathbf{x}_t xt :
x t = α ˉ t x 0 + 1 − α ˉ t ϵ \mathbf{x}_t = \sqrt{\bar{\alpha}_t}\mathbf{x}_0 + \sqrt{1 - \bar{\alpha}_t}\boldsymbol{\epsilon} xt=αˉt x0+1−αˉt ϵ
那通过这一项,其实我们可以看出我们在训练获取 x t \mathbf{x}_t xt 的时候,并不是真的从 x 0 \mathbf{x}_0 x0 一步一步加噪到 x t \mathbf{x}_t xt ,而是有一个公式能够让我们直接从 x 0 \mathbf{x}_0 x0 加噪到 x t \mathbf{x}_t xt ,这样极大简化了我们构造 x t \mathbf{x}_t xt 的一个流程。
然后我们将 x t \mathbf{x}t xt 以及对应当前这个时间 t t t 输入到我们的模型当中,我们的模型就会预测得到一个噪声项 ϵ θ \boldsymbol{\epsilon}{\theta} ϵθ 。
然后我们拿模型预测噪声项 ϵ θ \boldsymbol{\epsilon}_{\theta} ϵθ 和真实的噪声 ϵ \boldsymbol{\epsilon} ϵ 去计算一个 L2 Loss,我们不断的重复这个流程,直到模型收敛,收敛之后,我们就可以利用我们的模型去进行图像的生成了。
那我们再看一下 Algorithm 2 中 Sampling 采样的过程:
首先我们会去采样一个 x T \mathbf{x}_T xT ,这里的 x T \mathbf{x}_T xT 是直接从一个多元高斯分布里面去采样的,或者说多元正态分布。
然后我们会循环 T T T 次,比如说 T = 1000 T=1000 T=1000 的话,我们就会循环 1000 次,当 t > 1 t > 1 t>1 的时候,我们这里的 z \mathbf{z} z 其实是采样的一个高斯噪声,然后呢我们根据输入的 x t \mathbf{x}_t xt 以及模型根据当前的 x t \mathbf{x}t xt 和时间信息 t t t 预测得到的一个噪声,再加上刚刚我们采样的一个高斯噪声 z \mathbf{z} z ,根据下面这个公式就能计算得到 x t − 1 \mathbf{x}{t-1} xt−1 :
x t − 1 = 1 α t ( x t − 1 − α t 1 − α ˉ t ϵ θ ( x t , t ) ) + σ t z \mathbf{x}_{t-1} = \dfrac{1}{\sqrt{\alpha_t}} \left( \mathbf{x}_t - \dfrac{1-\alpha_t}{\sqrt{1-\bar{\alpha}t}} \boldsymbol{\epsilon}\theta(\mathbf{x}_t, t) \right) + \sigma_t \mathbf{z} xt−1=αt 1(xt−1−αˉt 1−αtϵθ(xt,t))+σtz
那我们不断的去循环,直到最后一步,最后一步的时候,这里的 z \mathbf{z} z 就不再是高斯噪声了,而是一个 0 \mathbf{0} 0 。也就是说,最后一步我们不需要再额外加噪声,最终我们得到 x 0 \mathbf{x}_0 x0 ,就是我们生成的一个清晰图片了。
那这两个算法当中还涉及到一些其他的变量,比如说 α t \alpha_t αt 和 β t \beta_t βt ,那它们两个的关系如下:
α t = 1 − β t \alpha_t=1-\beta_t αt=1−βt
其中这里的 β t \beta_t βt 它是一个协方差系数,或者你也可以理解为噪声强度系数,这里的 β \beta β 在 DDPM 当中是人为定义的,它是从 β 1 = 10 − 4 \beta_1 = 10^{-4} β1=10−4 线性增长到 β T = 0.02 \beta_T=0.02 βT=0.02 。
然后算法中还有一个 α ˉ t \bar{\alpha}_t αˉt 项,它对应的就是 α i \alpha_i αi 的一个连乘的形式:
α ˉ t = ∏ i = 1 t α i \bar{\alpha}t = \prod\limits{i=1}^{t} \alpha_i αˉt=i=1∏tαi
那么在生成图像时,还有一个 σ t \sigma_t σt 项,其计算公式如下:
σ t 2 = β t or σ t 2 = β ~ t = 1 − α ˉ t − 1 1 − α ˉ t β t \sigma_t^2 = \beta_t \quad \text{or} \quad \sigma_t^2=\tilde{\beta}t=\frac{1-\bar{\alpha}{t-1}}{1-\bar{\alpha}_t}\beta_t σt2=βtorσt2=β~t=1−αˉt1−αˉt−1βt
这里的 σ t 2 \sigma_t^2 σt2 呢,我们可以直接令它等于我们人为设定的协方差系数 β t \beta_t βt ,或者我们也可以令它等于 1 − α ˉ t − 1 1 − α ˉ t β t \frac{1-\bar{\alpha}_{t-1}}{1-\bar{\alpha}_t}\beta_t 1−αˉt1−αˉt−1βt 这一项,那这一项是要根据我们后面推导才能得到的。论文当中有说,无论你用 β t \beta_t βt 还是 β ~ t \tilde{\beta}_t β~t 这一项,它们的效果其实都差不多的。
那讲到这儿,关于 DDPM 我们的结论就已经讲完了,接下来我们就开始进入到 DDPM 的公式推导环节。
4. 前向加噪公式推导
首先我们简单回顾一下正态分布的相关概念。
关于正态分布,我们在中学时其实都有学到过,那个时候我们接触到的正态分布,对应的都是一个一元的正态分布,比如说:
若随机变量 X X X 服从均值为 μ \mu μ ,方差为 σ 2 \sigma^2 σ2 的一个正态分布,或者说高斯分布的话,我们就可以记为:
X ∼ N ( μ , σ 2 ) X \sim \mathcal{N}(\mu, \sigma^2) X∼N(μ,σ2)
Note :随机变量我们一般用大写的 X X X 表示,而对于随机变量的具体取值则用 x x x 小写。
这里的 μ \mu μ 决定着我们这个分布的中心的位置,而这里的 σ 2 \sigma^2 σ2 它决定了我们这个正态分布的一个分散的程度:

其概率密度函数为:
f ( x ) = 1 2 π σ 2 exp ( − ( x − μ ) 2 2 σ 2 ) f(x) = \frac{1}{\sqrt{2\pi \sigma^2}} \exp\left( -\frac{(x-\mu)^2}{2\sigma^2} \right) f(x)=2πσ2 1exp(−2σ2(x−μ)2)
当 μ = 0 , σ 2 = 1 \mu=0,\, \sigma^2=1 μ=0,σ2=1 时,对应的就是一个标准的正态分布或者高斯分布。
注意!由于采样过程是随机、不可微的,因此我们一般会利用重参数化技巧构造可微的采样表达式,如下所示:
x = μ + σ ϵ , ϵ ∼ N ( 0 , 1 ) \boxed{x = \mu + \sigma \epsilon, \qquad \epsilon \sim \mathcal{N}(0,1)} x=μ+σϵ,ϵ∼N(0,1)
那关于正态分布它还有一些性质,比如说多个独立的正态分布进行线性叠加,叠加之后的分布仍然服从正态分布,例如:
若 x 1 ∼ N ( μ 1 , σ 1 2 ) x_1 \sim \mathcal{N}(\mu_1, \sigma_1^2) x1∼N(μ1,σ12), x 2 ∼ N ( μ 2 , σ 2 2 ) x_2 \sim \mathcal{N}(\mu_2, \sigma_2^2) x2∼N(μ2,σ22) 且 x 1 x_1 x1 与 x 2 x_2 x2 互相独立,对于任意实数 a a a 和 b b b ,则有:
y = a x 1 + b x 2 ∼ N ( a μ 1 + b μ 2 , a 2 σ 1 2 + b 2 σ 2 2 ) y = ax_1 + bx_2 \sim \mathcal{N}(a\mu_1 + b\mu_2, a^2\sigma_1^2 + b^2\sigma_2^2) y=ax1+bx2∼N(aμ1+bμ2,a2σ12+b2σ22)
若 x 1 , x 2 , ⋯ , x n x_1, x_2, \cdots, x_n x1,x2,⋯,xn 互相独立,且 x i ∼ N ( μ i , σ i 2 ) x_i \sim \mathcal{N}(\mu_i, \sigma_i^2) xi∼N(μi,σi2) 对于任意实数 a 1 , a 2 , ⋯ , a n a_1, a_2, \cdots, a_n a1,a2,⋯,an ,则有:
y = ∑ i = 1 n a i x i ∼ N ( ∑ i = 1 n a i μ i , ∑ i = 1 n a i 2 σ i 2 ) y = \sum_{i=1}^n a_i x_i \sim \mathcal{N}\left(\sum_{i=1}^n a_i \mu_i, \sum_{i=1}^n a_i^2 \sigma_i^2\right) y=i=1∑naixi∼N(i=1∑naiμi,i=1∑nai2σi2)
那回顾完正态分布相关概念之后,我们就来看一下我们前向加噪的一个过程,关于前向加噪,UP 提到他仿照的是知乎专栏 article 的讲解,大家感兴趣的可以看看这个专栏。

那这里我们先定义我们单步的一个加噪公式:
x t = a t x t − 1 + b t ε t , ε t ∼ N ( 0 , I ) \boldsymbol{x}t = a_t \boldsymbol{x}{t-1}+b_t \boldsymbol{\varepsilon}_t, \qquad \boldsymbol{\varepsilon}_t \sim \mathcal{N}(\boldsymbol{0},\boldsymbol{I}) xt=atxt−1+btεt,εt∼N(0,I)
注意,这个公式是一个递推公式,当 t = 1 t=1 t=1 时 x t − 1 = x 0 \boldsymbol{x}_{t-1}=\boldsymbol{x}_0 xt−1=x0 也就是我们的原始干净的输入图片。另外需要大家稍微留意一下,公式当中加粗的变量如 x t , ε t \boldsymbol{x}_t , \, \boldsymbol{\varepsilon}_t xt,εt 对应的都是高维向量,没有加粗的例如 a t , b t a_t, \, b_t at,bt ,一般对应的就是一个标量。
那我们这里的 x t , x t − 1 \boldsymbol{x}t, \, \boldsymbol{x}{t-1} xt,xt−1 其实就是一个高维向量,因为我们这里是对图像加噪嘛,我们将图像的像素展平的话,它对应的就是一个高维的向量,那这里的噪声项 ε t \boldsymbol{\varepsilon}_t εt 它其实也是一个向量,所以它也是一个加粗的形式。
而对于这里的 a t , b t a_t, \, b_t at,bt 加权系数,我们对它们有一个限制,要求:
0 < a t < 1 , 0 < b t < 1 0<a_t<1, \quad 0<b_t<1 0<at<1,0<bt<1
然后针对这里的 ε t \boldsymbol{\varepsilon}_t εt ,刚才说了,它服从一个标准多元正态分布,或者说高斯分布,那由于 b t b_t bt 是一个标量常数,所以我们的 b t ε t b_t \boldsymbol{\varepsilon}_t btεt 的协方差矩阵为:
Σ = b t 2 I = ( b t 2 0 ⋯ 0 0 b t 2 ⋯ 0 ⋮ ⋮ ⋱ ⋮ 0 0 ⋯ b t 2 ) \Sigma = b_t^2 \boldsymbol{I}= \begin{pmatrix} b_t^2 & 0 & \cdots & 0 \\ 0 & b_t^2 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & b_t^2 \end{pmatrix} Σ=bt2I= bt20⋮00bt2⋮0⋯⋯⋱⋯00⋮bt2
由于 b t ε t ∼ N ( 0 , b t 2 I ) b_t \boldsymbol{\varepsilon}t \sim \mathcal{N}(\boldsymbol{0}, b_t^2 \boldsymbol{I}) btεt∼N(0,bt2I) ,因此在给定 x t − 1 \boldsymbol{x}{t-1} xt−1 后, x t \boldsymbol{x}_t xt 服从协方差为 b t 2 I b_t^2 \boldsymbol{I} bt2I 的各向同性多元高斯分布。其各维度方差相同,并且由于它是多元高斯分布,协方差矩阵的非对角元素为零也意味着各维度相互独立。
那有了这样的一个加噪的公式之后呢,我们也可以写出关于 x t − 1 \boldsymbol{x}_{t-1} xt−1 的一个加噪形式:
x t − 1 = a t − 1 x t − 2 + b t − 1 ε t − 1 , ε t − 1 ∼ N ( 0 , I ) \boldsymbol{x}{t-1} = a{t-1} \boldsymbol{x}{t-2}+b{t-1} \boldsymbol{\varepsilon}{t-1}, \qquad \boldsymbol{\varepsilon}{t-1} \sim \mathcal{N}(\boldsymbol{0},\boldsymbol{I}) xt−1=at−1xt−2+bt−1εt−1,εt−1∼N(0,I)
然后我们将这里的 x t − 1 \boldsymbol{x}_{t-1} xt−1 带入到上面 x t \boldsymbol{x}_t xt 那个式子,我们就能得到下面这个式子:
x t = a t x t − 1 + b t ε t = a t ( a t − 1 x t − 2 + b t − 1 ε t − 1 ) + b t ε t = a t a t − 1 x t − 2 + a t b t − 1 ε t − 1 + b t ε t \begin{align*} \boldsymbol{x}t &= a_t \boldsymbol{x}{t-1}+b_t \boldsymbol{\varepsilon}t \\ &=a_t(a{t-1} \boldsymbol{x}{t-2}+b{t-1} \boldsymbol{\varepsilon}{t-1})+b_t \boldsymbol{\varepsilon}t \\ &= a_ta{t-1} \boldsymbol{x}{t-2} + a_tb_{t-1} \boldsymbol{\varepsilon}_{t-1}+b_t \boldsymbol{\varepsilon}_t \end{align*} xt=atxt−1+btεt=at(at−1xt−2+bt−1εt−1)+btεt=atat−1xt−2+atbt−1εt−1+btεt
然后我们再将 x t − 2 \boldsymbol{x}{t-2} xt−2 写成一个关于 x t − 3 \boldsymbol{x}{t-3} xt−3 的一个加噪形式:
x t − 2 = a t − 2 x t − 3 + b t − 2 ε t − 2 , ε t − 2 ∼ N ( 0 , I ) \boldsymbol{x}{t-2} = a{t-2} \boldsymbol{x}{t-3}+b{t-2} \boldsymbol{\varepsilon}{t-2}, \qquad \boldsymbol{\varepsilon}{t-2} \sim \mathcal{N}(\boldsymbol{0},\boldsymbol{I}) xt−2=at−2xt−3+bt−2εt−2,εt−2∼N(0,I)
我们也代入到上面 x t \boldsymbol{x}_t xt 的计算公式,就能进一步得到下面的公式:
x t = a t a t − 1 x t − 2 + a t b t − 1 ε t − 1 + b t ε t = a t a t − 1 ( a t − 2 x t − 3 + b t − 2 ε t − 2 ) + a t b t − 1 ε t − 1 + b t ε t = a t a t − 1 a t − 2 x t − 3 + a t a t − 1 b t − 2 ε t − 2 + a t b t − 1 ε t − 1 + b t ε t \begin{align*} \boldsymbol{x}t &= a_ta{t-1} \boldsymbol{x}{t-2} + a_tb{t-1} \boldsymbol{\varepsilon}{t-1}+b_t \boldsymbol{\varepsilon}t \\ &= a_ta{t-1} ( a{t-2} \boldsymbol{x}{t-3}+b{t-2} \boldsymbol{\varepsilon}{t-2}) + a_tb{t-1} \boldsymbol{\varepsilon}{t-1}+b_t \boldsymbol{\varepsilon}t \\ &= a_ta{t-1}a{t-2} \boldsymbol{x}{t-3}+ a_ta{t-1}b_{t-2} \boldsymbol{\varepsilon}{t-2} + a_tb{t-1} \boldsymbol{\varepsilon}_{t-1}+b_t \boldsymbol{\varepsilon}_t \end{align*} xt=atat−1xt−2+atbt−1εt−1+btεt=atat−1(at−2xt−3+bt−2εt−2)+atbt−1εt−1+btεt=atat−1at−2xt−3+atat−1bt−2εt−2+atbt−1εt−1+btεt
如果我们进一步展开,其实就能得到一个 x t \boldsymbol{x}_t xt 关于 x 0 \boldsymbol{x}_0 x0 的一个加噪的公式:
x t = ( a t a t − 1 ⋯ a 1 ) x 0 + ( a t a t − 1 ⋯ a 2 ) b 1 ε 1 + ⋯ + ( a t a t − 1 ) b t − 2 ε t − 2 + a t b t − 1 ε t − 1 + b t ε t \boldsymbol{x}t = (a_t a{t-1} \cdots a_1)\boldsymbol{x}0 + \boxed{(a_t a{t-1} \cdots a_2)b_1 \boldsymbol{\varepsilon}1 + \cdots + (a_t a{t-1})b_{t-2} \boldsymbol{\varepsilon}{t-2} + a_t b{t-1} \boldsymbol{\varepsilon}_{t-1} + b_t \boldsymbol{\varepsilon}_t} xt=(atat−1⋯a1)x0+(atat−1⋯a2)b1ε1+⋯+(atat−1)bt−2εt−2+atbt−1εt−1+btεt
那后面方框里面的这个部分呢其实全都是噪声,那根据我们前面提到的多个独立正态分布的线性叠加,仍服从正态分布,虽然我们这里是多元正态分布,它依然满足这样的个性质,所以其实方框这部分线性叠加之后,它仍满足一个多元正态分布:
N ( 0 , ( ( a t a t − 1 ⋯ a 2 ) 2 b 1 2 + ⋯ + ( a t a t − 1 ) 2 b t − 2 2 + a t 2 b t − 1 2 + b t 2 ) ‾ I ) \mathcal{N}\left(\boldsymbol{0}, \underline{((a_t a_{t-1} \cdots a_2)^2 b_1^2 + \cdots + (a_t a_{t-1})^2 b_{t-2}^2 + a_t^2 b_{t-1}^2 + b_t^2)}\boldsymbol{I}\right) N(0,((atat−1⋯a2)2b12+⋯+(atat−1)2bt−22+at2bt−12+bt2)I)
那这个多元正态分布的均值为 0 \boldsymbol{0} 0 ,协方差系数其实就是对应着上面每一个噪声项前面的系数的平方和。
下面我们来单独分析下这个协方差系数:
( a t a t − 1 ⋯ a 2 ) 2 b 1 2 + ⋯ + ( a t a t − 1 ) 2 b t − 2 2 + a t 2 b t − 1 2 + b t 2 = ( i ) ( a t a t − 1 ⋯ a 1 ) 2 + ( a t a t − 1 ⋯ a 2 ) 2 b 1 2 + ( a t a t − 1 ⋯ a 3 ) 2 b 2 2 + ⋯ + ( a t a t − 1 ) 2 b t − 2 2 + a t 2 b t − 1 2 + b t 2 − ( a t a t − 1 ⋯ a 1 ) 2 = ( i i ) ( a t a t − 1 ⋯ a 2 ) 2 ( a 1 2 + b 1 2 ) + ( a t a t − 1 ⋯ a 3 ) 2 b 2 2 + ⋯ + ( a t a t − 1 ) 2 b t − 2 2 + a t 2 b t − 1 2 + b t 2 − ( a t a t − 1 ⋯ a 1 ) 2 = ( i i i ) ( a t a t − 1 ⋯ a 3 ) 2 ( a 2 2 ( a 1 2 + b 1 2 ) + b 2 2 ) + ⋯ + ( a t a t − 1 ) 2 b t − 2 2 + a t 2 b t − 1 2 + b t 2 − ( a t a t − 1 ⋯ a 1 ) 2 = ( i v ) a t 2 ( a t − 1 2 ( ⋯ ( a 2 2 ( a 1 2 + b 1 2 ) + b 2 2 ) + ⋯ ) + b t − 1 2 ) + b t 2 − ( a t a t − 1 ⋯ a 1 ) 2 \begin{align*} &(a_t a_{t-1} \cdots a_2)^2 b_1^2 + \cdots + (a_t a_{t-1})^2 b_{t-2}^2 + a_t^2 b_{t-1}^2 + b_t^2 \\ \overset{(i)}{=} & \boxed{(a_t a_{t-1} \cdots a_1)^2} + (a_t a_{t-1} \cdots a_2)^2 b_1^2 + (a_t a_{t-1} \cdots a_3)^2 b_2^2 + \cdots + (a_t a_{t-1})^2 b_{t-2}^2 + a_t^2 b_{t-1}^2 + b_t^2 - \boxed{(a_t a_{t-1} \cdots a_1)^2} \\ \overset{(ii)}{=} & (a_t a_{t-1} \cdots a_2)^2(a_1^2 + b_1^2) + (a_t a_{t-1} \cdots a_3)^2 b_2^2 + \cdots + (a_t a_{t-1})^2 b_{t-2}^2 + a_t^2 b_{t-1}^2 + b_t^2 - (a_t a_{t-1} \cdots a_1)^2 \\ \overset{(iii)}{=} & (a_t a_{t-1} \cdots a_3)^2(a_2^2(a_1^2 + b_1^2) + b_2^2) + \cdots + (a_t a_{t-1})^2 b_{t-2}^2 + a_t^2 b_{t-1}^2 + b_t^2 - (a_t a_{t-1} \cdots a_1)^2 \\ \overset{(iv)}{=} & a_t^2(a_{t-1}^2(\cdots(a_2^2(a_1^2 + b_1^2) + b_2^2) + \cdots) + b_{t-1}^2) + b_t^2 - (a_t a_{t-1} \cdots a_1)^2 \end{align*} =(i)=(ii)=(iii)=(iv)(atat−1⋯a2)2b12+⋯+(atat−1)2bt−22+at2bt−12+bt2(atat−1⋯a1)2+(atat−1⋯a2)2b12+(atat−1⋯a3)2b22+⋯+(atat−1)2bt−22+at2bt−12+bt2−(atat−1⋯a1)2(atat−1⋯a2)2(a12+b12)+(atat−1⋯a3)2b22+⋯+(atat−1)2bt−22+at2bt−12+bt2−(atat−1⋯a1)2(atat−1⋯a3)2(a22(a12+b12)+b22)+⋯+(atat−1)2bt−22+at2bt−12+bt2−(atat−1⋯a1)2at2(at−12(⋯(a22(a12+b12)+b22)+⋯)+bt−12)+bt2−(atat−1⋯a1)2
其中,步骤 i i i 同时加上减去了同一个数 ;步骤 ( i i ) (ii) (ii) 提取前两项的公共因子;步骤 ( i i i ) (iii) (iii) 继续将下一项合并并提取公共因子;步骤 ( i v ) (iv) (iv) 重复上述过程,最终得到嵌套表达式。
那通过观察我们可以发现,如果我们令:
a i 2 + b i 2 = 1 , i = 1 , ... , t a_i^2+b_i^2=1, \qquad i=1,\ldots,t ai2+bi2=1,i=1,...,t
那么我们就能够将我们协方差系数化简为:
1 − ( a t a t − 1 ⋯ a 1 ) 2 1-(a_ta_{t-1} \cdots a_1)^2 1−(atat−1⋯a1)2
那么同样我们根据 a i 2 + b i 2 = 1 , ∀ i a_i^2 + b_i^2 = 1, \, \forall i ai2+bi2=1,∀i 这个要求,再回过头来看一下我们刚刚定义的单步加噪公式:
x t = a t x t − 1 + b t ε t , ε t ∼ N ( 0 , I ) \boldsymbol{x}t = a_t \boldsymbol{x}{t-1}+b_t \boldsymbol{\varepsilon}_t, \qquad \boldsymbol{\varepsilon}_t \sim \mathcal{N}(\boldsymbol{0},\boldsymbol{I}) xt=atxt−1+btεt,εt∼N(0,I)
我们再令:
α i = a i 2 , β t = 1 − α t \alpha_i = a_i^2, \qquad \beta_t = 1-\alpha_t αi=ai2,βt=1−αt
则有:
x t = a t x t − 1 + b t ε t , ε t ∼ N ( 0 , I ) = α t x t − 1 + 1 − α t ε t = 1 − β t x t − 1 + β t ε t \begin{align*} \boldsymbol{x}t &= a_t \boldsymbol{x}{t-1}+b_t \boldsymbol{\varepsilon}_t, \qquad \boldsymbol{\varepsilon}t \sim \mathcal{N}(\boldsymbol{0},\boldsymbol{I}) \\ &= \sqrt{\alpha_t} \boldsymbol{x}{t-1} + \sqrt{1-\alpha_t}\boldsymbol{\varepsilon}t \\ &= \sqrt{1-\beta_t}\boldsymbol{x}{t-1} + \sqrt{\beta_t}\boldsymbol{\varepsilon}_t \end{align*} xt=atxt−1+btεt,εt∼N(0,I)=αt xt−1+1−αt εt=1−βt xt−1+βt εt
那根据这个形式,其实我们可以得到对应条件概率分布的一个定义式,也就是我们已知 x t − 1 \boldsymbol{x}_{t-1} xt−1 状态下 x t \boldsymbol{x}_t xt 的一个条件概率分布:
q ( x t ∣ x t − 1 ) : = N ( x t ; 1 − β t x t − 1 , β t I ) q(\boldsymbol{x}t \mid \boldsymbol{x}{t-1}) := \mathcal{N}(\boldsymbol{x}t;\sqrt{1-\beta_t} \boldsymbol{x}{t-1},\beta_t \boldsymbol{I}) q(xt∣xt−1):=N(xt;1−βt xt−1,βtI)
Note :这个公式表示条件概率密度 q ( x t ∣ x t − 1 ) q(\boldsymbol{x}t \mid \boldsymbol{x}{t-1}) q(xt∣xt−1) 等于 N ( 1 − β t x t − 1 , β t I ) \mathcal{N}(\sqrt{1-\beta_t} \boldsymbol{x}{t-1},\beta_t \boldsymbol{I}) N(1−βt xt−1,βtI) 这个多元正态分布,这是概率密度函数写法。它等价于写成 x t ∣ x t − 1 ∼ N ( 1 − β t x t − 1 , β t I ) \boldsymbol{x}t \mid \boldsymbol{x}{t-1} \sim \mathcal{N}(\sqrt{1-\beta_t} \boldsymbol{x}{t-1},\beta_t \boldsymbol{I}) xt∣xt−1∼N(1−βt xt−1,βtI) 。
那这里我们需要注意一下,这里是一个 : = := := 的形式,也就意味着这是一个定义式,因为这里的加噪过程是我们自己人为定义的,所以这里是一个定义的符号。
那么 x t ∣ x t − 1 \boldsymbol{x}t \mid \boldsymbol{x}{t-1} xt∣xt−1 它是满足正态分布的,其中它的均值是 1 − β t x t − 1 \sqrt{1-\beta_t} \boldsymbol{x}_{t-1} 1−βt xt−1 ,协方差是 β t I \beta_t \boldsymbol{I} βtI 。
Q & A
Q :这里博主有点困惑,为什么 x t ∣ x t − 1 \boldsymbol{x}t \mid \boldsymbol{x}{t-1} xt∣xt−1 这个条件分布会服从多元正态分布呢?
A:首先我们知道 DDPM 的单步加噪公式是:
x t = 1 − β t x t − 1 + β t ε t , ε t ∼ N ( 0 , I ) \boldsymbol{x}t = \sqrt{1-\beta_t} \boldsymbol{x}{t-1}+ \sqrt{\beta_t} \boldsymbol{\varepsilon}_t, \qquad \boldsymbol{\varepsilon}_t \sim \mathcal{N}(\boldsymbol{0},\boldsymbol{I}) xt=1−βt xt−1+βt εt,εt∼N(0,I)
接着 x t ∣ x t − 1 \boldsymbol{x}t \mid \boldsymbol{x}{t-1} xt∣xt−1 表示在给定 x t − 1 \boldsymbol{x}{t-1} xt−1 条件下求 x t \boldsymbol{x}{t} xt 的分布,关键就在于这里的条件:给定 x t − 1 \boldsymbol{x}_{t-1} xt−1 。
假设给定:
x t − 1 = c , \boldsymbol{x}_{t-1} = \boldsymbol{c}, xt−1=c,
那么加噪公式就变成了:
x t = 1 − β t c + β t ε t \boldsymbol{x}_t = \sqrt{1-\beta_t} \boldsymbol{c} + \sqrt{\beta_t} \boldsymbol{\varepsilon}_t xt=1−βt c+βt εt
此时第一项:
1 − β t c \sqrt{1-\beta_t} \boldsymbol{c} 1−βt c
已经是一个确定的向量,不再随机。同时, β t \beta_t βt 是提前设定好的常数,因此 β t \sqrt{\beta_t} βt 也是确定的。因此整个式子中唯一的随机项就是 ε t \boldsymbol{\varepsilon}_t εt 。
由于:
β t ε t ∼ N ( 0 , β t I ) , \sqrt{\beta_t}\boldsymbol{\varepsilon}_t \sim \mathcal{N}(\boldsymbol{0},\beta_t\boldsymbol{I}), βt εt∼N(0,βtI),
再加上确定向量 1 − β t c \sqrt{1-\beta_t}\boldsymbol{c} 1−βt c ,只会使均值发生平移,而不会改变协方差,因此:
x t ∣ x t − 1 = c ∼ N ( 1 − β t c , β t I ) . \boldsymbol{x}t\mid\boldsymbol{x}{t-1}=\boldsymbol{c} \sim \mathcal{N} \left( \sqrt{1-\beta_t}\boldsymbol{c}, \beta_t\boldsymbol{I} \right). xt∣xt−1=c∼N(1−βt c,βtI).
也就是说,给定 x t − 1 \boldsymbol{x}_{t-1} xt−1 后, x t \boldsymbol{x}_t xt 是 "确定向量加上高斯随机向量",所以其条件分布仍然是多元正态分布。
此时,我们再来回顾下 x t \boldsymbol{x}_t xt 关于 x 0 \boldsymbol{x}_0 x0 的一个加噪的公式:
x t = ( a t a t − 1 ⋯ a 1 ) x 0 + ( a t a t − 1 ⋯ a 2 ) b 1 ε 1 + ⋯ + ( a t a t − 1 ) b t − 2 ε t − 2 + a t b t − 1 ε t − 1 + b t ε t \boldsymbol{x}t = (a_t a{t-1} \cdots a_1)\boldsymbol{x}0 + \boxed{(a_t a{t-1} \cdots a_2)b_1 \boldsymbol{\varepsilon}1 + \cdots + (a_t a{t-1})b_{t-2} \boldsymbol{\varepsilon}{t-2} + a_t b{t-1} \boldsymbol{\varepsilon}_{t-1} + b_t \boldsymbol{\varepsilon}_t} xt=(atat−1⋯a1)x0+(atat−1⋯a2)b1ε1+⋯+(atat−1)bt−2εt−2+atbt−1εt−1+btεt
在 a i 2 + b i 2 = 1 a_i^2+b_i^2=1 ai2+bi2=1 这个条件下,我们知道方框中这部分服从一个多元正态分布:
N ( 0 , 1 − ( a t a t − 1 ⋯ a 1 ) 2 ‾ I ) \mathcal{N}\left(\boldsymbol{0}, \underline{1-(a_ta_{t-1} \cdots a_1)^2}\boldsymbol{I}\right) N(0,1−(atat−1⋯a1)2I)
因此,我们可以把 x t \boldsymbol{x}_t xt 关于 x 0 \boldsymbol{x}_0 x0 的加噪的公式表达成如下形式:
x t = ( a t a t − 1 ⋯ a 1 ) x 0 + 1 − ( a t a t − 1 ⋯ a 1 ) 2 ε ˉ , ε ˉ ∼ N ( 0 , I ) \boldsymbol{x}t = (a_t a{t-1} \cdots a_1)\boldsymbol{x}0 + \sqrt{1-(a_t a{t-1} \cdots a_1)^2} \bar{\varepsilon}, \qquad \bar{\varepsilon} \sim \mathcal{N}(\boldsymbol{0}, \boldsymbol{I}) xt=(atat−1⋯a1)x0+1−(atat−1⋯a1)2 εˉ,εˉ∼N(0,I)
接着我们再令:
α ˉ t = ∏ i = 1 t a i 2 = ∏ i = 1 t α i \bar{\alpha}t = \prod\limits{i=1}^{t} a_i^2 = \prod\limits_{i=1}^{t} \alpha_i αˉt=i=1∏tai2=i=1∏tαi
因此有:
x t = α ˉ t x 0 + 1 − α ˉ t ε ˉ \boldsymbol{x}_t = \sqrt{\bar{\alpha}_t} \boldsymbol{x}_0 + \sqrt{1-\bar{\alpha}_t} \bar{\boldsymbol{\varepsilon}} xt=αˉt x0+1−αˉt εˉ
那么这对应的就是我们从原始输入图像 x 0 \boldsymbol{x}_0 x0 加噪到 x t \boldsymbol{x}_t xt 的一个形式,那么它对应的一个条件概率分布,就是如下这个形式:
q ( x t ∣ x 0 ) = N ( x t ; α ˉ t x 0 , ( 1 − α ˉ t ) I ) q(\boldsymbol{x}_t \mid \boldsymbol{x}_0) = \mathcal{N}(\boldsymbol{x}_t;\sqrt{\bar{\alpha}t} \boldsymbol{x}{0}, (1 - \bar{\alpha}_t) \boldsymbol{I}) q(xt∣x0)=N(xt;αˉt x0,(1−αˉt)I)
它同样满足高斯分布,均值是 α ˉ t x 0 \sqrt{\bar{\alpha}t} \boldsymbol{x}{0} αˉt x0 ,协方差是 ( 1 − α ˉ t ) I (1 - \bar{\alpha}_t) \boldsymbol{I} (1−αˉt)I 。
OK,下面我们来简单总结一下我们前向加噪过程当中相关的一些公式。
首先我们定义了单步加噪的条件概率分布:
q ( x t ∣ x t − 1 ) : = N ( x t ; 1 − β t x t − 1 , β t I ) q(\boldsymbol{x}t \mid \boldsymbol{x}{t-1}) := \mathcal{N}(\boldsymbol{x}t;\sqrt{1-\beta_t} \boldsymbol{x}{t-1},\beta_t \boldsymbol{I}) q(xt∣xt−1):=N(xt;1−βt xt−1,βtI)
其中 0 < β t < 1 0 < \beta_t < 1 0<βt<1 ,它表示前向加噪的协方差系数/噪声强度系数,那么在论文实验中是人为设定的,其值从 β 1 = 10 − 4 \beta_1 = 10^{-4} β1=10−4 线性增长到 β T = 0.02 \beta_T = 0.02 βT=0.02 。
这就意味着我们正向加噪过程中的加噪强度是逐渐增强的,那么这个公式对应的就是 DDPM 论文公式 ( 2 ) (2) (2) :

注意这是一个定义式,它对应的重参数化采样表达式是下面这个形式:
x t = 1 − β t x t − 1 + β t ε t , ε t ∼ N ( 0 , I ) \boldsymbol{x}t = \sqrt{1 - \beta_t} \boldsymbol{x}{t-1}+ \sqrt{\beta_t} \boldsymbol{\varepsilon}_t, \qquad \boldsymbol{\varepsilon}_t \sim \mathcal{N}(\boldsymbol{0}, \boldsymbol{I}) xt=1−βt xt−1+βt εt,εt∼N(0,I)
那我们根据我们定义的这个加噪公式,其实可以看出 x t \boldsymbol{x}t xt 其实它仅依赖于 x t − 1 \boldsymbol{x}{t-1} xt−1 ,所以我们的前向加噪过程它是满足 Markov 过程的(即未来的状态只取决于现在的状态,而与过去的历史状态无关),也就是说从 x 0 \boldsymbol{x}_0 x0 到 x 1 \boldsymbol{x}_1 x1 一直到 x t \boldsymbol{x}_t xt ,它是一个马尔可夫链(Markov Chain),即:
q ( x t ∣ x t − 1 , x t − 2 , ... x 0 ) = q ( x t ∣ x t − 1 ) q(\boldsymbol{x}t \mid \boldsymbol{x}{t-1}, \boldsymbol{x}_{t-2}, \ldots \boldsymbol{x}_0) = q(\boldsymbol{x}t \mid \boldsymbol{x}{t-1}) q(xt∣xt−1,xt−2,...x0)=q(xt∣xt−1)
然后我们再来看一下 q ( x 1 : T ∣ x 0 ) q(\boldsymbol{x}_{1:T} \mid \boldsymbol{x}_0) q(x1:T∣x0) 这个条件联合概率分布的计算:
q ( x 1 : T ∣ x 0 ) = q ( x 1 ∣ x 0 ) q ( x 2 ∣ x 1 , x 0 ) q ( x 3 ∣ x 2 , x 1 , x 0 ) ... q ( x T ∣ x T − 1 , ... , x 0 ) = q ( x 1 ∣ x 0 ) q ( x 2 ∣ x 1 ) q ( x 3 ∣ x 2 ) ... q ( x T ∣ x T − 1 ) = ∏ t = 1 T q ( x t ∣ x t − 1 ) \begin{align*} q(\boldsymbol{x}_{1:T} \mid \boldsymbol{x}_0) &= q(\boldsymbol{x}_1 \mid \boldsymbol{x}_0)q(\boldsymbol{x}_2 \mid \boldsymbol{x}_1, \boldsymbol{x}_0)q(\boldsymbol{x}_3 \mid \boldsymbol{x}_2, \boldsymbol{x}_1, \boldsymbol{x}_0)\dots q(\boldsymbol{x}T \mid \boldsymbol{x}{T-1}, \dots, \boldsymbol{x}_0) \\ &= q(\boldsymbol{x}_1 \mid \boldsymbol{x}_0)q(\boldsymbol{x}_2 \mid \boldsymbol{x}_1)q(\boldsymbol{x}_3 \mid \boldsymbol{x}2)\dots q(\boldsymbol{x}T \mid \boldsymbol{x}{T-1}) \\ &= \prod{t=1}^{T} q(\boldsymbol{x}t \mid \boldsymbol{x}{t-1}) \end{align*} q(x1:T∣x0)=q(x1∣x0)q(x2∣x1,x0)q(x3∣x2,x1,x0)...q(xT∣xT−1,...,x0)=q(x1∣x0)q(x2∣x1)q(x3∣x2)...q(xT∣xT−1)=t=1∏Tq(xt∣xt−1)
条件指的就是 x 0 \boldsymbol{x}0 x0 状态已知,我们获得 x 1 : T \boldsymbol{x}{1:T} x1:T 的一个联合概率分布,其实这个就意味着我们从 x 0 \boldsymbol{x}_0 x0 加噪到 x T \boldsymbol{x}_T xT 的整个过程。
那么我们根据条件概率链式法则可以将条件联合概率分布展开,并利用 Markov 性质做进一步简化,最终得到上面这个表达式。那这个连乘的形式对应的就是 DDPM 论文公式 ( 2 ) (2) (2) 的第一部分。
Q & A
Q :什么是 x 1 : T \boldsymbol{x}_{1:T} x1:T ?
A:这是一个简写:
x 1 : T = ( x 1 , x 2 , ... , x T ) \boldsymbol{x}_{1:T} = (\boldsymbol{x}_1, \boldsymbol{x}_2, \ldots , \boldsymbol{x}_T) x1:T=(x1,x2,...,xT)
它不是某一个单独的变量,而是从第 1 1 1 步到第 T T T 步的所有状态组合集合,也可理解为一整条加噪轨迹:
x 0 → x 1 → x 2 → ⋯ x T \boldsymbol{x}_0 \rightarrow \boldsymbol{x}_1 \rightarrow \boldsymbol{x}_2 \rightarrow \cdots \boldsymbol{x}_T x0→x1→x2→⋯xT
因此, q ( x 1 : T ∣ x 0 ) q(\boldsymbol{x}_{1:T} \mid \boldsymbol{x}_0) q(x1:T∣x0) 表示:在原始图像 x 0 \boldsymbol{x}_0 x0 已知的情况下,整条加噪轨迹 ( x 1 , ... , x T ) (\boldsymbol{x}_1, \ldots, \boldsymbol{x}_T) (x1,...,xT) 的联合分布。
Q:什么是联合分布?
A:假设只扩散两步,那么:
q ( x 1 , x 2 , ∣ x 0 ) q(\boldsymbol{x}_1, \boldsymbol{x}_2, \mid \boldsymbol{x}_0) q(x1,x2,∣x0)
描述的是:在给定 x 0 \boldsymbol{x}_0 x0 后, x 1 \boldsymbol{x}_1 x1 取某个值、同时 x 2 \boldsymbol{x}_2 x2 也取某个值的联合概率密度。
这里的关键词是 "同时"。
单独的 q ( x 1 ∣ x 0 ) q(\boldsymbol{x}_1 \mid \boldsymbol{x}_0) q(x1∣x0) 只描述第一步的状态,而 q ( x 2 ∣ x 0 ) q(\boldsymbol{x}_2 \mid \boldsymbol{x}_0) q(x2∣x0) 只描述第二步的状态。但是 q ( x 1 , x 2 , ∣ x 0 ) q(\boldsymbol{x}_1, \boldsymbol{x}_2, \mid \boldsymbol{x}0) q(x1,x2,∣x0) 描述的是二者作为一条连续轨迹共同出现的规律。推广到 T T T 步,就是 q ( x 1 : T ∣ x 0 ) q(\boldsymbol{x}{1:T} \mid \boldsymbol{x}_0) q(x1:T∣x0) 。
更严格地说,因为这些是连续随机变量,这里描述的是 条件联合概率密度,通常为了简便会直接称为条件联合概率分布。
Q:什么是条件概率链式法则?
A:先看最简单的两个变量:
q ( x 1 , x 2 ∣ x 0 ) = q ( x 1 ∣ x 0 ) q ( x 2 ∣ x 1 , x 0 ) q(\boldsymbol{x}_1,\boldsymbol{x}_2\mid\boldsymbol{x}_0) = q(\boldsymbol{x}_1\mid\boldsymbol{x}_0) q(\boldsymbol{x}_2\mid\boldsymbol{x}_1,\boldsymbol{x}_0) q(x1,x2∣x0)=q(x1∣x0)q(x2∣x1,x0)
它的意思是:
1. 先得到 x 1 \boldsymbol{x}_1 x1 ;
2. 再在已知 x 1 \boldsymbol{x}_1 x1 和 x 0 \boldsymbol{x}_0 x0 的条件下得到 x 2 \boldsymbol{x}_2 x2 。
三个变量时:
q ( x 1 , x 2 , x 3 ∣ x 0 ) = q ( x 1 ∣ x 0 ) q ( x 2 ∣ x 1 , x 0 ) q ( x 3 ∣ x 2 , x 1 , x 0 ) q(\boldsymbol{x}_1,\boldsymbol{x}_2,\boldsymbol{x}_3\mid\boldsymbol{x}_0)\ =q(\boldsymbol{x}_1\mid\boldsymbol{x}_0) q(\boldsymbol{x}_2\mid\boldsymbol{x}_1,\boldsymbol{x}_0) q(\boldsymbol{x}_3\mid\boldsymbol{x}_2,\boldsymbol{x}_1,\boldsymbol{x}_0) q(x1,x2,x3∣x0) =q(x1∣x0)q(x2∣x1,x0)q(x3∣x2,x1,x0)
推广到 T T T 步:
q ( x 1 : T ∣ x 0 ) = ∏ t = 1 T q ( x t ∣ x t − 1 , ... , x 0 ) q(\boldsymbol{x}_{1:T}\mid\boldsymbol{x}0) = \prod{t=1}^{T} q(\boldsymbol{x}t\mid \boldsymbol{x}{t-1},\ldots,\boldsymbol{x}_0) q(x1:T∣x0)=t=1∏Tq(xt∣xt−1,...,x0)
这就是条件概率的链式法则。它本身并不依赖马尔可夫性质,对一般随机变量都成立。
Q:为什么突然需要这个条件联合分布?
A:因为单步公式
q ( x t ∣ x t − 1 ) q(\boldsymbol{x}t\mid\boldsymbol{x}{t-1}) q(xt∣xt−1)
只告诉我们:从某一步如何走到下一步。
但 DDPM 不仅需要描述某一步,而是需要完整定义:
x 0 → x 1 → ⋯ → x T \boldsymbol{x}_0 \rightarrow \boldsymbol{x}_1 \rightarrow \cdots \rightarrow \boldsymbol{x}_T x0→x1→⋯→xT
这一整条前向扩散过程。
所以需要
q ( x 1 : T ∣ x 0 ) q(\boldsymbol{x}_{1:T}\mid\boldsymbol{x}_0) q(x1:T∣x0)
来描述整条随机轨迹的分布。
可以类比为:
- q ( x t ∣ x t − 1 ) q(\boldsymbol{x}t\mid\boldsymbol{x}{t-1}) q(xt∣xt−1):规定每一步怎么走;
- q ( x 1 : T ∣ x 0 ) q(\boldsymbol{x}_{1:T}\mid\boldsymbol{x}_0) q(x1:T∣x0):规定从起点出发,整条路线出现的概率规律。
此外,这个联合分布在后续推导中还非常重要,因为 DDPM 的训练目标需要同时处理整条前向加噪轨迹和反向去噪过程,例如后面会出现:
q ( x t − 1 ∣ x t , x 0 ) q(\boldsymbol{x}_{t-1}\mid\boldsymbol{x}_t,\boldsymbol{x}_0) q(xt−1∣xt,x0)
以及对变分下界 ELBO 的分解。没有完整的前向联合分布,就无法系统地推导这些公式。
Q :它与 q ( x t ∣ x 0 ) q(\boldsymbol{x}_t\mid\boldsymbol{x}_0) q(xt∣x0) 有什么区别?
A:这两个很容易混淆。
整条轨迹的联合分布
q ( x 1 : T ∣ x 0 ) q(\boldsymbol{x}_{1:T}\mid\boldsymbol{x}_0) q(x1:T∣x0)
研究的是所有中间状态:
x 1 , x 2 , ... , x T \boldsymbol{x}_1,\boldsymbol{x}_2,\ldots,\boldsymbol{x}_T x1,x2,...,xT
第 t t t 步状态的边缘分布
q ( x t ∣ x 0 ) q(\boldsymbol{x}_t\mid\boldsymbol{x}_0) q(xt∣x0)
只关心固定起点后,第 t t t 步的结果,不关心中间具体经过了哪些状态。
在 DDPM 中,它可以直接写为:
q ( x t ∣ x 0 ) = N ( x t ; α ˉ t x 0 , ( 1 − α ˉ t ) I ) q(\boldsymbol{x}_t\mid\boldsymbol{x}_0) = \mathcal N\left( \boldsymbol{x}_t; \sqrt{\bar\alpha_t}\boldsymbol{x}_0, (1-\bar\alpha_t)\boldsymbol I \right) q(xt∣x0)=N(xt;αˉt x0,(1−αˉt)I)
因此, q ( x 1 : T ∣ x 0 ) q(\boldsymbol{x}_{1:T}\mid\boldsymbol{x}_0) q(x1:T∣x0) 描述整条轨迹,而 q ( x t ∣ x 0 ) q(\boldsymbol{x}_t\mid\boldsymbol{x}_0) q(xt∣x0) 只描述第 t t t 步的状态。
最核心的理解是:单步转移分布定义 "每一步怎么走",条件联合分布定义 "整条前向过程怎么产生"。
然后我们刚刚其实也有得到一个多步加噪的条件概率分布:
q ( x t ∣ x 0 ) = N ( x t ; α ˉ t x 0 , ( 1 − α ˉ t ) I ) q(\boldsymbol{x}_t\mid\boldsymbol{x}_0) = \mathcal N\left( \boldsymbol{x}_t; \sqrt{\bar\alpha_t}\boldsymbol{x}_0, (1-\bar\alpha_t)\boldsymbol I \right) q(xt∣x0)=N(xt;αˉt x0,(1−αˉt)I)
它也是一个正态分布,其均值是 α ˉ t x 0 \sqrt{\bar\alpha_t}\boldsymbol{x}_0 αˉt x0 ,协方差是 ( 1 − α ˉ t ) I (1-\bar\alpha_t)\boldsymbol I (1−αˉt)I 。
其中:
α ˉ t = ∏ i = 1 t α i , α t = 1 − β t \bar{\alpha}t = \prod \limits{i=1}^t \alpha_i, \quad \alpha_t = 1-\beta_t αˉt=i=1∏tαi,αt=1−βt
那么这个多步加噪条件概率分布,我们使用重参数化技巧就能得到下面这个采样表达式:
x t = α ˉ t x 0 + 1 − α ˉ t ε , ε ∼ N ( 0 , I ) \boldsymbol{x}_t = \sqrt{\bar{\alpha}_t} \boldsymbol{x}_0 + \sqrt{1-\bar{\alpha}_t} \boldsymbol{\varepsilon}, \qquad \boldsymbol{\varepsilon} \sim \mathcal{N}(\boldsymbol{0}, \boldsymbol{I}) xt=αˉt x0+1−αˉt ε,ε∼N(0,I)
它对应的就是在 DDPM 论文当中的公式 ( 4 ) (4) (4) :

至此,关于 DDPM 的正向加噪过程涉及的一些公式基本上都讲的差不多了,接下来我们就可以进入反向去噪阶段了。
5. 介绍反向引入优化目标

那反向去噪阶段,我们最开始其实就是一个纯高斯噪声,然后一步一步去噪得到我们最终想要的一幅干净的图片,如上图所示。
那反向过程对应的是一个联合概率分布 p θ ( x 0 : T ) p_{\theta}(\boldsymbol{x}{0:T}) pθ(x0:T) ,那这里的 θ \theta θ 对应的就是我们要训练的参数,注意这里的 p θ ( x 0 : T ) p{\theta}(\boldsymbol{x}_{0:T}) pθ(x0:T) 它其实对应下面这样一个联合概率分布:
p θ ( x T , x T − 1 , ... , x 0 ) p_{\theta}(\boldsymbol{x}{T},\boldsymbol{x}{T-1}, \ldots,\boldsymbol{x}_0) pθ(xT,xT−1,...,x0)
那我们这里简写形式当中的 0 : T 0:T 0:T 并不是说它的顺序是从 x 0 \boldsymbol{x}_0 x0 到 x T \boldsymbol{x}_T xT 的,只是我们当前简写的一种规范形式。

那对于单步去噪过程当中,这个条件概率分布论文当中给的定义如下:
p θ ( x t − 1 ∣ x t ) : = N ( x t − 1 ; μ θ ( x t , t ) , Σ θ ( x t , t ) ) p_{\theta}(\boldsymbol{x}{t-1} \mid \boldsymbol{x}t) := \mathcal{N}(\boldsymbol{x}{t-1}; \boldsymbol{\mu}{\theta}(\boldsymbol{x}t, t), \boldsymbol{\Sigma}{\theta}(\boldsymbol{x}_t, t)) pθ(xt−1∣xt):=N(xt−1;μθ(xt,t),Σθ(xt,t))
它是一个正态分布,均值是 μ θ ( x t , t ) \boldsymbol{\mu}_{\theta}(\boldsymbol{x}t, t) μθ(xt,t) 这一项,也就是说均值是由我们的模型预测得到的,它的协方差 Σ θ ( x t , t ) \boldsymbol{\Sigma}{\theta}(\boldsymbol{x}_t, t) Σθ(xt,t) 也可以由模型预测得到,同样输入也是 x t \boldsymbol{x}_t xt 和对应的时间 t t t 。
那通过这个定义式,我们可以看到已知 x t \boldsymbol{x}t xt 状态下计算 x t − 1 \boldsymbol{x}{t-1} xt−1 的时候,其实我们只依赖于 x t \boldsymbol{x}t xt 这一项,不会依赖于 x t + 1 , x t + 2 \boldsymbol{x}{t+1},\boldsymbol{x}_{t+2} xt+1,xt+2 ,所以我们的反向过程其实也被定义成了一个马尔可夫链,而链上的每一步高斯转移概率分布是 由模型学习 得到的。
其初始分布为标准的正态分布,即:
p ( x T ) = N ( x T ; 0 , I ) p(\boldsymbol{x}_T) = \mathcal{N}(\boldsymbol{x}_T; \boldsymbol{0}, \boldsymbol{I}) p(xT)=N(xT;0,I)
也就是说 p ( x T ) p(\boldsymbol{x}T) p(xT) 它就是一个标准正态分布,注意这里的 p p p 并没有写成 p θ p{\theta} pθ ,因为我们起始的 x T \boldsymbol{x}_T xT 是直接从高斯噪声中采样得到的,并不依赖于我们的模型。
那论文当中也给出了关于我们反向去噪过程的联合概率分布形式:
p θ ( x 0 : T ) : = p ( x T ) ∏ t = 1 T p θ ( x t − 1 ∣ x t ) p_{\theta}(\boldsymbol{x}{0:T}) := p(\boldsymbol{x}{T}) \prod_{t=1}^{T} p_{\theta}(\boldsymbol{x}_{t-1} \mid \boldsymbol{x}_t) pθ(x0:T):=p(xT)t=1∏Tpθ(xt−1∣xt)
同样,根据条件概率链式法则以及 Markov 性质,我们可以很轻松的将其推导出来:
p θ ( x 0 : T ) = p ( x T ) p θ ( x T − 1 ∣ x T ) p θ ( x T − 2 ∣ x T − 1 , x T ) ... p θ ( x 0 ∣ x 1 , x 2 , ... , x T ) = p ( x T ) p θ ( x T − 1 ∣ x T ) p θ ( x T − 2 ∣ x T − 1 ) ... p θ ( x 0 ∣ x 1 ) = p ( x T ) ∏ t = 1 T p θ ( x t − 1 ∣ x t ) \begin{align*} p_{\theta}(\boldsymbol{x}{0:T}) &= p(\boldsymbol{x}{T}) p_{\theta}(\boldsymbol{x}{T-1} \mid \boldsymbol{x}{T}) p_{\theta}(\boldsymbol{x}{T-2} \mid \boldsymbol{x}{T-1}, \boldsymbol{x}{T}) \dots p{\theta}(\boldsymbol{x}0 \mid \boldsymbol{x}1, \boldsymbol{x}2, \dots, \boldsymbol{x}T) \\ &= p(\boldsymbol{x}{T}) p{\theta}(\boldsymbol{x}{T-1} \mid \boldsymbol{x}{T}) p_{\theta}(\boldsymbol{x}{T-2} \mid \boldsymbol{x}{T-1}) \dots p_{\theta}(\boldsymbol{x}0 \mid \boldsymbol{x}1) \\ &= p(\boldsymbol{x}{T}) \prod{t=1}^{T} p_{\theta}(\boldsymbol{x}_{t-1} \mid \boldsymbol{x}_t) \end{align*} pθ(x0:T)=p(xT)pθ(xT−1∣xT)pθ(xT−2∣xT−1,xT)...pθ(x0∣x1,x2,...,xT)=p(xT)pθ(xT−1∣xT)pθ(xT−2∣xT−1)...pθ(x0∣x1)=p(xT)t=1∏Tpθ(xt−1∣xt)
那为了让模型能够生成真实清晰的图像,我们的训练目标其实是 最大化真实样本对应的似然 p θ ( x 0 ) p_{\theta}(\boldsymbol{x}_0) pθ(x0) (边际概率分布) 。但是如果我们直接让模型去建模我们的真实图像太困难了,所以呢我们这里可以将 p θ ( x 0 ) p_{\theta}(\boldsymbol{x}_0) pθ(x0) 写成一个联合概率分布多重积分的形式:
p θ ( x 0 ) = ∬ ⋯ ∫ p θ ( x 0 , x 1 , ... , x T ) d x 1 d x 2 ⋯ d x T = ∫ p θ ( x 0 : T ) d x 1 : T p_{\theta}(\boldsymbol{x}0) = \iint \cdots \int p{\theta}(\boldsymbol{x}_0, \boldsymbol{x}_1, \dots, \boldsymbol{x}_T) d\boldsymbol{x}1 d\boldsymbol{x}2 \cdots d\boldsymbol{x}T = \int p{\theta}(\boldsymbol{x}{0:T}) d\boldsymbol{x}{1:T} pθ(x0)=∬⋯∫pθ(x0,x1,...,xT)dx1dx2⋯dxT=∫pθ(x0:T)dx1:T
这个要怎么理解呢,我们可以认为通过引入一系列中间隐变量,"把一步生成复杂图像" 的难题给拆解成 "多步逐步生成的简单问题"。
Q & A
Q:什么是似然?
A:模型最终想学习一个图像分布:
p θ ( x 0 ) p_\theta(\boldsymbol{x}_0) pθ(x0)
其中:
- x 0 \boldsymbol{x}_0 x0 是一张真实图像;
- θ \theta θ 是模型参数;
- p θ ( x 0 ) p_\theta(\boldsymbol{x}_0) pθ(x0) 表示当前模型在真实图像 x 0 \boldsymbol{x}_0 x0 处给出的概率密度。
当我们把真实样本 x 0 \boldsymbol{x}_0 x0 固定下来,把它看成关于参数 θ \theta θ 的函数时,就称其为 似然函数:
L ( θ ; x 0 ) = p θ ( x 0 ) L(\theta;\boldsymbol{x}0)=p\theta(\boldsymbol{x}_0) L(θ;x0)=pθ(x0)
因此:
- 作为 x 0 \boldsymbol{x}_0 x0 的函数,它是概率密度;
- 作为 θ \theta θ 的函数,它是似然。
也就是说,概率和似然使用的是同一个数学表达式,只是观察角度不同。
例如假设 x ∼ N ( μ , 1 ) x\sim\mathcal N(\mu,1) x∼N(μ,1) ,并且观测到真实数据 x = 3 x=3 x=3 。此时 p μ ( 3 ) p_\mu(3) pμ(3) 可以看作参数 μ \mu μ 的函数。显然,当 μ \mu μ 靠近 3 3 3 时,这个真实样本的密度更大,因此似然更高。
需要注意,对于连续变量,某一个精确取值的概率通常为零。这里的 p θ ( x 0 ) p_\theta(\boldsymbol{x}_0) pθ(x0) 更严格地说是 概率密度值,课程中通常会简称为概率或似然。
Q:为什么训练目标是最大化真实样本的似然?
A:因为我们希望模型认为真实数据是 "很可能出现的"。
假设模型生成分布与真实图像分布完全不一样,那么真实图片在模型分布下的概率密度就会很低:
p θ ( x 0 ) ≈ 0 p_\theta(\boldsymbol{x}_0)\approx 0 pθ(x0)≈0
相反,如果模型学得很好,真实图片应该处于模型认为概率密度较高的区域:
p θ ( x 0 ) 较大 p_\theta(\boldsymbol{x}_0)\text{ 较大} pθ(x0) 较大
因此,训练时要调整 θ \theta θ ,使真实样本的似然尽可能大:
max θ p θ ( x 0 ) \max_\theta p_\theta(\boldsymbol{x}_0) θmaxpθ(x0)
对于包含 N N N 张图片的数据集,假设样本相互独立,总似然是:
∏ i = 1 N p θ ( x 0 ( i ) ) \prod_{i=1}^{N}p_\theta(\boldsymbol{x}_0^{(i)}) i=1∏Npθ(x0(i))
实际中通常最大化对数似然:
max θ ∑ i = 1 N log p θ ( x 0 ( i ) ) \max_\theta \sum_{i=1}^{N} \log p_\theta(\boldsymbol{x}_0^{(i)}) θmaxi=1∑Nlogpθ(x0(i))
这样做的直观含义是:调整模型参数,使训练集中真实出现的图像,在模型分布下都具有较高的概率密度。
从理论上看,最大化真实数据的期望对数似然,等价于最小化真实数据分布与模型分布之间的前向 KL 散度:
K L ( p data ∣ p θ ) \mathrm{KL}\bigl(p_{\text{data}} \mid p_\theta\bigr) KL(pdata∣pθ)
所以最大似然的目标,本质上是在让模型分布 p θ p_\theta pθ 靠近真实数据分布 p data p_{\text{data}} pdata 。
Q:边际概率分布和边缘概率分布一样吗?
A:是的。
"边际概率分布" 和 "边缘概率分布" 通常都是英文 marginal distribution 的翻译,表达的是同一个概念。
假设有两个随机变量 X , Y X,Y X,Y ,它们的联合分布是:
p ( x , y ) p(x,y) p(x,y)
如果只关心 X X X ,不关心 Y Y Y ,就把 Y Y Y 消去。
对于离散变量:
p ( x ) = ∑ y p ( x , y ) p(x)=\sum_y p(x,y) p(x)=y∑p(x,y)
对于连续变量:
p ( x ) = ∫ p ( x , y ) d y p(x)=\int p(x,y)dy p(x)=∫p(x,y)dy
得到的 p ( x ) p(x) p(x) 就是联合分布 p ( x , y ) p(x,y) p(x,y) 关于 X X X 的边缘分布或边际分布。
在 DDPM 中,模型定义了完整路径:
p θ ( x 0 : T ) = p θ ( x 0 , x 1 , ... , x T ) p_\theta(\boldsymbol{x}{0:T}) = p\theta(\boldsymbol{x}_0,\boldsymbol{x}_1,\ldots,\boldsymbol{x}_T) pθ(x0:T)=pθ(x0,x1,...,xT)
但我们最终只关心生成出来的图像 x 0 \boldsymbol{x}_0 x0 ,因此要把中间变量 x 1 , ... , x T \boldsymbol{x}1,\ldots,\boldsymbol{x}T x1,...,xT 全部消去,得到 p θ ( x 0 ) p\theta(\boldsymbol{x}0) pθ(x0) 。所以 p θ ( x 0 ) p\theta(\boldsymbol{x}0) pθ(x0) 是联合分布 p θ ( x 0 : T ) p\theta(\boldsymbol{x}{0:T}) pθ(x0:T) 关于 x 0 \boldsymbol{x}_0 x0 的边缘分布。
Q:为什么可以把似然写成联合分布的多重积分?
A:这是连续随机变量版本的全概率公式。
先考虑只有一个中间变量的情况:
p θ ( x 0 ) = ∫ p θ ( x 0 , x 1 ) d x 1 p_\theta(\boldsymbol{x}0) = \int p\theta(\boldsymbol{x}_0,\boldsymbol{x}_1) d\boldsymbol{x}_1 pθ(x0)=∫pθ(x0,x1)dx1
它表示:要计算生成 x 0 \boldsymbol{x}_0 x0 的总概率密度,就把所有可能的 x 1 \boldsymbol{x}_1 x1 路径都考虑进去,并把它们的联合密度累加起来。
由于 x 1 \boldsymbol{x}_1 x1 是连续变量,所以使用积分;如果它是离散变量,就使用求和。当有多个中间变量时,就要把它们全部积分掉:
p θ ( x 0 ) = ∫ ⋯ ∫ p θ ( x 0 , x 1 , ... , x T ) d x 1 ⋯ d x T = ∫ p θ ( x 0 : T ) d x 1 : T \begin{aligned} p_\theta(\boldsymbol{x}0) = \int\cdots\int p\theta( \boldsymbol{x}_0, \boldsymbol{x}_1,\ldots,\boldsymbol{x}T )d\boldsymbol{x}1\cdots d\boldsymbol{x}T\ = \int p\theta(\boldsymbol{x}{0:T}) d\boldsymbol{x}{1:T} \end{aligned} pθ(x0)=∫⋯∫pθ(x0,x1,...,xT)dx1⋯dxT =∫pθ(x0:T)dx1:T
直观上,可以把每一组
( x T , x T − 1 , ... , x 1 ) (\boldsymbol{x}T,\boldsymbol{x}{T-1},\ldots,\boldsymbol{x}_1) (xT,xT−1,...,x1)
看作一条可能的反向去噪路径。不同的噪声和中间状态,都可能最终生成同一张或附近的 x 0 \boldsymbol{x}0 x0 。所以 p θ ( x 0 ) p\theta(\boldsymbol{x}_0) pθ(x0) 要统计的是:所有能够产生 x 0 \boldsymbol{x}_0 x0 的潜在去噪路径的总贡献。
篇幅限制原因,剩余章节内容我们在后续文章中再讲解!