【机器人 / 强化学习】QAM 与 DIVL:评价-执行闭环的完美配合

0x00 概要

LWD 的核心主张是"部署时持续改进",而这一主张在算法层面能否落地,取决于两个关键能力:有没有一双火眼金睛,能从好坏参半的部署数据中看清真正的价值方向?有没有一身好功夫,能把价值方向转化为丝滑流畅的动作改进? DIVL 和 QAM 就是为这两个问题而生的。

如果用更形象的方式来理解,DIVL 是"大脑",QAM 是"肌肉"

DIVL 负责"评价"环节:它的核心任务是更新 Q_φV_ψ 参数,产出越来越准确的"裁判"。DIVL 在教机器人怎么"看账本、识潜力"——让它变成一个非常有眼光、但不冒险的投资者。这个"裁判"能够从异质数据中识别出哪些动作有潜力,哪些是死路。

QAM 负责"执行"环节:它的核心任务是更新 π_θ(即论文中的 Policy),产出越来越厉害的"运动员"。QAM 在教机器人怎么"顺着潜力、滑出优美曲线"——让它变成一个不仅聪明,而且身体动作极其协调的运动员。这个"运动员"能够根据裁判的指导,生成流畅且持续改进的动作序列。

0x01 为什么需要两个算法?

1.1 先想清楚要解决什么问题

我们已经在系统架构层面理解了 LWD:它是一个 Actor-Learner 异步架构 + SOP 类分布式底座 + HIL 人类干预反馈。但如果我们把系统层和算法层混在一起谈,很容易陷入"系统很大、什么都能做"的模糊认知。

所以我们需要把问题聚焦到算法层面:给定一个混合了成功、失败、人类干预、部分恢复轨迹的海量 replay buffer,我们如何让 VLA 策略持续变强?

要回答这个问题,必须拆解出两个子问题:

  • 子问题一:如何从异质数据中给出稳健的价值评价? 传统 RL 的方法在这类数据上往往会出问题——离线数据被 OOD 动作过估计搞崩,online 数据又因为 reward 稀疏而无法高效传播。我们需要一个能从"好坏参半"的数据中提取出可靠信号的评价系统。
  • 子问题二:如何把评价信号稳定地注入生成式策略? 即使我们有了完美的价值函数,我们的策略也不是一个简单的 MLP——它是一个基于 Flow Matching 的生成式 VLA 模型。直接通过整个生成链路做反向传播(BPTT)会导致梯度爆炸/消失,显存更是天文数字。

DIVL 和 QAM 分别解决上述两个问题,而且它们的结合不是简单的"先 A 后 B"的流水线,而是价值-策略的闭环耦合

1.2 闭环总览

DIVL 和 QAM-闭环

这个闭环的每一个环节都有其不可替代性:

  • 没有 DIVL,Q 梯度会乱跳。 价值估计不准,策略改进就没有可靠的方向。整个系统就像没有导航的运动员,不知道往哪里优化。
  • 没有 QAM,V 的分布无法转化为流畅的动作。 再好的价值判断,如果不能稳定注入到生成式策略里,就像教练有眼光却无法纠正运动员的动作。
  • 统一目标消除阶段鸿沟。 两者在离线和在线阶段使用完全相同的损失函数,只是数据来源不同。这避免了离线 Critic 过于保守、在线微调时价值尺度不匹配的致命问题。

1.3 三阶段逻辑链条

整个 LWD 算法(论文 Algorithm 2)的逻辑可以拆解为三个递进阶段:

第一阶段:预训练(BC)

你手里有一堆离线数据 ( s , a ) (s, a) (s,a)。你训练一个 Flow 模型,损失函数只有最基础的 ∥ v θ − ( x 1 − x 0 ) ∥ 2 \|v_\theta - (x_1 - x_0)\|^2 vθ(x1x0)2。训练完后得到 f β f_\beta fβ——它只会"模仿"数据,完全不懂什么是奖励(Reward)。

第二阶段:值函数学习(DIVL)

DIVL 登场了。它的任务是学习 Critic(Q 和 V)。它改进了 IQL 的方式,用分布式的视角去评估每个动作的好坏。DIVL 产出的不是单个分数,而是一个价值分布——这保证了在面对混合质量数据时,价值估计不会被低质量轨迹拖垮。

第三阶段:策略提取(QAM)

QAM 把前两者的成果合二为一。它拿来 f β f_\beta fβ(只会模仿的躯壳)和 Q φ Q_\varphi Qφ(懂好坏的大脑)。利用 Adjoint Matching,让最终的策略 f θ f_\theta fθ 在模仿 f β f_\beta fβ 的基础上,往 Q φ Q_\varphi Qφ 认为更好的方向偏转。

0x02 LWD 论文算法

2.1 算法图例

论文给出的 DIVL 和 QAM 配合的算法图例如下:

算法2

2.2 算法公式

DIVL 对应的算法公式如下:

DIVL-公式

QAM 对应的算法公式如下

算法2-公式

2.3 逐行解释

以下是对这个算法的逐行深度技术解释:


