阶段 4 · 学会创造

一致性模型:让轨迹上
每一个点都说同一句话

上一章的《流匹配与整流流》把路修直,这一章换个弯的路走。 一致性模型的想法是:既然终点是确定的,那我在曲线上随便挑一个点, 直接一步跳过去不就行了? 难的地方在于——怎么让模型学会「不管从哪跳,都跳到同一个地方」。

1

一条弯路,走了几百步

扩散模型的采样是一条从噪声到数据的曲线。多步采样器是在这条曲线上 一小步一小步地走——走几百次才到终点。

做法怎么到终点步数问题
多步采样(DDPM / DDIM) 沿着轨迹走很多小步 20 ~ 1000 慢。步数少了曲线就走不准
直接一步跳过去 训练一个函数 f(x,t) 直接输出终点 1 一步跳很难学——因为要猜的跨度太大了
一致性模型 逼 f 在轨迹上处处给出同一个答案,然后再让它跳 1 ~ 4 牺牲了多样性(后面会讲)

三种走法 · 同一张图,代价差在哪

🎯 类比

像从山顶下山。多步采样是老老实实沿着盘山公路一格一格往下挪——稳妥,但慢。
一步跳是想直接从山顶跳到山脚——快,但你不知道中间会不会撞到山壁。
一致性模型的做法很巧妙:先在盘山公路的每一个位置都立一块路牌, 路牌上写的都是「山脚在这里」。这样无论你站在哪一段路上, 照着路牌指示的方向跳一步,都能到山脚。

路牌管到「每个起点只通向一个山脚」为止。路一旦分岔——同一个噪声本来能通向几张不同的图—— 路牌就只能写个平均方向,那正是后面要讲的代价。

2

任取两点,它都报同一个终点

先把两个词说清。扩散模型给平面上每个位置一个「往哪走」的方向(速度),从一个噪声点出发、顺着方向走, 走出来的那条线就是一条轨迹——同一个起点噪声,永远走出同一条轨迹。 两头是:数据那端 x₀(t = 0),起点噪声那端 z(t = 1)。

一致性模型要学的函数很特别,它有两个参数:f(x, t) —— 给我轨迹上的一个点, 直接告诉我终点在哪。

自一致性条件:只要 xt 和 xt′ 在同一条轨迹上,这两个输出就必须相等。
并且要满足边界条件:终点上映射到它自己。

就这一条约束。它意味着:整个轨迹上无穷多个点,全部被压缩到同一个输出。 于是你从任何一个点出发,一步就能到终点。

互动 · 真的验证一次自一致性

💡 两种实现差在哪

先说一句:这里的「理想一致性函数」是我们照着手头这条已知的轨迹算出来的—— 它被写成了「不管从哪问,都报 x₀」。真实模型并不知道终点在哪,它是在第 3 节那个损失里 一点点学成这样的。这里先把「学成之后长什么样」拿出来看。 轨迹用的是精确公式 x(t) = z + (x₀ − z)·(1−t)k,f 的两种实现都是真函数、真求值:
· 一致性模型:轨迹上任意两点做 f 之后落到完全相同的坐标(差值恒为 0.000000)
· 普通一步估计:用「从当前位置沿速度方向直接外推」(外推=沿当前方向往前伸),轨迹是弯的,所以两点落到不同的地方
切到「普通一步估计」看看差值变成多少,就明白为什么要专门训练了。

3

怎么把这条要求训练进去

网络并不知道终点在哪。它只被要求一件事:同一条轨迹上,远一点的答案和近一点的答案必须一样。 而 t = 0 那一端被规定就是数据 x₀ 本身,一致性从这里一路传开。

① 取一个噪声点 xt+1,朝数据那端(t 变小)用现成的求解器走一小步,得到 xt 这一小步靠老师模型算方向(CD);CT 没有老师,就用数据直接算出这一步。两种都不需要新网络
② 要求「网络在远一点位置的答案」和「影子网络在近一点位置的答案」一样 远的那个是 xt+1,近的那个是 xt——两者被要求报出同一个终点
③ 关键:右边那一项加 stop-gradient(sg) 不加的话,模型可以把所有输出改成同一个常数——比如都输出 0,等式照样成立。这就是「塌缩」

