1. 基本概念
生成模型的核心目标是:给定训练数据的分布 pdata(x)p_{data}(x)pdata(x),学习一个模型分布 pθ(x)p_\theta(x)pθ(x),使其尽可能逼近真实数据分布,从而能够采样生成"看起来像真实数据"的新样本(图像、文本、音频等)。这与判别模型(学习 p(y∣x)p(y|x)p(y∣x),用于分类/回归)在目标上根本不同。
AIGC(AI Generated Content)正是建立在生成模型基础上的应用范畴,涵盖图像生成、文本生成、音乐生成等。
2. 四大流派分类
生成模型目前主要分为四类:
| 流派 | 全称 | 核心思想 |
|---|---|---|
| GAN | 生成对抗网络 | 生成器与判别器博弈对抗 |
| VAE | 变分自编码器 | 编码到隐空间再解码,用变分推断逼近后验 |
| NF | 标准化流 | 用可逆变换把简单分布映射为复杂分布 |
| DM | 扩散模型 | 逐步加噪再学习逐步去噪 |
3. 各模型基本原理
GAN(生成对抗网络):由生成器 G 和判别器 D 构成一个极小极大博弈。G 试图生成以假乱真的样本欺骗 D,D 试图区分真假样本,两者交替优化,最终 G 收敛到能生成逼真样本。优点是采样快、生成质量高;缺点是训练不稳定,容易出现模式坍塌(mode collapse)。
VAE(变分自编码器) :编码器将输入 x 映射到隐变量 z 的近似后验分布 qϕ(z∣x)q_\phi(z|x)qϕ(z∣x),解码器再从 z 重建 x。通过最大化证据下界(ELBO)联合优化编码器和解码器。优点是有显式的概率框架、隐空间连续可解释;缺点是生成样本往往偏模糊。
NF(标准化流):通过一系列可逆且雅可比行列式可计算的变换,把简单分布(如高斯)逐步变换为复杂的数据分布。因为变换可逆,可以精确计算对数似然并直接优化,采样和似然评估都很高效;缺点是网络结构受限(必须可逆),表达能力和计算开销之间需要权衡。
扩散模型(Diffusion Models):思想源自非平衡热力学,通过参数化的马尔可夫链,用变分推断训练。分为两个过程:
- 前向过程(扩散):逐步向真实数据中添加高斯噪声,经过 T 步后数据趋近纯噪声。
- 反向过程(去噪):训练一个神经网络学习逐步去噪,从纯噪声逐步还原出数据。
让我画一张前向/反向过程的示意图帮助理解。

