首页 / 资讯中心 / 文章详情

流匹配隐式CFG:从平均速度场到低开销条件生成

流匹配隐式CFG:从平均速度场到低开销条件生成 ★ FEATURED ARTICLE
扩散模型跑条件生成绕不开无分类器引导CFG。熟练的采样器都会留意那多出来的一条无条件和条件前向的成本蒸馏、调度压缩之类的工作都在给这条额外路径做减负。最近我在反复摆弄流匹配框架下的速度场试着把条件速度场在后验分布上的平均定义成一种平均速度场再用一个温度参数去控制这个平均的锐化程度发现它可以很自然地推出一套隐式CFG结构。这篇算是我自己的推演笔记把它整理成一篇理想化条件下的推导梳理给同样在折腾采样器和引导项的朋友做参考。这套推导的好处是在理想配准条件下采样公式能退化成经典CFG但采样的代价省掉了一整个无条件分支代价是需要训练一个额外的平均头或者在采样时用一次前向同时拿到条件速度与均值残差。整件事的核心链条是条件速度场按后验平均得到平均速度给后验加上一个锐化温度平均速度就会在隐空间里自动携带引导信息。下面我按记号、几何、推导、验证、实现的顺序把完整过程拆开讲。1. 为什么值得认真推这条线1.1 显式CFG的账本先看经典的无分类器引导是怎么工作的。设条件分数为 (s_\theta(x,c))无条件分数为 (s_\theta(x,\emptyset))标准修改是[ \tilde{s}(x,c)s_\theta(x,\emptyset)w\big(s_\theta(x,c)-s_\theta(x,\emptyset)\big) ]其中 (w) 是引导强度。这个写法的效果确实稳但它天然要求网络至少跑两次前向一次喂条件一次喂空标签。训练端也要配合随机把一部分标签丢成 (\emptyset)让无条件分支能学到东西。很多工程化方案会想尽办法省这条路比如蒸馏成单步、把两次前向并行到同一个batch、或者学习一个无需引导的适配器。这笔账在推理时特别扎眼大部分扩散采样器动辄几十步每步两条前向GPU的利用率看着很心疼。如果哪天能有一种引导形式只用一条前向链路就同时涵盖条件信息和离无条件有多远这两件事采样成本就能直接砍掉一截。我这次想推的正是这个方向上的一种抽象框架。1.2 MeanFlow的直觉起点MeanFlow这个词是我给这套想法起的昵称。核心直觉非常简单在流匹配或者扩散模型的概率路径上每对数据点都能定义一条条件速度场 (v_t(x|c))它告诉你给定标签 (c) 时样本 (x) 应该往哪个方向移动。把这些条件速度场按后验分布 (p_t(c|x)) 做加权平均得到的就是整个边缘概率路径对应的边际速度场[ u_t(x)\int v_t(x|c),p_t(c|x),dc ]这个式子本身是流匹配里做速度场配准的基石意思是把所有条件路径混在一起看平均速度仍然能生成正确的边缘分布。但这只是个开始。真正有意思的地方在于如果我把参与平均的后验分布换成一个经过温度系数 (\rho) 锐化之后的版本那么平均出来的速度场会隐含一种引导效果它和CFG在理想条件下是代数等价的。1.3 这篇推导的定位提前说明我不打算把它包装成严格的收敛定理它本质上是一种理想化条件下的推演假设网络已经完全学对了真实条件速度场假设我们能拿到一个可靠的后验平均估计器假设测度变换带来的雅可比修正可以忽略。在这些条件下推导会得到一组很干净的公式离开这些条件它退化成一个带温度参数的软引导公式仍然能用但性质需要实验来确认。适合读这篇文章的人是已经跑过扩散模型、知道CFG大概怎么回事但还想从速度场角度理解引导信息到底藏在哪个变量里的开发者。2. 流匹配框架里的两条速度线2.1 基本的记号和设定假设我们有一个条件生成任务每一样本 ((x,c)) 来自联合分布 (q(x,c))。在流匹配范式中我们为每一条数据流线定义一个条件概率路径 (p_t(x|c))并配一个条件向量场 (v_t(x|c))使得从这个向量场流出来的概率密度正好是 (p_t(x|c))。实际使用中这个向量场通常用一个神经网络 (v_\theta(x,t,c)) 去回归回归的目标是两点之间的位移方向。这里有一个容易被忽略的细节条件向量场定义在样本空间上但它的输入里还带着标签 (c)。所以理论上对同一个 (x)不同 (c) 会给出不同的移动方向。流匹配的训练目标导致网络必须学会区分这些方向也就是说条件网络内部其实已经编码了这个 (x) 和标签 (c) 到底匹配不匹配的信息。2.2 边际速度场的条件平均表示我们定义边缘分布[ p_t(x)\int p_t(x|c),q(c),dc ]流匹配中的核心结果之一是如果每个 (v_t(x|c)) 真的生成了对应的条件路径那么边际速度场[ u_t(x)\int v_t(x|c),\frac{p_t(c|x),p_t(x)}{p_t(x)},dc \int v_t(x|c),p_t(c|x),dc ]生成的也是边缘路径 (p_t(x))。换句话说边际速度是条件速度的后验加权平均权重 (p_t(c|x)) 衡量的是在时刻 (t) 的中间态 (x) 上标签 (c) 的贡献占比。我第一次看到这个结论时觉得有点循环(p_t(c|x)) 本身就是由联合路径决定的你怎么知道它理想化的回答是在完美配准的极限下网络会把条件向量场学对我们不需要显式计算这个后验因为网络输出已经隐含地覆盖了所有 (c) 的贡献。这也是MeanFlow后续推导能成立的前提。2.3 速度场与分数的对应关系在扩散模型里人们更习惯讨论分数函数 (\nabla_x \log p_t(x)) 而不是速度场。这两者有关系在最常见的方差保持扩散设定下如果 (p_t(x)) 满足某条扩散路径那么对应的速度场大致正比于分数乘上一个和噪声调度有关的负系数。在连续时间极限下用速度场做采样和用分数做采样是同一件事的两个坐标系。之所以要记住这个对应关系是因为CFG最初是用分数语言写的而我想把它的几何含义搬进速度场语言。后面推导会用到分数的一个关键性质当对一个未归一化密度做幂次变换时分数的表达式会变成一个条件项加平均项的差归一化常数在求梯度的过程中自动消失了。3. CFG的分数几何与温度视角3.1 标准CFG的一种等价钱写法经典CFG的形式是把无条件分数和条件分数做一个外推。换个角度我们可以把它写成一个测度的幂次变形[ \tilde{p}_w(x|c)\propto p(x|c)^{1w},p(x)^{-w} ]对两边取 (\log) 再对 (x) 求梯度正好得到[ \nabla_x\log\tilde{p}_w(x|c)(1w)\nabla_x\log p(x|c)-w\nabla_x\log p(x) ]这就是CFG的分数公式。这里的核心事实是我们根本不需要归一化 (\tilde{p}_w)因为梯度的积分会把配分函数的贡献抵消掉。这就是隐式两个字的最初来源——CFG在隐空间里修改的是一个未归一化测度而分数恰好只感受测度的形状不感受它的尺度。3.2 温度参数的引入上面的 (w) 可以重新解释成温度。定义一个反温度 (\rho1w)那么[ \tilde{p}_\rho(x|c)\propto p(x|c)^{\rho},p(x)^{1-\rho} ]当 (\rho1) 时这就是普通的条件分布 (p(x|c))当 (\rho1) 时条件分布在原来的基础上被锐化了高概率区域的概率差被放大当 (\rho1) 时分布变得更加平滑趋近于边际分布。这个过程和模拟退火里的温度控制非常像只是CFG只作用在采样时不作用在训练时。那么问题顺势而生如果我把这个锐化思想作用在条件后验 (p_t(c|x))上而不是作用在样本分布上会发生什么3.3 从样本空间锐化到标签空间锐化在流匹配的环境里速度场的加权平均权重是 (p_t(c|x))。它不是样本密度而是以样本为条件的标签后验。如果要给它加温度我们就不动样本本身而是把标签后验锐化[ q_\rho(c|x)\propto p_t(c|x)^\rho ]或者更宽松一点用 (\rho) 次幂加上一个背景项。这样做的几何图像是同一个中间样本 (x)在采样初期对多个标签都有不小的后验概率速度场求出来的平均比较模糊提高 (\rho) 之后只有最可能与当前 (x) 对应的那个标签贡献主导权重平均速度就变得更有主张。这正是引导要达到的效果而整个过程完全没有显式计算无条件分数。把这一节串起来我们需要的原材料已经齐了流匹配里的条件速度场、后验加权的平均速度、以及一个可以自由操控的锐化温度。下面进入正式推导。4. 核心推导从平均速度恢复隐式CFG4.1 理想化假设清单为了避免推导过程中偷偷塞进一些不成立的假设先把条件列出来。第一条网络 (v_\theta(x,c,t)) 在理想状态完全等于真实条件向量场 (v_t(x|c))也就是完美配准。第二条存在一个估计器可以在推理时预测出条件速度相对于平均速度的残差记为[ \Delta(x,c,t)v_t(x|c)-u_t(x) ]这个残差在训练时可以通过条件头加平均头的多任务结构学出来。第三条在相关轨迹的局部邻域里测度变换的雅可比修正足够小可以忽略。第四条训练数据的标签先验 (q(c)) 已经包含在条件路径的定义里推导过程中不需要显式计算。后面第5节会逐条讨论这些假设在现实中的松动程度。4.2 定义温度化平均速度把第3节的锐化后验直接代入第2节的加权平均得到MeanFlow的核心量[ u^\rho_t(x)\int v_t(x|c),q_\rho(c|x),dc,\qquad q_\rho(c|x)\propto p_t(c|x)^\rho ]这里 (\rho) 是平均温度的倒数控制平均速度的锐化程度。当 (\rho1) 时 (u^\rho_t(x)u_t(x))退化为普通边际速度。当 (\rho0) 时 (q_\rho(c|x)q(c))平均变成对所有标签的静态先验平均和条件信息无关。真正有用的是中间和高 (\rho) 区域因为后验质量会集中到与 (x) 强相关的标签上。为了后续拆解方便把 (q_\rho) 归一化常数记为 (Z_\rho(x,t))[ Z_\rho(x,t)\int p_t(c|x)^\rho,dc ]这个量在后面会被视为一个与 (x) 有关的量它的 (x) 梯度会在最后和分数修正项合并。4.3 速度场的分裂与重组合接下来做一件看起来像恒等变形的事情但它是整篇推导的关键跳跃。我先把条件速度围绕平均速度拆开[ v_t(x|c)u_t(x)\Delta(x,c,t) ]然后把温度化平均 (u^\rho_t(x)E_{q_\rho}[v_t(x|c)]) 展开得到[ u^\rho_t(x)u_t(x)E_{q_\rho}[\Delta(x,c,t)] E_{q_\rho}[v_t(x|c)](1-\rho)E_{q_\rho}\left[\Delta(x,c,t)\right] ]最后这个式子看着有点绕换一种更顺手的拆法。定义一个 (x) 下的标签集平均残差[ \delta_\rho(x,t)E_{q_\rho(c|x)}\left[v_t(x|c)-u_t(x)\right] ]于是温度化平均速度可以写成[ u^\rho_t(x)u_t(x)\delta_\rho(x,t) ]现在回头看经典CFG的结构(\tilde{s}s_{\text{uncond}}w(s_{\text{cond}}-s_{\text{uncond}}))。它的本质是基准项加引导项。上面的速度场分解告诉我们一个平行结论(u_t(x)) 是基准平均(\delta_\rho) 是锐化引导残差。换句话说如果你能拿到条件速度 (v_{\text{cond}}v_t(x|c)) 和平均残差 (\delta_\rho)那么[ \tilde{v}t(x,c)u_t(x)\rho,\delta\rho(x,t) ]这个式子的有效性建立在一个关键近似上。理想情况下我们要的是 (E_{q_\rho}[\Delta])但实际采样时我们只有一个具体标签对应的条件速度残差 (\Delta_{\text{point}}v_t(x|c)-u_t(x))。用 (\rho1w) 加一个额外的共形因子后单点残差可以近似承担后验期望的角色。这种替换在 (p_t(c|x)) 很尖、也就是 (\rho) 足够大时尤其成立。4.4 和经典CFG的对照把速度场翻译回分数语言。理想情况下(u_t(x)) 扮演的角色对应分数里的无条件项 (s(x))而 (v_t(x|c)-u_t(x)) 扮演条件与无条件之间的差异项。代入我们上面的采样公式[ \tilde{v}_t(x,c)u_t(x)(1w)\big(v_t(x|c)-u_t(x)\big) ]展开之后[ \tilde{v}_t(x,c)v_t(x|c)w\big(v_t(x|c)-u_t(x)\big) ]这和标准CFG公式在形式上高度同构只是把无条件向量场替换成了平均向量场。区别微妙但重要在标准CFG里(s_{\text{uncond}}) 是显式输入 (\emptyset) 得到的在MeanFlow这里(u_t(x)) 是条件速度字段按后验期望平均出的边际速度。如果用第2节的配准定理理想情况下 (u_t(x)) 生成的正是边缘分布它天然比显式无条件网络多了一点所有标签的平均信息。这个差异在 (\rho1) 时不会出问题因为此时引导项消失了在 (\rho1) 时基准项的差别会让生成结果多出一层类别均值漂移不过总的来说可以当作一个额外自由度去调。4.5 从推导得到采样方程把以上公式落成实际可跑的采样算子。给定当前时刻 (t)、中间状态 (x_t)、目标标签 (c)我们不再跑两个前向而是只需要网络在条件输入下一次前向给出两个输出条件速度 (v_{\text{cond}}v_\theta(x_t,c,t))平均残差 (d_\theta(x_t,t)u_\theta(x_t,t)-v_{\text{cond}})或者网络直接输出条件速度与平均速度的差方便做减法然后采样速度组装为[ \tilde{v}v_{\text{cond}}\alpha,d_\theta ]其中 (\alphaw-1) 或按你的 (\rho) 参数取 (\alpha\rho-1)。对比一下它和标准CFG唯一的不同在于标准CFG需要单独的 (s_{\text{uncond}})这里我们用了一个训练出来的平均头去替代它。这个采样公式不再要求输入 (\emptyset) 标签也就避开了显式无条件分支这一整套训练和推理设计。要说清楚这不是免费的午餐平均头的训练质量和 (\rho) 的取值会让最终效果上下浮动。下面用一个简单例子先验证推导在理想情形下没毛病。4.6 高斯混合情形的显式核算为了检查公式没推错用一个极端简化的例子。设标签只有两个值 (c_0,c_1)条件分布都是高斯方差一样均值不同。给定中间样本 (x)后验 (p_t(c_i|x)) 由高斯似然决定。此时 (v_t(x|c_i)) 是指向各自均值方向的速度。当 (\rho1)后验权重自然平衡(u_t) 是两速度的加权平均采样最终落在两均值之间的混合分布上。当 (\rho\to\infty)后验趋于一个独热分布(u^\rho_tv_t(x|c_{\text{argmax}}))也就是最可能的那个标签方向。当 (\rho1w) 且 (w7) 时算出来的 (u^\rho_t) 方向明显偏向最大后验标签但步幅比纯最大后验柔和这和CFG高引导系数下更自信但不过度锐化的行为一致。这个例子虽然简单但足够说明一个事实温度化平均速度确实在连续地控制偏离条件目标的程度而不需要显式引入无条件模型。5. 理想化假设下的验证与边界5.1 假设逐条过筛子第一完美配准。真实模型肯定做不到网络输出等于真实条件向量场尤其是采样轨迹偏离训练分布时回归误差会被引导项放大。这会造成所谓的过度锐化伪影表现为生成结果高频过强、颜色过饱和。缓解手段比较常规限制 (\rho) 的上界或用残差网络结构的平均头去吸收一部分回归偏差。第二平均头估计器。训练时若只是简单让网络输出 (v_\theta(x,c,t))另外加一个不接收条件的分支 (u_\theta(x,t))这个分支学到的其实是 (E_c[v_\theta(x,c,t)])它和真实后验加权平均之间有一个偏差偏差来源是网络容量和训练时数据分布。要弥补可以在训练时把条件标签随机丢一部分给平均头做弱监督类似CFG训练时的 drop 策略。第三测度变换雅可比修正。从 (q_\rho) 到 (p_\rho) 的变换不是纯保距严格推导还应该带一个 (\log Z_\rho) 的梯度修正。理想假设把这个修正忽略了实际应用中通过残差项的超参数兜底。真要严谨起来可以把修正项估计成一个标量乘子这样既能保持理想形式又能吸收局部测度形变。5.2 (\rho) 的边界行为把几个极端值列出来对比(\rho1)无引导直接按条件速度采样生成结果贴近原始条件分布。(\rho0)退化成静态先验平均采样结果贴近所有标签的混合不具条件性。这个极限在现实实验里没什么用主要是理论闭包。(\rho1)引导增强中间态逐渐被推向更强的类别分离方向。(\rho) 过大后验在标签空间几乎独热平均头几乎没有梯度采样会变得像在做硬聚类选择容易出现模式坍缩到单点的风险。这四种行为说明 MeanFlow 的温度参数确实在引导强度和类别锐化程度之间连续插值而不像标准 CFG 那样只有外推倍数一个旋钮。5.3 推导与经典CFG的等价性边界在严格理想条件下MeanFlow 采样公式和经典 CFG 是代数等价的但前提是平均速度恰好等于无条件速度。现实训练中这两个量常常有偏特别是在数据类别不平衡时平均速度会更倾向于高频类别。这会导致 (\rho) 的语义发生漂移名义上你设 (\rho8)实际效果可能比标准CFG的 (w7) 更强或者更弱。我的建议是把它当作一个独立超参去格点搜索而不是试图公式化映射到标准CFG的 (w)。6. 从纸面到采样器实现与经验6.1 网络结构怎么改要在现有流匹配网络上做最小改动我建议在输出端并一个平均头。主头照常输出条件速度 (v_\theta(x,c,t))平均头 (u_\phi(x,t)) 不接条件输入。损失函数是两个头单独算[ \mathcal{L}\mathbb{E}\left[\lVert v_\theta(x,c,t)-v_{\text{gt}}(x,c)\rVert^2\right] \lambda,\mathbb{E}\left[\lVert u_\phi(x,t)-v_{\text{gt}}(x,c)\rVert^2\right] ]注意第二个期望同样遍历所有 ((x,c))所以 (u_\phi) 学到的实际上是给定当前 (x) 时对所有可能标签的速度期望。这里 (\lambda) 一般取 0.5 到 1太小会让平均头欠拟合太大了会让主头质量下降。如果不想额外加头也可以沿用采样时把条件向量场减去一个预先缓存的平均速度均值的近似但那种做法损失掉的信息更多效果不太稳我不推荐。6.2 采样器里的组装顺序拿到主头和平均头的输出后采样不是简单地加一项就完事。建议按以下顺序计算条件速度 (v_c)。计算平均头输出 (u_t)。计算残差 (dv_c-u_t)。组装引导速度 (\tilde{v}u_t\rho,d)。这里的 (\rho) 等效于标准 CFG 里的 (1w)所以如果你之前习惯用 (w7)可以先把 (\rho) 设成 8 再微调。时间步 (t) 进入网络时代参数平均头的输入里也需要拼上 (t) 的嵌入不能省略否则它在不同噪声水平下的预期会串掉。6.3 离散化和步长很多流匹配采样器用欧拉法或者二阶中点法。实测下来隐式引导在步长短的时候比较稳定20步以下如果 (\rho) 太大容易出现边缘发糊。二阶的 Heun 步长能显著缓解这个问题。还有一个细节引导残差 (d) 在中间时刻通常很大在早期和末期偏小所以如果你担心过冲可以给残差加一个随时间衰减的门控系数我用过余弦衰减效果不错。6.4 和标准CFG的实测对比我在一个中等规模的模拟数据集上做了下对照实验训练同一套骨干网络分别用标准 CFG 和 MeanFlow 采样。配置大致是 1000 步训练、50 步采样。结果显示在相同引导强度下MeanFlow 生成结果的类别一致性和多样性分数都接近标准 CFG但每步采样少了一次前向整体推理延迟降了大概四成。代价是平均头训练多了大概一成多的显存开销推理时则完全摊薄。需要提醒的是这个实验里的绝对数值没有普适参考意义我列出来只是为了说明省一次前向不是幻觉。你的数据分布和骨干网络不同效果差异会很大还是要自己跑一组对比。6.5 我踩过的几个坑第一个坑是平均头收敛太慢。最初我把 (\lambda) 设成 0.1训练了 20 万步之后平均头仍然拖着跑导致引导速度在时间步上忽大忽小。后来改成 (\lambda1.0)并把平均头的学习率提高 1.5 倍问题才缓解。第二个坑是标签不平衡数据下平均头会偏向高频类别导致低概率类别在 (\rho) 稍微大一点就完全消失。要解决可以在训练时给每个类别的损失加一个反频率权重或者在采样时用 (\rho) 的温度调度前期用低温度遍历后期再拉高温度做精选。第三个坑是关于零训练的幻觉。有人可能觉得这个隐式引导不需要额外数据其实平均头的训练数据就是原来的 ((x,c)) 对它只是换了个监督目标而已如果训练数据本身覆盖不到某些区域平均头也会跟着瞎猜不存在免费午餐。6.6 调试引导强度的快速办法快速判断 (\rho) 设得是否合理不需要跑整轮采样。取一个固定中间时刻 (t)随机挑一批中间态 (x_t)计算残差 (d) 的 L2 范数与条件速度 (v_c) 的 L2 范数比值。如果这个比值在 0.1 到 0.5 之间引导强度算正常如果比值超过 1 说明引导信号过于支配生成结果大概率会偏离流形如果比值小于 0.01说明平均头被条件头完全吞掉了引导几乎不生效。这个量我习惯叫它引导比调试时比肉眼盯生成图快很多。7. 一点个人体会和后续可以继续深挖的方向回头看整个推导最有价值的一步不是最后的采样公式而是把无条件速度换成了平均速度这一下。它把CFG从需要专门学一个脱离条件的分支”变成了“条件速度场在后验平均上的自然副产品”这让引导这个词真正落回了概率测度的语言里。当然理想化假设下的干净结论在现实里一定会被回归误差和数据偏移污染所以它更适合作为一种设计新采样器时的思考脚手架而不是可以直接无脑部署的生产配方。后续我比较想试的几个扩展方向第一把这个平均头继续往条件速度之外的量上推广比如标签嵌入的期望看看能不能顺便做语义插值第二(\rho) 在采样轨迹上做动态调度模拟退火的风格而不是全局固定第三把隐式CFG和一步蒸馏结合蒸馏目标直接从 (u^\rho_t) 提取省掉蒸馏阶段使用标准CFG的步骤。目前这些还在实验桌上如果跑出了值得写的结果我再来更新。
阅读完成 · 觉得有帮助?
咨询建站