【机器人 / 强化学习】QAM 与 DIVL:评价-执行闭环的完美配合
目录
- [【机器人 / 强化学习】QAM 与 DIVL:评价-执行闭环的完美配合](#【机器人 / 强化学习】QAM 与 DIVL:评价-执行闭环的完美配合)
- [0x00 概要](#0x00 概要)
- [0x01 为什么需要两个算法?](#0x01 为什么需要两个算法?)
- [1.1 先想清楚要解决什么问题](#1.1 先想清楚要解决什么问题)
- [1.2 闭环总览](#1.2 闭环总览)
- [1.3 三阶段逻辑链条](#1.3 三阶段逻辑链条)
- [0x02 LWD 论文算法](#0x02 LWD 论文算法)
- [2.1 算法图例](#2.1 算法图例)
- [2.2 算法公式](#2.2 算法公式)
- [2.3 逐行解释](#2.3 逐行解释)
- [0x02 DIVL:分布式价值评价系统](#0x02 DIVL:分布式价值评价系统)
- [2.1 三重角色定位](#2.1 三重角色定位)
- [2.2 输出结构:内部产物 vs 对外成品](#2.2 输出结构:内部产物 vs 对外成品)
- [2.3 分布式价值学习机制](#2.3 分布式价值学习机制)
- 为什么需要分布而不是标量?
- [V 与 Q 的分工](#V 与 Q 的分工)
- 训练过程
- [0x03 QAM:伴随匹配策略执行系统](#0x03 QAM:伴随匹配策略执行系统)
- [3.1 核心突破](#3.1 核心突破)
- [3.2 与通用 QAM 的对比](#3.2 与通用 QAM 的对比)
- [3.3 公式深度拆解](#3.3 公式深度拆解)
- [3.3 代码实现](#3.3 代码实现)
- [3.4 Reference Policy 与 BC](#3.4 Reference Policy 与 BC)
- [3.5 \(\sigma_w\) 的深入理解](#3.5 \sigma_w 的深入理解)
- [3.6 vs QAM作者实现](#3.6 vs QAM作者实现)
- [0x04 协同机制:价值到行动的闭环](#0x04 协同机制:价值到行动的闭环)
- [4.1 四人舞:完整的训练步](#4.1 四人舞:完整的训练步)
- [4.2 协同对话](#4.2 协同对话)
- [4.3 梯度传递链](#4.3 梯度传递链)
- [4.4 核心公式全景](#4.4 核心公式全景)
*- π_β (Reference Policy)
- [深度解析: DIVL 给 QAM 到底是什么?](#深度解析: DIVL 给 QAM 到底是什么?)
- [更新 V_ψ (Eq. 12)](#更新 V_ψ (Eq. 12))
- [计算 TD 目标 y_Q (Eq. 19)](#计算 TD 目标 y_Q (Eq. 19))
- [更新 Q_φ (Eq. 15)](#更新 Q_φ (Eq. 15))
- [0x05 总结](#0x05 总结)
- [0xFF 参考](#0xFF 参考)
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,Q 梯度会乱跳。 价值估计不准,策略改进就没有可靠的方向。整个系统就像没有导航的运动员,不知道往哪里优化。
- 没有 QAM,V 的分布无法转化为流畅的动作。 再好的价值判断,如果不能稳定注入到生成式策略里,就像教练有眼光却无法纠正运动员的动作。
- 统一目标消除阶段鸿沟。 两者在离线和在线阶段使用完全相同的损失函数,只是数据来源不同。这避免了离线 Critic 过于保守、在线微调时价值尺度不匹配的致命问题。
1.3 三阶段逻辑链条
整个 LWD 算法(论文 Algorithm 2)的逻辑可以拆解为三个递进阶段:
第一阶段:预训练(BC)
你手里有一堆离线数据 \((s, a)\)。你训练一个 Flow 模型,损失函数只有最基础的 \(\|v_\theta - (x_1 - x_0)\|^2\)。训练完后得到 \(f_\beta\)------它只会"模仿"数据,完全不懂什么是奖励(Reward)。
第二阶段:值函数学习(DIVL)
DIVL 登场了。它的任务是学习 Critic(Q 和 V)。它改进了 IQL 的方式,用分布式的视角去评估每个动作的好坏。DIVL 产出的不是单个分数,而是一个价值分布------这保证了在面对混合质量数据时,价值估计不会被低质量轨迹拖垮。
第三阶段:策略提取(QAM)
QAM 把前两者的成果合二为一。它拿来 \(f_\beta\)(只会模仿的躯壳)和 \(Q_\varphi\)(懂好坏的大脑)。利用 Adjoint Matching,让最终的策略 \(f_\theta\) 在模仿 \(f_\beta\) 的基础上,往 \(Q_\varphi\) 认为更好的方向偏转。
0x02 LWD 论文算法
2.1 算法图例
论文给出的 DIVL 和 QAM 配合的算法图例如下:
2.2 算法公式
DIVL 对应的算法公式如下:
QAM 对应的算法公式如下
2.3 逐行解释
以下是对这个算法的逐行深度技术解释:
| 行号 | 技术行 | 深度拆解 | 通俗理解 |
|---|---|---|---|
| 准备阶段 | 接收 mini-batch \((s,a,r,s')\)、Critic 网络、分布式价值网络、当前策略及冻结参考策略 | 从录像厅里抓一把带标签的录像 | |
| DIVL 阶段 | |||
| 1 | V-Loss | 通过最小化交叉熵损失,拟合当前状态的价值概率分布 | 看看最严厉的裁判给的最高分是多少 |
| 2 | Q-Target | 利用目标 V 函数计算分布式的 TD 目标(提取特定分位数 + 自适应调节) | 识破潜力:既然有人在这里拿过高分,那这路口的潜力就是满分 |
| 3 | Q-Loss | 使用 MSE 让 Critic 向 \(y_Q\) 逼近 | 算胜率:别只给平均分,把每一种赢法都算清楚 |
| 4 | Update | 动量软更新目标 Critic,维持训练平滑 | 修正偏见:让裁判算准这一招到底有几成胜算 |
| QAM 阶段 | |||
| 5-6 | Time/Noise/Trajectory | 在流匹配时间轴 \(w\) 上采样,跑出基准轨迹 | 模拟滑行:在动作进行到一半时看看你会滑到哪里 |
| 7 | Endpoint | 确定动作轨迹终点 \(a_t^1 = a_t\) | 确定最终的目标 |
| 8 | Gradient/Adjoint/Loss | 在终点计算 Critic 梯度 → 设为伴随状态 → 沿流路径反推 → 生成局部回归目标 | 感知引力→神经传导→听话又上进→对齐训练 |
| 9 | Return | 返回所有新参数 | 升级包做好了 |
我们接下来具体看看这两个算法,然后再看看如何配合。
0x02 DIVL:分布式价值评价系统
DIVL 解决的核心问题是:在不尝试危险动作的前提下(即纯 off-policy),从好坏参杂的数据中提炼出一张"价值地图"。
2.1 三重角色定位
在 LWD 架构中,DIVL 承担着三重角色,每一层都有其特定的职责。
第一,作为 Critic Head(\(Q_\varphi\))。 核心任务是评估动作的 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_\varphi(s, a)\)
- 它给 QAM 提供的是两个关键要素:\(Q_\varphi(s, a)\) 函数本身,以及由它在特定动作点产生的梯度 \(\nabla_a Q\)
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_\psi(s)\) 学习完整的分布------在状态 \(s\) 下,模型倾向于选择动作 A 或 B,但也会保留探索 C 的可能性。
V 与 Q 的分工
在架构图中,V 和 Q 共享一个 VLM 骨干网络,但各自承担不同的角色:
- Q 网络(Critic) :对状态-动作对 \((s_t, \mathbf{a}_t)\) 打分,预测其折扣累计回报。核心功能是给 QAM 提供梯度 \(\nabla_a Q\)。它是"动作评估员"------负责评价"具体某个动作"的好坏并提供改进方向。
- V 网络(Distributional Value Model) :这是 DIVL 的本体。它不是 预测一个标量值,而是建模数据集中 Q 值的分布 :\(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))\)。即给定状态 \(s_t\),V 学习的是"数据集中所有动作对应的 Q 值会呈现怎样的分布形态"。核心功能是提取"高光"基准(Expectile Regression),它是计算"优势值"的底数,是"全局裁判"。
自适应 \(\tau\) :训练时根据 \(V(s')\) 分布的熵动态调整 \(\tau\)------如果 \(V(s')\) 分布弥散(高熵),说明当前状态不确定,\(\tau\) 自动降低以保守;分布集中(低熵)则 \(\tau\) 升高以乐观。
另外,DIVL 还要接 QAM,我们也接着看。
动作优化(QAM) :Actor(VLA 大模型)并不直接感知 V,而是利用 Q 在生成动作终点处的梯度 \(\nabla_\mathbf{a} Q_\phi(s, \mathbf{a})\),通过**伴随匹配(Adjoint Matching)**将其转化为沿着参考流各时间步的局部回归目标,从而稳定地优化动作生成过程------避免了直接经整个去噪过程反向传播带来的不稳定和高昂计算代价。
训练过程
DIVL 的训练是一个统计学习过程:从数据集中收集 \((s, a)\),通过神经网络学习这些数据之间的关系,让网络学会"在什么状态下,什么样的分布形状代表高成功率"。
深入看 DIVL 的训练过程,实际有四个 角色在协同互动:V 网络(分布价值模型)、当前 Q 网络(Critic)、目标 Q 网络(\(\bar{Q}\),EMA 更新)、以及流策略 \(\pi_\theta\)(Actor)。
根据论文 Algorithm 2,每步训练包含两大块(此处把 QAM 也纳入进来):
块一:分布隐式价值学习(DIVL) (下图红色圈)
具体分为以下几步:
① 更新 V(拟合 Q 值分布):
- 输入:来自回放的 \((s_t, \mathbf{a}_t)\)
- 用目标网络 \(\bar{Q}\) 评估 \(Q_{\bar{\phi}}(s_t, \mathbf{a}_t)\),得到一个标量值
- 损失函数:\(\mathcal{L}V(\psi) = -\log p\psi(Q_{\bar{\phi}}(s_t, \mathbf{a}_t) \mid s_t)\),这是一个交叉熵损失
- V 的目标是让自己在状态 \(s_t\) 处输出的分布,最大似然地匹配"目标 Critic 对这个动作给出的分数"。V 不是在蒸馏一个数值,而是在学习**"在当前数据集里,这些动作对应的 Q 值是如何分布的"**
② 计算自适应 \(\tau\)(不确定性感知):
- 输入:下一状态 \(s_{t+H}\) 处的 \(V\) 分布
- 计算分布的归一化熵 \(\mathcal{H}(s_{t+H})\)
- 自适应公式:\(\tau(s_{t+H}) = \text{clip}(\tau_{\text{base}} - \alpha \mathcal{H}(s_{t+H}), \tau_{\min}, \tau_{\max})\)
- 结果:分布越弥散(高熵),\(\tau\) 越低------保守;分布越集中,\(\tau\) 越高------乐观
③ 计算 TD 目标 \(y_Q\)(看向未来):
- 输入:\(V(s_{t+H})\) 分布和自适应 \(\tau\)、当前步奖励 \(\mathbf{r}_t\)
- 计算:\(y_Q = \mathbf{r}t + \gamma^H \cdot \text{Quant}\tau(V_\psi(s_{t+H}))\)
- 从 \(V\) 分布中取出 \(\tau\)-分位数,作为未来价值的估计。因为 V 的分布是从数据集学到的,这个目标天然不会走出分布------\(\tau\) 分位数保证了乐观程度受控
- 离线阶段使用 \(n\)-步 目标来加速稀疏奖励传播:\(y_Q = \sum_{i=0}^{n-1} \gamma^{iH} \mathbf{r}{t+iH} + \gamma^{nH} \text{Quant}\tau(V_\psi(s_{t+nH}))\)(\(n=10\) 用于长程任务)
④ 更新 Q(收敛到 TD 目标):
- 损失函数:\(\mathcal{L}Q(\phi) = (Q\phi(s_t, \mathbf{a}_t) - y_Q)^2\),这是一个 MSE 回归任务
- 让 \(Q\) 的预测不断逼近上述 TD 目标
- 随后通过 EMA 更新目标网络:\(\bar{\phi} \leftarrow \rho \bar{\phi} + (1-\rho)\phi\)
块二:基于 QAM 的策略提取
⑤ 更新 Actor(QAM 策略提取):
- 采样高斯噪声 \(\mathbf{a}t^0\),通过参考流 \(\pi\beta\) 滚动生成完整轨迹 \(\{\mathbf{a}t^w\}{w\in0,1}\)
- 取轨迹终点 \(\mathbf{a}t^1\),计算 Critic 梯度 \(-\nabla\mathbf{a}Q_\\phi(s, \\mathbf{a}_t\^1)/\\lambda\) 作为伴随状态 \(g_1\) 的终值条件
- 沿参考流求解伴随动力学,得到各中间步的局部回归目标
- 让 \(\pi_\theta\) 的向量场去拟合这些目标:\(\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\)
整个流程的精髓 :DIVL 用分布式的 V 替代了标量 V ,保留了数据中的多模态回报信息;QAM 用伴随匹配替代了直接反向传播,让 Critic 的梯度能稳定地优化流式生成策略。二者结合,使得 LWD 可以在异质的 fleet 数据中进行稳定的离线到在线强化学习。
0x03 QAM:伴随匹配策略执行系统
如果说 DIVL 解决的是"怎么看"的问题,QAM 解决的就是"怎么改"的问题------它把 DIVL 训练好的 Critic 梯度,转化为 flow-based VLA 策略可以稳定吸收的局部回归目标。
3.1 核心突破
Adjoint Matching:控制理论与大模型的跨界碰撞
QAM 的核心突破在于引入了经典控制理论中的伴随灵敏度方法(Adjoint Sensitivity Method)。
传统的生成式模型(如 Diffusion 或 Flow Matching)在生成动作时涉及多步迭代推理。如果要用强化学习去优化它,就需要通过整个迭代链条进行反向传播(BPTT),这在数学上会导致严重的梯度消失或爆炸,显存开销更是天文数字。
伴随法的精妙之处在于:QAM 不需要展开整个生成链条。它利用伴随方程,直接在常微分方程(ODE)的层面计算出------"如果我希望最后生成的动作 \(a\) 的 Q 值更高,现在的向量场 \(v\) 应该往哪个方向偏移?"------这将极其复杂的全局求导简化为了局部的数学映射。
梯度引力场
QAM 将强化学习的优化过程具象化为一种物理上的"引力"。
在 Flow Matching 架构下,机器人动作是从噪声开始演化的。QAM 并不强迫机器人跳过演化过程,而是向这个演化过程注入了来自 DIVL 的 Q 函数梯度(\(\nabla_a Q\))。这个梯度就像一股无形的引力场,时刻拉动着动作流向更高分(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_{\text{base}} + \eta \cdot \nabla_a Q\) | 涉及 \((2f_\delta)/(\sigma_w)\) 和 \(\sigma_w \cdot \tilde{g}_w\) 的加权合成 |
| 噪声权重 | 常数或忽略 | \(\sigma_w = \sqrt{2(1-w)w}\)(Eq. 9) |
| 参考策略 | 仅是 \(x_1 - x_0\)(直接指向终点) | 明确使用参考策略 \(f_\beta\) 的残差学习 |
| 温度参数 | 常数 \(\eta\) | 明确为 \(1/\lambda\) 且 \(\lambda=2\) |
| 时间权重 | 无(所有时间 \(w\) 地位平等) | \(\sigma_w\) 动态权重(不同时间权重不同) |
核心差异在于伴随状态 \(\tilde{g}_w\) 和噪声系数 \(\sigma_w\) 的设计。
3.3 公式深度拆解
Eq. (9):核心损失函数
QAM 的核心损失函数定义如下:
\\\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 \]
其中:
- \(f_\delta = f_\theta - f_\beta\):当前速度与参考速度之差
- \(\sigma_w = \sqrt{2(1-w)w}\):噪声权重项
- \(\tilde{g}_w\):沿流路径传播的伴随状态
Eq. (10):伴随状态终点条件
\\\tilde{g}_1 = -\\nabla_a \\left\[ \\frac{Q_\\varphi(s, a\^1)}{\\lambda} \\right \]
其中 \(\lambda = 2\) 是温度参数。注意符号是负号,但它在 Loss 里面会被抵消。
逐行拆解
| 步骤 | 操作 | 技术含义 |
|---|---|---|
| Step 6 | Roll out reference trajectory | 通过 \(\pi_\beta\) 生成参考轨迹 \(\{a_t^w\}_{w\in0,1}\)。对于线性路径,它就是 \(a_t^w = (1-w)a_t^0 + w\cdot a_t^1\) |
| Step 7 | Set endpoint \(a_t^1 = a_t\) | 明确将数据集中的真实动作 \(a_t\) 设为轨迹的终点,这是计算梯度的基准点 |
| Step 8 | Compute gradient & Adjoint Map | 在终点计算 Critic 梯度,作为伴随状态的终值条件,沿 ODE 路径反推各步目标 |
| Eq. (9) | Policy Loss | 让当前策略 \(f_\theta\) 的向量场去拟合参考速度 + Q 梯度修正后的目标速度 |
保护机制
在 LWD 中,由于分母有 \(\sigma_w\),当靠近终点(\(w \to 1\))时,\(\sigma_w \to 0\),分母变小要求 \(f_\delta\) 必须强制趋近于 0。这保证了无论 Q 怎么指引,最终生成的动作绝对不会偏离合法的动作空间太远。
3.3 代码实现
我们来看核心的 QAM 更新逻辑如何用代码实现(非 QAM 作者版本):
python
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
关键设计点:
- 线性插值构造 \(a_w\):通过公式直接算出,不需要跑 ODE 积分
- 梯度计算 :使用
torch.autograd.grad计算 Q 对动作的导数 - 伴随状态简化 :由于参考路径是线性的,\(g_w = g_1\)(在非线性流中需要通过伴随 ODE 反推各步 \(g_w\))
- Loss 计算:预测速度与目标速度的 MSE
3.4 Reference Policy 与 BC
\(\pi_\beta\) 从何而来?
\(\pi_\beta\)(及其速度场 \(f_\beta\))是 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_\beta\) 项:
\\\mathcal{L}_{\\text{QAM}}(\\theta) = \\mathbb{E}\\left\[\\left\\\| \\underbrace{f_\\theta - f_\\beta}_{\\text{BC 项}} + \\dots \\right\\\|\^2\\right \]
- \(f_\beta\) 就是 BC 的化身,代表一个专门通过行为克隆训练好的、只模仿数据集动作的模型
- 每次执行 QAM Update 时,都会计算当前策略 \(f_\theta\) 与参考流 \(f_\beta\) 之间的差距
- 这强制让 \(\pi_\theta\) 不要偏离数据集太远,本质上是在进行在线的 KL 散度正则化
训练时机
离线预训练阶段 :先用收集好的历史数据跑普通的 Flow Matching Loss(没有 Q 梯度),产生一个纯粹的 BC 模型 \(f_\beta\)。
持续训练阶段 :\(f_\beta\) 通常被冻结 ,作为一个"永恒的导师",提醒正在学习的 \(f_\theta\)------"别忘了我们老祖宗(数据集)是怎么干的"。只有 \(f_\theta\)(当前策略)在利用 Q 梯度和对齐 \(f_\beta\) 的双重压力下更新。
LWD vs qam.py 在 BC 处理上的异同
| 维度 | qam.py(作者源码) | LWD(论文实现) |
|---|---|---|
| BC 的实体 | actor_slow | \(f_\beta\)(Reference Flow) |
| 训练时机 | 同时训练(通过 flow_loss) | 通常先预训练,再作为 Frozen Prior 使用 |
| 作用方式 | 作为总速度的一部分(v_s + v_f) | 作为 Loss 函数里的减项(\(f_\theta - f_\beta\)) |
3.5 \(\sigma_w\) 的深入理解
\(\sigma_w = \sqrt{2(1-w)w}\) 是整个 QAM 的灵魂参数。我们用一条长廊来理解它的物理直觉:
- 在起点(\(w \approx 0\)):\(\sigma_w\) 接近 0
- 在终点(\(w \approx 1\)):\(\sigma_w\) 也接近 0
- 在中间(\(w = 0.5\)):\(\sigma_w\) 达到最大值
回到 Loss 公式:\(\text{loss} = ((2 \cdot f_\delta / \sigma_w) + (\sigma_w \cdot g_w))^2\)
当 \(\sigma_w\) 非常小时,为了不让 Loss 爆炸,\(f_\delta\) 必须强制趋近于 0。这意味着在起点和终点,模型必须极其精准地"模仿"参考策略 。而当 \(\sigma_w\) 在中间变得很大时,\(\sigma_w \cdot g_w\) 这一项的影响力会变大,说明在导航的中间阶段可以拥有更多的自由度去根据 Q 梯度的指引进行漂移。
总结 \(\sigma_w\) 的三个作用:
- 端点锚定:确保轨迹的起点和终点稳定,不会因为 Q 的梯度而产生剧烈震荡
- 噪声调度:模仿扩散模型中的扩散核(Diffusion Kernel),使 QAM 在数学上等价于在最大化 Q 的同时最小化与参考策略之间的 KL 散度
- 数值稳定性:平衡"模仿速度"和"优化速度"的量级,防止在不同时刻梯度爆炸
3.6 vs QAM作者实现
在论文中, 我们说有 V, Q, π 三个逻辑实体, 但在QAM作者的代码 qam.py 中, 你看到的是 critic_loss 和 actor_loss。它们的对应关系如下:
- 核心对应关系
| 论文实体 (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)\)。
- 关于 V 的隐式处理: 在作者的 critic_loss 里, 他通过采样 next_actions 来计算 next_qs, 这是一种类似 SAC 的显式更新。
0x04 协同机制:价值到行动的闭环
前面两篇文章分别介绍了 DIVL 和 QAM 各自的设计。但 LWD 真正的力量在于它们的配合------这种配合不是简单的"先后顺序",而是一个"四人舞"式的多角色协同过程。
4.1 四人舞:完整的训练步
深入看一轮完整的训练步,实际有四个 角色在协同互动:V 网络(分布价值模型)、当前 Q 网络(Critic)、目标 Q 网络(\(\bar{Q}\),EMA 更新)、以及当前策略 \(\pi_\theta\)(Actor)。
python
一轮完整的训练步 = 从 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 函数的梯度,通过"导航"而非"瞬移"的方式,将噪声雕刻成高质量的动作
- \(\sigma_w\) 在其中起到了平衡"模仿"与"优化"的动态权重作用
如果我们把 DIVL 和 QAM 的交互写成对话,它是这样的:
- QAM 问 DIVL :"裁判,我现在在状态 \(s\),我的动作走到了位置 \(a_t\)。如果我往这个方向再迈一小步,我的前途会变亮还是变暗?",即QAM 问 Q:"请给我动作 \(a\) 这里的梯度 \(\nabla_a Q\)。"
- DIVL(Critic Head)回答 :
- "根据我学到的经验,在这个点,Q 值的梯度是这样的:\(\nabla_a Q\)。你沿着这个方向走,动作价值提升最快。"
- 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_\psi\)(分布值函数)包含了很多信息。DIVL 根据当前的"乐观度" \(\tau\),从这个分布中提取出一个具体的数值:\(y = \text{Quantile}\tau(V\psi(s'))\)
- 然后训练 Critic 网络 \(Q_\varphi(s, a)\) 去逼近这个数值
- 结果:我们得到了一个神经网络 \(Q_\varphi\),输入 \((s, a)\),输出一个实数
第二步:利用自动求导提取梯度
既然 \(Q_\varphi\) 是一个神经网络,它在数学上就是一个关于动作 \(a\) 的连续函数:
python
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 核心公式全景
我们整理一下完整的公式链条,看清每一步之间的因果关系:
python
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\),再通过 Q 训练变成连续可导的函数 \(Q_\varphi\),最后通过伴随匹配变成向量场中每一步的局部目标------信息在每一步都在被"提纯"和"转化",最终落地为机器人流畅的动作。
链条中的重点如下:
π_β (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)\) 逼近上面算出来的这个带有"乐观色彩"的 y_Q。
0x05 总结
DIVL 和 QAM 的配合是 LWD 算法层面的灵魂。我们把它们的关系做一个最终的梳理:
| 维度 | DIVL | QAM |
|---|---|---|
| 角色 | 评价系统(大脑) | 执行系统(肌肉) |
| 核心任务 | 更新 \(Q_\varphi\) 和 \(V_\psi\) | 更新 \(\pi_\theta\) |
| 解决的问题 | 从异质数据中稳健评估价值 | 把价值信号注入生成式策略 |
| 输出 | 稳健的 Critic + 梯度 | 改进后的 Flow 策略 |
| 关键机制 | 分布学习 + 自适应分位数 | 伴随匹配 + \(\sigma_w\) 噪声调度 |
| 与对方的接口 | 提供 \(\nabla_a Q\) | 吸收并应用 \(\nabla_a Q\) |
| 离在线统一性 | 相同损失函数,不同数据来源 | 相同损失函数,不同数据来源 |
一句话总结:DIVL 给出"往哪个方向走更有前途"的导航信号,QAM 把导航信号转化为每一步的"踩油门力度",两者配合让机器人在真实部署中持续进化。
0xFF 参考
SERL------针对真机高效采样的RL系统:基于图像观测和RLPD算法等,开启少量演示下的RL精密插拔之路(含插入基准FMB的详解)
论文解读:Learning while Deploying (LWD)------ 面向通用机器人策略的集群级强化学习框架