行号 技术行 深度拆解 通俗理解
准备阶段 接收 mini-batch ( s , a , r , s ′ ) (s,a,r,s') (s,a,r,s)、Critic 网络、分布式价值网络、当前策略及冻结参考策略 从录像厅里抓一把带标签的录像
DIVL 阶段
1 V-Loss 通过最小化交叉熵损失,拟合当前状态的价值概率分布 看看最严厉的裁判给的最高分是多少
2 Q-Target 利用目标 V 函数计算分布式的 TD 目标(提取特定分位数 + 自适应调节) 识破潜力:既然有人在这里拿过高分,那这路口的潜力就是满分
3 Q-Loss 使用 MSE 让 Critic 向 y Q y_Q yQ 逼近 算胜率:别只给平均分,把每一种赢法都算清楚
4 Update 动量软更新目标 Critic,维持训练平滑 修正偏见:让裁判算准这一招到底有几成胜算
QAM 阶段
5-6 Time/Noise/Trajectory 在流匹配时间轴 w w w 上采样,跑出基准轨迹 模拟滑行:在动作进行到一半时看看你会滑到哪里
7 Endpoint 确定动作轨迹终点 a t 1 = a t a_t^1 = a_t at1=at 确定最终的目标
8 Gradient/Adjoint/Loss 在终点计算 Critic 梯度 → 设为伴随状态 → 沿流路径反推 → 生成局部回归目标 感知引力→神经传导→听话又上进→对齐训练
9 Return 返回所有新参数 升级包做好了

我们接下来具体看看这两个算法,然后再看看如何配合。

0x02 DIVL:分布式价值评价系统

DIVL 解决的核心问题是:在不尝试危险动作的前提下(即纯 off-policy),从好坏参杂的数据中提炼出一张"价值地图"。

2.1 三重角色定位

在 LWD 架构中,DIVL 承担着三重角色,每一层都有其特定的职责。

第一,作为 Critic Head( Q φ Q_\varphi Qφ)。 核心任务是评估动作的 Q 值,为 QAM 的 Adjoint Matching 提供稳定的梯度信号。没有这个稳定的评估,QAM 就不知道该往哪个方向优化。

第二,与 QAM 的紧密耦合。 这种耦合是双向的:QAM 利用 DIVL 的价值分布进行导航,而 DIVL 的训练也依赖于 QAM 的 Q 网络状态。两者形成了"评价-执行"的完整闭环——DIVL 画地形图,QAM 在上面跑。

第三,作为参考策略的锚点。 DIVL 的 Value Head 在训练后会被冻结,作为 Reference Policy( π β \pi_\beta πβ),给策略网络提供稳定的行为基准。即使 QAM 学习得比较激进,这个基准也能确保策略不会完全偏离安全范围。这就像给越野车设定了一个"围栏",防止它跑出安全区。

2.2 输出结构:内部产物 vs 对外成品

内部产物(用于训练):DIVL 输出一个概率分布(101 个格子的概率)。这个分布最大的贡献是计算出带"乐观滤镜"的 Q 目标值,让 Q 网络学得极其稳健。这是 DIVL 内部训练机制的核心,用来对抗 OOD 过估计和稀疏奖励。

对外成品(最终形态):

  • 它产出一个经过充分锻炼、能够准确判断好坏的 Critic 网络 Q φ ( s , a ) Q_\varphi(s, a) Qφ(s,a)
  • 它给 QAM 提供的是两个关键要素: Q φ ( s , a ) Q_\varphi(s, a) Qφ(s,a) 函数本身,以及由它在特定动作点产生的梯度 ∇ a Q \nabla_a Q aQ

DIVL 负责画出一张完整的"地形图"(Q 值的高低起伏),而 QAM 是在这个地形图上跑的"越野车"。越野车不需要知道整个地形图的全貌,它只需要知道脚下这块地是往哪边倾斜的(梯度),就能找到最高峰。

这种分工的精妙之处在于:DIVL 专注于"看得准",保留完整的分布信息;QAM 专注于"跑得稳",只需要局部的梯度指导。两者的输出互补,避免了 QAM 过度依赖 DIVL 的内部细节,又能让 QAM 得到足够精确的导航信号。

2.3 分布式价值学习机制

为什么需要分布而不是标量?

传统价值函数追求"分数最高",DIVL 追求的是"分布最合理"。这个转变背后的逻辑很简单:在 fleet 部署数据中,同一个状态下往往有多种不同的动作结果。如果只取平均值,会丢失罕见但可复现的高回报模态。

想象一个场景:在某个状态下,数据集中不同动作的表现差异很大:

  • 动作 A:Q = 50,成功率 80%
  • 动作 B:Q = 40,成功率 60%
  • 动作 C:Q = 10,成功率 30%

传统方法只学习"选动作 A",丢失了信息。DIVL 让 V ψ ( s ) V_\psi(s) Vψ(s) 学习完整的分布——在状态 s s s 下,模型倾向于选择动作 A 或 B,但也会保留探索 C 的可能性。

V 与 Q 的分工

在架构图中,V 和 Q 共享一个 VLM 骨干网络,但各自承担不同的角色:

  • Q 网络(Critic):对状态-动作对 ( s t , a t ) (s_t, \mathbf{a}_t) (st,at) 打分,预测其折扣累计回报。核心功能是给 QAM 提供梯度 ∇ a Q \nabla_a Q aQ。它是"动作评估员"——负责评价"具体某个动作"的好坏并提供改进方向。
  • V 网络(Distributional Value Model):这是 DIVL 的本体。它不是预测一个标量值,而是建模数据集中 Q 值的分布 p ψ ( v ∣ s t ) = P ( v = Q ϕ ( s t , a t ) ∣ a t ∼ D ( ⋅ ∣ s t ) ) p_\psi(v \mid s_t) = P(v = Q_\phi(s_t, \mathbf{a}_t) \mid \mathbf{a}_t \sim \mathcal{D}(\cdot \mid s_t)) pψ(vst)=P(v=Qϕ(st,at)atD(st))。即给定状态 s t s_t st,V 学习的是"数据集中所有动作对应的 Q 值会呈现怎样的分布形态"。核心功能是提取"高光"基准(Expectile Regression),它是计算"优势值"的底数,是"全局裁判"。

自适应 τ \tau τ:训练时根据 V ( s ′ ) V(s') V(s) 分布的熵动态调整 τ \tau τ——如果 V ( s ′ ) V(s') V(s) 分布弥散(高熵),说明当前状态不确定, τ \tau τ 自动降低以保守;分布集中(低熵)则 τ \tau τ 升高以乐观。

另外,DIVL 还要接 QAM,我们也接着看。

动作优化(QAM):Actor(VLA 大模型)并不直接感知 V,而是利用 Q 在生成动作终点处的梯度 ∇ a Q ϕ ( s , a ) \nabla_\mathbf{a} Q_\phi(s, \mathbf{a}) aQϕ(s,a),通过**伴随匹配(Adjoint Matching)**将其转化为沿着参考流各时间步的局部回归目标,从而稳定地优化动作生成过程——避免了直接经整个去噪过程反向传播带来的不稳定和高昂计算代价。

训练过程

DIVL 的训练是一个统计学习过程:从数据集中收集 ( s , a ) (s, a) (s,a),通过神经网络学习这些数据之间的关系,让网络学会"在什么状态下,什么样的分布形状代表高成功率"。

深入看 DIVL 的训练过程,实际有四个角色在协同互动:V 网络(分布价值模型)、当前 Q 网络(Critic)、目标 Q 网络( Q ˉ \bar{Q} Qˉ,EMA 更新)、以及流策略 π θ \pi_\theta πθ(Actor)。

根据论文 Algorithm 2,每步训练包含两大块(此处把 QAM 也纳入进来):

块一:分布隐式价值学习(DIVL)下图红色圈

具体分为以下几步:

① 更新 V(拟合 Q 值分布):

  • 输入:来自回放的 ( s t , a t ) (s_t, \mathbf{a}_t) (st,at)
  • 用目标网络 Q ˉ \bar{Q} Qˉ 评估 Q ϕ ˉ ( s t , a t ) Q_{\bar{\phi}}(s_t, \mathbf{a}_t) Qϕˉ(st,at),得到一个标量值
  • 损失函数: L V ( ψ ) = − log ⁡ p ψ ( Q ϕ ˉ ( s t , a t ) ∣ s t ) \mathcal{L}_V(\psi) = -\log p_\psi(Q_{\bar{\phi}}(s_t, \mathbf{a}_t) \mid s_t) LV(ψ)=logpψ(Qϕˉ(st,at)st),这是一个交叉熵损失
  • V 的目标是让自己在状态 s t s_t st 处输出的分布,最大似然地匹配"目标 Critic 对这个动作给出的分数"。V 不是在蒸馏一个数值,而是在学习**“在当前数据集里,这些动作对应的 Q 值是如何分布的”**

② 计算自适应 τ \tau τ(不确定性感知):

  • 输入:下一状态 s t + H s_{t+H} st+H 处的 V V V 分布
  • 计算分布的归一化熵 H ( s t + H ) \mathcal{H}(s_{t+H}) H(st+H)
  • 自适应公式: τ ( s t + H ) = clip ( τ base − α H ( s t + H ) , τ min ⁡ , τ max ⁡ ) \tau(s_{t+H}) = \text{clip}(\tau_{\text{base}} - \alpha \mathcal{H}(s_{t+H}), \tau_{\min}, \tau_{\max}) τ(st+H)=clip(τbaseαH(st+H),τmin,τmax)
  • 结果:分布越弥散(高熵), τ \tau τ 越低——保守;分布越集中, τ \tau τ 越高——乐观

③ 计算 TD 目标 y Q y_Q yQ(看向未来):

  • 输入: V ( s t + H ) V(s_{t+H}) V(st+H) 分布和自适应 τ \tau τ、当前步奖励 r t \mathbf{r}_t rt
  • 计算: y Q = r t + γ H ⋅ Quant τ ( V ψ ( s t + H ) ) y_Q = \mathbf{r}_t + \gamma^H \cdot \text{Quant}_\tau(V_\psi(s_{t+H})) yQ=rt+γHQuantτ(Vψ(st+H))
  • V V V 分布中取出 τ \tau τ-分位数,作为未来价值的估计。因为 V 的分布是从数据集学到的,这个目标天然不会走出分布—— τ \tau τ 分位数保证了乐观程度受控
  • 离线阶段使用 n n n-步 目标来加速稀疏奖励传播: y Q = ∑ i = 0 n − 1 γ i H r t + i H + γ n H Quant τ ( V ψ ( s t + n H ) ) y_Q = \sum_{i=0}^{n-1} \gamma^{iH} \mathbf{r}_{t+iH} + \gamma^{nH} \text{Quant}_\tau(V_\psi(s_{t+nH})) yQ=i=0n1γiHrt+iH+γnHQuantτ(Vψ(st+nH)) n = 10 n=10 n=10 用于长程任务)

