Blog · 2026-08-20

从 Diffusion SDE 到 π₀.₅ Flow Matching Action Head

Flow Matching action head 学到的到底是什么?它和 Diffusion SDE、π₀.₅ 以及机器人数据采集有什么关系?

原始问题

这条讨论最开始不是从 Flow Matching 开始的,而是从一个更基础的问题开始:

Diffusion 为什么可以稳定地不断加噪?为什么随机项是 Δtz\sqrt{\Delta t}z,而不是 Δtz\Delta t z

沿着这个问题继续追下去,知识链会自然变成:

√dt 噪声尺度

Brownian motion / dW_t

SDE

X_t = a_t X_0 + b_t ε

Diffusion 的 Gaussian cloud

直接学习 velocity field

Flow Matching

π₀.₅ action expert

机器人数据采集中的 p(A | o, l)

真正的主线是:从“Diffusion 怎么加噪”走到“机器人 action generator 到底在学习什么”。

随机噪声为什么是 Δt\sqrt{\Delta t}

Forward diffusion 可以写成一个连续随机过程:

dXt=f(Xt,t)dt+g(t)dWtdX_t=f(X_t,t)dt+g(t)dW_t

离散化后是:

Xt+ΔtXt+f(Xt,t)Δt+g(t)Δtz,zN(0,I)X_{t+\Delta t}\approx X_t+f(X_t,t)\Delta t+g(t)\sqrt{\Delta t}z, \qquad z\sim\mathcal N(0,I)

这里最容易误解的是随机项的尺度。确定性运动按位移相加:

ΔX=vΔt\Delta X=v\Delta t

NN 步,总位移是 NvΔt=vTNv\Delta t=vT。所以 drift 项自然是 O(Δt)O(\Delta t)

随机运动不是这样。假设每一步:

ΔXk=gΔtzk,zki.i.d.N(0,1)\Delta X_k=g\sqrt{\Delta t}z_k, \qquad z_k\overset{i.i.d.}{\sim}\mathcal N(0,1)

因为每一步噪声独立,方差可以相加:

Var(kΔXk)=kVar(ΔXk)=Ng2Δt=g2T\operatorname{Var}\left(\sum_k\Delta X_k\right) =\sum_k\operatorname{Var}(\Delta X_k) =Ng^2\Delta t =g^2T

即使 Δt0\Delta t\rightarrow0NN\rightarrow\infty,总随机性仍然保持有限。

关键洞察

确定性变化积累的是 displacement;随机变化积累的是 variance。因此 drift 是 O(dt)O(dt),noise 是 O(dt)O(\sqrt{dt})

确定性位移和随机方差的积累尺度对比为什么 noise 是 √Δt,而 drift 是 Δt左边积累位移,右边积累方差;两个连续极限的稳定尺度不同确定性项每步位移 vΔtN 步后:NvΔt = vT单步尺度:O(Δt)随机项Var 总量:N · g²Δt = g²T单步标准差:O(√Δt)要让随机过程在连续极限中既不消失也不爆炸,单步方差必须是 O(Δt)

Δtz\sqrt{\Delta t}z 为什么变成 dWtdW_t

Brownian motion (Wiener process) 的增量定义为:

ΔWt=Wt+ΔtWt\Delta W_t = W_{t+\Delta t}-W_t

它满足:

ΔWtN(0,Δt)\Delta W_t\sim\mathcal N(0,\Delta t)

而如果 zN(0,1)z\sim\mathcal N(0,1),那么:

ΔtzN(0,Δt)\sqrt{\Delta t}z\sim\mathcal N(0,\Delta t)

所以离散噪声增量可以写成:

ΔWt=Δtz\Delta W_t=\sqrt{\Delta t}z

连续极限里记作 dWtdW_t。注意,dWtdW_t 不是 W(t)dtW'(t)dt。Brownian motion 的轨迹几乎处处不可微,dWtdW_t 应该理解成极短时间内的随机增量,它的尺度是 O(dt)O(\sqrt{dt})

从 SDE 到一次性构造 XtX_t

考虑线性 SDE:

dXt=c(t)Xtdt+g(t)dWtdX_t=c(t)X_tdt+g(t)dW_t

它的解可以写成:

Xt=atX0+btϵ,ϵN(0,I)X_t=a_tX_0+b_t\epsilon, \qquad \epsilon\sim\mathcal N(0,I)

这里 ata_t 控制原始数据保留多少,btb_t 控制噪声注入多少。直觉上,XtX_t 原本经历了很多步随机扰动:

X_0 → X_Δt → X_2Δt → ... → X_t

但最终随机项只是很多独立高斯噪声的线性组合。独立 Gaussian 的线性组合仍然是 Gaussian, 因此可以压缩成一个 btϵb_t\epsilon

