Flow Matching(流匹配)
让每一粒噪声沿一条直线匀速走向一个数据点,再训练一个神经网络去学“经过这里的所有直线的平均速度”:这就是 flow matching。训练只是一个普通的回归,不需要积分 ODE,也不需要噪声调度表;生成时从高斯噪声出发,沿学到的速度场积分几步就得到样本。本节从 19.3 节的连续 flow 和 19.6 节的扩散模型出发,先看概率路径和“取平均”这个核心技巧,在浏览器里现场训练一个速度场,再看为什么步数少了会糊、怎样用最优传输和 reflow 把路径拉直,最后搭一个 π0 风格的 flow matching 动作头,让它生成能绕开障碍物的多模态动作块。
1为什么机器人需要它
机器人策略要输出的往往不是“一个动作”,而是“动作的分布”。同一个场景下,示教者有时从左边绕开障碍,有时从右边;同一个杯子可以从好几个方向抓。19.1 节已经看到,用均方误差回归动作会学到两个模式的平均,正好撞上障碍物。所以我们需要一个能表达多峰分布、又能快速采样的生成模型。
19.6 节的扩散模型能做到前一半:它把数据一步步加噪成高斯,再学习如何一步步去噪,样本质量很好,Diffusion Policy(22.2 节)就是这样生成动作的。但机器人有一个很硬的约束:时间。一个以 50 Hz 运行的控制器,每 20 ms 就要给出下一个动作;如果采样一次要几十到上百次网络前向,就很难赶上。19.3 节的连续 flow 是另一条路:沿一个向量场积分 ODE 就能采样,可是按最大似然训练它,每一步训练都要把 ODE 积分一遍。
Flow matching(Lipman 等,2023;同期的 rectified flow 与 stochastic interpolants 是同一类想法)把两者的优点拼在一起:它学的也是一个把噪声“流”成数据的速度场 \(\mathbf v_\theta(\mathbf x,t)\),但训练时不积分,只是对一个随手就能写出来的目标做回归;而且这个目标来自直线路径,所以通常几步积分就够了。π0 这类视觉-语言-动作模型的动作头用的就是它:每次推理只积分 10 步,就生成一整段 50 步的动作块。
2直觉:直线连起来,速度取平均
3.6 节把向量场想成一条河:撒一把沙子,每粒沙子顺着水流漂。现在我们想设计一条河,让 \(t=0\) 时撒下的一团高斯沙子 \(p_0=\mathcal N(\mathbf 0,I)\),到 \(t=1\) 时恰好堆成数据的形状 \(q\)。最笨也最直接的办法:随机配对,每粒噪声 \(\mathbf x_0\sim p_0\) 配一个数据点 \(\mathbf x_1\sim q\),让它沿直线匀速走过去:
本节沿用 Lipman 等和 π0 的写法:时间从噪声走向数据,\(t=0\) 是噪声,\(t=1\) 是数据;\(\mathbf x_0\) 是噪声,\(\mathbf x_1\) 是数据,生成时从 \(t=0\) 往前积分到 \(t=1\)。19.6 节的 DDPM 正好相反:\(t\) 数的是加噪步数,\(t=0\) 是数据 \(\mathbf x_0\),\(t=T\) 是噪声,生成时 \(t\) 倒着走。对照表:本节的 \(\mathbf x_0\) 对应 19.6 节的噪声 \(\boldsymbol\varepsilon\)(约等于 \(\mathbf x_T\)),本节的 \(\mathbf x_1\) 对应 19.6 节的 \(\mathbf x_0\),本节的 \(t\) 大致对应 19.6 节的 \(1-t/T\)。
在每个时刻 \(t\),所有沙粒的位置构成一个分布 \(\hl{pt}{p_t}\),从 \(p_0\)(高斯)连续地变到 \(p_1=q\)(数据)。这一串分布叫概率路径。问题在于:这些直线会交叉。两条直线在同一个时刻穿过同一点,却要朝不同方向走,而一个向量场在一个点只能给出一个速度。解决办法就是本节的核心:在每个点 \((\mathbf x,t)\),取所有经过这里的直线速度的平均,
第二个等号用了 \(\mathbf x_0=(\mathbf x-t\mathbf x_1)/(1-t)\):知道了现在的位置和终点,起点就确定了。\(p(\mathbf x_1\mid\mathbf x_t=\mathbf x)\) 是“一粒此刻在 \(\mathbf x\) 的沙子,终点是哪里”的后验。一个不显然、却是本节最重要的事实是:沿这个平均速度场漂流,整团沙子在每个时刻的分布仍然恰好是 \(p_t\)(第 5 节证明)。单粒沙子的路线变了:它们不再走直线,而是走一条弯曲、互不交叉的曲线,但整体的“人群密度”与直线配对时一模一样。下图在一维里把两者画在一起。横轴是时间,纵轴是位置。
- 把绿色探针拖到 \(t\ge0.35\) 的某处,使两个峰的后验权重都至少是 0.25(读数里的 \(w_1,w_2\)):两条紫色线段指向相反的方向,琥珀色的平均速度既不指向上峰也不指向下峰,而是指向两峰之间。
- 在显示蓝色轨迹时(“蓝色轨迹”或默认的“两者”),拖动琥珀色圆圈,让原来在下方的峰移到另一个峰的上方。紫色直线照样交叉,蓝色轨迹却重新排好了队,始终互不交叉:一维里,平均速度的流把 \(p_0\) 的分位点一一送到 \(q\) 的同一分位点,这正是 4.9 节的逆 CDF 采样。
平均速度 \(\mathbf u_t(\mathbf x)\) 没法直接算,因为后验 \(p(\mathbf x_1\mid\mathbf x_t)\) 要对整个数据集求和。但我们不需要算它:16.2 节说过,用平方误差回归一个带噪声的目标,学到的是目标的条件均值。所以只要随机抽 \((\mathbf x_0,\mathbf x_1,t)\),让网络在 \(\mathbf x_t\) 处回归那条直线的速度 \(\mathbf x_1-\mathbf x_0\),它学到的自然就是 \(\mathbb E[\mathbf x_1-\mathbf x_0\mid\mathbf x_t]=\mathbf u_t\)。每个训练目标都“错”(它只是一条直线的速度),平均起来却恰好对。这就是 flow matching 的全部秘密。
3动手:现场训练一个速度场
把上面的配方原样写成代码,就是条件 flow matching(CFM)的训练循环。每一步:抽一批噪声 \(\mathbf x_0\sim\mathcal N(\mathbf 0,I)\)、一批数据 \(\mathbf x_1\sim q\) 和时间 \(t\sim\mathcal U[0,1]\),算出 \(\mathbf x_t\),让网络在那里预测速度,与直线速度 \(\mathbf x_1-\mathbf x_0\) 比平方误差:
没有 ODE、没有雅可比行列式、没有噪声调度表:就是一个回归问题,梯度用 16.3 节的反向传播。下图的网络是一个 \([5,48,48,2]\) 的 GELU MLP,输入是 \((x,y,t,\sin\pi t,\cos\pi t)\),共 2738 个参数;优化器是 Adam(学习率 0.003,2000 步后降到 0.001),每步 64 个样本。数据是二维的高斯混合,这样页面能算出精确的平均速度场 \(\mathbf u_t\)(第 5 节给出公式),于是我们可以直接量出网络离理想答案还有多远:
第一项是场误差 \(\mathcal E(\theta)\),训练能把它压向零;第二项 \(\mathcal L^*\) 与 \(\theta\) 无关,是直线速度围绕平均值的散布:同一点上直线们彼此越不一致,它越大。所以 CFM 的损失永远不会降到零,就像 16.2 节验证损失有一个噪声地板一样。采样时从 500 个固定的高斯样本出发,用 Euler 法积分 \(\mathbf x\leftarrow\mathbf x+h\,\mathbf v_\theta(\mathbf x,t)\),\(h=1/N\)(2.5、3.6 节)。
- 在“双月”上按“训练”,直到场误差低于 0.1(默认种子第 900 步左右;开始时是 1.34)。看损失:它从 4.38 降到 3.0 附近就几乎不动了,而地板 \(\mathcal L^*=2.89\)。真正在变好的是场误差和 SW。
- 换到“8 个高斯”,训练到场误差低于 0.15(约 1900 步)。它的地板 \(\mathcal L^*=4.06\),比双月高得多:8 个峰离得远、方向各异,经过同一点的直线彼此更不一致。
(1) 把 \(t\) 滑块拉到 0 附近:箭头几乎平行地指向数据的中心。\(t=0\) 时 \(\mathbf x_t=\mathbf x_0\) 与 \(\mathbf x_1\) 独立,后验就是整个数据集,平均速度是 \(\mathbb E[\mathbf x_1]-\mathbf x\)。拉到 0.9 附近:箭头指向最近的那一小段数据,因为这时一个点离哪个数据点近,后验就几乎全押在那里。 (2) 双月训练 4000 步后,场误差约 0.06,20 步 Euler 的 SW 是 0.081,精确场是 0.078:剩下的差距主要来自步数,不是网络。 (3) 打开“轨迹”:路径是弯的。条件路径都是直线,平均之后却不是,这一点决定了要积分多少步(第 4 节)。
4另外两个视角:少步采样,以及把路径拉直
少步采样:步数、积分方法和路径的形状
训练好之后,生成一个样本就是解一个 ODE:\(\dot{\mathbf x}=\mathbf v_\theta(\mathbf x,t)\),从 \(t=0\) 积到 \(t=1\)。每次网络前向(NFE,number of function evaluations)都要花时间,所以问题是:给定一个 NFE 预算,样本有多准?下图用精确的平均场(不是网络)把“学得好不好”和“积分得准不准”分开,只看后者。除了直线路径,也可以选一条余弦路径 \(\mathbf x_t=\sin(\tfrac{\pi t}{2})\mathbf x_1+\cos(\tfrac{\pi t}{2})\mathbf x_0\):它的信号和噪声系数平方和为 1,与 19.6 节扩散模型常用的“方差保持”型路径属于同一类(第 5 节);把时间反过来(\(t=1-\tau/T\)),它就是 19.6 节的余弦日程(略去那里的小偏移 \(s\)),\(\sin\tfrac{\pi t}{2}\approx\sqrt{\bar\alpha_\tau}\)。积分方法可选 Euler(每步 1 次 NFE,一阶)或中点法(每步 2 次 NFE,二阶,3.6 节 FIG 4 里的 Heun 也是二阶)。
- 选直线路径、Euler、NFE = 1:300 个样本全部落在同一个点,也就是数据的均值(读数里样本云的半径为 0)。一步 Euler 的终点是 \(\mathbf x_0+\mathbf u_0(\mathbf x_0)=\mathbb E[\mathbf x_1]\),与起点无关;这和 19.6 节 FIG 4 里 1 步 DDPM/DDIM 的结果是同一回事。
- 在“8 个高斯”和直线路径上,分别找出 Euler 和中点法把终点误差压到 0.05 以下所需的最小 NFE(两者都要试到)。Euler 需要 16(误差 0.044),中点法只要 8(0.028):NFE 每翻一倍,Euler 的误差减半,中点法的误差则下降得快得多(0.268 → 0.028 → 0.006)。
- 还是“8 个高斯”,把预算固定为 NFE = 4,试遍四种组合,找出终点误差最小的那个(它可能不是你预想的)。
答案是余弦路径 + Euler(0.141,直线 + Euler 是 0.177,两种中点法都在 0.26 以上)。这值得停下来想一想。直线路径的条件路径是直的,但独立随机配对时,平均之后的边缘轨迹仍然是弯的,FIG 3 的青色曲线就是证据;在这个例子里,余弦路径配上等间距的时间步反而更好积分。真实的采样器还会把时间步排得不均匀,所以“哪条路径更省步数”没有放之四海皆准的答案。直线路径真正的优势在别处:如果配对本身是“不交叉”的,直线路径下的边缘轨迹就真的是直线,一步 Euler 就精确。下一张图就去造这样的配对。
把路径拉直:小批量最优传输与 reflow
边缘轨迹之所以弯,是因为训练时的直线互相交叉,平均之后拐了弯。交叉来自随机配对:一粒在左上的噪声,可能被配给右下的数据点。两种办法能让配对“有序”:
- 小批量最优传输(Tong 等,2024;Pooladian 等,2023):每个批次里有 64 个 \(\mathbf x_0\) 和 64 个 \(\mathbf x_1\),不再随机配,而是求一个让总平方距离 \(\sum_i\|\mathbf x_0^{(i)}-\mathbf x_1^{(\sigma(i))}\|^2\) 最小的一一配对 \(\sigma\)(指派问题,本页用匈牙利算法精确求解)。最优传输的配对线段互不交叉。
- Reflow(Liu 等,2023 的 rectified flow):先训练一个普通的 flow,然后从噪声 \(\mathbf x_0\) 出发积分它得到 \(\mathbf x_1=\mathrm{ODE}(\mathbf x_0)\),把这些 \((\mathbf x_0,\mathbf x_1)\) 当作新的配对再训练一次。ODE 的轨迹互不交叉,所以新的配对也不交叉,新的流更直。本页为了省时间,直接用精确平均场的 ODE(RK4,10 步)生成 2000 对,也就是 FIG 2 那个网络努力逼近的流。
- 右边选“小批量 OT”,Euler 步数保持默认的 1,训练至少 500 步:右边的样本已经是两条月牙(SW < 0.2),左边的样本仍然缩在中心附近(SW > 0.6)。注意两边的损失:独立配对停在 2.8 到 2.9 之间,OT 降到 0.25 左右,因为配对越确定,直线越少交叉,地板越低。
- 右边换成“Reflow”并训练,直到右边 1 步 Euler 的 SW 低于 0.1(默认种子约 300 步)。蓝色路径几乎是直线:一次网络前向就够了。
回归:在 \((\mathbf x_t,t)\) 处回归直线速度,学到条件均值(16.2 节)。 流体:设计一个速度场,使密度按连续性方程从 \(p_0\) 变到 \(q\)(3.6 节的“沙子守恒”)。 传输:flow 定义了一个从噪声到数据的映射 \(\mathbf x_0\mapsto\mathbf x_1\);配对越接近最优传输,映射越接近直线位移,积分越省步。 连续 normalizing flow:训练好的 \(\mathbf v_\theta\) 就是 19.3 节 FIG 5 那样的 ODE flow,可以用散度积分求精确似然,只是训练它不再需要最大似然。 扩散:换一条高斯路径,同一个回归就变成了 19.6 节的去噪(第 5 节)。
5再看数学
提示:把鼠标悬停在公式中带底色的符号上,图中对应的元素会被高亮(FIG 1 的密度底色、紫色直线、蓝色轨迹与琥珀色箭头、探针的后验短线,FIG 2 的速度箭头、损失曲线、场误差曲线与地板线,FIG 3 的数值路径与精确轨迹,FIG 4 的训练配对,FIG 5 的采样动作块与观测)。
概率路径与连续性方程
记 \(\mathbf z=(\mathbf x_0,\mathbf x_1)\) 为一对配对,按某个联合分布 \(\pi(\mathbf z)\) 抽取;独立配对时 \(\pi=p_0\otimes q\)。每一对给出一条条件路径:\(\mathbf x_t=\psi_t(\mathbf z)=(1-t)\mathbf x_0+t\mathbf x_1\),速度 \(\hl{cond}{\mathbf u_t(\mathbf x\mid\mathbf z)=\mathbf x_1-\mathbf x_0}\)。对所有配对平均,就得到边缘的概率路径 \(\hl{pt}{p_t}\) 和边缘速度场:
这里 \(p_t(\mathbf x\mid\mathbf z)\) 是集中在 \(\psi_t(\mathbf z)\) 一点上的分布;分式就是后验 \(p(\mathbf z\mid\mathbf x_t=\mathbf x)\)。一个速度场 \(\mathbf v\) “生成”一条概率路径,是指沿它漂流的样本在每个时刻的分布都是 \(p_t\),等价地,二者满足连续性方程(质量守恒,3.6 节的散度在这里出现):
右边那个形式沿着轨迹 \(\dot{\mathbf x}=\mathbf v_t(\mathbf x)\) 成立,它正是 19.3 节 FIG 5 上方的瞬时换元公式;把左式展开成 \(\partial_tp+\mathbf v\cdot\nabla p+p\,\nabla\cdot\mathbf v=0\),前两项合起来就是沿轨迹的全导数。
定理 1(边缘场生成边缘路径)。每条条件路径都满足自己的连续性方程 \(\partial_tp_t(\mathbf x\mid\mathbf z)+\nabla\cdot\big(p_t(\mathbf x\mid\mathbf z)\,\mathbf u_t(\mathbf x\mid\mathbf z)\big)=0\)(一个点沿直线匀速移动,当然质量守恒)。对 \(\pi(\mathbf z)\) 积分,对时间和空间的导数都可以拿到积分外面:
最后一步就是 \(\mathbf u_t\) 的定义(分子乘上 \(p_t\))。所以 \(\mathbf u_t\) 满足 \(p_t\) 的连续性方程:从 \(p_0\) 出发沿 \(\mathbf u_t\) 积分,在 \(t=1\) 恰好得到 \(q\)。这就是 FIG 1 里紫色直线和蓝色曲线给出同一片底色的原因。
为什么回归条件速度就够了
理想的目标是 flow matching 损失 \(\mathcal L_{\mathrm{FM}}(\theta)=\mathbb E_{t,\,\mathbf x\sim p_t}\|\mathbf v_\theta(\mathbf x,t)-\mathbf u_t(\mathbf x)\|^2\),可惜 \(\mathbf u_t\) 算不出来。定理 2(条件 flow matching):\(\mathcal L_{\mathrm{CFM}}\) 与 \(\mathcal L_{\mathrm{FM}}\) 只差一个与 \(\theta\) 无关的常数,所以梯度相同。证明只需把两个平方展开:
第二行用了条件期望的塔性质(先固定 \(\mathbf x_t\) 对配对求平均)。最后一项就是 FIG 2 的地板 \(\mathcal L^*\),它等于“给定 \(\mathbf x_t\) 时直线速度的方差”的期望。它在配对越确定时越小:FIG 4 里独立配对的损失停在 2.8 到 2.9 之间,OT 降到 0.25 左右,reflow 只有 0.01 左右,但三个网络的“好坏”并不能从这三个数比出来。Lipman 等的原始论文是对 \(\mathbf x_1\) 单独条件化,用高斯条件路径 \(p_t(\mathbf x\mid\mathbf x_1)=\mathcal N\big(t\mathbf x_1,(1-(1-\sigma_{\min})t)^2I\big)\),条件速度 \(\big(\mathbf x_1-(1-\sigma_{\min})\mathbf x\big)/\big(1-(1-\sigma_{\min})t\big)\);\(\sigma_{\min}\to0\) 时它就是本节的 \(\mathbf x_1-\mathbf x_0\)。
高斯混合的精确场(本页的“标准答案”)
取一般的高斯路径 \(\mathbf x_t=\alpha_t\mathbf x_1+\sigma_t\mathbf x_0\)(直线路径 \(\alpha_t=t,\ \sigma_t=1-t\);余弦路径 \(\alpha_t=\sin\tfrac{\pi t}{2},\ \sigma_t=\cos\tfrac{\pi t}{2}\)),条件速度 \(\dot\alpha_t\mathbf x_1+\dot\sigma_t\mathbf x_0\)。若数据是 \(q=\sum_k\pi_k\,\mathcal N(\boldsymbol\mu_k,s_k^2I)\),给定分量 \(k\) 时 \(\mathbf x_t\) 与速度是联合高斯的,4.4 节的条件高斯公式直接给出:
\(w_k\) 是 FIG 1 读数里的后验权重。代入直线路径和 \(t=0\):\(c_k=-1\)、\(w_k=\pi_k\),于是 \(\mathbf u_0(\mathbf x)=\mathbb E[\mathbf x_1]-\mathbf x\),这就是 FIG 3 里“一步 Euler 落到均值”的来源。本页的双月和螺旋其实也是高斯混合(28 个和 26 个标准差 0.12 的小高斯沿曲线排开),所以 FIG 2 的场误差、FIG 3 的参考轨迹和 FIG 4 的 reflow 配对都能精确算出。
与扩散模型的关系
19.6 节的 DDPM 用的也是一条高斯路径:信号系数 \(\alpha\) 与噪声系数 \(\sigma\) 满足 \(\alpha^2+\sigma^2=1\)(方差保持),只是时间方向相反(DDPM 的第 0 步是数据,见第 2 节的约定对照),网络预测的是噪声 \(\boldsymbol\varepsilon\)(就是这里的 \(\mathbf x_0\))。在高斯路径上,知道了 \(\mathbf x_t\),下面三个量中任意一个都能换算出另外两个,所以“预测速度”“预测噪声”“预测干净数据”携带的信息相同。对直线路径:
其中“帽子”都表示给定 \(\mathbf x_t\) 的条件均值,\(\hat{\mathbf v}=\mathbf u_t(\mathbf x_t)\)。第三个式子把速度和 19.6 节的得分(score)联系起来(Tweedie 公式)。19.6 节 DDIM 的确定性采样器,就是在离散地积分这类 ODE(Song 等 2021 称之为概率流 ODE)。所以 flow matching 与扩散不是两类不同的模型,而是同一个框架里的不同选择:哪条路径(\(\alpha_t,\sigma_t\))、网络输出什么(这会改变损失在不同 \(t\) 上的权重)、怎样抽 \(t\)、以及用 ODE 还是 SDE 采样。直线路径的好处是目标最简单(\(\mathbf x_1-\mathbf x_0\),处处有界,不需要调度表),并且在配对有序时轨迹真正变直。
采样误差、直线与最优传输
Euler 法每步的局部误差是 \(O(h^2)\),累积 \(1/h\) 步后,与精确的流映射 \(\hl{ode}{\varphi_1(\mathbf x_0)}\)(3.6 节)之间的全局误差是 \(O(h)\);中点法是 \(O(h^2)\)(2.5 节)。误差的常数取决于轨迹有多弯:如果每条轨迹都是匀速直线,\(\mathbf v\) 沿轨迹不变,Euler 一步就精确,\(\hl{euler}{\mathbf x_1=\mathbf x_0+\mathbf v_\theta(\mathbf x_0,0)}\)。什么样的配对能做到?Benamou 与 Brenier(2000)证明,二次代价的最优传输可以写成“动能最小的流”:
最优的流沿直线匀速搬运,粒子互不相撞。所以用最优传输配对再走直线,边缘轨迹就是直线(FIG 4 右边那些青色的配对线段 \(\hl{pair}{(\mathbf x_0,\mathbf x_1)}\) 短而几乎不交叉)。小批量 OT 只在每个批次内部求最优,是近似,批次越大越接近;reflow 用一个已有的 ODE 映射作配对,Liu 等证明这样做不会增加任何凸代价下的传输代价,并且反复 reflow 会让轨迹越来越直。代价是要多训练一次,并且配对来自模型本身,模型的误差会被带进新的数据里。
条件生成、引导与似然
条件生成:把条件 \(\mathbf c\)(文本、图像特征、机器人观测)作为网络的额外输入,\(\mathbf v_\theta(\mathbf x,t,\mathbf c)\),训练时配对取自同一个 \(\mathbf c\) 下的数据,其余不变;第 6 节的动作头就是这样。无分类器引导(19.6 节)原样适用于速度:\(\tilde{\mathbf v}=\mathbf v_\theta(\mathbf x,t,\varnothing)+w\,\big(\mathbf v_\theta(\mathbf x,t,\mathbf c)-\mathbf v_\theta(\mathbf x,t,\varnothing)\big)\)。似然:训练好的流是一个连续 normalizing flow,19.3 节的公式 \(\log p_1(\mathbf x_1)=\log p_0(\mathbf x_0)-\int_0^1\nabla\cdot\mathbf v_\theta\,dt\) 照样成立,需要时可以倒着积分求密度。时间的抽样:本页用 \(t\sim\mathcal U[0,1]\);Stable Diffusion 3(Esser 等,2024)用 logit-正态分布把训练集中在中间的 \(t\),π0 用一个偏向噪声一端的 Beta 型分布。这只改变损失在不同时刻上的权重,不改变最优解 \(\mathbf u_t\)。
6机器人中的它:π0 风格的 flow matching 动作头
π0(Black 等,Physical Intelligence,2024)是一个视觉-语言-动作模型:一个预训练的视觉-语言模型(PaliGemma)读入多路相机图像、语言指令和机器人本体状态,旁边接一个约 3 亿参数的动作专家,用 flow matching 生成一整个动作块(未来 50 步的连续动作)。推理时从高斯噪声出发积分 10 步(步长 0.1);观测部分的注意力键值只算一次并缓存,10 步里只重复运行较小的动作专家。这样它能以高达 50 Hz 的频率控制双臂等机器人完成叠衣服这类灵巧任务。与 17.5 节的离散动作 token 相比,这条路线直接输出连续动作,不需要动作 tokenizer。
下图是一个能在浏览器里训练的缩小版。一个点机器人以恒定速度从左向右开,经过一个圆形障碍物(半径 0.55),观测 \(\hl{obs}{\mathbf o=(y_s,y_o)}\) 是起点高度和障碍物高度,动作块是未来 \(H=8\) 步的横向位置(相对起点)。示教数据里,人从障碍物上方绕过的概率是 \(\sigma(-6y_o)\):障碍物越靠上,越多人从下方走。速度网络 \(\mathbf v_\theta(\mathbf a_t,t,\mathbf o)\) 是 \([13,64,64,8]\) 的 GELU MLP(8 维动作 + 2 维观测 + 3 个时间特征),共 5576 个参数;作为对照,一个 \([2,64,64,8]\) 的网络直接用均方误差回归动作块,也就是普通的行为克隆(22.1 节)。两者同时训练,Adam,每步 64 条示教。
19.6 节的 FIG 6 已经在一个固定的避障场景里,用精确的 score 对整段动作去噪,展示了每段动作都完整地选定一边、两边的频率与示教一致。这里不再重复那一点,而是看三样新东西:速度场是网络现场学出来的;它以观测为条件,障碍物一动,两种走法的比例就跟着变;积分步数可以一直减到 1,这时 flow matching 退化成均方误差回归。
- 保持障碍物在中间(\(|y_o|\le0.1\)),按“训练”,直到 10 步积分的碰撞率低于 10%(默认种子约 650 步;开始时约 91%)。紫色动作块分成上下两束,红色的均方误差线从中间直穿障碍物。
- 训练到碰撞率低于 10% 之后,把积分步数改成 1,障碍物仍在中间:碰撞率跳到 90% 以上,紫色线全都挤到红线附近。一步 Euler 从 \(t=0\) 出发,得到的是 \(\boldsymbol\varepsilon+\mathbf v_\theta(\boldsymbol\varepsilon,0,\mathbf o)\approx\mathbb E[\mathbf a\mid\mathbf o]\):一步的 flow matching 就是均方误差回归。
- 训练到碰撞率低于 10% 之后,用 10 步积分,把障碍物拖到 \(|y_o|\ge0.3\):示教里只有约 14% 或更少(或 86% 以上)从上方走,模型样本的比例与之相差不到 8 个百分点(刚过 10% 时可能还差一些,再多训练几百步即可)。动作头学到的不只是“有两种走法”,还有各自的概率。
π0 与后续模型:π0 的动作专家与视觉-语言骨干共享 Transformer 的注意力,但有自己的权重,观测 token 不看动作 token(分块的注意力掩码,17.3 节);它的后继 π0.5 保留了 flow matching 动作专家。NVIDIA 的 GR00T N1(2025)用一个以 flow matching 训练的扩散 Transformer 作为人形机器人的动作模块。 为什么是 flow matching:与 Diffusion Policy(Chi 等,2023,22.2 节)的 DDPM/DDIM 相比,它的训练目标更简单,没有噪声调度表要调,确定性的 ODE 采样用 10 步左右就够;但两者在数学上很接近(第 5 节),具体选哪个常常取决于工程习惯。 动作块:一次生成多步动作并按“滚动时域”执行(22.2 节),既摊薄了推理延迟,也让多模态动作在一个块内保持一致,不会在两个模式之间来回跳。 加速:需要更少步数时,可以用 reflow 或蒸馏,例如 Consistency Policy(Prasad 等,2024)把扩散策略蒸馏成一到几步的策略。 数据侧的约定:动作要按数据集统计量归一化到单位尺度,使高斯噪声和动作的尺度相当;部署时必须用同一套统计量反归一化(17.5 节对动作 token 也有同样的要求)。
7常见误区
本节(和 Lipman 等)约定 \(t=0\) 是噪声、\(t=1\) 是数据,目标是 \(\mathbf x_1-\mathbf x_0\);DDPM 的步数从数据(第 0 步)数到噪声,有的代码库把噪声放在 \(t=1\),目标写成 \(\boldsymbol\varepsilon-\mathbf x\)。照着一篇论文的公式、用另一份代码的约定,就会朝错误的方向积分,样本一路跑出画面,或者训练目标和采样器的时间轴对不上。最便宜的检查:训练完后看 \(t\) 接近噪声一端时的场,它应当大致指向数据的均值(FIG 2 把 \(t\) 拉到 0 时的样子),并且一步 Euler 应当把所有样本送到 \(\mathbb E[\mathbf x_1]\) 附近(FIG 3)。
CFM 损失有一个地板 \(\mathcal L^*\),它由数据和配对决定,与网络无关。FIG 2 里双月的损失从 4.38 降到 3.0 附近就停了,看上去“没怎么学”,其实场误差从 1.34 降到了 0.06;FIG 4 里 reflow 的损失比独立配对低两个数量级,却不代表它的网络更准,只是它的地板低。比较模型要看样本(SW、FID 这类分布距离,机器人上则是任务成功率),或者像本页这样在有精确答案的玩具问题上量场误差。
直的是条件路径;独立配对时,平均出来的边缘轨迹是弯的。一步 Euler 的结果是条件均值 \(\mathbb E[\mathbf x_1]\)(无条件时)或 \(\mathbb E[\mathbf a\mid\mathbf o]\)(有条件时),也就是均方误差回归的答案,多模态全部丢掉:FIG 3 的样本云缩成一个点,FIG 5 的碰撞率超过 90%。想用一两步,就要先把轨迹拉直(OT 配对、reflow)或做蒸馏,并在任务指标上验证。
小批量 OT 把每个噪声配给离它最近的数据点。如果批次里混着不同的观测 \(\mathbf o\),OT 会把为观测 A 准备的噪声配给观测 B 的动作,网络学到的就不再是 \(p(\mathbf a\mid\mathbf o)\)。条件生成时,要么只在同一个条件内部做 OT,要么就用独立配对;reflow 则要用同一个条件下的 ODE 生成配对。另外,OT 配对是在整个批次上求的,批次很小时它只是一个粗糙的近似。
噪声是标准高斯,所以数据(动作)也要归一化到差不多的尺度:如果关节角以弧度计、夹爪以毫米计,同一份噪声对它们的意义完全不同,路径的形状也被扭曲。另一个陷阱是用 \(\mathbf u_t(\mathbf x\mid\mathbf x_1)=(\mathbf x_1-\mathbf x)/(1-t)\) 这个形式算目标:\(t\) 接近 1 时分母趋于零,数值噪声被放大。直接用 \(\mathbf x_1-\mathbf x_0\)(本页的做法)就没有这个问题;如果网络改为预测 \(\hat{\mathbf x}_1\) 再换算成速度,同样会在 \(t\to1\) 除以 \(1-t\),要截断 \(t\) 的范围或对损失加权。
8小练习
9延伸阅读
- Y. Lipman, R. T. Q. Chen, H. Ben-Hamu, M. Nickel & M. Le, Flow Matching for Generative Modeling, ICLR 2023 — 条件 flow matching 与它和 FM 梯度相同的定理,高斯条件路径,“最优传输”直线路径
- X. Liu, C. Gong & Q. Liu, Flow Straight and Fast: Learning to Generate and Transfer Data with Rectified Flow, ICLR 2023 — rectified flow 与 reflow
- M. S. Albergo & E. Vanden-Eijnden, Building Normalizing Flows with Stochastic Interpolants, ICLR 2023 — 同一想法的随机插值视角
- A. Tong et al., Improving and Generalizing Flow-Based Generative Models with Minibatch Optimal Transport, Transactions on Machine Learning Research, 2024; A.-A. Pooladian et al., Multisample Flow Matching: Straightening Flows with Minibatch Couplings, ICML 2023 — 小批量 OT 配对
- Y. Lipman et al., Flow Matching Guide and Code, arXiv, 2024 — 系统的教程与参考实现
- Y. Song, J. Sohl-Dickstein, D. P. Kingma, A. Kumar, S. Ermon & B. Poole, Score-Based Generative Modeling through Stochastic Differential Equations, ICLR 2021 — 概率流 ODE,扩散与 flow 的桥梁
- J.-D. Benamou & Y. Brenier, A Computational Fluid Mechanics Solution to the Monge–Kantorovich Mass Transfer Problem, Numerische Mathematik, 2000 — 最优传输的动态(流体)形式
- P. Esser et al., Scaling Rectified Flow Transformers for High-Resolution Image Synthesis, ICML 2024 — Stable Diffusion 3:大规模直线路径模型与时间抽样分布
- K. Black et al., π0: A Vision-Language-Action Flow Model for General Robot Control, arXiv, 2024 — 第 6 节的 flow matching 动作专家
- C. Chi, S. Feng, Y. Du, Z. Xu, E. Cousineau, B. Burchfiel & S. Song, Diffusion Policy: Visuomotor Policy Learning via Action Diffusion, RSS 2023 — 扩散版的动作生成,22.2 节详解
- NVIDIA, GR00T N1: An Open Foundation Model for Generalist Humanoid Robots, arXiv, 2025 — 以 flow matching 训练的扩散 Transformer 动作模块