④ 更新 Q(收敛到 TD 目标):

  • 损失函数: L Q ( ϕ ) = ( Q ϕ ( s t , a t ) − y Q ) 2 \mathcal{L}_Q(\phi) = (Q_\phi(s_t, \mathbf{a}_t) - y_Q)^2 LQ(ϕ)=(Qϕ(st,at)yQ)2,这是一个 MSE 回归任务
  • Q Q Q 的预测不断逼近上述 TD 目标
  • 随后通过 EMA 更新目标网络: ϕ ˉ ← ρ ϕ ˉ + ( 1 − ρ ) ϕ \bar{\phi} \leftarrow \rho \bar{\phi} + (1-\rho)\phi ϕˉρϕˉ+(1ρ)ϕ

块二:基于 QAM 的策略提取

⑤ 更新 Actor(QAM 策略提取)

  • 采样高斯噪声 a t 0 \mathbf{a}_t^0 at0,通过参考流 π β \pi_\beta πβ 滚动生成完整轨迹 { a t w } w ∈ [ 0 , 1 ] \{\mathbf{a}_t^w\}_{w\in[0,1]} {atw}w[0,1]
  • 取轨迹终点 a t 1 \mathbf{a}_t^1 at1,计算 Critic 梯度 − ∇ a [ Q ϕ ( s , a t 1 ) / λ ] -\nabla_\mathbf{a}[Q_\phi(s, \mathbf{a}_t^1)/\lambda] a[Qϕ(s,at1)/λ] 作为伴随状态 g 1 g_1 g1 的终值条件
  • 沿参考流求解伴随动力学,得到各中间步的局部回归目标
  • π θ \pi_\theta πθ 的向量场去拟合这些目标: L QAM ( θ ) = E [ ∫ 0 1 ∥ 2 f δ σ w + σ w g w ∥ 2 2 d w ] \mathcal{L}_{\text{QAM}}(\theta) = \mathbb{E}\left[\int_0^1 \left\| \frac{2f_\delta}{\sigma_w} + \sigma_w g_w \right\|_2^2 dw\right] LQAM(θ)=E[01 σw2fδ+σwgw 22dw]