前向过程是固定的加噪马尔可夫链,不需要学习;真正需要训练的是反向过程------一个神经网络(通常是 U-Net 结构)在每一步预测当前噪声,从而实现从纯噪声一步步"雕刻"出真实数据。训练目标本质上是最大化变分下界,等价于让网络学会预测每一步添加的噪声(噪声预测损失)。
DALL-E 2、Stable Diffusion 等模型正是基于这一原理,往往还结合了文本编码器(如 CLIP)来实现文本引导的条件生成。
4. 四种模型对比
| 维度 | GAN | VAE | Flow | 扩散模型 |
|---|---|---|---|---|
| 训练稳定性 | 差(易崩溃) | 好 | 好 | 好 |
| 生成质量 | 高(清晰锐利) | 中(偏模糊) | 中 | 高(目前最优之一) |
| 采样速度 | 快(一步) | 快(一步) | 中等 | 慢(需多步迭代) |
| 显式似然计算 | 不支持 | 有下界(ELBO) | 精确支持 | 有下界 |
| 隐空间可解释性 | 弱 | 强 | 强(可逆) | 中等 |
| 典型代表 | StyleGAN | VQ-VAE | RealNVP、Glow | DDPM、Stable Diffusion |
从发展脉络看,GAN 曾长期是图像生成质量的标杆,但训练不稳定的问题始终存在;VAE 提供了严谨的概率框架但生成效果打折扣;Flow 兼顾精确似然和可逆性但结构受限;而扩散模型通过"渐进式加噪---去噪"这一相对简单且训练稳定的思路,在图像生成质量上实现了对 GAN 的超越,也因此成为了 DALL-E 2、Stable Diffusion 等近年现象级生成模型的核心技术路线,代价是采样速度较慢(需要多步迭代),这也是目前该领域重要的优化方向(如 DDIM、蒸馏加速等)。
5. 扩散模型 中"参数化马尔可夫链"和"变分推断训练"分别指什么
这句话其实是两件事拼在一起说的:结构上 是一条马尔可夫链,训练方法上借用了变分推断(和 VAE 的思路是同一套数学工具)。下面拆开讲。
1. 马尔可夫链体现在哪
扩散模型有两条链,都满足马尔可夫性质(每一步只依赖前一步):
前向链(加噪,固定不训练)
q(x1:T∣x0)=∏t=1Tq(xt∣xt−1)q(x_{1:T}|x_0) = \prod_{t=1}^{T} q(x_t|x_{t-1})q(x1:T∣x0)=t=1∏Tq(xt∣xt−1)
q(xt∣xt−1)=N(xt; 1−βt xt−1, βtI)q(x_t|x_{t-1}) = \mathcal{N}\left(x_t;\ \sqrt{1-\beta_t}\, x_{t-1},\ \beta_t I\right)q(xt∣xt−1)=N(xt; 1−βt xt−1, βtI)
- βt∈(0,1)\beta_t \in (0,1)βt∈(0,1):第 ttt 步的噪声方差调度(超参数,人为设定,随 ttt 增大而增大)
- N(⋅;μ,Σ)\mathcal{N}(\cdot;\mu,\Sigma)N(⋅;μ,Σ):均值为 μ\muμ、协方差为 Σ\SigmaΣ 的高斯分布
- 含义:每一步都是"把上一步的 xt−1x_{t-1}xt−1 缩小一点,再加一点高斯噪声",TTT 步之后 xTx_TxT 基本就是纯噪声 N(0,I)\mathcal{N}(0,I)N(0,I)
- x1:Tx_{1:T}x1:T 是数学中的一种简写记号,表示"从下标 1 到下标 T 的所有变量"
- q(x1:T∣x0)q(x_{1:T}|x_0)q(x1:T∣x0) :已知第 0 个的状态,这后面 经过T 次加噪后,整条演变轨迹出现的可能性有多大;(依次相乘)
反向链(去噪,需要学习)
pθ(x0:T)=p(xT)∏t=1Tpθ(xt−1∣xt)p_\theta(x_{0:T}) = p(x_T)\prod_{t=1}^{T} p_\theta(x_{t-1}|x_t)pθ(x0:T)=p(xT)t=1∏Tpθ(xt−1∣xt)
pθ(xt−1∣xt)=N(xt−1; μθ(xt,t), Σθ(xt,t))p_\theta(x_{t-1}|x_t) = \mathcal{N}\left(x_{t-1};\ \mu_\theta(x_t,t),\ \Sigma_\theta(x_t,t)\right)pθ(xt−1∣xt)=N(xt−1; μθ(xt,t), Σθ(xt,t))
- θ\thetaθ:神经网络(通常是 U-Net)的参数,这就是"参数化"的意思------反向每一步的均值 μθ\mu_\thetaμθ(有时也预测方差)都由网络输出
- p(xT)=N(xT;0,I)p(x_T) = \mathcal{N}(x_T;0,I)p(xT)=N(xT;0,I):起点,纯噪声
注意关键差异:前向链是固定的(人为设计好的加噪规则,没有可学习参数),只有反向链需要用神经网络去拟合。
补充:均值1−βt\sqrt{1-\beta_t}1−βt , 协方差βtI\beta_t IβtI, 怎么都有βt?\beta_t?βt?
这是一个很关键的观察------两处的 βt\beta_tβt 不是巧合,而是刻意设计成这样的,目的是让整个加噪过程中数据的"方差"始终保持在 1 附近,不会爆炸也不会消失。下面推一遍就清楚了。
先看单步定义
q(xt∣xt−1)=N(xt; 1−βt xt−1, βtI)q(x_t|x_{t-1}) = \mathcal{N}\left(x_t;\ \sqrt{1-\beta_t}\, x_{t-1},\ \beta_t I\right)q(xt∣xt−1)=N(xt; 1−βt xt−1, βtI)
写成采样的形式(重参数化):
xt=1−βt xt−1+βt ϵt,ϵt∼N(0,I)x_t = \sqrt{1-\beta_t}\, x_{t-1} + \sqrt{\beta_t}\, \epsilon_{t}, \qquad \epsilon_t \sim \mathcal{N}(0, I)xt=1−βt xt−1+βt ϵt,ϵt∼N(0,I)
- 第一项 1−βt xt−1\sqrt{1-\beta_t}\,x_{t-1}1−βt xt−1:把上一步的信号按比例缩小保留下来
- 第二项 βt ϵt\sqrt{\beta_t}\,\epsilon_tβt ϵt:新加入一份噪声
关键:为什么两边系数要配对成这样
假设 xt−1x_{t-1}xt−1 的方差是 1(单位方差,数据预处理时通常会归一化到这个量级)。那么 xtx_txt 的方差是多少?
因为 xt−1x_{t-1}xt−1 和 ϵt\epsilon_tϵt 相互独立,方差可以直接相加:
Var(xt)=(1−βt)⋅Var(xt−1)+βt⋅Var(ϵt)\text{Var}(x_t) = (1-\beta_t)\cdot\text{Var}(x_{t-1}) + \beta_t\cdot\text{Var}(\epsilon_t)Var(xt)=(1−βt)⋅Var(xt−1)+βt⋅Var(ϵt)
代入 Var(xt−1)=1\text{Var}(x_{t-1})=1Var(xt−1)=1,Var(ϵt)=1\text{Var}(\epsilon_t)=1Var(ϵt)=1:
Var(xt)=(1−βt)×1+βt×1=1\text{Var}(x_t) = (1-\beta_t)\times 1 + \beta_t \times 1 = 1Var(xt)=(1−βt)×1+βt×1=1
方差正好还是 1,没有变化。
这说明了什么
这就是所谓的**方差保持(variance-preserving)**设计:
- 如果均值那边缩小多少信号(1−βt1-\beta_t1−βt 那部分),噪声那边就精确地补回来多少(βt\beta_tβt 那部分)
- 两者此消彼长,加起来永远等于 1
- 这样一来,不管走了多少步 ttt,xtx_txt 的整体方差都保持在 1 左右,不会因为累乘 TTT 次而越变越大(爆炸)或越变越小(塌缩到 0)
如果不这样设计会怎样
如果均值系数和噪声系数不是这样精确配对(比如都用固定的 1,或者随便设置两个无关的系数),经过成百上千步的连乘之后,xtx_txt 的方差会指数级增长或衰减到不可控的数值,训练会非常不稳定,甚至数值溢出。
一句话总结
βt\beta_tβt 同时出现在均值缩放系数 1−βt\sqrt{1-\beta_t}1−βt 和噪声协方差 βtI\beta_t IβtI 里,是为了保证"信号衰减掉的方差"恰好等于"噪声新增的方差",从而让整个前向链的方差始终守恒为 1------这也正是为什么经过 TTT 步之后,xTx_TxT 会稳定收敛到标准正态分布 N(0,I)\mathcal{N}(0, I)N(0,I)(方差为 1),而不是收敛到方差趋于 0 或趋于无穷的退化分布。
2. 变分推断怎么用上的
目标是让模型学会的分布 pθ(x0)p_\theta(x_0)pθ(x0) 逼近真实数据分布,本应最大化对数似然 logpθ(x0)\log p_\theta(x_0)logpθ(x0),但这需要对所有中间变量 x1,...,xTx_1,\dots,x_Tx1,...,xT 积分,是不可解的:
logpθ(x0)=log∫pθ(x0:T) dx1:T\log p_\theta(x_0) = \log \int p_\theta(x_{0:T})\, dx_{1:T}logpθ(x0)=log∫pθ(x0:T)dx1:T
这里用变分推断的标准技巧:引入一个已知的辅助分布(这里恰好就是前向过程 qqq),通过 Jensen 不等式构造一个可优化的下界(变分下界,ELBO):
logpθ(x0)≥Eqlogpθ(x0:T)q(x1:T∣x0)=−LVLB\log p_\theta(x_0) \geq \mathbb{E}q\left\\log \\frac{p_\\theta(x_{0:T})}{q(x_{1:T}\|x_0)}\\right = -L{VLB}logpθ(x0)≥Eqlogq(x1:T∣x0)pθ(x0:T)=−LVLB
- 这一步和 VAE 的 ELBO 推导完全同源:VAE 只有一层隐变量 zzz,扩散模型相当于把隐变量拆成了 TTT 层(x1,...,xTx_1,\dots,x_Tx1,...,xT),本质都是"用已知的近似后验去逼近难算的真实后验,从而把不可解的似然优化转化为可解的下界优化"
- 训练不直接最大化似然本身,而是最大化这个下界(等价于最小化 LVLBL_{VLB}LVLB)
3. 下界展开成什么
把 LVLBL_{VLB}LVLB 按每个时间步拆开,会得到一系列 KL 散度项:
LVLB=Eq DKL(q(xT∣x0) ∥ p(xT))⏟固定,可忽略+∑t=2TDKL(q(xt−1∣xt,x0) ∥ pθ(xt−1∣xt))⏟核心训练目标−logpθ(x0∣x1) L_{VLB} = \mathbb{E}_q\Big\\ \\underbrace{D_{KL}\\big(q(x_T\|x_0)\\,\\\|\\,p(x_T)\\big)}_{\\text{固定,可忽略}} + \\sum_{t=2}\^{T} \\underbrace{D_{KL}\\big(q(x_{t-1}\|x_t,x_0)\\,\\\|\\,p_\\theta(x_{t-1}\|x_t)\\big)}_{\\text{核心训练目标}} - \\log p_\\theta(x_0\|x_1)\\ \\BigLVLB=Eq 固定,可忽略 DKL(q(xT∣x0)∥p(xT))+t=2∑T核心训练目标 DKL(q(xt−1∣xt,x0)∥pθ(xt−1∣xt))−logpθ(x0∣x1)
- q(xt−1∣xt,x0)q(x_{t-1}|x_t,x_0)q(xt−1∣xt,x0):真实的"去噪后验",由于前向过程是高斯的,这一项可以解析算出闭式解(这是扩散模型能高效训练的关键前提)
- pθ(xt−1∣xt)p_\theta(x_{t-1}|x_t)pθ(xt−1∣xt):模型预测的去噪分布
- 每一步训练本质就是让模型预测的去噪分布去逼近这个已知的真实后验
4. 最终简化成什么样的实际损失函数
由于两边都是高斯分布,KL 散度可以化简为均值之间的加权平方差,再通过重参数化,把预测均值 μθ\mu_\thetaμθ 换成预测"当前步添加的噪声" ϵθ\epsilon_\thetaϵθ,最终 DDPM 论文给出的实用训练目标非常简洁:
Lsimple(θ)=Et, x0, ϵ ∥ϵ−ϵθ(αˉt x0+1−αˉt ϵ, t)∥2 L_{simple}(\theta) = \mathbb{E}_{t,\, x_0,\, \epsilon}\Big\\ \\big\\\|\\epsilon - \\epsilon_\\theta(\\sqrt{\\bar\\alpha_t}\\,x_0 + \\sqrt{1-\\bar\\alpha_t}\\,\\epsilon,\\ t)\\big\\\|\^2\\ \\BigLsimple(θ)=Et,x0,ϵ ϵ−ϵθ(αˉt x0+1−αˉt ϵ, t) 2
逐项解释:
- ϵ∼N(0,I)\epsilon \sim \mathcal{N}(0,I)ϵ∼N(0,I):训练时随机采样的真实噪声(我们知道它是多少,因为是我们自己加的)
- αˉt=∏s=1t(1−βs)\bar\alpha_t = \prod_{s=1}^{t}(1-\beta_s)αˉt=∏s=1t(1−βs):累积保留系数,用来一步到位算出任意时刻 ttt 的加噪结果,不用真的迭代 ttt 次
- αˉt x0+1−αˉt ϵ\sqrt{\bar\alpha_t}\,x_0 + \sqrt{1-\bar\alpha_t}\,\epsilonαˉt x0+1−αˉt ϵ:就是加噪 ttt 步后的 xtx_txt(重参数化写法)
- ϵθ(xt,t)\epsilon_\theta(x_t, t)ϵθ(xt,t):神经网络看到带噪图 xtx_txt 和时间步 ttt,预测"这里面混入的噪声是什么"
- 整体:让网络预测的噪声尽量接近真实加入的噪声,用均方误差衡量
一句话理解
整个推导链条是:真实似然不可解 → 用变分推断构造可解的下界(ELBO)→ 下界拆成逐步的 KL 散度 → 因为链是高斯的所以每步 KL 有闭式解 → 化简后变成"预测噪声、算 MSE"这样一个极简的训练任务。所以扩散模型训练起来非常稳定,就是因为最终目标退化成了一个普通的回归问题。