这直接解释了 Diffusion 训练中的一个关键技巧:

取真实样本 x0

随机采样 t

随机采样 ε

直接构造 xt = at x0 + bt ε

不用真的把 forward diffusion 跑到第 tt 步。

固定一个数据点 X0=xdataX_0=x_{\text{data}} 时:

Xt=atxdata+btϵX_t=a_tx_{\text{data}}+b_t\epsilon

所以:

pt(xtxdata)=N(atxdata,bt2I)p_t(x_t\mid x_{\text{data}}) =\mathcal N(a_tx_{\text{data}},b_t^2I)

也就是说,一个真实数据点在时间 tt 上会变成围绕 atxdataa_tx_{\text{data}} 的 Gaussian cloud。 整个数据分布则是很多 Gaussian cloud 的叠加。随着 ata_t 下降、btb_t 上升, 数据结构逐渐消失,最终靠近 N(0,I)\mathcal N(0,I)

Flow Matching:直接学习概率怎么流动

Diffusion 的反向生成最终也需要知道当前 XtX_t 应该往哪里移动。于是自然会问:

既然最后需要的是一个速度场,为什么不直接学习 velocity field?

Flow Matching 就是这个入口。它把流程改成:

人为设计一条 probability path

这条 path 的 conditional velocity 可以直接算

用 MSE 监督 velocity network

推理时用 ODE 积分生成

最简单的线性路径可以写成:

xτ=(1τ)x0+τϵx_\tau=(1-\tau)x_0+\tau\epsilon

其中 x0x_0 是数据,ϵ\epsilon 是噪声。对 τ\tau 求导:

uτ=dxτdτ=ϵx0u_\tau=\frac{dx_\tau}{d\tau}=\epsilon-x_0

训练目标就是:

L=E[vθ(xτ,τ)uτ2]\mathcal L = \mathbb E\left[ \|v_\theta(x_\tau,\tau)-u_\tau\|^2 \right]

关键点是:模型最终不是记住每一条 noise-data 直线。对于 MSE 回归,最优解满足:

v(x,τ)=E[uτxτ=x,τ]v^*(x,\tau)=\mathbb E[u_\tau\mid x_\tau=x,\tau]

也就是说,大量 conditional paths 在局部提供监督,网络学到的是整个分布在该位置的 marginal velocity field。

关键洞察

Flow Matching 的训练路径是工具;真正要学的是让整个概率分布连续变形的速度场。

Flow Matching 从条件路径监督出边缘速度场Conditional paths 是训练样本,marginal velocity field 才是模型目标每条线只给出局部速度监督;同一位置的 MSE 最优解是条件速度期望很多条 conditional pathdatanoise局部条件平均后的速度场v*(x,τ) = E[uτ | xτ = x, τ]

落到 π₀.₅:生成对象是 action chunk

在机器人里,生成对象不再是 image,而是一整个 future action chunk:

At=[at,at+1,,at+H1]A_t=[a_t,a_{t+1},\dots,a_{t+H-1}]

所以 π₀.₅ Action Expert 学到的是:

从 random action chunk 流向合理 action chunk 的 probability-flow velocity\boxed{\text{从 random action chunk 流向合理 action chunk 的 probability-flow velocity}}

它不是物理世界里的 joint velocity,也不是单步控制量的速度。它是生成空间里的速度:当前 noisy action chunk 应该如何移动,才能变成符合 observation 和 subtask 的 action chunk。

在这次讨论的 π₀.₅ 语境里,训练时构造:

Aτ=τϵ+(1τ)AA^\tau=\tau\epsilon+(1-\tau)A

其中 τ=0\tau=0 对应真实动作 AAτ=1\tau=1 对应噪声 ϵ\epsilon。于是:

dAτdτ=ϵA\frac{dA^\tau}{d\tau}=\epsilon-A

所以 velocity label 是:

uτ=ϵAu_\tau=\epsilon-A

训练 action expert:

vθ(Aτ,o,^,τ)ϵAv_\theta(A^\tau,o,\hat\ell,\tau)\approx \epsilon-A

其中 oo 是 camera / proprioception,^\hat\ell 是 high-level subtask,τ\tau 是 flow generation progress。

推理时方向反过来:从 A1N(0,I)A^1\sim\mathcal N(0,I) 出发,沿 τ:10\tau:1\rightarrow0 积分,最后得到要执行的 A0A^0

π₀.₅ action expert 的 Flow Matching 训练和推理方向π₀.₅ action expert:训练方向和生成方向相反velocity 是 action chunk 生成空间里的速度,不是机器人关节物理速度训练:从真实 action chunk 到 noise 的人工路径A · 真实 chunkAτ = τε + (1 - τ)A,label: ε - Aε · random推理:从 random action chunk 反向积分到可执行动作A⁰ · outputODE integration: τ 从 1 走到 0A¹ · randomcondition: observation o + subtask l + flow timestep τ