整个流程的精髓:DIVL 用分布式的 V 替代了标量 V,保留了数据中的多模态回报信息;QAM 用伴随匹配替代了直接反向传播,让 Critic 的梯度能稳定地优化流式生成策略。二者结合,使得 LWD 可以在异质的 fleet 数据中进行稳定的离线到在线强化学习。

DIVL训练

0x03 QAM:伴随匹配策略执行系统

如果说 DIVL 解决的是"怎么看"的问题,QAM 解决的就是"怎么改"的问题——它把 DIVL 训练好的 Critic 梯度,转化为 flow-based VLA 策略可以稳定吸收的局部回归目标。

3.1 核心突破

Adjoint Matching:控制理论与大模型的跨界碰撞

QAM 的核心突破在于引入了经典控制理论中的伴随灵敏度方法(Adjoint Sensitivity Method)

传统的生成式模型(如 Diffusion 或 Flow Matching)在生成动作时涉及多步迭代推理。如果要用强化学习去优化它,就需要通过整个迭代链条进行反向传播(BPTT),这在数学上会导致严重的梯度消失或爆炸,显存开销更是天文数字。

伴随法的精妙之处在于:QAM 不需要展开整个生成链条。它利用伴随方程,直接在常微分方程(ODE)的层面计算出——“如果我希望最后生成的动作 a a a 的 Q 值更高,现在的向量场 v v v 应该往哪个方向偏移?”——这将极其复杂的全局求导简化为了局部的数学映射。

梯度引力场

QAM 将强化学习的优化过程具象化为一种物理上的"引力"。

在 Flow Matching 架构下,机器人动作是从噪声开始演化的。QAM 并不强迫机器人跳过演化过程,而是向这个演化过程注入了来自 DIVL 的 Q 函数梯度( ∇ a Q \nabla_a Q aQ)。这个梯度就像一股无形的引力场,时刻拉动着动作流向更高分(Q 值更高)的区域偏移。

结果是:机器人输出的动作不再是机械地模仿人类录像,而是"顺着引力走"。即使在完全陌生的环境下,只要 Q 函数识别出了正确的方向,QAM 就能引导机器人划出一条丝滑的、通往成功的运动轨迹。

数值稳定性

在 5B 甚至 10B 规模的 VLA 模型上跑强化学习,稳定性高于一切。

QAM 的损失函数设计非常精妙,它是**时间局部性(Time-locality)**的——你可以在动作生成的任何一个时间采样进行训练,而不需要跑完整生成过程。它将不稳定的 RL 策略梯度问题,转化为了一个极度稳定的向量回归问题。这使得大模型能够像处理文本生成一样,高效、稳定地吸收学习的反馈,而不会出现权重崩溃。

动作连贯性

长程任务(3-5 分钟)最怕的是误差随时间累积。由于 QAM 在每一帧推理时都在接收 Q 函数梯度的微调,它具备了天然的自恢复(Self-recovery)能力。

例如:在搬运重物的 2 分钟过程中,如果手滑了一下,Q 函数会立刻感知到价值下降,QAM 随即产生一个反向的"拉力",引导手爪重新抓紧。因为动作是沿着连续的向量场"流"出来的,QAM 生成的动作流在时间维度上具有极高的二阶平滑度。这保证了机器人在长达数分钟的高强度工作中,电机始终处于平顺状态,不会产生任何突兀的抖动。

3.2 与通用 QAM 的对比

LWD 论文中的 QAM 实现与通用 QAM 有显著区别:

维度 通用 QAM LWD 论文中的 QAM
基础逻辑 简单的速度向量加法 加权的评分匹配(Score Matching)
目标速度 v base + η ⋅ ∇ a Q v_{\text{base}} + \eta \cdot \nabla_a Q vbase+ηaQ 涉及 ( 2 f δ ) / ( σ w ) (2f_\delta)/(\sigma_w) (2fδ)/(σw) σ w ⋅ g ~ w \sigma_w \cdot \tilde{g}_w σwg~w 的加权合成
噪声权重 常数或忽略 σ w = 2 ( 1 − w ) w \sigma_w = \sqrt{2(1-w)w} σw=2(1w)w (Eq. 9)
参考策略 仅是 x 1 − x 0 x_1 - x_0 x1x0(直接指向终点) 明确使用参考策略 f β f_\beta fβ 的残差学习
温度参数 常数 η \eta η 明确为 1 / λ 1/\lambda 1/λ λ = 2 \lambda=2 λ=2
时间权重 无(所有时间 w w w 地位平等) σ w \sigma_w σw 动态权重(不同时间权重不同)

