Diffusion 入门
前置
高斯混合模型
一个复杂分布 Pθ 可以用 K 个高斯分布来表示。
Pθ=i=1∑KP(zi)Pθ(x∣zi)(1)
由于 ∫P(z)=1,用一个连续的高斯分布来表示 P(z)∼N(0,1),因此
Pθ=∫P(zi)∗Pθ(x∣zi)(2)
KL 散度
DKL(p∥q)=−x∫p(x)logp(x)q(x)dx(m→∞)(3)
优化目标
初衷是希望生成模型所产生的图片所遵从的概率分布尽可能接近真实世界图片的概率分布。使用 KL 散度描述,得到:
argθminKL(Pdata∥Pθ)(4)
其中 Pθ 是模型所预测的分布,Pdata 为真实分布。对上式做如下变换
argθminKL(Pdata∥Pθ)=argθmin−x∫Pdata(x)logPdata(x)Pθ(x)dx=argθmaxx∫Pdata(x)logPdata(x)Pθ(x)dx=argθmaxx∫Pdata(x)logPθ(x)dx−argθmaxx∫Pdata(x)logPdata(x)dx=argθmaxx∫Pdata(x)logPθ(x)dx=argθmaxEx∼Pdata[logPθ(x)]≈argθmaxi=1∑mlogPθ(xi)=argθmaxlogi=1∏mPθ(xi)=argθmaxi=1∏mPθ(xi)(5)
(5.8),得到新的优化目标 argmaxθi=1∏mPθ(xi)。
Lower Bound
要使 (5.8) 成立,即极大似然估计 (Maximum Likelihood Estimate)
MLEθ∗=θargmaxPθ(x)(6)
令 q(z∣x) 是某个概率分布 (实际上是加噪过程的分布 qϕ,通常记作 q(x1..T∣x0),ϕ 代表加噪过程的参数),则
log(Pθ(x))=log(Pθ(x))⋅∫q(z∣x)dz=∫log(Pθ(z∣x)Pθ(x,z))q(z∣x)dz=∫log(q(z∣x)Pθ(x,z)⋅Pθ(z∣x)q(z∣x))q(z∣x)dz=∫log(q(z∣x)Pθ(x,z))q(z∣x)dz+KL(q(z∣x)∥Pθ(z∣x))≥∫log(q(z∣x)Pθ(x,z))q(z∣x)dz=Eq(Z∣X)[log(q(z∣x)Pθ(x,z))](7)
(7.1)→(7.2),由 Pθ(x,z)=Pθ(x)∗Pθ(z∣x)
(7.4),由 KL(p∥q)=∫plogqp≥0
因此,要优化最大对数似然,就是在优化 Evidence Lower Bound (ELBO). 至此,得到初步的优化目标,下面开始讲解 DDPM.
DDPM
Overview

通俗理解 DDPM。允许多步 (T) 生成过程,从而分多次估计噪声 ϵ^t 比一步估计图片 xT→x^0 容易。DDPM 的大部分数学框架在更早时候已有之,而该工作的最大贡献其实是用 U-Net 作为噪声估计器调通了这一模型,并得到了不错的效果。
前向扩散过程
给定初始数据分布 x0∼q(x),前向扩散过程向 x0 逐步添加 T 次高斯噪声,得到一系列带噪声图片 x1,...,xT。定义 xt−1→xt 的加噪过程:
q(xt∣xt−1)=N(xt;1−βtxt−1,βtI)(8)
q(x1:T∣x0)=t=1∏Tq(xt∣xt−1)(9)
从而,加噪过程是一个马尔可夫链,满足分布 N(xt;1−βtxt−1,βtI),生成 xt−1→xt 的过程只由 {βt,xt−1} 确定。β1,...,βT 是可学习的参数,提前确定 β1,...,βT 后即可得到加噪过程 x1,...,xT 任意一步。
关于 qϕ 的设计。为什么选择 1−βt 和 βt 用于修饰加噪过程的均值和方差,并不知道 DDPM 的前置工作中是否有提及。但在训练过程中,这个设计可以方便地引出 αt 和 αˉt 的定义,从而实现对 x0→xt 的一步加噪。
注意,此时我们实际上只定义了加噪过程满足的分布 qϕ,尚未定义实际的加噪过程,这部分将在「重参数化」一节说明。但可以知道的是,随着加噪过程的进行, βt 不断增大,即每一步的噪声比例不断升高。最终,当 T→∞,xT 趋近于一个各向独立的高斯分布,视觉上就是一张接近纯粹高斯噪声的「雪花」图。
重参数化
一步加噪
从 x0 和固定序列 {βt∈(0,1)}t=1T 可以直接得到任意一步 xt,从而省去前向迭代。这使得训练过程变得容易。
References
DDPM
- 【较真系列】讲人话-Diffusion Model全解(原理+代码+公式)_哔哩哔哩_bilibili(讲得很不错,完整看下来基本明白 DDPM 前后向过程都在干什么)
- VictorYuki视频专辑-VictorYuki视频合集-哔哩哔哩视频(手写过程,可作为参考)
- 【大白话01】一文理清 Diffusion Model 扩散模型 | 原理图解+公式推导_哔哩哔哩_bilibili(入门 DDPM 看的第一个精讲,还可以)
- 54、Probabilistic Diffusion Model概率扩散模型理论与完整PyTorch代码详细解读_哔哩哔哩_bilibili | 64、扩散模型加速采样算法DDIM论文精讲与PyTorch源码逐行解读_哔哩哔哩_bilibili(主讲代码)
- 此外还看了李宏毅的视频,和之前看老师其他视频的感受一样,需要有些基础再来看,作为巩固增强。否则很多推导都是一语带过,理解起来会有问题。
DDIM
- 【串讲系列】讲人话-Stable Diffusion全解(原理+代码+公式)之 DDIM + SDXL Turbo_哔哩哔哩_bilibili
DDNM
- denoising_diffusion_nullspace_model_ddnm__method_explained