公式里几个符号:θ 是学生(正在更新的网络);θ⁻ 是 θ 的滑动平均(旧版影子,论文叫目标网络)。 sg 后面的值被冻住当标准答案,梯度不流回右边;‖·‖² 就是每项相减、平方、再求和。 CD 里「老师」指预训练好的扩散模型:它给出「往哪走」的方向,ODE 求解器沿着这个方向走一小段(ODE 是描述这条路的那类方程)。 为什么只比相邻两步?相邻两点能由模型或数据准确算出来;隔得远的两点要反复迭代,误差反而更大。

边界条件不靠损失,靠网络的写法:f(x, t) = cskip(t)·x + cout(t)·F(x, t)—— F 是网络本体,cskip、cout 是两个随 t 变化、预先定好的系数。 让 t = 0 时 cskip = 1、cout = 0,数据那一端 f 就天然等于 x 本身; 再靠「相邻两点相等」一段段把这一端的答案传到整条轨迹。

不加 sg 的话,损失靠「把所有输出改成同一个常数」就能降下去——任何常数都满足等式,但函数彻底没用。 加上 sg,右边的值被冻住当标准答案,左边的 f 只能老老实实去追它。这和 BYOL、MoCo 那些自监督方法里的做法是同一招。

对比项一致性蒸馏 CD一致性训练 CT
要老师吗要——预先训练好的扩散模型 不要,从头训
训练目标学生的输出要等于老师走一步的结果 只用「自一致性」这一个约束
实际用得多吗训练型加速里最常见的一条(LCM 一系) 少,因为要从头训,成本更高
4

落地的两件工程

先给四个词各一句:潜空间是压缩过的图像表示;CFG(无分类器引导)是同一张图算两遍—— 一遍带提示词、一遍不带,用两者的差把画面往提示词方向推;LoRA 是一种只训一小撮额外参数的微调方法; SD 是 Stable Diffusion,一个开源的文生图模型。下面两件工程就是在这四个词上做文章。

东西做法为什么重要
LCM
Latent Consistency Model
在潜空间里做一致性蒸馏,并且把无分类器引导(CFG)直接塞进蒸馏目标 解决了两个现实问题:① 潜空间比像素空间便宜得多; ② 原先的一致性蒸馏要跑两遍(有/无条件)才能支持 CFG,LCM 把它合成了一次
LCM-LoRA 把一致性蒸馏的结果做成一个 LoRA 适配器 最实用的一步:同一份 LoRA 可以插到同系列的任意 SD 微调模型上, 插上之后那个模型立刻变成 4 步出图,而且还能和别的 LoRA 叠加。 相当于「加速」变成了一个可插拔的零件
SDXL-Turbo / SD-Turbo 对抗扩散蒸馏(ADD)+ 分数蒸馏,1~4 步 把 GAN 的判别器请回来当「质量裁判」(对抗),再加分数蒸馏(跟老师的去噪方向走),一步出图的画质明显提升

LCM-LoRA · 把加速做成一枚可插拔的零件

🎯 类比

一致性蒸馏像把一本 1000 章的说明书压缩成 4 章摘要—— 得重新写一遍,压缩完就固定在那个模型上了。
LCM-LoRA像一个「速读插件」:不用改写原书,插上就能用速读模式读, 而且能同时装好几个不同的插件。这就是工程上的胜利——它把加速从「重训模型」变成了「换个零件」。

插件只认同一系列:SD1.5 的插件插不进 SDXL,所以官方给了两份权重。

M

数学 · 一次出图跑几次网络

这一章从头到尾只讲一件事:把「网络要被跑多少次」从几十次压到几次。
到底压掉了多少?下面每一格就是网络被跑一次——数格子就行。

动画 · 每一格就是网络被跑一次

总前向次数
—
相对 20 步基线
—
每一步跑几次
—

微型图解 · 那个影子参数追得多慢

5

三条路:不训练、蒸馏、改路径

想让扩散模型少走几步,只有三条路。下面先用一张图把家底说清,再用一张表逐条给细节。