核心差异在于伴随状态 g ~ w \tilde{g}_w g~w 和噪声系数 σ w \sigma_w σw 的设计。

3.3 公式深度拆解

Eq. (9):核心损失函数

QAM 的核心损失函数定义如下:

L QAM ( θ ) = E [ ∫ 0 1 ∥ 2 f δ ( s , a w , w ) σ w + σ w g ~ w ∥ 2 d w ] \mathcal{L}_{\text{QAM}}(\theta) = \mathbb{E}\left[\int_0^1 \left\| \frac{2f_\delta(s, a^w, w)}{\sigma_w} + \sigma_w \tilde{g}_w \right\|^2 dw\right] LQAM(θ)=E[01 σw2fδ(s,aw,w)+σwg~w 2dw]

其中:

  • f δ = f θ − f β f_\delta = f_\theta - f_\beta fδ=fθfβ:当前速度与参考速度之差
  • σ w = 2 ( 1 − w ) w \sigma_w = \sqrt{2(1-w)w} σw=2(1w)w :噪声权重项
  • g ~ w \tilde{g}_w g~w:沿流路径传播的伴随状态
Eq. (10):伴随状态终点条件

g ~ 1 = − ∇ a [ Q φ ( s , a 1 ) λ ] \tilde{g}_1 = -\nabla_a \left[ \frac{Q_\varphi(s, a^1)}{\lambda} \right] g~1=a[λQφ(s,a1)]

其中 λ = 2 \lambda = 2 λ=2 是温度参数。注意符号是负号,但它在 Loss 里面会被抵消。

逐行拆解
步骤 操作 技术含义
Step 6 Roll out reference trajectory 通过 π β \pi_\beta πβ 生成参考轨迹 { a t w } w ∈ [ 0 , 1 ] \{a_t^w\}_{w\in[0,1]} {atw}w[0,1]。对于线性路径,它就是 a t w = ( 1 − w ) a t 0 + w ⋅ a t 1 a_t^w = (1-w)a_t^0 + w\cdot a_t^1 atw=(1w)at0+wat1
Step 7 Set endpoint a t 1 = a t a_t^1 = a_t at1=at 明确将数据集中的真实动作 a t a_t at 设为轨迹的终点,这是计算梯度的基准点
Step 8 Compute gradient & Adjoint Map 在终点计算 Critic 梯度,作为伴随状态的终值条件,沿 ODE 路径反推各步目标
Eq. (9) Policy Loss 让当前策略 f θ f_\theta fθ 的向量场去拟合参考速度 + Q 梯度修正后的目标速度
保护机制

在 LWD 中,由于分母有 σ w \sigma_w σw,当靠近终点( w → 1 w \to 1 w1)时, σ w → 0 \sigma_w \to 0 σw0,分母变小要求 f δ f_\delta fδ 必须强制趋近于 0。这保证了无论 Q 怎么指引,最终生成的动作绝对不会偏离合法的动作空间太远。

3.3 代码实现

我们来看核心的 QAM 更新逻辑如何用代码实现(非 QAM 作者版本):

def lwd_qam_update(v_net, v_beta, q_net, s, a_1, lambda_temp=2.0):
    # 1. 采样时间 w 和噪声 a_0
    w = torch.rand(s.shape[0], device=s.device)
    a_0 = torch.randn_like(a_1)

    # 2. 构造参考轨迹 (Step 6)
    w_exp = w.view(-1, 1)
    a_w = (1 - w_exp) * a_0 + w_exp * a_1

    # 3. 计算噪声权重 sigma_w = sqrt(2 * (1-w) * w)
    sigma_w = torch.sqrt(2 * (1 - w_exp) * w_exp + 1e-6)

    # 4. Eq. (10): 计算终点伴随状态 g_1
    a_1.requires_grad_(True)
    q_val = q_net(s, a_1)
    g_1 = -torch.autograd.grad(q_val.sum() / lambda_temp, a_1)[0]

    # 5. 简化: 线性路径下 g_w = g_1
    g_w = g_1

    # 6. 计算速度差 f_delta = f_theta - f_beta
    v_theta = v_net(s, a_w, w)
    v_beta_val = v_beta(s, a_w, w)
    f_delta = v_theta - v_beta_val

    # 7. Eq. (9): 损失函数
    loss = torch.mean(((2 * f_delta / sigma_w) + (sigma_w * g_w))**2)
    return loss

