
1. 从“生成模型到底在学什么”说起1.1 一个被问烂了但很少被讲透的问题搞生成模型的人几乎都绕不开一个灵魂拷问模型到底在学什么早期做GAN的时候大家说是在学一个从噪声到数据的映射判别器负责挑刺生成器负责骗过它。后来做扩散模型说法变成了“学一个去噪过程”把真实数据一步步加噪再让网络学会一步步还原。这两种说法都对但都不够本质。真正把这件事讲清楚的是flow matching这套思路——它把生成过程统一成了“学一个速度场”然后用常微分方程把噪声输运到数据分布上。我第一次接触flow matching是在做diffusion policy相关项目的时候。当时团队在复现一个机器人操作策略用的是扩散模型做动作生成训练慢、采样步数多推理延迟压不下来。后来有人提了一句“要不要试试flow matching”我才认真去啃了这篇工作。啃完之后最大的感受是这东西不是又一个“新瓶装旧酒”的生成模型变体而是把扩散模型里那套“加噪-去噪”的隐式假设换成了一个更直接、更几何的视角。简单说flow matching要解决的核心问题是如何构造一条从简单分布比如标准高斯到复杂数据分布的连续路径并让神经网络学会这条路径上的速度场。一旦速度场学好了从噪声出发沿着速度场积分就能生成样本。这个思路的好处是训练目标极其干净——就是一个回归问题预测速度均方误差没有对抗、没有复杂的变分下界推导。1.2 为什么它和diffusion policy会被放在一起讨论diffusion policy是近两年机器人学习领域很火的一个方向核心思想是把机器人的动作序列当成一个生成问题用扩散模型去建模动作分布的多模态性。传统的行为克隆方法学的是一个确定性映射遇到人类演示里“同一个状态有多种合理动作”的情况就会平均化导致动作模糊、执行失败。扩散模型天然能建模多模态分布所以效果提升明显。但diffusion policy有个硬伤采样慢。扩散模型生成一个动作序列通常需要几十甚至上百步去噪每一步都要过一遍网络。对于机器人实时控制来说这个延迟是致命的。flow matching恰好能缓解这个问题——因为它的路径可以是直线直线路径的积分可以用很少的步数甚至一步近似完成。这就是为什么最近很多工作开始用flow matching替代diffusion policy里的扩散模型比如一些机械臂抓取、灵巧手操作的项目。所以“flow matching思路与问答”这个标题本质上是在问两件事flow matching的数学直觉和工程实现到底是什么以及它和diffusion policy这类具体应用怎么结合。下面我按自己的理解把这条线从头到尾捋一遍。2. flow matching的核心思路拆解2.1 连续归一化流的老问题与新解法要理解flow matching得先知道它从哪来。它的前身是连续归一化流Continuous Normalizing FlowCNF。CNF的想法很直接定义一个随时间变化的向量场v(x, t)让样本点沿着这个场运动从初始分布p0走到目标分布p1。数学上就是解一个常微分方程dx/dt v(x, t)如果这个向量场的散度容易计算就能用瞬时变量替换公式算出概率密度的变化从而做最大似然训练。但问题在于CNF的最大似然训练需要反复解ODE、算散度计算量巨大而且训练不稳定。所以CNF虽然理论优雅实际用起来很痛苦。flow matching的突破点在于它不要求你去算似然而是直接构造一个目标速度场让网络去回归它。这个目标速度场怎么来答案是你自己设计一条从p0到p1的概率路径然后算出这条路径上的速度场作为监督信号。这样一来训练就变成了一个简单的回归问题不需要解ODE不需要算散度训练效率和稳定性都上了一个台阶。这里的关键洞察是你不需要知道真实的速度场长什么样你只需要构造一个“条件速度场”让它的边缘分布恰好对应你想要的概率路径。这就是conditional flow matchingCFM的核心。2.2 条件流匹配把难问题拆成容易的条件问题CFM的推导是这样的。假设我们有一批真实数据x1从数据分布q(x1)里采样。我们想学一个边缘速度场u(x, t)使得从p0比如标准高斯出发沿着u积分能得到q(x1)。直接学u很难因为q(x1)未知且复杂。CFM的做法是引入一个条件变量x1构造条件概率路径p_t(x | x1)这个路径从p0出发在t1时退化到x1这个点。然后构造条件速度场u_t(x | x1)使得这个条件路径满足ODE。最后证明边缘速度场u(x, t)就是条件速度场在q(x1)下的期望。也就是说只要我们对每个样本x1构造一个简单的条件路径然后让网络去回归条件速度场训练出来的网络就等价于在学边缘速度场。这个结论极其重要因为它把“学一个复杂分布之间的输运”变成了“学一堆简单路径上的速度回归”。而简单路径可以设计成直线直线上的速度就是常数回归目标就是x1 - x0。这就是为什么flow matching的训练目标看起来那么简单。2.3 直线路径与最优传输的直觉最常用的条件路径是直线路径x_t (1-t) * x0 t * x1其中x0 ~ p0x1 ~ q。这条路径上的速度是常数dx_t/dt x1 - x0。所以条件速度场就是x1 - x0与t无关。这个设计的好处是如果所有条件路径都是直线那么边缘路径也会尽量接近直线虽然不严格是直线因为不同x1对应的直线会交叉。直线路径意味着从噪声到数据的输运距离最短积分需要的步数最少。这直接对应了最优传输Optimal Transport里的思想找一条代价最小的输运方案。flow matching用直线路径近似最优传输虽然不是严格最优但已经足够好而且计算上极其简单。我实测下来用直线路径的flow matching在采样时用4到8步欧拉积分就能生成不错的结果而扩散模型通常需要20步以上。这个差距在机器人控制这种对延迟敏感的场景里就是能不能落地的区别。3. 代价函数与梯度训练到底在优化什么3.1 均方误差背后的概率解释flow matching的训练损失函数长得非常朴素L E_{t, x0, x1} [ || v_theta(x_t, t) - (x1 - x0) ||^2 ]其中t从[0,1]均匀采样x0从p0采样x1从数据采样x_t (1-t)x0 t x1。网络v_theta预测速度目标就是x1 - x0。这就是一个标准的回归问题用均方误差。但为什么这个损失是对的前面说了CFM证明了边缘速度场是条件速度场的期望。而均方误差的最优解就是条件期望。所以最小化这个损失网络就会收敛到边缘速度场。这个推导链条是flow matching理论保证的核心也是它区别于“随便设计个回归目标”的关键。实际训练时这个损失还有一个等价形式预测x1而不是预测速度。因为x_t (1-t)x0 t x1所以x1 x_t (1-t)(x1 - x0)。如果网络预测x1损失就变成|| x1_hat - x1 ||^2。这两种参数化在数学上等价但实际训练时表现不同。我试过两种预测速度在早期训练更稳定预测x1在后期收敛更快具体选哪个要看任务。3.2 梯度累积在flow matching训练中的实际作用flow matching的batch size对训练效果影响很大。因为损失是期望形式batch越大对期望的估计越准梯度方差越小。但显存有限不可能无限加大batch。这时候梯度累积就派上用场了。梯度累积的做法是把一个大batch拆成几个小batch分别前向传播算梯度但不立即更新参数而是把梯度累加起来等累积到一定步数再一起更新。这样等效于用了大batch但显存占用只有小batch的水平。在flow matching里梯度累积还有一个额外的好处因为t是随机采样的不同小batch采到的t不同累积后的梯度相当于对t的期望估计更充分。我一般设置累积步数为4到8配合学习率线性缩放。注意梯度累积时学习率不能简单按累积步数放大因为梯度是累加不是平均。如果框架默认对累积梯度取平均那学习率可以适当放大如果是直接累加学习率要保持不变或者只轻微放大。这个细节踩过坑一开始没注意训练loss直接炸了。3.3 学习率与梯度裁剪的配合flow matching的损失曲面比扩散模型平滑因为目标速度场是常数回归任务本身比较温和。但这不意味着可以随便设学习率。我一般用1e-4到3e-4的初始学习率配合余弦退火或者线性warmup。warmup很重要因为训练初期网络输出和真实速度差距大梯度范数可能很大直接上大学习率容易不稳定。梯度裁剪也是标配通常裁剪范数设1.0。但要注意flow matching的梯度范数分布和扩散模型不同。扩散模型因为要预测噪声梯度范数在t接近0和1时变化剧烈flow matching的梯度范数相对均匀因为速度目标x1 - x0的尺度只取决于数据本身。所以裁剪阈值可以设得比扩散模型稍小1.0通常够用。还有一个经验如果发现训练loss下降但采样质量差大概率是t的采样策略有问题。均匀采样t在直线路径下是合理的但如果数据分布尺度差异大可以考虑对t做重要性采样让网络在速度变化快的区间多学一点。这个技巧在图像生成里用得少但在机器人动作生成里很有用因为动作序列的某些维度变化快某些维度几乎不变。4. 从flow matching到diffusion policy的落地细节4.1 动作序列生成为什么适合flow matching机器人动作生成和图像生成有个本质区别动作序列的维度低、时序相关性强、多模态性明显。比如抓取任务同一个物体可以从左边抓也可以从右边抓这两种动作都是合理的但平均起来就是撞上去。扩散模型能建模这种多模态flow matching也能而且更快。具体来说diffusion policy通常把动作序列展平成一个向量用U-Net或者Transformer去噪。flow matching替换掉去噪过程直接学速度场。因为动作维度低通常几十维直线路径的假设更合理采样步数可以压到4步甚至2步。我做过对比同样的网络结构flow matching版本推理速度快3到5倍成功率还略高一点因为直线路径减少了累积误差。但要注意动作序列的边界条件很重要。比如机械臂的关节角有物理限制生成的动作不能超出范围。扩散模型可以通过在采样时做投影或者加惩罚项来处理flow matching同样可以但要在速度场回归时就把边界信息编码进去。我的做法是在网络输入里加入当前关节角让速度场预测的是相对于当前状态的增量这样边界约束更容易满足。4.2 网络结构选型U-Net还是Transformerflow matching对网络结构没有硬性要求只要输入x_t和t输出同维度的速度即可。图像生成里常用U-Net因为空间归纳偏置强。动作生成里我更倾向Transformer因为动作序列的时序依赖需要注意力机制来捕捉。具体配置上我会用4到6层Transformer encoder每层8个注意力头隐藏维度256到512。时间t用正弦位置编码注入和扩散模型一样。x_t作为token序列输入输出同样长度的速度序列。如果动作维度很高可以先过一个线性层降维再进Transformer最后升维回来。有个细节flow matching的速度场对t的依赖比扩散模型的噪声预测更平滑。扩散模型在t接近0和1时行为差异大需要网络有足够容量去区分flow matching的速度场在整个t区间变化平缓所以网络可以小一点。我试过把Transformer层数从6降到4效果几乎没掉推理还更快。4.3 训练数据与采样策略diffusion policy的训练数据通常是人类演示或者脚本生成的成功轨迹。flow matching对数据质量的要求和扩散模型类似但有一个额外好处因为训练目标是回归速度对噪声标签的鲁棒性稍好。如果演示数据里有少量抖动扩散模型可能会把这些抖动当成多模态性去学flow matching因为速度是平均意义下的反而会平滑掉一些。采样策略上flow matching训练时x0从标准高斯采样x1从数据采样t均匀采样。但实际部署时初始噪声的尺度要和训练时一致。如果训练时x0是标准高斯部署时也用标准高斯如果训练时用了缩放部署时也要缩放。这个细节容易忽略导致部署时生成的动作幅度不对。还有一个工程技巧在训练后期可以逐渐把t的采样范围缩小到[0.1, 0.9]让网络专注于中间段的速度学习。因为t接近0和1时x_t分别接近纯噪声和纯数据速度场的信息量少。这个技巧能加速收敛但不要一开始就用否则网络学不到完整的路径。5. 常见问题与排查技巧实录5.1 训练loss不下降或者下降后反弹这是最常见的问题。先检查数据归一化。flow matching的速度目标x1 - x0的尺度直接取决于数据尺度。如果数据没归一化速度目标可能很大网络输出层需要很大的权重训练初期梯度爆炸。我一般把数据归一化到[-1, 1]或者零均值单位方差然后速度目标的尺度就控制在合理范围。如果归一化没问题检查t的采样。有些实现里t是从Beta分布采样的偏向中间这在某些任务上有效但如果不加调整直接用可能导致网络在t接近0和1时学不好。建议先用均匀采样确认能收敛后再尝试其他分布。还有一个隐蔽问题x0和x1的配对。flow matching训练时每个x1随机配一个x0这是对的。但如果你不小心把x0和x1固定配对比如按索引网络会学到错误的路径。这个bug很难发现因为loss看起来在降但采样质量差。检查方法是打乱x0的顺序看loss是否变化。5.2 采样步数少时质量崩坏flow matching理论上可以用很少的步数采样但实际中如果步数太少比如1步质量会明显下降。原因是直线路径只是条件路径边缘路径不是严格直线所以欧拉积分有离散误差。解决办法有两个一是用高阶积分器比如中点法或者RK4同样步数下精度更高二是训练时加入一些噪声或者用随机插值让边缘路径更接近直线。我常用中点法4步就能达到欧拉8步的效果。如果必须用1步可以考虑一致性flow matching或者整流流的变体这些方法通过额外训练让网络直接预测终点但那就偏离标准flow matching了。5.3 多模态动作生成时模式坍塌flow matching理论上能建模多模态因为条件路径覆盖了所有x1。但实际训练中如果网络容量不够或者训练不充分可能会忽略某些模式。表现是生成的动作总是偏向某一种抓取方式。排查方法是可视化速度场。在二维或者三维投影下看速度场是否覆盖了所有数据区域。如果某些区域速度场几乎为零说明网络没学到那里的输运。解决办法是增加网络容量或者对数据做重加权让稀有模式在训练中更频繁出现。还有一个技巧在损失里加入一个排斥项惩罚不同x1对应的路径过度交叉。这个技巧来自最优传输的正则化能提升多模态性但会增加计算量。5.4 梯度异常与数值不稳定flow matching的梯度通常比扩散模型稳定但仍有几个坑。一是x_t的计算如果t接近0或1x_t可能非常接近x0或x1导致速度目标x1 - x0的数值范围变化大。建议在计算x_t时加一个小的epsilon避免极端值。二是网络输出层的初始化。速度目标的尺度是数据尺度的两倍左右如果输出层用默认初始化初始输出接近零梯度会很大。我一般把输出层权重初始化得小一点偏置设为零让初始输出接近零但梯度可控。三是混合精度训练。flow matching对数值精度比扩散模型敏感因为速度回归的误差会累积到采样。如果发现混合精度下loss震荡先关掉混合精度确认是否是精度问题。如果确实是可以用bf16代替fp16bf16的动态范围更大不容易溢出。6. 几个容易被忽略的实操心得6.1 时间步的嵌入方式影响收敛速度flow matching和扩散模型一样需要把t嵌入到网络里。常见做法是正弦位置编码加MLP。但我发现对于动作生成任务直接用t的傅里叶特征多个频率的正弦余弦比可学习的位置编码收敛更快。因为速度场对t的依赖是平滑的固定频率的特征更容易捕捉这种平滑性。具体实现上我用8到16个频率频率范围从1到1000对数均匀分布。然后把特征拼接起来过一个两层的MLP输出维度和隐藏层一致。这个改动让训练收敛快了大概20%而且最终loss更低。6.2 数据增强要谨慎图像生成里常用随机裁剪、翻转等增强动作生成里也有类似操作比如加噪声、时间缩放。但flow matching对数据增强的敏感度比扩散模型高因为增强会改变数据分布而速度场是直接依赖数据分布的。我试过在动作数据上加高斯噪声增强结果生成的动作变得模糊。原因是噪声改变了x1速度目标x1 - x0也跟着变网络学到的速度场对应的是加噪后的分布采样时自然生成模糊动作。所以数据增强要么不用要么在训练后期逐渐减小增强强度。6.3 评估指标的选择flow matching生成的动作怎么评估不能只看MSE因为多模态分布下MSE会惩罚所有模式的平均而平均动作可能是错的。我一般用任务成功率作为主要指标辅以动作平滑度和执行时间。如果做离线评估可以用最大均值差异或者覆盖度指标看生成分布是否覆盖了真实分布的所有模式。还有一个实用技巧把生成的动作放回仿真环境执行看轨迹是否合理。有些动作在数值上接近真实但执行时会撞到障碍物这种只能通过闭环评估发现。6.4 和扩散模型的混合使用flow matching和扩散模型不是非此即彼。我做过一个混合方案用flow matching做粗生成快速得到一个初始动作序列然后用少量步数的扩散模型做精修。这样兼顾了速度和精度。具体是flow matching生成4步扩散模型再跑4步去噪总步数8步效果接近纯扩散模型20步速度还快一倍多。这个方案的实现要点是扩散模型的输入不是纯噪声而是flow matching的输出加少量噪声。噪声尺度要调太大就退化成纯扩散太小则精修效果不明显。我一般加0.1到0.2倍标准差的噪声。7. 关于flow matching和diffusion policy的一些问答7.1 flow matching能完全替代diffusion policy吗不能完全替代但能在很多场景下替代。flow matching的优势是快劣势是理论上的表达能力和扩散模型有差异。扩散模型通过多步去噪可以建模非常复杂的分布flow matching的直线路径假设在极端复杂分布下可能不够。所以如果任务对延迟不敏感、对生成质量要求极高扩散模型仍然有优势。如果任务对延迟敏感、动作维度低flow matching是更好的选择。7.2 训练flow matching需要多少数据和扩散模型差不多通常几千到几万条轨迹。因为flow matching的损失是回归对数据量的需求比GAN小但比确定性行为克隆大。如果数据少可以用预训练加微调或者用数据增强但要谨慎前面说了。7.3 梯度累积和梯度下降在flow matching里有什么特殊之处梯度下降是通用优化方法flow matching没有特殊之处。梯度累积的特殊之处在于因为t是随机采样的累积不同小batch的梯度相当于对t做了更充分的期望估计。所以梯度累积在flow matching里不仅是省显存的手段还能提升训练稳定性。我建议如果显存允许至少用4步累积。7.4 怎么调试flow matching的采样质量先看训练loss如果loss正常但采样差检查采样步数和积分器。然后可视化速度场看是否覆盖数据区域。最后检查初始噪声的尺度是否和训练一致。这三个步骤能解决大部分问题。7.5 flow matching和最优传输的关系flow matching用直线路径近似最优传输但不是严格最优。严格最优传输需要解一个复杂的优化问题计算量大。flow matching用条件路径的期望来近似牺牲了一点最优性换来了训练和采样的高效。实际中这个近似足够好因为直线路径已经比扩散模型的弯曲路径短很多。8. 最后再分享几个踩坑记录第一个坑是t的采样范围。我一开始用[0, 1]均匀采样训练正常但采样时从t0开始积分第一步速度预测误差大导致生成质量不稳定。后来改成训练时t从[0.001, 0.999]采样采样时也从0.001开始问题解决。原因是t0时x_t就是纯噪声速度场的信息量最少网络在这个点的预测最不准。第二个坑是网络输出的缩放。flow matching的速度目标x1 - x0的尺度取决于数据。如果数据归一化到[-1, 1]速度目标的每个维度范围大约是[-2, 2]。网络输出层如果不加缩放初始输出接近零梯度会推着输出往目标走但步长可能过大。我后来在输出层加了一个可学习的缩放因子初始化为1训练中自适应调整收敛更稳。第三个坑是采样时的数值积分。欧拉法简单但精度低我试过用RK4精度高但每步要算四次网络速度慢。后来用中点法每步算两次网络精度接近RK4速度只慢一倍。对于4步采样中点法总共算8次网络比欧拉4步算4次网络慢但比RK4的16次快。实际部署时根据延迟预算选。第四个坑是batch size和梯度累积的配合。我一开始用batch size 64梯度累积4步等效batch 256。但发现训练不稳定loss震荡。后来改成batch size 32累积8步等效batch 256反而稳定了。原因是小batch的梯度噪声大累积后相当于做了更多次随机采样对期望的估计更准。所以梯度累积的步数比batch size更重要。这些坑踩下来最大的体会是flow matching的理论很干净但工程细节一点不比扩散模型少。每一个超参数、每一个实现选择都会影响最终效果。好在它的训练目标简单调试起来有明确的抓手——看速度场、看采样轨迹、看loss曲线基本能定位问题。如果你正在做diffusion policy相关的工作我强烈建议花两天时间把flow matching跑通对比一下大概率会有惊喜。