• 流匹配 和 扩散模型

    MIT 6.S184

    这门课:Flow/Diffusion模型的理论与实践

    第零章 学习资源

    https://diffusion.csail.mit.edu/

    网站包括幻灯片,以及三个实验,以及课堂笔记

    第一章 利用随机微分方程的Gen AI

    第一节:从生成到采样

    我们将图像/视频/蛋白质表示为向量

    zRH×R×3zRT×H×R×3zRN×3(N个原子有3坐标)。

    一张图像的“好”程度 ≈ 它在数据分布下的可能性有多高

    学术一点的说法:图像的质量可以近似等同于它在数据分布中的似然性

    生成就是从数据分布中采样

    数据分布一般用概率密度函数pdata表示。

    数据集包含了数据分布中有限个数的样本:z1,...,zNpdata

    条件生成指的是从条件分布中采样:zpdata(y),比如 y 是提示词。意味着给定这个提示,数据的分布是什么。这是我们最感兴趣的课题。

    生成模型将初始分布(例如高斯分布)中的样本转换为数据分布中的样本。

    xpinit ➡️ GenerativeModel ➡️ zpdata

     

    第二节 流模型与扩散模型

    2.1 流模型

    2.1.1 基本术语和概念

    流的基本对象:轨迹(Trajectory)、向量场(Vector Field)、常微分方程(ODE)

    1. 轨迹:X:[0,1]Rd,tXt

    Note

    表示函数的定义域和值域之间的映射关系;

    表示具体给定一个元素映射到另一个元素;

    轨迹终点 X1 落在真实数据分布上。

    2. 向量场:u:Rd×[0,1]Rd,(x,t)ut(x)

    Note

    笛卡尔积在这里的作用是“构造一个联合空间”,就像编程里写def f(x: Vector, t: float)-> Vector:,数学中我们不能写两个参数名,所以就把它们打包成一个二元组 (x,t),而这个“打包”的空间就是 Rd×[0,1]

    3. 常微分方程:描述轨迹上的条件

    X0=x0() 沿着向量场指定的方向前进。

    ddtXt=ut(Xt) (ODE)

    轨迹的导数或速度 是由 Xt 当前所在位置的向量 ut(Xt) 给出的。

    Tip

    也许我们中的一些人听说过ODE在工程和物理学中是力学的基础。但“”这个术语不太常见。流是遵循ODE的轨迹的集合。

    本质上是我们收集大量针对不同初始条件的解决方案,然后将它们全部收集到一个函数中,并称之为流。

    4. 流:ψ:Rd×[0,1]Rd,(x0,t)ψt(x0)

    ψ是所有不同起点 x0 的轨迹集合,即整个系统的“流动结构”。

    我们希望对于每个初始条件x0,轨迹ψt(x0)都是下面这个ODE的解:

    ψ0(x0)=x0

    ddtψt(x0)=ut(ψt(x0))

    所以:

    image-20250714163807435

    图示红色网格是轨迹,蓝色箭头是向量场。

    2.1.2 定理

    ODEs 解的存在性与唯一性定理

    定理(皮卡–林德勒夫定理) 如果向量场 ut(x) 是连续可微的,且其导数有界,那么下面这个常微分方程(ODE):X0=x0,ddtXt=ut(Xt)

    存在唯一解。换句话说,流映射是存在的。更一般地说,只要向量场是 Lipschitz 连续的,结论仍然成立。

    Lipschitz 连续是一种比连续更强,比可微略弱的函数光滑性条件,在分析和微分方程中非常重要。

    Tip

    在机器学习实际应用中,常微分方程(ODE)或流(flow)的问题通常都存在唯一解

    你上过的大多数课程中,这已经被隐式假设了。

     

    2.1.3 示例:线性ODE

    Flow-based 模型是在学习一个确定性的(deterministic)向量场,间接决定轨迹。轨迹由向量场通过常微分方程生成。

    简单的线性向量场:ut(x)=θx(θ>0)

    断言:流由下式给出:Ψt(x0)=eθtx0

    • 断言(Claim)在数学中表示一个待证明的断言、结论或命题。

    • ψ 发音为 /saɪ/ 或 /psaɪ/

    证明:

    1. 初始条件:

      Ψt(x0)=e0x0=x0

    2. ODE:

      ddtΨt(x0)=ddt(eθtx0)=θeθtx0=θψt(x0)=ut(ψt(x0))

    不同初始条件的轨迹:

    y轴表示初始条件。轨迹呈指数级趋近于零。

    image-20250713225445411

    2.1.4 ODE数值模拟——欧拉法

    不幸的是,在大多数情况,这并不容易,你不能只是手动找到ODE的解。

    我们需要做的是模拟它。

    算法1:欧拉法模拟ODE

    输入:向量场ut,初始条件x0,步数n

    1. t=0

    2. 设步长 h=1n

    3. X0=x0

    4. i=1,,n1 循环:

      Xt+h=Xt+hut(Xt)

      更新tt+h

    5. 结束循环

    6. 返回轨迹:X0,Xh,X2h,,X1

    Tip

    这是sampling的算法(生成的过程),比较简单。困难的是utθ训练的部分。

    2.1.5 生成模型
    1. 流模型:pinitODEpdata

    2. 神经网络:将向量场变成一个神经网络。

    utθ:Rd×[0,1]Rdθ 是网络参数

    1. 随机初始条件:由于ODE是确定性的,所以还不能生成整个分布。但我们可以使初始条件随机化。

      X0pinit

    2. 常微分方程:

      ddtXt=utθ(Xt)

    3. 目标:

      X1pdata

    image-20250714163036782

    image-20250714163319333

    后面我们会学到,这幅图描述就是用高斯概率路径的边际向量场进行基于欧拉法的ODE数值模拟。

    image-20250714163356536

    2.2 扩散模型

    扩散模型本质上扩展了我们刚才讨论过的想法,但采用随机微分方程。

    2.2.1 基本术语和概念

    扩散模型的基本对象:随机过程(Stochastic process)、向量场(Vector Field)、常微分方程(ODE)

    1. 随机过程:扩散模型的解是随机的轨迹,也称为随机过程。

    Xt,(0t1) 是随机变量

    X:[0,1]Rd,tXt ,但此时可以从X中抽取样本,所以X本身是随机的。这些轨迹的集合更像是它们发生的可能性。

    2. 向量场:u:Rd×[0,1]Rd,(x,t)ut(x)

    3.  扩散系数:σ:[0,1]R0,tσt,由它向ODE注入随机性。

    3. 随机微分方程:

    X0=x0()

    dXt=ut(Xt)dtODE+σtdWtstochastic/noise (SDE)

    表示: Xt 随时间演化,它的变化由两个部分组成:

    1. 确定性部分:它会朝着一个“向量场”或“趋势” ut(Xt) 的方向走(ODE)。

    2. 随机部分:它还会叠加一些“不可预测的扰动”——这些扰动由布朗运动 dWt 产生,并通过一个缩放因子 σt 控制其强度。

    Wt 表示布朗运动,在数学中通常被建模为一个 Wiener 过程(维纳过程)。

    4. 布朗运动:

    随机过程:W(Wt)t0WtRd,可以是任何维度的

    1. 初始化为0:W0=0

    2. 高斯增量:WtWsN(0,(ts)Id),(0st)

    3. 独立的增量:Wt1Wt0,,WtnWtn10t0<t1<<tn 都是互相独立的,视为随机变量

    这个独特属性,使得它在任何地方都不可微。

    但我们在研究依赖于求导的微分方程。

    5. 符号dXt

    由于维纳过程不可微,我们换种表达:

    ddtXt=ut(Xt)

    limh0Xt+hXth=ut(Xt)

    Xt+hXth=ut(Xt)+Rt(h)

    Xt+h=Xt+hut(Xt)+hRt(h)

    这里 Rt(h) 是误差项,且 limh0Rt(h)=0。这儿想作是泰勒近似。

    dXt=ut(Xt)dt+σtdWt

    Xt+h=Xt+hut(Xt)+σt(Wt+hWt)+hRt(h)

    ODESDE
    解是轨迹解是随机过程,或说随机轨迹
    由向量场定义。由向量场 和 扩散系数 定义。
    2.2.2 定理

    SDEs 解的存在性与唯一性定理

    如果向量场 ut(x) 是连续可微的,且其导数有界,并且扩散系数是连续的,那么下面这个随机微分方程

    X0=x0,dXt=ut(Xt)dt+σtdWt

    存在唯一解。

    2.2.3 SDE数值模拟——欧拉-丸山法

    算法2:从一个SDE采样(欧拉-丸山法,Euler-Maruyama method)

    输入:向量场ut,步数n,扩散系数σt

    1. t=0

    2. 设步长 h=1n

    3. X0=x0

    4. i=1,,n1 循环:

      从标准 d-维正态分布中采样 ϵN(0,Id)

      Xt+h=Xt+hut(Xt)+σthϵ

      Note

      hϵN(0,hId),噪声的方差为h

      更新tt+h

    5. 结束循环

    6. 返回轨迹:X0,Xh,X2h,,X1

    2.2.4 示例:奥-乌过程

    Ornstein–Uhlenbeck (OU) 过程是一个均值回复型的随机过程,是布朗运动(随机游走)的扩展。它经常用来建模那些会在长期内回到某个平衡值附近波动的系统。

    dXt=θXtdt+σdWt

    image-20250714215209895

    2.2.5 生成模型
    1. 扩散模型:pinitSDEpdata

    2. 神经网络:是向量场,此处和流模型一样。

    utθ:Rd×[0,1]Rdθ 是网络参数

    1. 扩散系数:

      σt (大多数情况下它是固定的)

    2. 随机初始条件:

      X0pinit

    3. 常微分方程:

      dXt=utθ(Xt)dt+σtdWt

    4. 目标:

      X1pdata

    第二章 构建训练目标

    回顾:

    image-20250715133905048

    第一节 训练模型

    不经过训练,模型的产出“毫无意义” → 我们需要训练向量场 ut

    训练 = 找到一组参数,使得:

    X0pinit从一个初始分布开始,dXt=utθ(Xt)dt沿着向量场进行演化, 能得到 X1pdata最终点的分布 = 数据分布

    在回归或分类任务中,训练目标是标签。

    但在这里:没有标签 : (

    我们必须推导出一个训练目标。

     

    第二节 构建训练目标

    目的:推导一个用于训练我们模型的训练目标的公式。

    这一节的课程将是技术上最具挑战性的一节!接下来的课程会轻松很多很多。

    你不必理解推导过程,但一定要理解以下公式:

    image-20250715141504078

    三个条件对象,三个边际对象的公式:

    2.1 条件和边际概率路径

    2.1.1 关键术语

    Conditional(条件的) 强调的是在某个特定数据点条件下的情况。

    Marginal(边际的) 是指考虑整个数据的整体分布,不针对单点。

    🔍 “边际”

    2.1.2 概率路径

    概率路径: 从噪声到数据的路径。(噪声和数据的逐步插值)

    狄拉克分布( Dirac distribution):zRd, δz:XδzX=z

    这是最简单的一种分布。它是一种确定性分布(deterministic distribution):它在 x=z 处“无限高”,在 xz 的地方为 0,积分为 1。

    你可以把它看成一个“浓缩在一个点 z 上的概率分布”,所有质量都集中在 z​,没有任何扩散或随机性。从 狄拉克分布中采样的结果就是 z 本身,毫无随机性。

    Tip

    一开始,大家尝试寻找“从噪声变成数据”的最优路径,比如在纯粹的神经常微分方程(neural ODEs)[1] 中,是不去指定中间过程(即路径上的中间分布)的,人们只是希望模型自己找到一条最佳路径。但扩散模型的一个关键思想,就是明确地指定从噪声到数据的演化路径 而实际上,扩散模型这样 选择一种路径并坚持使用,是完全可行的——因为这样可以带来可扩展的训练流程。

    [1] Chen, Ricky TQ, et al. "Neural ordinary differential equations." Advances in neural information processing systems 31 (2018).

    2.1.3 条件概率路径 pt(z)

    条件概率路径:pt(z)

    1. pt(z)Rd上的概率分布

    2. p0(z)=pinit

    3. p1(z)=δz

     

    2.1.4 例子 —— 高斯概率路径

    pt(z)=N(αtz,βt2Id)

    αtβt 是所谓的噪声调度器(noise schedulers)

    容易得到,它满足条件概率路径 pt(z)的三点要求。

    如下图可视化:

    image-20250715144434634

    2.1.5 边际概率路径 pt

    边际概率路径:pt

    zpdata,xpt(z)xptforget z

    通过条件概率路径 + 数据分布 可以推出 边际概率路径。即:

    流模型中时刻 t 的边际分布是对所有初始数据 z 的条件分布 pt(Xz) 的加权平均,权重由初始数据的分布 pdata(z) 决定。

    1. pt(X)=pt(x|z)pdata(z)dz

    2. p0=pinit

    3. p1=pdata

    如下图可视化:

    image-20250715151652997

    2.1.6 概率路径小结

    条件概率路径 pt(z),由 pinit 和 一个数据点 z 插值,例子是高斯概率路径N(αtz,βt2Id)αt从0到1,βt从1到0。

    边缘化得到

    边际概率路径pt,由 pinitpdata 插值,有公式 pt(x)=pt(x|z)pdata(z)dz

    Note

    公式 pt(X)=pt(x|z)pdata(z)dz

    z 给“边缘化掉”了(marginalized out)——所以叫它“边际分布”。

    在概率论中,“边际”这个词来自于一个常见的操作 —— 从联合分布或条件分布中通过积分“边缘化掉”一些变量,只保留我们关心的部分。

    术语含义举例
    条件概率 p(xz)给定 zx 的分布先挑定一个初始点,观察它的演化路径
    联合概率 p(x,z)xz 同时出现的概率所有起点与终点对的联合分布
    边际概率 p(x)不关心 z 时,x 的总体分布所有起点演化后的“总体效果”

    Tip

    “边际”这个词来自表格“边缘”的历史传统,而不是因为它本身有什么边的含义。从语义角度来说确实不够直观,但它已经成为标准术语。你记住“边际 = 去掉另一个变量后,留下的总概率”就可以了。

    性别 / 吸烟吸烟 (Yes)不吸烟 (No)总计(边缘)
    男 (Male)30/100 = 0.3020/100 = 0.200.50
    女 (Female)10/100 = 0.1040/100 = 0.400.50
    总计0.400.601.00

    如果你觉得难记,大可以在心里把它当作“总分布”或“全局分布”来理解,也没问题 。

     

    2.2 条件和边际向量场

    2.2.1 条件向量场

    Note

    我们希望有一个ODE,能沿着条件概率路径,从噪声到单个数据点,即 pinitODEpt(z)δz

    形式化(公式化)表达:

    uttarget(x|z),( 0t1x,zRd

    满足

    X0pinit,ddtXt=uttarget(xt|z)Xtpt(z) (0t1)

    2.2.2 例子——条件高斯向量场

    uttarget(x|z)=(αt˙βt˙βtαt)z+βt˙βtx

    • ˙ 在物理中常用于表示时间导数,如速度x˙,所以 αt˙=ddtαt

    • 这个向量场很简单,就是 xz 的某种加权组合。

    这个向量场能沿着高斯概率路径 pt(z)=N(αtz,βt2Id) 从噪声到数据点。

    可视化为下图:

    image-20250715164951644

    image-20250715164934805

    2.2.3 边际向量场 & 定理(边缘化技巧)

    边际向量场:

    uttarget(x)=uttarget(x|z)pt(x|z)pdata(z)pt(x)dz

    pt(x|z)pdata(z)pt(x) 这个比率,本质上是给定x,采用z的后验概率,即pt(z|x)

    Important

    这儿要理解一下,边际概率路径是条件概率路径p(z) 加权,描述数据在(t时刻)空间中的整体分布,反映“在哪儿”更可能出现。

    向量场描述“怎么走”的方向和速度,是动态且带方向性的。由于当前位置 x 下不同初始条件导致的向量场差异较大,向量场需按后验概率 p(zx) 加权,才能准确反映当前点的运动趋势。

    这样的边际向量场

    满足

    X0pinit,ddtXt=uttarget(xt)Xtpt(0t1) X1pdata

    Tip

    回顾这些边际对象的公式,可以看到研究 条件对象 只是工具,都是为了构建 边际对象 的公式。

    image-20250715210906306

    2.2.4 连续性方程(延伸知识,用于证明边际向量场的边缘化)

    给定:X0pinit,ddtXt=ut(Xt)

    沿着概率路径 Xtpt(0t1) (边际是pt

    等价于说:

    连续性方程 ddtpt(x)=div(ptut)(x) 成立。(该PDE成立)

    ptx处的时间导数 是由 ptut=×)的负散度给出的。

    Note

    可以理解为 概率密度的变化,取决于该点的负的净流出量。(散度衡量的是净流出量 。用于描述 流体是否在某处发散或聚集,正散度表示发散,负散度表示汇聚。)。

    换句话说, 流出越多,密度下降越快

    image-20250715220122401

    Caution

    向量场的散度是描述流体“是否在某处发散或聚集”;

    散度:div(vt)(x)=i=1d(vt)i(x)xi

    而KL散度是描述两个分布“偏离有多大”。从数学形式和语义来看,它们是两个完全不同的工具。

    仅仅因为字面的 “偏离/发散” 符合描述,而使用了相同的术语词汇。

     

    证明:

    ddtpt(x)=ddtpt(x|z)pdata(z)dz=ddtpt(x|z)pdata(z)dz

    =div(pt(z)uttarget(z))(x)pdata(z)dz

    =div(pt(xz)uttarget(xz)pdata(z))dz

    =div(pt(x)uttarget(xz)pt(xz)pdata(z)pt(x))dz

    =div(ptuttarget)(x)

    Tip

    其实就是利用连续方程:

    ddtpt(x|z)=div(pt(|z)uttarget(|z))(x)

    ddtpt(x)=div(ptut)(x)

    的定义

    ,在推导过程中,得到的uttarget(x)=uttarget(x|z)pt(x|z)pdata(z)pt(x)dz

     

    2.2.5 向量场小结

    条件向量场 uttarget(xz),其ODE沿着条件路径,例子是条件高斯向量场(αt˙βt˙βtαt)z+βt˙βtx

    边缘化得到

    边际向量场uttarget(x),其ODE沿着边际路径,有公式 uttarget(x)=uttarget(x|z)pt(x|z)pdata(z)pt(x)dz

     

    2.3 条件和边际得分函数(扩散模型)

    2.3.1 条件和边际得分

    条件得分:

    xlogpt(x|z),即条件概率路径的对数似然的梯度

    边际得分:

    logpt(x),即边际概率路径的对数似然的梯度

    公式:根据链式法则

    logpt(x)=pt(x)pt(x)=pt(x|z)pdata(z)dzpt(x)

    =pt(x|z)pdata(z)dzpt(x)=logpt(x|z)pt(x|z)pdata(z)pt(x)dz,发现又是构造出后验概率加权积分的形式。

    logpt(x|z)=pt(x|z)pt(x|z)

    2.3.2 例子——高斯得分

    一个高斯概率路径对应的高斯得分:

    xlogpt(x|z)=xαtzβt2

    由正太分布的概率密度函数

    p(x)=1(2π)d/2|Σ|1/2exp(12(xμ)Σ1(xμ))

    代入  Σ=βt2I

    p(x)=1(2πβt2)d/2exp(12βt2xαtz2)

    推导得到。

     

    2.3.3 定理(SDE扩展的技巧)

    对于任意σt0

    X0pinit,dXt=[uttarget(Xt)+σt22logpt(xt)]dt+σtdWt

    Note

    得分函数 本质上就是 我们需要应用的校正项

    得分函数校正了“随机扩散轨迹”的方向,让它向数据靠近。

    Xtpt(0t1)X1pdata

    🔍 流模型 其实就能达到这个目标,所以现在50%的模型都纯流模型。所以我们优先掌握流模型,扩散模型只是其扩展。

    流模型是基础。 扩散模型更多像一种实践经验,在流模型基础上,通过实验发现加各种扩散系数的噪声,生成效果是否会改善。

    2.4 总结

    后续课程会学习到:

    模型训练 就是 训练 uttarget 这个对象,或logpt(x)这个对象。

    image-20250715141504078

    image-20250715151929759

    image-20250715151949401

     

    第三章 训练流模型和扩散模型

    回顾:

    image-20250715133905048

    image-20250715151929759

    image-20250715151949401

    Note

    知识小灶:

    • 归一化流:直接学映射函数

    像修一条高速公路。你得明确规划每个路口(映射函数),并且每段必须符合标准设计(可逆、结构简单、Jacobian 可计算)。

    • 流匹配:学导数(vector field) 像使用GPS。你不关心路具体长什么样,只要告诉我每个时刻往哪个方向走(向量场),然后用 ODE 把路径积分出来,就能从出发点走到终点。

    3.1 训练算法

    我们将 边际向量场、边际得分函数 转化为 两种算法:流匹配得分匹配

    这将是训练算法,用于学习这两个对象。

    image-20250716120032690

    3.2 流匹配

    utθ (θ: parameters)

    目标

    utθuttarget

    3.2.1 流匹配损失

    Lfm(θ)=E[utθ(x)uttarget(x)2]

    ✓ Minimizer ✗ Tractable

    为什么不易处理呢? 因为我们无法评估这一点,边际向量场是一个(边缘化)积分,批量进行计算很困难。

    tU(0,1)t[0,1] 区间均匀采样。

    zpdataz 通过dataloader从数据集中随机采样。

    xpt(z)x 从条件概率路径采样。

    Note

    这里流匹配损失函数很直观,就是两个对象之间的均方误差。取期望值就是在所有采样样本(x,t)上做torch.mean,这是平时实现损失函数常用的。

    3.2.2 条件流匹配损失

    Lcfm(θ)=E[utθ(x)uttarget(xz)2]

    ? Minimizer ✓ Tractable

    最小化这个对象是否有意义?因为条件向量场不是真的有用,我们不想生成单个数据点,而是想生成整个数据分布。

    但接下来我们会证明,最小化条件流匹配损失,能够达到我们的目标。

    tU(0,1)zpdataxpt(z)

    3.2.3 定理

    Lfm(θ)=Lcfm(θ)+C ,for C<0 independent of θ

    Tip

    C 是与θ无关的常数,不会影响梯度下降方向。从 优化角度来看,优化 Lcfm(θ) 与优化 Lfm(θ) 是等价的

    image-20250716142449141

    θ 的值不重要,我们不关心神经网络具体参数值什么,重要的是最小化器(Minimizer),我们记为 θ

    ① 对于 Lcfm 的最小化器 θutθ=uttarget

    θLcfm(θ)=θLfm(θ)

    SGD(随机梯度下降)是相同的。

     

    3.2.4 算法(通用)

    算法3:流匹配训练过程(通用)

    输入:一个样本 zpdata 数据集,神经网络 utθ

    对每个最小批次(mini-batch)的数据循环:

    采样zpdata

    采样tUnif[0,1]

    采样 xpt(z)

    计算损失 L(θ)=utθ(x)uttarget(xz)2

    (选择一种优化器)梯度下降更新模型参数

    循环结束

    Note

    • 流和扩散模型的强大之处就在于只需要最小化简单的均方误差。例如,GANs会有一个最小最大优化程序,比这复杂得多。

    • 这儿条件概率路径 pt(z)、条件向量场uttarget(xz) 如上节课讲的,是我们选择的一组,它可以完成我们想要的工作。这是一个设计选择,也有很多其他选择,接下来的课程我们实际上会看到一组新的选择。

    3.2.5 例子——高斯概率路径的Lcfm

    回顾:

    pt(z)=N(αtz,βt2Id)

    uttarget(x|z)=(αt˙βt˙βtαt)z+βt˙βtx

    继续推:

    εN(0,Id)αtz+βtε=definexpt(z)

    Lcfm(θ)=E[utθ(x)(αt˙βt˙βtαt)zβt˙βtx2]

    tU(0,1)zpdataxN(αtz,βt2Id)

    代入 x=αtz+βtε 再做些代数:

    =E[utθ(αtz+βtε)(αt˙βt˙βtαt)zβt˙βt(αtz+βtε)2]

    =E[utθ(αtz+βtε)(αt˙z+βt˙ε)2]

    对于指定的条件路径的实例: αt=t,βt=1t

    Tip

    Cond OT path

    选择的 αt=t,βt=1t 这样一条路径有特定的名称,就是所谓的条件最优传输路径( Conditional Optimal Transport path)。

    有:αt˙=1,βt˙=1

    Lcfm(θ)=E[utθ(tz+(1t)ε)(zε)2]

    非常简单吧,无法想象一个更简单的训练算法了。

    image-20250719225950090

    3.2.6 算法(OT)

    Flow Matching Training for CondOT path

    算法4:流匹配训练过程(最优传输路径)

    输入:一个样本 zpdata 数据集,神经网络 utθ

    对每个最小批次(mini-batch)的数据循环:

    采样zpdata

    采样tUnif[0,1]

    采样噪声 εN(0,Id)

    x=tz+(1t)ε

    计算损失 L(θ)=utθ(x)(zε)2

    (选择一种优化器)梯度下降更新模型参数

    循环结束

    Important

    让我们欣赏下该算法的简单:

    我们在zε 之间的直线上取一个点,我们将其插入神经网络,然后神经网络本质上会学习预测数据和噪声两点之间的差异zϵ

    Tip

    思考:为了训练更稳定,采样t可以随训练进度动态调整,从接近1 → 接近0 的分布。因为t=0时只能访问噪声的信息,t=1时可以访问完整的数据点。所以随着时间推移,你将需要预测同样的东西,但是拥有的信息是不同的。

    物理直觉:

    本质上是在预测给定噪声、数据点和路径,在这条路径上的某个地方,你需要预测当前的速度。但在直线路径(OT)中,速度只是一个差值,两点间的向量。

    而扩散模型走的是非直线,就像一些所谓的方差保持路径或方差爆炸路径。

    这可不是什么奇特的、太简单的算法,MovieGen(Meta)、Stable Diffusion 3(Stability AI)就是用的该算法

    3.2.7 证明

    定理Lfm(θ)=Lcfm(θ)+C 的证明:

    ab2=a22aTb+b2, (a,bRd)

    Lfm(θ)=E[utθ(x)uttarget(x)2]=E[utθ(x)22utθ(x)Tuttarget(x)+uttarget(x)2]

    Lcfm(θ)=E[utθ(x)uttarget(xz)2]=E[utθ(x)22utθ(x)Tuttarget(xz)+uttarget(xz)2]

    然后 uttarget(x)2uttarget(xz)2 是和 θ 无关的常数,可以消掉,utθ(x)2 项相同,也可以消掉。

    转变成了证明 2utθ(x)Tuttarget(x)2utθ(x)Tuttarget(xz) 的期望相同。 在课堂笔记中,对此进行了详细证明,这儿的点积是线性的,这里就略过了。

    3.2.8 采样算法

    我们如何从刚刚训练好的流模型中采样(生成对象)呢?

    参加算法1 ODE数值模拟——欧拉法

    Tip

    问:人们是否使用欧拉法?

    答:最初是的,但现在人们最想要最小化神经网络的预测次数,也就是数值模拟中有多少步。所以关心效率时,人们通常使用高阶ODE求解器

    • Euler 方法(欧拉法)是最基本的 ODE 数值求解器之一,属于一阶(first-order)ODE solver。

    • “higher-order” 指的是方法的收敛阶(order of accuracy),也就是它逼近真实解的速度。

     

    3.3 得分匹配

    回顾:

    边际得分函数:

    logpt(x)=logpt(x|z)pt(x|z)pdata(z)pt(x)dz,是后验概率加权积分的形式。

    定理(SDE扩展的技巧):

    对于任意σt0

    X0pinit,dXt=[uttarget(Xt)+σt22logpt(xt)]dt+σtdWt

    Note

    得分函数 本质上就是 我们需要应用的校正项

    得分函数校正了“随机扩散轨迹”的方向,让它向数据靠近。

    Xtpt(0t1)X1pdata

    3.3.1 得分匹配损失

    得分匹配网络:

    stθ (θ:parameters )

    目标:

    stθlogpt

    由于边际得分函数和边际向量场的(边缘化)公式非常类似,这儿的推导也是类似的,即将证明:Lsm(θ)=Ldsm(θ)+C

    Note

    人们习惯将条件得分匹配损失,称作去噪得分匹配损失。实则是一回事。

    3.3.2 去噪得分匹配损失

    Lsm(θ)=Et,z,x[stθ(x)logpt(x)2]

    ✓ Minimizer ✗ Tractable

    Ldsm(θ)=Et,z,x[stθ(x)logpt(xz)2]

    ? Minimizer ✓ Tractable

    3.3.3 定理

    Lsm(θ)=Ldsm(θ)+C,for C<0 independent of θ

    ① 对于 Ldsm 的最小化器 θstθ=logpt(x)

    θLdsm(θ)=θLsm(θ)

    SGD(随机梯度下降)是相同的。

    3.3.4 算法(通用)

    算法5:得分匹配训练过程(通用)

    输入:一个样本 zpdata 数据集,得分网络 stθ

    对每个最小批次(mini-batch)的数据循环:

    采样zpdata

    采样tU[0,1]

    采样 xpt(z)

    计算损失 L(θ)=stθ(x)logpt(xz)2

    (选择一种优化器)梯度下降更新模型参数

    循环结束

    3.3.5 例子——高斯概率路径的Ldsm

    回顾:

    xlogpt(x|z)=xαtzβt2

    εN(0,Id)x=αtz+βtεN(αtz,βt2Id)

    继续推:

    Ldsm(θ)=EtUnif,zpdata,xpt(z)[stθ(x)+xαtzβt22]

    =EtUnif,zpdata,xpt(z)[stθ(αtz+βtε)+εβt2]

    Tip

    现在你应该理解,为什么它被称为 去噪得分匹配,是因为被发现对于高斯概率路径,我们只是学习预测用于破坏数据点的噪声。

     

    3.3.6 算法(高斯概率路径)

    Score Matching Training for Gaussian probability path

    算法6:得分匹配训练过程(高斯概率路径)

    输入:一个样本 zpdata 数据集,得分网络(或称 噪声预测器) stθ

    输入:Schedulers αt, βt with α0=β1=0, α1=β0=1

    对每个最小批次(mini-batch)的数据循环:

    采样zpdata

    采样tUnif[0,1]

    采样噪声 εN(0,Id)

    x=αtz+βtε

    计算损失 L(θ)=stθ(xt)+εβt2

    (选择一种优化器)梯度下降更新模型参数

    循环结束

    Note

    值得一提的是,对于较小的βtεβt在数值上是不稳定的。所以对于t接近1时,损失可能不稳定。

    扩散模型研发的早期就意识到这点,并且有一些技巧可以解决。在课堂笔记里有介绍。 但得分匹配是在扩散模型之前就提出的,那时人们反对这种匹配具有高方差。

    问答:

    Note

    问:我们能否避免同时学习它们(流匹配网络 和 得分匹配网络)?

    答:其实我稍后会讲到这个。答案是肯定的。

    原则上,对于一般情况,你必须同时学习它们。

    但是,在最重要的特定的高斯概率路径,我们可以将它们相互转换。

    但即使你必须同时学习它们,请记住,我们可以将它们放在同一个网络中,也就是为一个图像的每个像素制作两个输出,所以它的计算成本不会那么高。

     

    3.3.7 采样算法

    扩散模型的随机采样:

    我们将训练好的新网络插入到SDE:

    X0pinit,dXt=[uttarget(Xt)+σt22logpt(xt)]dt+σtdWt

    插入 表示向量场的网络 和 得分网络

    X0pinit,dXt=[utθ(Xt)+σt22stθ(xt)]dt+σtdWt

    经过训练 Xtpt

    3.3.8 去噪扩散模型(DDMs)

    术语

    去噪扩散模型 = 高斯概率路径N(αtz,βt2Id)(我们的标准例子)的扩散模型

    通用术语中 Terminology(by many people)

    去噪扩散模型 = 扩散模型

    也就是说,许多人提到扩散模型,就是指的这个特定的实例。人们会用不同的方式谈论同一件事。

    当和你的同事交谈时,他们会用一种完全不同的语言,不要感到困惑。这并不奇怪,因为算法是通过许多不同的方式发现的。

    特殊性质

    向量场和得分函数 可以 相互转换。 所以同一个网络即可完成 流匹配 和 得分匹配。

    向量场 和 得分函数 都是 xz 的某种加权

    λ1z+λ2xλ1z+λ2x

    经过代数,就能得出它们能相互转换:

    image-20250720153027234

    训练后的边际向量场 可以转换为 得分网络,反之亦然。

    即,得分是免费获取的。

    Tip

    所以第一代的扩散模型文章,只讨论 得分匹配。 因为它们隐式地依赖于高斯概率路径的去噪扩散模型。然后可以将东西相互转换。

    总结

    我们在这里得到一个完整的端到端训练和采样算法。我们有一个通用的模型,可以从数据分布中生成样本。

    下周的课程将更加注重应用,我们将讨论针对特定应用可以做出的具体选择:

    我们可以将任意分布相互转换,任意的 pinitpdata,所以我们不仅仅是关心去噪扩散模型(DDMs)。因为DDMs总是从某种高斯噪声作为 pinit 开始。

    但可能还有其他情况,你的初始分布要有趣得多,而且有很多人在探索这一点。

    在图像空间、音频空间以及科学领域,许多时候,你的初始分布本身就很有意义,例如:

    image-20250720160712054

    我觉得可以预测转换域的东西,定义清楚这个转换,是光流?是高频残差?等等。 有意义的输入则作为参考信息。

    第四章 构建一个图像生成器

    为了避免混乱,本章只以流模型为例,进行介绍。但所讲述的内容都可扩展到扩散模型。

    议程:

    1. 将生成模型框架从 无条件生成 延伸到 有条件生成。

    2. 开发用于条件采样的无分类器引导(classifier-free guidance)方法。

    3. 讨论图像生成这一典型案例中的架构选择,并综述当前主流模型。

    4.1 条件生成和引导

    无条件 也可以 称作 无引导(Unguided)

    有条件 也可以 称作 有引导(Guided)

    image-20250721213103970

    4.1.1 有引导的条件匹配目标函数 Lcfmguided

    观察:当 y 固定时,我们实际退化为无引导生成:

    此时 y 可以理解为 超参数。

    Lcfmguided(θ;y)=E[utθ(x)uttarget(xz)2]

    =zpdata(zy),tU[0,1),xpt(xz)

    观察:当让 y 变化时:

    Lcfmguided(θ)=E[utθ(x)uttarget(xz)2]

    =(z,y)pdata(z,y),tU[0,1),xpt(xz)

     

    4.1.2 无分类器引导(CFG)
    名称定义是否使用条件?是否用分类器?
    无引导生成 (unconditional generation)不提供任何条件,模型自由生成样本❌ 否❌ 否
    有引导生成 (conditional generation)提供条件(如文本、类别)来控制生成✅ 是✅ / ❌
    有分类器引导 (classifier guidance)使用独立的分类器来引导生成趋向目标类别✅ 是✅ 是
    无分类器引导 (classifier-free guidance)不使用分类器,而是训练一个能同时进行有/无条件生成的模型,在推理时人为混合✅ 是❌ 否

    无引导生成:用于评估模型的基础能力;或生成多样化样本;

    有引导生成

    Tip

    问:为什么不能对有分类器引导也这么加权?

    答:因为它的“引导方向”是用分类器反传出来的梯度(方向),不是一个完整的预测向量场,你没法跟另一个向量直接相加。 而 classifier-free guidance 是两个完整的模型输出,当然可以直接加。

    • 无分类器引导(Classifier-Free Guidance) 是一种 启发式方法,通过线性组合模型在有条件无条件下的预测结果,来构造一个引导向量场,以实现条件控制。

    • 有分类器引导(Classifier Guidance) 是一种 理论驱动的方法,直接利用一个额外分类器 C(x) 对条件概率 p(yx) 的梯度 xlogp(yx),来增强模型生成结果对条件 y 的符合

    • 相当于对于 xlogp(xy)=xlogp(x)+wxlogp(yx)

      有分类器引导的wxlogp(yx)是实际反向传播分类器获得的。而无分类器引导里只是推导过程中的一个式子,可以继续拆解、推导。

    4.1.3 CFG推导

    logp(xy)=logp(x)+logp(yx)logp(y)

    对两边求导有:

    xlogp(xy)=xlogp(x)+xlogp(yx)xlogp(y)= 0

    其中

    xlogp(x)无条件(边际)数据分布的对数梯度,

    xlogp(yx)条件信息(如分类器)提供的额外梯度

    实际操作中,直接用上式做采样,往往会弱化条件的引导效果,所以提出了引入一个超参数 w 调节条件梯度的强度:

    xlogp(xy)=xlogp(x)+wxlogp(yx)

    =xlogp(x)+w(xlogp(y)=0+xlogp(xy)xlogp(x))

    =xlogp(x)+wxlogp(xy)wxlogp(x)

    =(1w)xlogp(x)+wxlogp(xy)

    因为 p(y)x 无关,对 x 的梯度是0。

    Note

    x 读作:“对 x 的梯度” 或 “在 x 方向上的梯度”。

    符号 xlogp(x) 通常称为得分函数(score function),也叫对数梯度。它描述“朝着高概率区域改变 x 的方向和速率的向量”。

    u~t(xy)=(1w)uttarget(x)+wuttarget(xy)

    推出 无分类器引导(classifier-free guidance)的 核心思想在向量场形式上的表达。

    我们用有条件和无条件的向量场按比例加权,得到一个“折中”方向,来引导采样过程。

    4.1.4 CFG训练

    观察:我们可以将无引导的向量场视为没有任何条件的情况。 但“没有条件”也是一种条件:

    uttarget(x)=uttarget(xy=)

    我们现在可以训练一个单一模型 utθ(xy),其中 yY{},通过重复使用Lcfmguided(θ),并偶尔将 y 设为

    LcfmCFG(θ)=E[utθ(x)uttarget(xz)2]

    =(z,y)pdata(z,y),with prob.η,y,tU[0,1),xpt(xz)

    4.1.5 CFG采样

    每一步都调用模型两次(无条件 & 有条件),计算量是原来的两倍。但是工程上有些优化方法。

    算法——CFG采样过程

    输入:训练好的有引导的向量场utθ(xy)

    1. 选择一个提示词 yY,以及一个 y= 用于无引导采样

    2. 选择一个引导尺度 w>1

    3. 初始化 X0pinit

    4. t=0t=1 模拟 dXt=[(1w)utθ(Xt)+wutθ(Xty)]dt

    image-20250722223728725

    image-20250722223949275

    4.2 图像生成的网络架构考量

    对于图像这种高维的对象,多层感知机(MLP)是不够的。

    我们将探索两种选择:U-Nets(基于卷积)和 DiT(基于注意力)

    留意 引导变量 y 是如何编码、嵌入 和 处理的。

    4.2.1 U-Net