关键设计点:

  1. 线性插值构造 a w a_w aw:通过公式直接算出,不需要跑 ODE 积分
  2. 梯度计算:使用 torch.autograd.grad 计算 Q 对动作的导数
  3. 伴随状态简化:由于参考路径是线性的, g w = g 1 g_w = g_1 gw=g1(在非线性流中需要通过伴随 ODE 反推各步 g w g_w gw
  4. Loss 计算:预测速度与目标速度的 MSE

3.4 Reference Policy 与 BC

π β \pi_\beta πβ 从何而来?

π β \pi_\beta πβ(及其速度场 f β f_\beta fβ)是 LWD 中的参考策略(Reference Policy)。它的职责是告诉模型"数据集里的专家/人类通常是怎么做的"。在代码实现中,它是一个预先训练好的、只做行为克隆(BC)的 Flow Matching 模型。

在 Offline RL 中,如果我们只依赖数据集中的样本,机器人一旦尝试一个数据集中完全没出现过的动作(Out-of-Distribution, OOD),Q 网络就可能给它乱估分。通常由于神经网络的特性,这种乱估分往往是异常高的。如果只听从 Q 的指引,机器人就会疯狂尝试这些危险的 OOD 动作,导致在真实环境中崩溃。这就是为什么我们需要 π β \pi_\beta πβ(Behavior Prior)来充当"紧箍咒"。

BC 被"内化"到了训练循环中

在 LWD 中,BC 被深度嵌入在训练循环的每一时刻。看 Eq. (9) 中的 f β f_\beta fβ 项:

L QAM ( θ ) = E [ ∥ f θ − f β ⏟ BC 项 + …   ∥ 2 ] \mathcal{L}_{\text{QAM}}(\theta) = \mathbb{E}\left[\left\| \underbrace{f_\theta - f_\beta}_{\text{BC 项}} + \dots \right\|^2\right] LQAM(θ)=E BC  fθfβ+ 2

  • f β f_\beta fβ 就是 BC 的化身,代表一个专门通过行为克隆训练好的、只模仿数据集动作的模型
  • 每次执行 QAM Update 时,都会计算当前策略 f θ f_\theta fθ 与参考流 f β f_\beta fβ 之间的差距
  • 这强制让 π θ \pi_\theta πθ 不要偏离数据集太远,本质上是在进行在线的 KL 散度正则化
训练时机

离线预训练阶段:先用收集好的历史数据跑普通的 Flow Matching Loss(没有 Q 梯度),产生一个纯粹的 BC 模型 f β f_\beta fβ

持续训练阶段 f β f_\beta fβ 通常被冻结,作为一个"永恒的导师",提醒正在学习的 f θ f_\theta fθ——“别忘了我们老祖宗(数据集)是怎么干的”。只有 f θ f_\theta fθ(当前策略)在利用 Q 梯度和对齐 f β f_\beta fβ 的双重压力下更新。

LWD vs qam.py 在 BC 处理上的异同
维度 qam.py(作者源码) LWD(论文实现)
BC 的实体 actor_slow f β f_\beta fβ(Reference Flow)
训练时机 同时训练(通过 flow_loss) 通常先预训练,再作为 Frozen Prior 使用
作用方式 作为总速度的一部分(v_s + v_f) 作为 Loss 函数里的减项( f θ − f β f_\theta - f_\beta fθfβ

3.5 σ w \sigma_w σw 的深入理解

σ w = 2 ( 1 − w ) w \sigma_w = \sqrt{2(1-w)w} σw=2(1w)w 是整个 QAM 的灵魂参数。我们用一条长廊来理解它的物理直觉:

  • 在起点( w ≈ 0 w \approx 0 w0): σ w \sigma_w σw 接近 0
  • 在终点( w ≈ 1 w \approx 1 w1): σ w \sigma_w σw 也接近 0
  • 在中间( w = 0.5 w = 0.5 w=0.5): σ w \sigma_w σw 达到最大值

回到 Loss 公式: loss = ( ( 2 ⋅ f δ / σ w ) + ( σ w ⋅ g w ) ) 2 \text{loss} = ((2 \cdot f_\delta / \sigma_w) + (\sigma_w \cdot g_w))^2 loss=((2fδ/σw)+(σwgw))2

σ w \sigma_w σw 非常小时,为了不让 Loss 爆炸, f δ f_\delta fδ 必须强制趋近于 0。这意味着在起点和终点,模型必须极其精准地"模仿"参考策略。而当 σ w \sigma_w σw 在中间变得很大时, σ w ⋅ g w \sigma_w \cdot g_w σwgw 这一项的影响力会变大,说明在导航的中间阶段可以拥有更多的自由度去根据 Q 梯度的指引进行漂移

总结 σ w \sigma_w σw 的三个作用:

  1. 端点锚定:确保轨迹的起点和终点稳定,不会因为 Q 的梯度而产生剧烈震荡
  2. 噪声调度:模仿扩散模型中的扩散核(Diffusion Kernel),使 QAM 在数学上等价于在最大化 Q 的同时最小化与参考策略之间的 KL 散度
  3. 数值稳定性:平衡"模仿速度"和"优化速度"的量级,防止在不同时刻梯度爆炸

3.6 vs QAM作者实现

在论文中, 我们说有 V, Q, π 三个逻辑实体, 但在QAM作者的代码 qam.py 中, 你看到的是 critic_loss 和 actor_loss。它们的对应关系如下:

  1. 核心对应关系
论文实体 (Algorithm 2) 代码函数 (qam.py) 实际意义
DIVL (V 和 Q) critic_loss 训练裁判系统。它负责把 V 和 Q 练好, 让它们能准确评估好坏。
QAM (π) actor_loss 训练动作系统。它负责利用裁判给出的梯度, 学会怎么生成动作。

为什么 qam.py 里看起来没写 V?这是一个非常有意思的代码设计差异:

  • 在我们的实现中: 我们严格按照 DIVL 论文, 显式定义了 V_ψ (分布) 和 Q_φ (标量)。
  • 在QAM 作者的 qam.py 中
    • 作者使用的是一种更通用的写法。他的 critic_loss 实际上是 Critic Ensemble (多头 Q 网络)。
    • 如果你去看他 create 方法里的 Value 类, 虽然名字叫 Value, 但它输入的是 (obs, actions), 所以它其实是在实现 Q ( s , a ) Q(s, a) Q(s,a)
    • 关于 V 的隐式处理: 在作者的 critic_loss 里, 他通过采样 next_actions 来计算 next_qs, 这是一种类似 SAC 的显式更新。

0x04 协同机制:价值到行动的闭环

前面两篇文章分别介绍了 DIVL 和 QAM 各自的设计。但 LWD 真正的力量在于它们的配合——这种配合不是简单的"先后顺序",而是一个"四人舞"式的多角色协同过程。

4.1 四人舞:完整的训练步

深入看一轮完整的训练步,实际有四个角色在协同互动:V 网络(分布价值模型)、当前 Q 网络(Critic)、目标 Q 网络( Q ˉ \bar{Q} Qˉ,EMA 更新)、以及当前策略 π θ \pi_\theta πθ(Actor)。

一轮完整的训练步 = 从 replay buffer 采样数据
                 → DIVL 更新 V_ψ (分布拟合)
                 → DIVL 计算自适应 τ 和 TD 目标 y_Q
                 → DIVL 更新 Q_φ (收敛到 y_Q)
                 → EMA 更新目标 Q 网络
                 → QAM 通过 π_β 生成参考轨迹
                 → QAM 在终点计算 ∇_a Q
                 → QAM 通过伴随匹配生成局部回归目标
                 → QAM 更新 π_θ 的向量场
                 → 新策略异步下发

4.2 协同对话

DIVL 和 QAM 交互如下:

  • DIVL 通过分布式评估,为 Q 函数提供了一个考虑不确定性的、极其稳定的"地形图"
  • QAM 利用 Q 函数的梯度,通过"导航"而非"瞬移"的方式,将噪声雕刻成高质量的动作
  • σ w \sigma_w σw 在其中起到了平衡"模仿"与"优化"的动态权重作用

如果我们把 DIVL 和 QAM 的交互写成对话,它是这样的:

  • QAM 问 DIVL:“裁判,我现在在状态 s s s,我的动作走到了位置 a t a_t at。如果我往这个方向再迈一小步,我的前途会变亮还是变暗?”,即QAM 问 Q:“请给我动作 a a a 这里的梯度 ∇ a Q \nabla_a Q aQ。”
  • DIVL(Critic Head)回答
    1. “根据我学到的经验,在这个点,Q 值的梯度是这样的: ∇ a Q \nabla_a Q aQ。你沿着这个方向走,动作价值提升最快。”
    2. Q 因为向 V 学习了"乐观的未来",它的梯度会指向那些真正能通往高分的动作方向。
  • QAM 拿到梯度,把它填进 Adjoint Matching 的公式里,调整自己的速度场。

4.3 梯度传递链

梯度的传递是连接 DIVL 和 QAM 的关键纽带。梯度的计算逻辑如下:

  • DIVL 给 QAM 提供了梯度。
    • DIVL 提供了一个稳定的、考虑了不确定性的训练目标, 使得 Q 函数不会因为离线数据的噪声而产生乱七八糟的形状。
    • 梯度的产生:通过对 Critic 网络执行 torch.autograd.grad, 计算 Q 值对输入 a 的导数。
    • 最终形态:这是一个与动作 a 维度相同的向量, 指向 Q 值增加最快的方向。
  • 而 QAM 利用这个梯度最终生成了 Action。

整个过程分为三步:

第一步:DIVL 产出目标值,训练 Q 函数

  • V ψ V_\psi Vψ(分布值函数)包含了很多信息。DIVL 根据当前的"乐观度" τ \tau τ,从这个分布中提取出一个具体的数值: y = Quantile τ ( V ψ ( s ′ ) ) y = \text{Quantile}_\tau(V_\psi(s')) y=Quantileτ(Vψ(s))
  • 然后训练 Critic 网络 Q φ ( s , a ) Q_\varphi(s, a) Qφ(s,a) 去逼近这个数值
  • 结果:我们得到了一个神经网络 Q φ Q_\varphi Qφ,输入 ( s , a ) (s, a) (s,a),输出一个实数

第二步:利用自动求导提取梯度

既然 Q φ Q_\varphi Qφ 是一个神经网络,它在数学上就是一个关于动作 a a a 的连续函数:

a_t.requires_grad_(True)
q_val = critic_q_net(s, a_t)                    # 问 Q 网络: 在这个点值多少?
grad_a_q = torch.autograd.grad(q_val.sum(), a_t)[0]  # 核心: 计算 q_val 对 a_t 的导数

第三步:梯度体现了 DIVL 的意志

你可能会问:既然是算 Q 的梯度,那和 DIVL 的"分布"有什么关系?关系就在于训练过程:因为 Q 是看着 V 的分布(特别是分布的高分右端)学出来的,所以 Q 函数的"地形图"会被塑造成指向 V 分布中那些高分动作的方向。

V 告诉 Q 哪里是高山,Q 顺着这个指示画出了山的形状,最后 QAM 看着 Q 画的形状往山上爬。

4.4 核心公式全景

我们整理一下完整的公式链条,看清每一步之间的因果关系:

V 网络更新 (交叉熵):
  ℒ_V(ψ) = -log p_ψ(Q_φ̄(s_t, a_t) | s_t)
  → V 学习数据集中 Q 值的分布

自适应 τ (不确定性感知):
  τ(s_{t+H}) = clip(τ_base - α·H(s_{t+H}), τ_min, τ_max)
  → 分布越不确定(高熵) → τ 越低 → 越保守

TD 目标 (分位数 bootstrap):
  y_Q = r_t + γ^H · Quant_τ(V_ψ(s_{t+H}))
  → 从 V 分布取 τ-分位数作为未来价值估计

Q 网络更新 (MSE):
  ℒ_Q(φ) = (Q_φ(s_t, a_t) - y_Q)²
  → Q 收敛到带乐观偏置的 TD 目标

QAM 伴随匹配 (策略提取):
  ℒ_QAM(θ) = E[∫₀¹ || (2f_δ/σ_w) + (σ_w·g̃_w) ||² dw]
  → f_θ 在模仿 f_β 的基础上, 往 ∇_a Q 的方向偏转

这条链条中最精妙的设计在于:每一步的输出都是下一步的输入,且每一步的输出都比上一步更接近"可执行的动作"。V 的分布是抽象的统计信息,经过分位数提取变成具体的数值 y Q y_Q yQ,再通过 Q 训练变成连续可导的函数 Q φ Q_\varphi Qφ,最后通过伴随匹配变成向量场中每一步的局部目标——信息在每一步都在被"提纯"和"转化",最终落地为机器人流畅的动作。

链条中的重点如下:

π_β (Reference Policy)

π_β 不是 DIVL 的输出, 而是系统的"输入"和"先验知识"。 它通常是一个预先用行为克隆 (BC) 训练好的模型。它代表了"旧的、安全的、但可能平庸的行为"。

在 Algorithm 2 的第 1 行, 你会看到 policy π_θ with reference policy π_β

它在干什么? 在整个训练过程中, 它像是一个"锚点", 防止 π_θ 因为追求高分而变得过于疯狂 (即我们之前讨论的 KL 散度约束)。

深度解析: DIVL 给 QAM 到底是什么?
  • 我们看 Algorithm 2 的第 11 行:Update θ by minimizing Eq. (9) with \tilde{g}1 set from action gradient ∇{a}Q_φ(s, a₁) ...。这一行就是"交接棒"!
  • DIVL 先算: 它在第 3-5 行完成了 Q_φ 的更新。这时候, Q_φ 是热气腾腾、最新的裁判。
  • QAM 后接: 到了第 11 行, QAM 并没有调用 DIVL 的 V 分布, 它只向 Q_φ 要了一个东西——动作梯度 ∇_a Q
  • QAM 执行: 它拿着这个梯度, 利用 Adjoint Matching, 把原来的 π_β 往更好的方向推一步。
  • 总结: 谁产出了谁?
    • DIVL 产出了: 经过修正的 Q_φ (裁判的眼光)。
    • QAM 产出了: 经过修正的 π_θ (运动员的动作)。
    • π_β: 始终在那里, 作为"不准跑偏"的参考标准。
更新 V_ψ (Eq. 12)

这可以理解为 “分类任务”。

  • 目标: 我们让分布网络 V_ψ(s) 去预测数据集里动作的 Q 值。
  • Loss: 这是一个交叉熵 (Cross-Entropy) 损失。
  • 物理意义: V_ψ(s) 学习的是: “在这个状态下, 数据集中的动作 Q 值通常分布在哪些格子里?”
计算 TD 目标 y_Q (Eq. 19)

这是"选择概率分布高的区域执行"的数学体现。

  • 在普通的 Q-learning 中, 我们用 max_{a’} Q(s’, a’)。
  • 在 DIVL 中, 我们从 V_ψ(s’) 这个分布中取一个分位数 (Quantile)。
  • 公式的核心: Quantile_{τ}(V_ψ(s'))
    • 如果 τ=0.9 (乐观), 我们取分布中前 10% 的高分位置。
    • 如果 τ=0.1 (悲观), 我们取最后 10% 的低分位置。
  • 论文提到 τ 不是固定的, 而是根据分布的熵 (Entropy) 来定的: τ(s) = clip(τ_{base} - α H(s), …)。
    • 熵大 代表分布很散 (机器人很懵, 不知道哪里好)。
    • 熵小 代表分布很集中 (机器人很自信)。
更新 Q_φ (Eq. 15)

这依然是一个回归任务 (MSE Loss)。

  • Q ( s , a ) Q(s, a) Q(s,a) 逼近上面算出来的这个带有"乐观色彩"的 y_Q。

0x05 总结

DIVL 和 QAM 的配合是 LWD 算法层面的灵魂。我们把它们的关系做一个最终的梳理:

维度 DIVL QAM
角色 评价系统(大脑) 执行系统(肌肉)
核心任务 更新 Q φ Q_\varphi Qφ V ψ V_\psi Vψ 更新 π θ \pi_\theta πθ
解决的问题 从异质数据中稳健评估价值 把价值信号注入生成式策略
输出 稳健的 Critic + 梯度 改进后的 Flow 策略
关键机制 分布学习 + 自适应分位数 伴随匹配 + σ w \sigma_w σw 噪声调度
与对方的接口 提供 ∇ a Q \nabla_a Q aQ 吸收并应用 ∇ a Q \nabla_a Q aQ
离在线统一性 相同损失函数,不同数据来源 相同损失函数,不同数据来源

一句话总结:DIVL 给出"往哪个方向走更有前途"的导航信号,QAM 把导航信号转化为每一步的"踩油门力度",两者配合让机器人在真实部署中持续进化。

TransFormer-封面

0xFF 参考

SERL——针对真机高效采样的RL系统:基于图像观测和RLPD算法等,开启少量演示下的RL精密插拔之路(含插入基准FMB的详解)

边部署边学习:面向通用机器人策略的机群-级强化学习

论文解读:Learning while Deploying (LWD)—— 面向通用机器人策略的集群级强化学习框架

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