MIT 6.S184 | 基于随机微分方程的生成式AI | 2026 | 笔记 | Lecture 3-B: Guidance
目录
前言
学习 MIT S.184 课程,本篇文章记录课程第三讲 B 部分:引导,记录下个人学习笔记,和大家一起分享交流😄
Website:https://diffusion.csail.mit.edu/
Course Notes:An Introduction to Flow Matching and Diffusion Models
1. Guidance
接下来我们讨论 Guidance,也就是如何让生成模型根据给定提示词生成内容。
到目前为止,我们主要讨论的是无条件生成。也就是说,模型的目标只是从数据分布中生成一个样本。例如,对于图像模型来说,无条件生成的目标可以简单理解为:
Generate an image.
也就是生成一张图像,但不指定图像应该是什么内容。
但是在实际应用中,我们通常并不只是希望模型随便生成一张图像,而是希望它根据某个具体条件生成。例如:
Generate an image of a cat baking a cake.
也就是说,我们希望模型生成一张 “猫正在烤蛋糕” 的图像。
这里就出现了 unguided 和 guided 的区别:
- Unguided generation:无引导生成,只要求模型生成一个来自数据分布的样本;
- Guided generation:有引导生成,要求模型生成符合特定条件或提示词的样本。
例如,如果提示词是 “a car made out of vegetables”,那么我们希望生成的是一辆由蔬菜构成的汽车,而不是任意一张图像。
因此,Guidance 要解决的问题就是:
如何让生成模型不仅生成高质量样本,还能让样本符合给定 prompt?
这就是本节课接下来要讨论的核心内容。
2. Vanilla Guidance
首先,我们讨论最直接的做法,也就是 普通条件引导(vanilla guidance)。
在无条件生成中,数据分布只包含数据样本:
z ∼ p d a t a z\sim p_{\mathrm{data}} z∼pdata
其中, z ∈ R d z\in\mathbb{R}^d z∈Rd 表示图像、视频或其他数据对象。
而在条件生成中,数据不再只是单独的图像,而是图像和提示词组成的配对数据:
( z , y ) ∼ p d a t a ( z , y ) (z,y)\sim p_{\mathrm{data}}(z,y) (z,y)∼pdata(z,y)
这里:
- z z z 表示数据样本,例如一张图像;
- y y y 表示条件信息,例如文本 prompt。
例如, z z z 可以是一张猫的图像, y y y 可以是对应的文本描述:“a cat baking a cake”。
既然现在生成过程需要依赖 prompt,那么我们就需要让神经网络在输入中接收这个 prompt。
在无条件流模型中,神经网络向量场写作:
u t θ ( x ) u_t^\theta(x) utθ(x)
它接收当前位置 x x x 和时间 t t t,输出速度向量。
在有条件生成中,我们将 prompt y y y 也作为输入,于是向量场变成:
u t θ ( x ∣ y ) u_t^\theta(x\mid y) utθ(x∣y)
这个对象可以理解为 引导向量场(guided vector field)。它告诉模型:在当前时间 t t t 、当前位置 x x x ,并且给定提示词 y y y 的情况下,样本应该朝哪个方向移动。
训练方法也非常直接。我们只需要在原来的 Conditional Flow Matching 损失中加入 prompt 输入即可:
L C F M g u i d e d ( θ ) = E ( z , y ) ∼ p d a t a ( z , y ) , t ∼ U n i f [ 0 , 1 ] , x ∼ p t ( ⋅ ∣ z ) [ ∥ u t θ ( x ∣ y ) − u t t a r g e t ( x ∣ z ) ∥ 2 ] \mathcal{L}_{\mathrm{CFM}}^{\mathrm{guided}}(\theta) = \mathbb{E}_{(z,y)\sim p_{\mathrm{data}}(z,y), t\sim \mathrm{Unif}[0,1], x\sim p_t(\cdot|z)} \left[ \left \| u_t^\theta(x|y) - u_t^{\mathrm{target}}(x|z) \right \|^2 \right] LCFMguided(θ)=E(z,y)∼pdata(z,y),t∼Unif[0,1],x∼pt(⋅∣z)[ utθ(x∣y)−uttarget(x∣z) 2]
这个公式和无条件 Flow Matching 非常相似,区别只在于:
- 训练数据从单个样本 z z z 变成了配对样本 ( z , y ) (z,y) (z,y) ;
- 神经网络输入从 ( x , t ) (x,t) (x,t) 变成了 ( x , t , y ) (x,t,y) (x,t,y) ;
- 损失仍然是让网络输出回归条件目标向量场。
也就是说,训练过程变成:
- 从数据集中采样一对图像和文本 ( z , y ) (z,y) (z,y) ;
- 随机采样时间 t t t ;
- 从条件概率路径中采样带噪样本 x x x ;
- 将 ( x , t , y ) (x,t,y) (x,t,y) 输入神经网络;
- 让网络输出回归 u t t a r g e t ( x ∣ z ) u_t^{\mathrm{target}}(x|z) uttarget(x∣z) 。
这里需要注意,目标向量场:
u t t a r g e t ( x ∣ z ) u_t^{\mathrm{target}}(x|z) uttarget(x∣z)
仍然只依赖数据点 z z z ,不显式依赖提示词 y y y 。因为它描述的是从噪声到该数据点的路径,而 prompt 的作用主要体现在神经网络输入中,帮助模型判断当前样本应该朝哪个数据语义方向演化。
训练完成之后,采样过程也很自然。
给定一个提示词 y y y,例如:
a cat baking a cake
我们从初始噪声分布中采样:
X 0 ∼ p i n i t X_0\sim p_{\mathrm{init}} X0∼pinit
然后模拟条件 ODE:
d X t = u t θ ( X t ∣ y ) d t dX_t=u_t^\theta(X_t\mid y)dt dXt=utθ(Xt∣y)dt
也就是说,在采样的每一步,都把 prompt y y y 输入给神经网络,让神经网络根据当前状态和提示词给出速度方向。最终得到的 X 1 X_1 X1 就应该是符合提示词的生成样本。
从理论上看,这似乎已经解决了条件生成问题:我们训练了一个带 prompt 输入的向量场,然后采样时给定 prompt,就可以从条件分布中生成样本。
但是在实践中,这种普通条件引导往往效果不够好。
普通条件引导的问题是:模型生成的图像有时并不能很好地符合 prompt。
例如,当 prompt 是:
Corgi dog
我们希望模型生成清晰、准确的柯基犬图像。但普通条件引导生成的结果可能只是大致像狗,甚至出现类别不准确、画面混乱、局部结构错误等问题。
换句话说,模型虽然接收了 prompt,但它对 prompt 的遵循程度不够强。生成结果可能仍然主要受无条件数据分布影响,而没有足够强调提示词中的语义约束。
因此,我们需要一种方法来 增强 prompt 对生成过程的影响。
这就是后面要讨论的 classifier guidance 和 classifier-free guidance 的动机。
Q & A
Q:为什么条件目标向量场 u t t a r g e t ( x ∣ z ) u_t^{\mathrm{target}}(x|z) uttarget(x∣z) 不依赖 prompt y y y ?
A:因为这里的目标向量场来自我们对概率路径的解析构造。它描述的是:给定数据点 z z z ,如何从噪声移动到这个数据点。
对于高斯概率路径来说,条件向量场本质上由 x x x、 z z z 以及调度器 α t , β t \alpha_t,\beta_t αt,βt 决定。它并不需要显式知道 prompt,因为 prompt 只是这个数据点的语义描述,而从噪声到数据点的插值路径已经由 z z z 本身决定。
当然,从理论上说,也可以设计依赖 prompt 的概率路径或目标向量场,但实际中通常不会这样做。更常见的做法是:让 prompt 作为神经网络输入,由网络学习如何利用 prompt 改变生成方向。
Q:能不能学习一种依赖 prompt 的加噪方式或概率路径?
A:原则上可以。我们可以设想一种概率路径:
p t ( ⋅ ∣ z , y ) p_t(\cdot\mid z,y) pt(⋅∣z,y)
或者一个依赖 prompt 的目标向量场:
u t t a r g e t ( x ∣ z , y ) u_t^{\mathrm{target}}(x\mid z,y) uttarget(x∣z,y)
但这会让训练框架更复杂,而且实践中主流方法并不这样做。当前更常用、更有效的方法是固定概率路径,然后通过 guidance 机制增强 prompt 对采样过程的影响。
3. Classifier Guidance
接下来讨论 分类器引导(classifier guidance)。
虽然最终我们会重点介绍 classifier-free guidance,但为了理解它的来源,需要先理解 classifier guidance。
普通条件引导效果不够好的原因是:模型虽然接收 prompt,但 prompt 的影响可能不够强。因此,我们希望找到一种方式,把生成过程更强地推向符合 prompt 的方向。
分类器引导的基本思想是:
使用一个额外的分类器或条件判断模型,告诉生成过程当前样本是否符合 prompt,然后沿着让 prompt 概率增加的方向修正生成轨迹。
我们从贝叶斯公式开始。
对于给定 prompt y y y 的条件分布,有:
p t ( x ∣ y ) = p t ( y ∣ x ) p t ( x ) p t ( y ) p_t(x\mid y) = \frac{ p_t(y\mid x)p_t(x) }{ p_t(y) } pt(x∣y)=pt(y)pt(y∣x)pt(x)
这里:
- p t ( x ∣ y ) p_t(x\mid y) pt(x∣y) 表示给定 prompt y y y 时,带噪样本 x x x 的分布;
- p t ( y ∣ x ) p_t(y\mid x) pt(y∣x) 表示给定带噪样本 x x x 时,它对应 prompt y y y 的概率;
- p t ( x ) p_t(x) pt(x) 是无条件边缘分布;
- p t ( y ) p_t(y) pt(y) 是 prompt 的边缘概率。
对两边取对数:
log p t ( x ∣ y ) = log p t ( y ∣ x ) + log p t ( x ) − log p t ( y ) \log p_t(x\mid y) = \log p_t(y\mid x) + \log p_t(x) - \log p_t(y) logpt(x∣y)=logpt(y∣x)+logpt(x)−logpt(y)
接着对 x x x 求梯度。由于 log p t ( y ) \log p_t(y) logpt(y) 不依赖于 x x x,它的梯度为零,因此得到:
∇ x log p t ( x ∣ y ) = ∇ x log p t ( y ∣ x ) + ∇ x log p t ( x ) \nabla_x\log p_t(x\mid y) = \nabla_x\log p_t(y\mid x) + \nabla_x\log p_t(x) ∇xlogpt(x∣y)=∇xlogpt(y∣x)+∇xlogpt(x)
这个公式非常关键。
它说明:条件 score 可以分解为两部分:
- 无条件 score:
∇ x log p t ( x ) \nabla_x\log p_t(x) ∇xlogpt(x)
- prompt 相关的引导项:
∇ x log p t ( y ∣ x ) \nabla_x\log p_t(y\mid x) ∇xlogpt(y∣x)
其中,第二项表示:如何改变当前样本 x x x ,才能让它更符合 prompt y y y 。
接下来,我们利用前面讲过的 score 与向量场之间的转换关系。
对于高斯概率路径,边缘向量场可以写作:
u t t a r g e t ( x ) = b t x + a t ∇ x log p t ( x ) u_t^{\mathrm{target}}(x) = b_tx+a_t\nabla_x\log p_t(x) uttarget(x)=btx+at∇xlogpt(x)
同理,给定 prompt y y y 的条件目标向量场可以写成:
u t t a r g e t ( x ∣ y ) = b t x + a t ∇ x log p t ( x ∣ y ) u_t^{\mathrm{target}}(x|y) = b_tx+a_t\nabla_x\log p_t(x|y) uttarget(x∣y)=btx+at∇xlogpt(x∣y)
将刚才的条件 score 分解代入:
∇ x log p t ( x ∣ y ) = ∇ x log p t ( x ) + ∇ x log p t ( y ∣ x ) \nabla_x\log p_t(x\mid y) = \nabla_x\log p_t(x) + \nabla_x\log p_t(y\mid x) ∇xlogpt(x∣y)=∇xlogpt(x)+∇xlogpt(y∣x)
于是得到:
u t t a r g e t ( x ∣ y ) = b t x + a t ( ∇ x log p t ( x ) + ∇ x log p t ( y ∣ x ) ) = u t t a r g e t ( x ) + a t ∇ x log p t ( y ∣ x ) u_t^{\mathrm{target}}(x|y) = b_tx + a_t \left( \nabla_x\log p_t(x) + \nabla_x\log p_t(y|x) \right) = u_t^{\mathrm{target}}(x) + a_t\nabla_x\log p_t(y|x) uttarget(x∣y)=btx+at(∇xlogpt(x)+∇xlogpt(y∣x))=uttarget(x)+at∇xlogpt(y∣x)
这个公式告诉我们:
条件向量场 = 无条件向量场 + prompt 相关的分类器梯度项。
其中:
u t t a r g e t ( x ) u_t^{\mathrm{target}}(x) uttarget(x)
是不依赖 prompt 的无条件生成方向,而:
a t ∇ x log p t ( y ∣ x ) a_t\nabla_x\log p_t(y|x) at∇xlogpt(y∣x)
是依赖 prompt 的引导方向。
为什么这里叫 “分类器引导”?
因为 p t ( y ∣ x ) p_t(y\mid x) pt(y∣x) 可以理解为一个分类器或条件判断模型。如果 y y y 是类别标签,例如 “dog” 或 “corgi”,那么 p t ( y ∣ x ) p_t(y\mid x) pt(y∣x) 就表示:给定当前带噪图像 x x x ,它属于类别 y y y 的概率。
因此:
∇ x log p t ( y ∣ x ) \nabla_x\log p_t(y\mid x) ∇xlogpt(y∣x)
表示的是:如何改变当前样本 x x x ,才能让分类器更相信它属于类别 y y y 。
这正是分类器引导的核心思想:在采样过程中,除了使用生成模型本身的方向,还额外沿着分类器认为更符合 prompt 的方向移动。
u t t a r g e t ( x ∣ y ) = u t t a r g e t ( x ) + a t ∇ x log p t ( y ∣ x ) u_t^{\mathrm{target}}(x|y) = u_t^{\mathrm{target}}(x) + a_t\nabla_x\log p_t(y|x) uttarget(x∣y)=uttarget(x)+at∇xlogpt(y∣x)
上面的公式给出了理论上的条件向量场:
但是前面已经看到,普通条件生成可能对 prompt 的遵循不够强。因此,一个自然想法是:
放大 prompt 相关的那一部分。
于是引入一个引导权重:
w ≥ 1 w\geq 1 w≥1
并定义增强后的引导向量场:
u ~ t ( x ∣ y ) = u t t a r g e t ( x ) + w a t ∇ x log p t ( y ∣ x ) \tilde{u}_t(x|y) = u_t^{\mathrm{target}}(x) + w a_t\nabla_x\log p_t(y|x) u~t(x∣y)=uttarget(x)+wat∇xlogpt(y∣x)
当 w = 1 w=1 w=1 时,它退化为普通的条件向量场。
当 w > 1 w>1 w>1 时,prompt 相关项被放大,生成过程会更强地朝着符合 prompt 的方向移动。
这就是 classifier guidance 的基本机制。
从几何上看,无条件向量场给出一个基础生成方向,而分类器梯度给出一个 prompt 相关的修正方向。放大这个修正方向后,最终采样轨迹会更强地偏向符合 prompt 的区域。
分类器引导虽然直观有效,但它有明显缺点。
首先,它需要额外训练一个分类器:
p t ( y ∣ x ) p_t(y\mid x) pt(y∣x)
这意味着除了生成模型本身,还需要训练另一个模型。训练和维护成本都会增加。
其次,这个分类器不能只是普通的干净图像分类器。因为在生成过程中, x x x 通常是带噪样本,尤其是在中间时间 t t t ,它并不是一张清晰图像。因此,分类器必须能够处理不同噪声水平下的样本,也就是需要训练一个噪声条件分类器:
p t ( y ∣ x ) p_t(y\mid x) pt(y∣x)
这进一步增加了训练难度。
第三,当 y y y 不是简单类别标签,而是一段复杂文本 prompt 时,问题会变得更困难。对于 “a cat baking a cake” 这样的长文本,我们很难直接训练一个传统意义上的分类器来输出:
p t ( y ∣ x ) p_t(y\mid x) pt(y∣x)
更不用说还要计算它关于 x x x 的梯度:
∇ x log p t ( y ∣ x ) \nabla_x\log p_t(y\mid x) ∇xlogpt(y∣x)
因此,classifier guidance 虽然提供了很好的理论直觉,但在实际大规模文本到图像生成中并不是最理想的方案。
这也正是 Classifier-Free Guidance 出现的原因:
我们希望获得类似分类器引导的效果,但不额外训练一个分类器。
4. Classifier-Free Guidance
上一部分我们讨论了 classifier guidance。它的核心思想是:使用一个额外的分类器 p t ( y ∣ x ) p_t(y|x) pt(y∣x) 来判断当前带噪样本 x x x 是否符合提示词 y y y ,然后沿着提升该条件概率的方向修正生成轨迹。
分类器引导得到的增强向量场可以写成:
u ~ t ( x ∣ y ) = u t t a r g e t ( x ) + w a t ∇ x log p t ( y ∣ x ) \tilde{u}_t(x|y) = u_t^{\mathrm{target}}(x) + w a_t \nabla_x \log p_t(y|x) u~t(x∣y)=uttarget(x)+wat∇xlogpt(y∣x)
其中:
- u t t a r g e t ( x ) u_t^{\mathrm{target}}(x) uttarget(x) 是无条件向量场;
- ∇ x log p t ( y ∣ x ) \nabla_x\log p_t(y|x) ∇xlogpt(y∣x) 是分类器提供的 prompt 相关方向;
- a t a_t at 是 score 与向量场转换公式中的时间系数;
- w ≥ 1 w\geq 1 w≥1 是引导强度,用来放大 prompt 相关项。
这个公式的直觉很清楚:先按照无条件模型生成图像,再额外加入一项,让生成过程更偏向符合 prompt 的方向。
但是它有一个明显缺点:需要额外训练一个分类器,而且这个分类器必须能够处理带噪样本 x x x 。如果 prompt 是复杂文本,而不是简单类别标签,那么训练和使用这个分类器会更加困难。
因此,我们希望保留 “增强 prompt 相关方向” 的思想,但不再显式训练分类器。这就是 Classifier-Free Guidance(CFG,无分类器引导) 的目标。
现在从分类器引导公式出发:
u ~ t ( x ∣ y ) = u t t a r g e t ( x ) + w a t ∇ x log p t ( y ∣ x ) \tilde{u}_t(x|y)=u_t^{\mathrm{target}}(x)+w a_t\nabla_x\log p_t(y|x) u~t(x∣y)=uttarget(x)+wat∇xlogpt(y∣x)
关键是把其中的分类器梯度项:
∇ x log p t ( y ∣ x ) \nabla_x\log p_t(y|x) ∇xlogpt(y∣x)
改写成不需要分类器的形式。
上一部分中,我们已经通过贝叶斯公式得到:
∇ x log p t ( x ∣ y ) = ∇ x log p t ( y ∣ x ) + ∇ x log p t ( x ) \nabla_x \log p_t(x|y) = \nabla_x \log p_t(y|x) + \nabla_x \log p_t(x) ∇xlogpt(x∣y)=∇xlogpt(y∣x)+∇xlogpt(x)
因此可以移项得到:
∇ x log p t ( y ∣ x ) = ∇ x log p t ( x ∣ y ) − ∇ x log p t ( x ) \nabla_x \log p_t(y|x) = \nabla_x \log p_t(x|y) - \nabla_x \log p_t(x) ∇xlogpt(y∣x)=∇xlogpt(x∣y)−∇xlogpt(x)
也就是说,分类器梯度可以看作:
条件 score 减去无条件 score。
接下来利用高斯概率路径下 score 与向量场之间的转换关系:
u t t a r g e t ( x ) = a t ∇ x log p t ( x ) + b t x u_t^{\mathrm{target}}(x) = a_t\nabla_x\log p_t(x)+b_tx uttarget(x)=at∇xlogpt(x)+btx
以及
u t t a r g e t ( x ∣ y ) = a t ∇ x log p t ( x ∣ y ) + b t x u_t^{\mathrm{target}}(x|y) = a_t\nabla_x\log p_t(x|y)+b_tx uttarget(x∣y)=at∇xlogpt(x∣y)+btx
于是有:
a t ∇ x log p t ( y ∣ x ) = u t t a r g e t ( x ∣ y ) − u t t a r g e t ( x ) a_t\nabla_x\log p_t(y|x) = u_t^{\mathrm{target}}(x|y) - u_t^{\mathrm{target}}(x) at∇xlogpt(y∣x)=uttarget(x∣y)−uttarget(x)
将它代回分类器引导公式:
u ~ t ( x ∣ y ) = u t t a r g e t ( x ) + w a t ∇ x log p t ( y ∣ x ) = u t t a r g e t ( x ) + w ( u t t a r g e t ( x ∣ y ) − u t t a r g e t ( x ) ) = ( 1 − w ) u t t a r g e t ( x ) + w u t t a r g e t ( x ∣ y ) \begin{aligned} \tilde{u}_t(x|y) &= u_t^{\mathrm{target}}(x) + w a_t\nabla_x\log p_t(y|x) \\[8pt] &= u_t^{\mathrm{target}}(x) + w \left( u_t^{\mathrm{target}}(x|y) - u_t^{\mathrm{target}}(x) \right) \\[8pt] &= (1-w)u_t^{\mathrm{target}}(x) + wu_t^{\mathrm{target}}(x|y) \end{aligned} u~t(x∣y)=uttarget(x)+wat∇xlogpt(y∣x)=uttarget(x)+w(uttarget(x∣y)−uttarget(x))=(1−w)uttarget(x)+wuttarget(x∣y)
这就是 CFG 的核心公式。
它的意义非常重要:原本分类器引导需要显式计算分类器梯度,但现在这个分类器梯度被改写成了 条件向量场与无条件向量场之差。
也就是说,prompt 相关方向可以理解为:
u t t a r g e t ( x ∣ y ) − u t t a r g e t ( x ) u_t^{\mathrm{target}}(x|y) - u_t^{\mathrm{target}}(x) uttarget(x∣y)−uttarget(x)
这正是 “给定 prompt 后,向量场相对于无 prompt 情况发生的变化”。因此,我们不再需要一个单独的分类器,只需要能够得到两个向量场:
- 无条件向量场 u t t a r g e t ( x ) u_t^{\mathrm{target}}(x) uttarget(x) ;
- 条件向量场 u t t a r g e t ( x ∣ y ) u_t^{\mathrm{target}}(x|y) uttarget(x∣y) 。
现在还有一个问题:如果需要同时得到条件向量场和无条件向量场,是否仍然需要训练两个模型?
答案是不需要。
CFG 使用一个非常简单但非常有效的技巧:引入一个 空 token,记作:
∅ \varnothing ∅
它表示 “不提供 prompt”。
于是无条件向量场可以写成:
u t t a r g e t ( x ∣ ∅ ) u_t^{\mathrm{target}}(x|\varnothing) uttarget(x∣∅)
也就是说,我们把无条件生成看作条件生成的一个特殊情况:条件输入为空。
这样,CFG 的增强向量场可以写成:
u ~ t ( x ∣ y ) = ( 1 − w ) u t t a r g e t ( x ∣ ∅ ) + w u t t a r g e t ( x ∣ y ) \tilde{u}_t(x|y) = (1-w)u_t^{\mathrm{target}}(x|\varnothing) + wu_t^{\mathrm{target}}(x|y) u~t(x∣y)=(1−w)uttarget(x∣∅)+wuttarget(x∣y)
在实际模型中,我们用同一个神经网络来近似这两个向量场:
u t θ ( x ∣ ∅ ) , u t θ ( x ∣ y ) u_t^\theta(x|\varnothing), \qquad u_t^\theta(x|y) utθ(x∣∅),utθ(x∣y)
因此,采样时使用:
u t θ , w ( x ∣ y ) = ( 1 − w ) u t θ ( x ∣ ∅ ) + w u t θ ( x ∣ y ) u_t^{\theta,w}(x|y) = (1-w)u_t^\theta(x|\varnothing) + wu_t^\theta(x|y) utθ,w(x∣y)=(1−w)utθ(x∣∅)+wutθ(x∣y)
这就是无分类器引导的最终形式。
它的核心思想可以总结为:
用同一个模型同时学习 “有 prompt 的生成方向” 和 “无 prompt 的生成方向”,然后在采样时放大二者之间的差异,从而增强 prompt 的影响。
这就是为什么它叫 classifier-free guidance:它达到了类似 classifier guidance 的效果,但完全不需要显式训练分类器。
从几何上看,CFG 的含义非常直观。
普通条件向量场可以分解为两部分:
u t t a r g e t ( x ∣ y ) = u t t a r g e t ( x ) + ( u t t a r g e t ( x ∣ y ) − u t t a r g e t ( x ) ) u_t^{\mathrm{target}}(x|y) = u_t^{\mathrm{target}}(x) + \left( u_t^{\mathrm{target}}(x|y) - u_t^{\mathrm{target}}(x) \right) uttarget(x∣y)=uttarget(x)+(uttarget(x∣y)−uttarget(x))
其中:
- u t t a r g e t ( x ) u_t^{\mathrm{target}}(x) uttarget(x) 是无条件生成方向;
- u t t a r g e t ( x ∣ y ) − u t t a r g e t ( x ) u_t^{\mathrm{target}}(x|y)-u_t^{\mathrm{target}}(x) uttarget(x∣y)−uttarget(x) 是 prompt 带来的修正方向。
如果普通条件生成对 prompt 的响应不够强,我们就放大这个修正方向:
u ~ t w ( x ∣ y ) = u t t a r g e t ( x ) + w ( u t t a r g e t ( x ∣ y ) − u t t a r g e t ( x ) ) \tilde{u}_t^w(x|y) = u_t^{\mathrm{target}}(x) + w \left( u_t^{\mathrm{target}}(x|y) - u_t^{\mathrm{target}}(x) \right) u~tw(x∣y)=uttarget(x)+w(uttarget(x∣y)−uttarget(x))
当 w = 1 w=1 w=1 时:
u ~ t w ( x ∣ y ) = u t t a r g e t ( x ∣ y ) \tilde{u}_t^w(x|y)=u_t^{\mathrm{target}}(x|y) u~tw(x∣y)=uttarget(x∣y)
这就是普通条件生成。
当 w > 1 w>1 w>1 时,prompt 相关方向被放大,生成结果会更强地贴合提示词。
例如,对于 prompt “Corgi dog”,当 w = 1 w=1 w=1 时,结果可能只是大致像狗,甚至出现语义不准确的图像;而当 w = 4 w=4 w=4 时,生成结果会明显更接近柯基犬:
这说明 CFG 的作用不是简单地 “使用 prompt”,而是进一步 增强 prompt 对生成轨迹的控制力。
为了让一个模型同时支持有条件和无条件生成,我们需要在训练时加入一个小改动。
训练过程如下。
对于每个 mini-batch:
- 从配对数据集中采样:
( z , y ) ∼ p d a t a (z,y)\sim p_{\mathrm{data}} (z,y)∼pdata
- 随机采样时间:
t ∼ U n i f ( [ 0 , 1 ] ) t\sim \mathrm{Unif}([0,1]) t∼Unif([0,1])
- 采样高斯噪声:
ϵ ∼ N ( 0 , I d ) \epsilon\sim \mathcal{N}(0,I_d) ϵ∼N(0,Id)
- 构造带噪样本:
x = α t z + β t ϵ x=\alpha_tz+\beta_t\epsilon x=αtz+βtϵ
- 以某个概率 p p p 丢弃 prompt:
y ← ∅ y\leftarrow \varnothing y←∅
- 计算回归损失:
L ( θ ) = ∥ u t θ ( x ∣ y ) − u t t a r g e t ( x ∣ z ) ∥ 2 \mathcal{L}(\theta) = \left \| u_t^\theta(x|y) - u_t^{\mathrm{target}}(x|z) \right \|^2 L(θ)= utθ(x∣y)−uttarget(x∣z) 2
- 使用梯度下降更新参数。
这里最关键的一步是:以一定概率丢弃 prompt。
例如,可以让模型在一部分训练样本中看到真实 prompt,在另一部分训练样本中只看到空 token ∅ \varnothing ∅。这样一来,同一个网络就会同时学到两种能力:
- 当输入为 y y y 时,学习条件向量场;
- 当输入为 ∅ \varnothing ∅ 时,学习无条件向量场。
这就是 CFG 能够只用一个模型实现有条件和无条件生成的原因。
它相比 classifier guidance 的优势非常明显:不需要额外训练分类器,也不需要维护两个完全独立的模型,只需要在原有训练流程中加入 “随机丢弃标签” 这一步。
训练完成后,采样过程也很简单。
给定 prompt y y y 和引导强度 w > 1 w>1 w>1 ,我们使用加权向量场:
u t θ , w ( x ∣ y ) = ( 1 − w ) u t θ ( x ∣ ∅ ) + w u t θ ( x ∣ y ) u_t^{\theta,w}(x|y) = (1-w)u_t^\theta(x|\varnothing) + wu_t^\theta(x|y) utθ,w(x∣y)=(1−w)utθ(x∣∅)+wutθ(x∣y)
然后像普通流模型一样模拟 ODE:
d X t = u t θ , w ( X t ∣ y ) d t dX_t = u_t^{\theta,w}(X_t|y)dt dXt=utθ,w(Xt∣y)dt
也就是说,采样流程为:
- 选择 prompt y y y ;
- 选择 guidance scale w > 1 w>1 w>1 ;
- 从初始噪声分布采样:
X 0 ∼ p i n i t X_0\sim p_{\mathrm{init}} X0∼pinit
- 从 t = 0 t=0 t=0 到 t = 1 t=1 t=1 模拟 ODE:
d X t = [ ( 1 − w ) u t θ ( X t ∣ ∅ ) + w u t θ ( X t ∣ y ) ] d t dX_t = \left[ (1-w)u_t^\theta(X_t|\varnothing) + wu_t^\theta(X_t|y) \right]dt dXt=[(1−w)utθ(Xt∣∅)+wutθ(Xt∣y)]dt
- 返回最终样本 X 1 X_1 X1 。
当 w = 1 w=1 w=1 时,这就是普通条件采样:
u t θ , 1 ( x ∣ y ) = u t θ ( x ∣ y ) u_t^{\theta,1}(x|y)=u_t^\theta(x|y) utθ,1(x∣y)=utθ(x∣y)
当 w > 1 w>1 w>1 时,模型会更强地遵循 prompt。
当 y = ∅ y=\varnothing y=∅ 时,则退化为无条件采样。
需要注意的是,CFG 采样通常需要在每个时间步调用两次模型:
u t θ ( x ∣ ∅ ) and u t θ ( x ∣ y ) u_t^\theta(x|\varnothing) \quad \text{and}\quad u_t^\theta(x|y) utθ(x∣∅)andutθ(x∣y)
因此,它的推理成本通常高于普通条件采样。这是 CFG 的一个实际缺点。
CFG 在现代图像和视频生成模型中非常重要。
从示例可以看到,使用更强的 guidance scale 后,生成结果通常会更符合指定类别或文本描述。例如,对于猫、柯基犬、火山等类别,CFG 能明显增强生成样本与 prompt 的一致性。
讲义中也强调,当前许多图像或视频生成系统都高度依赖 CFG。比如 Stable Diffusion 3 这类模型中,常见的 guidance scale 大约可以取到 w ≈ 4 w\approx 4 w≈4 。这意味着模型在采样时显著放大了 prompt 相关的方向。
从实践角度看,CFG 是让文本条件生成模型真正可用的关键技巧之一。没有它,生成结果往往更容易偏离 prompt,或者语义匹配度明显下降。
不过,CFG 也有一个非常重要的理论问题:当 w > 1 w>1 w>1 时,它不再严格对应于从真实数据分布采样。
在前面课程中,我们一直强调生成模型的目标是:
X 1 ∼ p d a t a X_1\sim p_{\mathrm{data}} X1∼pdata
或者在条件生成中:
X 1 ∼ p d a t a ( ⋅ ∣ y ) X_1\sim p_{\mathrm{data}}(\cdot|y) X1∼pdata(⋅∣y)
但 CFG 做的事情是人为放大 prompt 相关方向:
u t θ , w ( x ∣ y ) = u t θ ( x ∣ ∅ ) + w ( u t θ ( x ∣ y ) − u t θ ( x ∣ ∅ ) ) u_t^{\theta,w}(x|y) = u_t^\theta(x|\varnothing) + w \left( u_t^\theta(x|y) - u_t^\theta(x|\varnothing) \right) utθ,w(x∣y)=utθ(x∣∅)+w(utθ(x∣y)−utθ(x∣∅))
当 w = 1 w=1 w=1 时,它对应普通条件生成。
但当 w > 1 w>1 w>1 时,我们已经不再只是按照理论上的条件向量场采样,而是在向量场中加入了额外放大。因此,它不再严格表示某条原始数据分布对应的概率路径。
可以把它理解为一种 “向高置信度区域推得更强” 的操作。随着 guidance strength 增大,分布可能会更加集中到某些模式上:
- prompt 对齐度更高;
- 样本看起来更符合文本;
- 但多样性可能下降;
- 过大时可能出现过饱和、模式坍缩或视觉伪影。
因此,CFG 本质上是一种启发式方法。它并不是因为严格保持数据分布而成立,而是因为在实践中效果非常好。
Guidance scale w w w 控制 prompt 强度和样本多样性之间的权衡。
当 w = 1 w=1 w=1 时,模型使用普通条件向量场,理论上更接近原本的条件生成分布,但 prompt 可能不够强。
当 w > 1 w>1 w>1 时,prompt 相关方向被放大,生成结果通常更符合文本描述,但也会更偏离原始数据分布。
如果 w w w 太大,可能出现以下问题:
- 生成结果过度追求 prompt 中的关键词;
- 图像变得过饱和;
- 样本多样性下降;
- 某些模式被过度强化;
- 生成结果可能出现不自然的结构或视觉伪影。
如果 w < 1 w<1 w<1,则相当于削弱 prompt 的作用,生成结果会更接近无条件生成,文本控制能力下降。
因此,CFG 的使用通常需要经验调参。实际模型中会选择一个合适的 w w w,在图像质量、文本一致性和多样性之间取得平衡。
OK,最后快速回顾一下之前学过的内容,并简单概述下接下来要讲解的内容:
到目前为止,前几讲已经建立了生成模型的核心理论框架:
Lecture 1 讨论生成模型作为采样问题,并从 ODE / SDE 角度定义流模型和扩散模型。
Lecture 2 讨论 Flow Matching,也就是如何通过条件概率路径和条件向量场训练一个生成向量场。
Lecture 3 讨论 Score Matching 和 Guidance,说明如何用 score 函数重新理解扩散模型,并进一步通过 CFG 实现 prompt 条件控制。
接下来,Lecture 4 将进入更实际的图像生成器构建问题,包括神经网络架构和潜在空间。尤其是潜在空间非常关键,因为它可以压缩高维图像,使训练和采样更加高效。
Lecture 5 将讨论一些高级主题,包括离散扩散模型和蒸馏模型。离散扩散模型可以用于语言等离散数据建模,而蒸馏模型则关注如何加速生成过程,让模型用更少采样步数得到高质量结果。
5. Summary
最后回顾本节课的核心内容。
Lecture 3 的主题是 Score Matching 和 Guidance。其中 Guidance 主要回答一个问题:
如何让生成模型根据 prompt 生成符合条件的内容?
最直接的方法是普通条件生成,也就是把 prompt 输入给神经网络,训练条件向量场:
u t θ ( x ∣ y ) u_t^\theta(x|y) utθ(x∣y)
但普通条件生成往往对 prompt 的遵循不够强。
Classifier guidance 通过贝叶斯公式得到:
∇ x log p t ( x ∣ y ) = ∇ x log p t ( x ) + ∇ x log p t ( y ∣ x ) \nabla_x\log p_t(x|y) = \nabla_x\log p_t(x) + \nabla_x\log p_t(y|x) ∇xlogpt(x∣y)=∇xlogpt(x)+∇xlogpt(y∣x)
并利用分类器梯度:
∇ x log p t ( y ∣ x ) \nabla_x\log p_t(y|x) ∇xlogpt(y∣x)
来增强 prompt 相关方向。但它需要额外训练一个能处理带噪样本的分类器,因此不够方便。
Classifier-Free Guidance 的关键是将分类器梯度改写为条件向量场和无条件向量场之差:
u t t a r g e t ( x ∣ y ) − u t t a r g e t ( x ) u_t^{\mathrm{target}}(x|y) - u_t^{\mathrm{target}}(x) uttarget(x∣y)−uttarget(x)
于是采样时使用:
u t θ , w ( x ∣ y ) = ( 1 − w ) u t θ ( x ∣ ∅ ) + w u t θ ( x ∣ y ) u_t^{\theta,w}(x|y) = (1-w)u_t^\theta(x|\varnothing) + wu_t^\theta(x|y) utθ,w(x∣y)=(1−w)utθ(x∣∅)+wutθ(x∣y)
通过在训练时随机丢弃 prompt,同一个网络就可以同时学到条件生成和无条件生成能力。采样时再放大二者之间的差异,就能显著增强 prompt 对生成结果的控制。
CFG 的优点是简单、有效、可扩展;缺点是每一步采样通常需要两次网络调用,并且当 w > 1 w>1 w>1 时不再严格对应于真实数据分布,而是一种主要由经验效果支撑的启发式方法。
下一节课将进入 Build Image Generators,重点讨论图像生成模型真正落地所需的神经网络架构,以及为什么潜在空间对于高效生成非常关键。
结语
本节课围绕 Guidance(引导生成 展开,系统性地回答了一个核心问题:如何让生成模型在保证数据分布合理性的同时,更强地遵循 prompt 约束。
首先,我们从最基础的条件生成出发,构建了带 prompt 输入的向量场 u t θ ( x ∣ y ) u_t^\theta(x|y) utθ(x∣y) 。它通过直接将条件信息输入模型,实现了从噪声到条件数据分布的映射。然而,这种 vanilla conditional generation 在实践中往往存在一个关键问题:prompt 约束较弱,生成结果容易偏离语义目标。
为了解决这一问题,我们引入了 classifier guidance。通过贝叶斯分解我们将条件生成分解为无条件 score 与分类器梯度两部分,其中分类器梯度负责提供 “朝向 prompt 的修正方向”。在此基础上,通过引入 guidance scale w ≥ 1 w \ge 1 w≥1 可以显式增强 prompt 相关方向,从而显著提升生成样本的语义对齐能力。
然而 classifier guidance 依赖额外训练一个噪声条件分类器,在文本 prompt 或复杂条件下成本较高,因此在大规模生成模型中并不理想。
随后,本节课重点介绍了 Classifier-Free Guidance(CFG),这是现代扩散模型最重要的核心技术之一。CFG 的关键思想是:不再显式建模分类器,而是利用同一个网络同时学习 conditional 和 unconditional 两种向量场。
通过空 token ∅ \varnothing ∅ 的引入,无条件向量场可以统一表示为 u t θ ( x ∣ ∅ ) u_t^\theta(x|\varnothing) utθ(x∣∅) ,进一步利用恒等变换我们得到 CFG 的核心形式: u t θ , w ( x ∣ y ) = ( 1 − w ) u t θ ( x ∣ ∅ ) + w u t θ ( x ∣ y ) u_t^{\theta,w}(x|y) = (1-w)u_t^\theta(x|\varnothing) + w u_t^\theta(x|y) utθ,w(x∣y)=(1−w)utθ(x∣∅)+wutθ(x∣y) 。
这一结果表明:prompt 的作用本质上可以被解释为 conditional flow 与 unconditional flow 之间的差异。通过在采样阶段放大这一差异,我们可以显著增强生成结果对 prompt 的遵循程度,而无需额外训练分类器。
在训练层面,通过随机丢弃 prompt(dropout conditioning),模型自动学习有条件生成和无条件生成两种模式,从而实现统一建模。
最后我们分析了 CFG 的本质与局限性:当 w > 1 w>1 w>1 时,生成过程不再严格对应真实条件分布,而是一种经验性分布重加权机制。它在提升 prompt 对齐能力的同时,也会带来多样性下降与分布偏移,因此需要在实践中进行权衡。
下一讲我们将重点讨论如何构建图像生成器,敬请期待🤗
参考
更多推荐


所有评论(0)