三类加速 · 九个方法各归哪一类

方法要不要训练步数核心思想
DDIM不要20 ~ 100 把随机采样改成确定性的 ODE,可以跳步
DPM-Solver不要10 ~ 20 用高阶数值积分方法解同一个 ODE(比 Euler 那种一步一步走更准)
渐进蒸馏 PD
2022
要(多轮) 4 ~ 8每次把步数减半,反复蒸馏。要训很多轮
一致性蒸馏 CD
2023
要(一轮) 1 ~ 4自一致性,一次到位。本章的主题
一致性训练 CT要(从头)1 ~ 4 不要老师,只用自一致性约束从头训
LCM / LCM-LoRA要(LoRA 规模) 4潜空间 + CFG 蒸馏 + 可插拔 LoRA。落地最好
SDXL-Turbo要1 ~ 4 对抗扩散蒸馏:请回 GAN 判别器当裁判;再加分数蒸馏(跟老师的去噪方向走)
Lightning / Hyper-SD要1 ~ 8 蒸馏(+ 对抗 / 反馈),各步数档位都覆盖
流匹配 / 整流流要(重训) 1 步也能出换一条更直的路径,而不是把弯路走快
6

速度是用多样性换来的

这是整个加速领域最核心的权衡。下面两个量分别来自 Euler 离散化误差(用有限小步去近似一条曲线,步子越大偏得越多) 和抽样后统计的分布熵(把抽出的样本按最近的数据簇分箱,看分得有多均匀)。这里的「模式」,指这个玩具里的三个数据簇。

互动 · 少步数到底牺牲了什么

终点误差(质量)
—
分布熵(多样性)
—
覆盖到的模式
—

互动 · 少步数为什么一定付代价(看这条弯路径)

为什么会给平均:几条靠得近的轨迹,终点并不一样

⚠️ 一句话说清这个权衡

步数越少,模型就必须在「更大的一步」里做决定,于是它只能选一个最安全的答案——平均值。 平均值意味着:同一条噪声只会产生一个确定的结果(这是好事,可复现), 但不同噪声之间的差异也变小了——生成出来的样本开始「长得越来越像」。
这就是为什么 1 步生成的模型,通常用来做实时预览、视频滤镜、游戏素材,而不是用来做需要千变万化的创意探索。

💡 一个反直觉的结论

「少步」和「高质量」本质冲突,原因不在模型能力,而在路径的形状:
一条弯曲的路径,用大步走必然偏离;要少步就必须把路径修直。
所以真正的解法是换一个本来就更直的路径—— 这正是上一章流匹配(Flow Matching)做过的事。
一致性模型是在「把弯曲的路走快」,流匹配是在「把路修直」。后者更根本。

7

几个绕不开的问题

问题说明
同一噪声给几个结果? 一致性模型一步采样是确定性的——同一个 z 永远出同一张图, 想要多个结果必须换 z(多步采样时,中间每一步还可以再注入噪声)。 这既是缺点(少了多样性),也是优点(可复现)
能不能和别的 LoRA 叠加? LCM-LoRA 可以。这是它比「重训一个 Turbo 模型」更好用的地方
训练成本 CD 要跑老师模型生成轨迹,成本大约是原训练的一小部分; 但CT 要从头训,没有老师可借,成本更高,所以用的人少
和知识蒸馏是一回事吗? 思想上一脉相承(学生模仿老师),但目标是新的:不是压缩模型大小,而是压缩采样步数
上一章讲过什么 流匹配——它不去加速弯曲的路径,而是直接学一条直线。 直线用一步就能精确到达,而且不需要蒸馏
4 步和 50 步到底差多少? 这一页只给数学上的差距;想看真实的并排图,去 📄 里那张 《Latent Consistency Models》(里面有 2 步、4 步出图与基线的并排对比)
8

小结

前面这些东西,其实只属于七条线里的一条——它在这一章上表现得特别干净。

