ReinFlow:用 PPO 微调 Flow Matching 策略
论文出处:reinflow
由chatgpt整理。
ReinFlow 是一种用在线强化学习微调 Flow Matching 控制策略的方法,主要面向机器人连续控制。
它通常不从零开始训练,而是先用模仿学习得到一个 Flow Matching Policy,再通过环境奖励继续优化,使策略可以突破示范数据的性能上限。该方法发表于 NeurIPS 2025。
1. 背景
Flow Matching Policy 通常从一个高斯噪声动作开始,通过速度网络逐步将其变成实际动作:
ak+1=ak+vθ(tk,ak,o)Δt
其中:
- o 是机器人观测;
- ak 是第 k 个生成步骤的中间动作;
- vθ 是 Flow Matching 学到的速度场;
- 最终的 aK 是机器人执行的动作或动作序列。
这个过程本质上是确定性的 ODE 离散积分。给定初始噪声后,中间轨迹就确定了。
2. 为什么直接用 PPO
PPO 等策略梯度算法需要计算动作的概率:
logπθ(a∣o)
以及新旧策略之间的概率比:
r=πθold(a∣o)πθ(a∣o)
这里就是一个比较有意思的点,其实理论上是可以直接计算动作的概率的,论文4.1“Likelihood Computation over a Short Denoising Trajectory“中
lnp1(ψ1(x))=lnp0(ψ0(x))−∫01∇⋅v(t,ψt(x))dt,x∼p0(⋅)
因为ODE 解的唯一性, 在固定时间 t 下不会把两个不同初始点映射到同一个点。起点处概率可知,可以通过起点到终点的局部体积压缩/膨胀比来得到终点处动作的概率。这个过程可以用Monte-Carlo近似为
lnp1(x1)=lnp0(x0)−k=0∑K−1tr[Z⊤∂xvθ(ti,Xti)Z]Δti
但这个过程计算复杂度高,且只使用一个或少量生成步骤时离散误差会更加明显,同时确定性生成过程本身也没有直接的在线探索机制。
3. ReinFlow 的核心方法
ReinFlow 在每个 Flow 生成步骤中加入一个可学习的高斯噪声:
ak+1∼N(ak+vθ(tk,ak,o)Δt,σϕ2(tk,ak,o))
这里增加了一个噪声网络:
σϕ(tk,ak,o)
它根据观测、中间动作和当前 Flow 时间,输出每个动作维度的噪声标准差。
加入噪声之后,原来的确定性 Flow 轨迹变成了一条离散马尔可夫链:
a0→a1→⋯→aK
由于每一步都是已知均值和方差的高斯分布,因此可以直接计算整条生成路径的联合概率:
logπˉ(a0:K∣o)=logp(a0)+k=0∑K−1logp(ak+1∣ak,o)
这里精确计算的是离散生成路径的联合概率,而不是直接计算最终动作 aK 的边缘概率。ReinFlow 通过对应的策略梯度定理,使用路径联合概率来更新策略,从而不需要显式求最终动作的边缘密度。
提问:为什么不再考虑空间膨胀和收缩?
“does not directly describe the marginal probability of the final action”只计算已经采样到的整条路径的联合概率而不是直接计算最终动作的概率,但是可以使用这个来优化策略。
4. 训练流程
ReinFlow 的训练大致分为以下过程。
预训练 Flow Policy
使用示范数据进行行为克隆或 Flow Matching 训练,得到速度网络:
vθ(t,a,o)
添加噪声网络和价值网络
增加:
- 噪声网络 σϕ,控制动作生成过程中的随机性;
- Critic 网络 Vψ(o),估计状态价值。
与环境交互
对于每个观测 o:
- 采样初始动作噪声 a0;
- 执行 K 个带噪声的 Flow 更新;
- 得到最终动作 aK;
- 在环境中执行动作并收集奖励;
- 保存整条内部生成轨迹 a0:K。
计算优势函数
使用 Critic 和 GAE 等方法计算优势:
A^t
优势为正表示该动作结果高于当前价值估计,优势为负表示低于当前估计。
使用 PPO 更新
ReinFlow 使用整条 Flow 路径的联合概率计算新旧策略概率比:
rt=πˉθold,ϕold(at0:K∣ot)πˉθ,ϕ(at0:K∣ot)
然后使用 PPO clipped objective,同时更新:
- Flow 速度网络 θ;
- 噪声网络 ϕ;
- Critic 网络 ψ。
论文也给出了使用 SAC 等其他策略优化方法的可能形式,但实验主要采用 PPO。
5. 噪声网络的作用
噪声网络主要有两个作用。
第一是让每个 Flow 转移具有明确的高斯概率密度,从而可以计算策略梯度需要的 likelihood。
第二是提供探索。不同状态、不同生成阶段可以使用不同噪声:
- 不确定或需要探索时输出较大方差;
- 策略逐渐稳定后输出较小方差。
噪声大小通常受到上下界限制,避免动作扰动超过机器人关节或控制系统允许的范围。
6. 训练和部署的区别
训练阶段:
Flow速度网络+噪声网络
动作生成过程是随机的,用于探索和计算概率。
训练完成后,论文中的做法是丢弃噪声网络,只保留经过强化学习更新的 Flow 速度网络:
ak+1=ak+vθ(tk,ak,o)Δt
因此部署时仍然可以使用确定性 Flow Policy,不需要保留额外的噪声网络。
7. 与普通 PPO 的关系
普通高斯 PPO 直接输出动作分布:
a∼N(μθ(o),σθ(o))
ReinFlow 不直接输出最终动作的高斯分布,而是让动作通过多步 Flow 转移生成:
a0→a1→⋯→aK
因此其动作分布可以比单个对角高斯更复杂,并能够表示多峰动作分布。PPO 的主体结构没有明显改变,主要变化是策略概率由整条 Flow 生成路径的概率计算。
8. 方法特点与局限
ReinFlow 可以用于 Rectified Flow、Shortcut Model,以及原则上由 ODE 定义的其他 Flow Policy。它支持少量甚至单步动作生成,并在论文中的运动控制和机械臂操作基准上用于在线微调。
当前实现仍有以下限制:
- 主要采用 on-policy PPO,需要持续与环境交互;
- 对噪声上下界和噪声强度较敏感;
- 需要预训练好的 Flow Matching Policy;
- 论文实验主要基于模拟控制任务,真实机器人在线强化学习仍需进一步验证;
- 实验网络规模相对有限,扩展到大型 Flow VLA 模型的效果尚未得到充分验证。
概括来说,ReinFlow 的主要结构是:
确定性 Flow+可学习高斯噪声→可计算路径概率→PPO 在线微调
9.补充 ODE 解的唯一性。
设流映射为
ψt(x0)=x(t),
轨迹满足
dtdx(t)=v(t,x(t)),x(0)=x0.
假设两个不同初始点 xa=xb 在时刻 t∗ 被映射到同一个点:
ψt∗(xa)=ψt∗(xb)=y.
那么从时刻 t∗ 的状态 y 向后求解 ODE:
dtdx=v(t,x),x(t∗)=y.
若 v(t,x) 对 x 满足 Lipschitz 条件,ODE 的解是唯一的。因此,从 y 反向积分只能得到唯一一条轨迹,于是必须有
xa=xb,
这与 xa=xb 矛盾。
所以固定时间的流映射
ψt:x0↦x(t)
是单射。
10.连续时间变量替换公式
设神经 ODE 为
dtdXt=vθ(t,Xt),X0=x0,X1=x1.
概率密度 pt(x) 满足连续性方程:
∂t∂pt(x)+∇x⋅(pt(x)vθ(t,x))=0.
展开散度:
∂t∂pt+vθ⊤∇xpt+pt∇x⋅vθ=0.
另一方面,沿轨迹 Xt 对 logpt(Xt) 求全导数:
dtdlogpt(Xt)=∂t∂logpt(Xt)+∇xlogpt(Xt)⊤dtdXt.
代入
dtdXt=vθ(t,Xt),
得到
dtdlogpt(Xt)=pt1(∂t∂pt+vθ⊤∇xpt).
由连续性方程,
∂t∂ρ+∇⋅(ρv)=0
∂t∂pt+vθ⊤∇xpt=−pt∇x⋅vθ.
因此
dtdlogpt(Xt)=−∇x⋅vθ(t,Xt)
这就是瞬时变量替换公式。
散度写成 Jacobian 的迹,向量场
vθ(t,x)=⎣⎢⎢⎡v1(t,x)⋮vd(t,x)⎦⎥⎥⎤
的散度为
∇x⋅vθ=j=1∑d∂xj∂vj.
而 Jacobian 为
∂xvθ=∂x∂vθ=⎣⎢⎢⎡∂x1∂v1⋮∂x1∂vd⋯⋱⋯∂xd∂v1⋮∂xd∂vd⎦⎥⎥⎤.
所以
∇x⋅vθ=tr(∂xvθ).
于是
dtdlogpt(Xt)=−tr[∂xvθ(t,Xt)].
从 t=0 积分到 t=1:
logp1(x1)=logp0(x0)−∫01tr[∂xvθ(t,Xt)]dt
其中
x1=X1=ψ1(x0).
将时间区间划分为
0=t0<t1<⋯<tK=1,Δtk=tk+1−tk.
使用左端点黎曼和:
∫01tr[∂xvθ(t,Xt)]dt≈k=0∑K−1tr[∂xvθ(tk,Xtk)]Δtk.
因此
logp1(x1)≈logp0(x0)−k=0∑K−1tr[∂xvθ(tk,Xtk)]Δtk.
用随机向量估计 Jacobian 的迹。直接构造 d×d Jacobian 的开销很大,因此使用 Hutchinson 迹估计。
令随机向量 z 满足
E[z]=0,E[zz⊤]=I,
例如
z∼N(0,I)
或每个元素独立取 ±1 的 Rademacher 分布。
对任意矩阵 A,
Ez[z⊤Az]=tr(A).
证明为
E[z⊤Az]=E[tr(z⊤Az)]=E[tr(Azz⊤)]=tr(AE[zz⊤])=tr(A).
令
A=∂xvθ(tk,Xtk),
便有
tr[∂xvθ(tk,Xtk)]≈z⊤∂xvθ(tk,Xtk)z.
若将一个或多个随机向量写成矩阵 Z,并满足
E[ZZ⊤]=I,
则
tr[∂xvθ]≈tr[Z⊤∂xvθZ].
代回时间离散公式:
lnp1(x1)=lnp0(x0)−k=0∑K−1tr[Z⊤∂xvθ(tk,Xtk)Z]Δtk
这就是图中的公式。
多个随机向量时的归一化,若
Z=[z1,…,zm]
且每个 zj 都满足
E[zjzj⊤]=I,
那么通常应写成
tr(A)≈m1tr(Z⊤AZ)=m1j=1∑mzj⊤Azj.
图中没有 1/m,通常意味着已经把 Z 定义为
Z=m1[z1,…,zm],
或者 Z 实际上只有一列。
最后,符号 p1 上的帽子表示它不是完全精确的密度,因为包含两种近似:
时间积分离散误差+随机迹估计误差.
为什么能够加速计算
表面上看:
ϵ⊤Jϵ
仍然包含 Jacobian J。真正节省计算的地方在于,它可以通过一次自动微分得到。
定义标量:
s(x)=ϵ⊤v(x).
对 x 求梯度:
∇xs(x)=∇x(ϵ⊤v(x))=J⊤ϵ.
这是一次普通反向传播能够直接计算的 vector-Jacobian product。
再和 ϵ 点乘:
ϵ⊤∇xs=ϵ⊤J⊤ϵ.
由于它是标量:
ϵ⊤J⊤ϵ=ϵ⊤Jϵ.
因此完整计算过程是:
sgtr(J)=ϵ⊤v(x),=∇xs=J⊤ϵ,=ϵ⊤g.
只需要:
- 一次速度网络前向传播;
- 一次反向传播;
- 两次向量点积。
不需要生成 D×D 的矩阵。