数据采集真正定义的是 p(Ao,)p(A\mid o,\ell)

到这里,工程问题自然出现:

如果模型学的是 v(x,o,,τ)=E[uτxτ=x,o,,τ]v^*(x,o,\ell,\tau)=\mathbb E[u_\tau\mid x_\tau=x,o,\ell,\tau],那么训练数据中的 action distribution 会怎样影响这个速度场?

机器人 demonstration 可以看成:

Apdata(Ao,)A\sim p_{\mathrm{data}}(A\mid o,\ell)

所以数据采集并不只是“收了多少小时”,而是在设计经验条件动作分布:

data collectiondesigning pdata(Ao,)\boxed{\text{data collection}\approx\text{designing }p_{\mathrm{data}}(A\mid o,\ell)}

这里有一个重要区分:

  • state coverage:不同物体位置、机器人姿态、遮挡、任务阶段、failure / recovery state
  • conditional action entropy:同一个状态下,操作员用不同风格、犹豫、停顿、抖动、绕路

前者通常有价值;后者不一定。

Flow Matching 可以表达 multimodality,但这不等于所有行为冲突都是好数据。如果同一状态下“左抓”和“右抓”都安全、有效、值得部署,那么这是结构化多模态,应该保留。相反,如果差异来自 operator 手抖、controller latency、无意义停顿、timestamp misalignment 或 calibration drift,它们只是在提高 H(Ao,)H(A\mid o,\ell)

因此机器人数据采集最重要的原则可以写成:

diverse situations+coherent behavior\boxed{\text{diverse situations}+\text{coherent behavior}}

或者更直接:

状态覆盖尽量宽,给定状态后的动作结构尽量清晰。\boxed{\text{状态覆盖尽量宽,给定状态后的动作结构尽量清晰。}}

这也是为什么 recovery data 很重要。部署时 policy 不会永远停留在 demonstration 的 nominal trajectory 上。更有价值的数据不是重复完美轨迹,而是:

扰动

异常状态

正确 recovery

成功

它增加的是有意义的 state coverage,而不是无意义的 action variance。

timestamp 和 partial observability 会伪造多模态

Flow Matching 的训练监督本质是:

(ot,At:t+H)(o_t,A_{t:t+H})

如果 RGB 实际来自 t150mst-150\text{ms},proprioception 来自 t20mst-20\text{ms}, action 却从 t+50mst+50\text{ms} 开始,那么模型看到的 oo 并不真正对应这个 AA

从概率角度看,这会人为变宽:

p(Ao,)p(A\mid o,\ell)

也就是说:

timestamp misalignment 会伪造 conditional multimodality\boxed{\text{timestamp misalignment 会伪造 conditional multimodality}}

Partial observability 也类似。如果两段轨迹当前 RGB 看起来一样,但真实 task phase 不同, 正确动作就可能不同。此时问题不一定是 demonstration 不一致,也可能是 condition 不足以确定 hidden state。

因此要继续追问:

action ambiguity

到底是数据策略天然多模态?
还是 observation 不完整?

history / state / subtask 是否需要进入 conditioning?

回到原始问题

现在可以把整条链压缩成一个更短的回答:

  1. Diffusion 中噪声按 dt\sqrt{dt} 缩放,是因为独立随机扰动累积的是方差。
  2. Δtz\sqrt{\Delta t}z 在连续极限中对应 Brownian increment dWtdW_t
  3. 线性 SDE 的多步高斯扰动可以压缩成 Xt=atX0+btϵX_t=a_tX_0+b_t\epsilon
  4. Flow Matching 进一步把问题改写成直接学习 probability path 的 velocity field。
  5. π₀.₅ action expert 的 velocity 是 action chunk 生成空间里的速度,不是机器人关节速度。
  6. 机器人数据采集本质上是在塑造 pdata(Ao,)p_{\mathrm{data}}(A\mid o,\ell)

最终工程结论是:

不要首先问“我要收多少小时数据”,而要问训练集中的 p(Aobservation,task/subtask)p(A\mid observation, task/subtask) 应该长什么样。

横向上,p(o)p(o) 要尽量覆盖真实部署状态;纵向上,p(Ao,)p(A\mid o,\ell) 中的 variability 要尽量有任务意义。

下一个前置概念

这个回答暴露的下一个关键前置概念是 Continuity Equation

如果理解了 continuity equation,就能从“概率质量守恒”的角度看清楚:为什么 conditional paths 只是训练工具,而条件速度期望 v(xt,t)=E[utxt]v^*(x_t,t)=\mathbb E[u_t\mid x_t] 真的可以产生正确的 marginal distribution。