它对应哪条线 ④ 学习即压缩——一致性模型不压缩模型,它压缩计算本身: 把「沿着一条曲线走几百步」这件事,压成「一次映射」
一句话 整条轨迹上,f 被约束成处处输出同一个值。 于是从任何一点出发都能一步跳到终点——「跳得远」不是靠模型更聪明,是靠它「不需要看你在哪」。
它牺牲了什么 牺牲了轨迹上的全部信息(回扣暗线 B)。 无穷多个点被压成一个点,换来「一步到位」;代价是这些点之间原本的区别—— 也就是多样性——被一起压掉了。压缩得越狠(步数越少),丢掉的细节越多。
🎬 自己验一遍

回到第 2 节那张图:把「f 的实现」切到普通一步估计,再把轨迹弯曲程度 k 从 2.0 拖到 1.0(直线)。 两个落点之间那条红线的差值,会从「差 0.几」一路塌到 0.000000——那个瞬间就是「整条轨迹被压成一个点」。

为什么是 ④ 而不是别的:整条轨迹(无穷多个点)被压成一个输出,压缩的度量单位不是比特,而是步数—— 从 50 步压到 4 步,就是从曲线上压掉 46 个点。至于其余六条线:

线为什么不站这边
① 表达力 vs 泛化 · ⑤ 高维里的低维不涉及——它压的是轨迹上的点,不是拟合程度,也不是数据维度
② 归纳偏置 · ⑦ 拧得动沾边,但落点都在别处——约束带来的是「步数被压掉」这个结果,⑦ 说的也不是压缩
③ 规模会赢 · ⑥ 层层组合方向恰好相反——这一章把大模型跑得更省、把多步合成一步

它在暗线里站在哪

暗线这一章的回答
A 信息流动 多步采样把噪声一步步搬成图像;一致性模型把这条搬运链折叠成一次搬运——形状不变,步数从几十变成一
B 什么被牺牲了 牺牲了多样性:步数越少,模型只能给平均答案,第 6 节的互动里覆盖率会从 3/3 掉到 1/3
C 参数账本 SD1.5 的 U-Net(它那个图像网络)约 860M 参数(fp16 半精度存储 ≈ 1.7 GB);50→4 步,采样算力几乎线性降到约 1/12; LCM-LoRA 适配器只占原模型体积的不到 10%
D 跑在什么上 瓶颈是「步数 × 每步的乘加次数」;batch 很小时每步还要把 1.7 GB 权重读一遍, 这时带宽比算力先不够用(带宽墙),详见 《硬件与算力账本》
E 它假设了什么 假设每个噪声起点的终点唯一;论文作者公开的代码用 Heun 求解器走这一步(每走一步先试探一下再修正,比 Euler 准一档),本页演示用的是 Euler
F 违背了哪个直觉 「算得越少,结果越粗糙」只对一半。砍到 4 步左右主要掉多样性,再压到 1 步清晰度才跟着掉
🎯 前后钩子

它接住了上一章的什么:《流匹配与整流流》的做法是 把路修直,好让一步就够;这一章是把弯路走快(训练一个肯跳的函数)。 两条路的区别在图上一眼可辨:一个改的是路径的形状,一个改的是走路的步幅。

它给后面的章留了什么:既然「压缩」可以压计算,那能不能压表示? 下一章《视觉 tokenizer》把图压成编号;更后面 《LoRA 与参数高效微调》、《蒸馏、量化与剪枝》压的则是参数—— 同一个「学习即压缩」,压的对象不同。

一句话带走一致性模型

一致性模型 = 训练一个函数,让它在整条轨迹上处处输出同一个终点。 有了这个性质,从轨迹上任何一点出发,一步就能到终点。
损失的核心是 相邻两步的自我比较 + stop-gradient——不加 sg,两边的输出会一起塌缩成同一个常数。
LCM-LoRA 是它最成功的落地形式:把加速做成了一个可插拔的零件。
代价是多样性换速度:少步意味着模型只能给「平均答案」,样本之间越来越像。
所以更根本的解法是把路修直——见上一章的流匹配。

9

拓展阅读

上面讲的都是「够用」的版本。想往下挖,这里有三个入口—— 它们不是必修内容,是给想再往前走一步的读者准备的。

📄 这一章的说法从哪来

💻 工业界怎么写

∑ 更严格的形式