如何让VLA模型像人类一样从错误中学习:RECAP框架深度解析与实战指南

最近在机器人社区里,一个话题的热度持续攀升:如何让那些已经能看懂、能听懂、能行动的视觉-语言-动作模型,真正具备“从经验中学习”的能力?这听起来像是科幻小说的情节,但PI公司最新发布的π*0.6模型及其背后的RECAP框架,正在将这一愿景变为触手可及的现实。如果你是一位AI工程师或机器人开发者,正苦于如何让模型超越静态的演示数据,在真实、多变且充满不确定性的物理环境中持续进化,那么这篇文章正是为你准备的。

传统的模仿学习,就像让一个学生只通过观看大师的录像来学习钢琴演奏。他可以模仿指法,但一旦弹错一个音,后续的节奏就可能全盘崩溃,因为他不知道如何从错误中恢复,更不懂得如何根据现场听众的反应调整演奏情绪。这就是所谓的“误差累积”问题。RECAP框架的核心突破在于,它为VLA模型引入了一套类似人类“练习-反馈-修正”的学习循环。它不再仅仅依赖完美的演示数据,而是让模型在真实环境中“动手”尝试,接受稀疏的奖励信号(成功或失败),甚至在关键时刻引入人类专家的轻微点拨,从而学会如何从自己的错误中汲取教训,优化行为策略。接下来,我们将深入RECAP的每一个技术环节,从原理到代码,手把手解析这套让VLA模型获得“学习能力”的工程化方案。

1. 理解RECAP:超越模仿学习的范式革新

要理解RECAP的价值,我们首先得看清当前VLA模型训练的瓶颈所在。大多数现有的视觉-语言-动作策略,其训练范式可以归结为“行为克隆”。我们收集大量人类专家操作机器人的演示数据(图像、指令、动作序列),然后让模型学习一个从观测到动作的映射函数。这种方法简单直接,在受控环境下往往能取得不错的效果。

然而,一旦部署到真实世界,问题就暴露无遗。物理环境存在传感器噪声、执行器误差、物体属性的微小差异,这些都会导致模型的动作输出出现细微偏差。在模仿学习框架下,模型并没有学会如何处理这些偏差。第一个小错误会导致机器人的状态偏离训练数据分布,第二个动作基于这个“错误”的状态做出,从而产生更大的偏差,如此循环,最终任务失败。就像一个学走路的孩子,如果第一步踩滑了,后续的步态调整完全不在他之前的“学习资料”里,他很可能就会摔倒。

RECAP框架的提出,正是为了打破这个僵局。它的全称是“Reinforcement Learning with Experience and Corrections via Advantage-conditioned Policies”。这个名字几乎概括了其全部精髓:

  • 强化学习:引入奖励信号,让模型学习“好”与“坏”的评判标准。
  • 经验:模型通过与环境的自主交互收集数据,而不仅仅是被动接受演示。
  • 修正:允许人类专家在模型犯错时进行干预,提供“如何从错误中恢复”的示范。
  • 优势条件化策略:这是RECAP的技术核心,它提供了一种优雅的方式,将价值函数评估出的“优势”信息,作为条件输入给策略模型,指导其学习。

RECAP将整个训练流程分为三个阶段,构成了一个可迭代的闭环:

  1. 数据收集:混合演示数据、自主运行数据和人工修正数据。
  2. 价值函数训练:训练一个“评论家”,学会评估当前状态距离任务成功还有多远。
  3. 优势条件策略训练:利用价值函数计算的优势值,训练一个能区分“好动作”和“坏动作”的策略。

这个框架的美妙之处在于它的通用性和可扩展性。它不依赖于特定的策略模型架构(无论是扩散模型还是流匹配模型),也不要求密集的奖励信号。接下来,我们将聚焦于RECAP中最具创新性的“优势条件化”机制,看看它是如何具体实现的。

2. 核心机制:优势条件化策略提取详解

如果说价值函数是RECAP系统中的“教练”,负责给每个动作打分,那么优势条件化策略提取就是“训练方法”,它告诉模型如何利用这些分数来改进自己。这是RECAP区别于传统策略梯度方法(如PPO)或简单过滤方法(如AWR)的关键。

2.1 从价值到优势:定义“好动作”

首先,RECAP训练一个分布式价值函数 $V_{\phi}(o, l)$。它接收观测 $o$ 和语言指令 $l$,输出一个离散化的价值分布。这个价值函数的目标是预测当前状态下,未来能获得的累积回报(在RECAP中,回报通常与任务成功前的剩余步数相关)。一个状态价值高,意味着从这个状态出发,很容易成功完成任务。

有了状态价值,我们就能定义动作优势值 $A(o, a)$。直观上,优势值衡量的是在状态 $o$ 下执行动作 $a$,相比执行“平均”动作能带来多少额外好处。其计算公式可以近似为: $A(o_t, a_t) \approx Q(o_t, a_t) - V(o_t)$ 或者,在蒙特卡洛估计中,使用 $n$ 步回报:$A(o_t, a_t) = \sum_{i=0}^{n-1} r_{t+i} + V(o_{t+n}) - V(o_t)$。

RECAP采用了一个更工程化的简便方法:它直接使用价值函数对未来若干步的观测进行评估,计算其差值作为优势估计。优势值为正,说明这个动作比平均水平好,更可能导向成功;优势值为负,则说明这个动作拖了后腿。

2.2 优势条件化:将评分融入策略输入

传统的强化学习方法,如PPO,会通过复杂的策略梯度计算,直接调整策略网络的参数,使其更倾向于产生高优势的动作。这个过程涉及重要性采样、信赖域约束等,对于大规模、参数化的VLA模型(尤其是基于流匹配的模型)来说,稳定训练颇具挑战。

RECAP则另辟蹊径,它采用了一种条件化的思想。具体做法令人惊讶的简单:

  1. 在策略模型(即VLA模型)的输入序列中,增加一个特殊的文本标记,用来指示当前训练样本中动作的优势情况。
  2. 如果该动作的优势值 $A(o, a)$ 高于某个阈值 $\tau$,则输入 ”Advantage: positive”;否则输入 ”Advantage: negative”
  3. 在训练时,模型不仅学习如何根据图像和语言指令生成动作,还学习如何根据这个“优势指示器”来调整其动作分布。

这相当于在教模型一门“新语言”:当系统告诉它“现在是优势正”时,它应该输出那些被评估为“好”的动作模式;当系统告诉它“优势负”时,它看到的则是一个反面教材。在推理阶段,我们可以始终输入 ”Advantage: positive”,从而引导模型只产生高优势的动作。

2.3 数学本质与实现技巧

从数学上看,优势条件化对应着一种正则化的策略提取。我们希望找到一个新策略 $\pi_{new}$,它既能在期望上优于旧的行为策略 $\pi_{beta}$,又不会偏离太远。RECAP所采用的方法源于一个理论结果:可以通过对一个改进指标 $I$(这里就是优势是否大于阈值)进行条件化,来得到一个改进的策略。

训练目标函数可以写为: $\mathcal{L} = \mathbb{E}{(o,a,l) \sim D} [ -\log \pi{theta}(a | o, l) - \alpha \cdot \mathbb{1}{A(o,a) > \tau} \cdot \log \pi{theta}(a | o, l, I=1) ]$ 其中,第一项是标准的行为克隆损失,确保模型记住所有数据;第二项是优势条件化项,它强制模型在面对“优势正”的指示时,必须能高概率地复现对应的好动作。

在实际实现中,有两个重要技巧:

  • 优势指示器丢弃:在训练时,以一定概率(如30%)随机丢弃优势指示器输入。这使得模型同时学会了有条件策略 $\pi(a|o,l,I)$ 和无条件策略 $\pi(a|o,l)$。在推理时,这允许我们使用无分类器引导技术,通过调节一个引导权重 $\beta$ 来进一步锐化动作分布,追求更极致的性能。

    # 伪代码示例:训练时的优势条件输入构建
    def prepare_training_batch(obs, actions, language, advantages, threshold=0.0, drop_prob=0.3):
        batch_size = obs.shape[0]
        advantage_indicator = (advantages > threshold).float() # 二值化
        # 随机丢弃优势条件
        mask = (torch.rand(batch_size) > drop_prob).float().unsqueeze(1)
        conditioned_advantage_text = []
        for i in range(batch_size):
            if mask[i] and advantage_indicator[i]:
                text = language[i] + " Advantage: positive"
            elif mask[i] and not advantage_indicator[i]:
                text = language[i] + " Advantage: negative"
            else:
                text = language[i] # 无条件
            conditioned_advantage_text.append(text)
        return obs, actions, conditioned_advantage_text
    
  • 人工修正的特殊处理:对于人类专家在机器人自主运行中进行的干预修正动作,RECAP强制将其优势指示器设为“正”。这是一个合理的假设,因为专家的修正意图正是展示正确的恢复路径。这确保了这些宝贵的修正数据能被模型以“好动作”的模式学习。

通过这种设计,RECAP巧妙地将强化学习的“优化”思想,转化为了一个可扩展的、稳定的监督学习问题。模型利用全部数据(包括好的、坏的和修正的)进行训练,但通过优势条件这个“开关”,学会了如何区分和选择。

3. 实战演练:从π0.6到π*0.6的RECAP微调流程

理解了核心原理后,我们来看如何将一个预训练的VLA模型(如π0.6),通过RECAP框架微调成能从经验中学习的π*0.6。这个过程可以分为离线预训练和在线后训练两个主要阶段。

3.1 阶段一:离线RL预训练

这个阶段的目标是让模型初步建立“优势”的概念,为后续的在线学习打下基础。此时使用的数据全部是历史收集的人类演示数据

步骤1:训练价值函数 我们首先在庞大的多任务演示数据集上训练价值函数 $V_{\phi}$。这个数据集包含了成千上万小时的不同机器人、不同任务的操作记录。价值函数的学习目标是最小化其预测价值与真实回报之间的交叉熵损失(分布式回归)。这里的“回报”根据任务成功标签构建,例如,可以定义为成功前剩余步数的负值。

注意:即使在这个离线阶段,价值函数也是在预测一个与策略优化相关的量,而非简单的状态价值。它需要学会在长序列任务中进行粗略的“信用分配”,识别出哪些步骤是关键瓶颈。

步骤2:计算优势并预训练策略

  1. 用训练好的价值函数,遍历整个预训练数据集,为每一个状态-动作对 $(o_t, a_t)$ 计算优势值 $A(o_t, a_t)$。
  2. 为每个任务设定一个优势阈值 $\tau$。通常,选择使约30%的演示数据具有正优势的阈值。这保证了模型学习的是“相对优秀”的动作,而不是必须完美。
  3. 将优势二值化($I_t = A(o_t, a_t) > \tau$),作为条件输入,与原始的图像、语言指令一起,对π0.6模型进行预训练。此时,模型架构需要稍作修改,以接收这个额外的文本条件。

经过这个阶段,我们得到了一个“种子模型”π*0.6。它已经内化了“优势”的概念,但尚未接触过任何自主交互数据。

3.2 阶段二:在线RL后训练(含人工干预)

这是RECAP框架发挥威力的关键阶段。我们将模型部署到真实机器人上,针对特定任务进行迭代提升。

迭代循环: 对于目标任务(例如“制作一杯浓缩咖啡”),我们启动以下循环,可以进行1到多次迭代:

  1. 数据收集

    • SFT微调:首先,用目标任务的一小部分高质量演示数据对π*0.6种子模型进行有监督微调。在这个微调中,我们将所有数据的优势指示器固定为“正”,这相当于一个快速的任务适应。
    • 自主运行:使用微调后的策略,让机器人在真实环境中反复执行任务。记录下所有的观测、动作和最终的任务成功/失败标签。
    • 人工干预:这是RECAP的特色。在自主运行过程中,人类专家在旁监控。当机器人即将犯下关键错误或已经陷入困境时,专家通过遥操作接管机器人,执行一系列修正动作,将其引导回正轨。修正前后的整个片段(包括自主错误和人工修正)都被完整记录
    # 伪代码示例:在线数据收集循环
    def collect_online_data(policy, env, num_episodes, human_supervisor=None):
        dataset = []
        for ep in range(num_episodes):
            obs = env.reset()
            done = False
            trajectory = {'obs': [], 'actions': [], 'rewards': [], 'human_corrected': []}
            while not done:
                action = policy.predict(obs)
                # 人类决策是否干预
                if human_supervisor and human_supervisor.should_intervene(obs, action):
                    corrected_action, correction_sequence = human_supervisor.intervene(obs)
                    trajectory['actions'].append(corrected_action)
                    trajectory['human_corrected'].append(True)
                    # 记录干预片段
                    dataset.append({
                        'type': 'correction',
                        'sequence': correction_sequence,
                        'advantage_label': 'positive' # 强制为正
                    })
                else:
                    obs_next, reward, done, info = env.step(action)
                    trajectory['obs'].append(obs)
                    trajectory['actions'].append(action)
                    trajectory['rewards'].append(reward)
                    trajectory['human_corrected'].append(False)
                    obs = obs_next
            # 回合结束,标记成功与否,计算稀疏奖励
            success = env.is_success()
            final_reward = 100 if success else -1
            # 将自主运行轨迹加入数据集
            dataset.append({
                'type': 'autonomous',
                'trajectory': trajectory,
                'success': success,
                'final_reward': final_reward
            })
        return dataset
    
  2. 价值函数微调:将本轮收集到的所有新数据(自主+修正)与之前的所有数据(包括初始演示)合并。在这个更大的、混合了不同策略数据的数据集上,重新微调价值函数 $V_{\phi}$。这使得价值函数对当前策略的行为和任务瓶颈有了更新的认识。

  3. 策略优势条件化微调

    • 使用最新微调的价值函数,重新计算整个合并数据集中每个动作的优势值。
    • 根据新的优势值,更新每个样本的优势指示器 $I_t$。
    • 以优势指示器为条件,对π*0.6策略模型进行新一轮的微调。模型从之前的检查点开始训练,学习根据新的价值判断来调整其动作分布。

这个循环的每一次迭代,价值函数都对“如何成功”有了更精准的把握,而策略模型则根据这个更精准的“教练”的指导,淘汰不良动作模式,强化优良模式。实验表明,即使是单次迭代,也能在复杂任务上带来吞吐量翻倍、失败率减半的显著提升。

4. 系统设计、调参与避坑指南

将RECAP从论文落地到实际机器人系统,需要精心的工程设计和参数调校。本节结合原始论文和工程经验,探讨关键的设计选择与实战技巧。

4.1 模型架构与训练细节

π*0.6模型本身是在π0.5基础上的升级,采用知识隔离训练,主干网络基于Gemma 3 4B,并配备一个860M参数的“动作专家”模块进行流匹配。RECAP在此基础上,主要增加了两个部分:

  1. 价值函数网络:采用一个较小的VLM主干(如670M参数),与策略网络共享相同的视觉编码器和文本编码器架构,但输出层改为预测离散化的价值分布。为了防止过拟合,需要在训练时混合一部分互联网多模态数据。

  2. 优势条件输入:在输入序列中,将二值化的优势指示器(”Advantage: positive/negative”)作为一段特殊的文本插入到语言指令之后、动作序列之前。这样,只有后续的动作生成部分会受此条件影响。

训练目标对于连续动作(流匹配)和离散动作(自回归)是分开的:

  • 连续动作部分使用流匹配损失。
  • 离散动作部分使用标准的交叉熵损失。
  • 优势条件化通过影响这两部分损失的样本权重或直接作为模型输入条件来实现。

4.2 关键超参数与调优建议

RECAP的性能对以下几个超参数比较敏感:

超参数作用典型值/调优建议
优势阈值 $\tau$决定哪些动作被视为“正优势”。控制策略的探索性与保守性。预训练:设为使约30%演示数据为正优势的值。
在线训练:设为使约40%在线评估轨迹为正优势的值。对于需要高可靠性的任务,可提高阈值(如10%)。
CFG引导权重 $\beta$在推理时,用于调节有条件策略和无条件策略的混合程度,锐化分布。通常 $\beta=1$(仅使用有条件策略)效果已很好。可尝试 $\beta \in [1.5, 2.5]$ 以追求更激进、快速的动作,但需注意可能导致不稳定。
优势条件丢弃率训练时随机丢弃优势条件的概率,用于同时学习有条件/无条件策略。论文使用30%。这是一个稳定训练的常用技巧,类似于Dropout。
价值函数前视步数 $N$计算优势时,向前看多少步的未来状态价值。预训练:$N = T$(整个回合长度),计算简单但方差高。
在线训练:$N=50$,在偏差和方差间取得平衡。
数据混合权重在线训练时,新数据与旧数据在训练价值函数和策略时的相对重要性。类似RLPD,可采用50%来自最新策略,50%来自历史数据(演示+旧策略)的混合方式,防止遗忘。

调参心得:从一个保守的配置开始(中等阈值$\tau$, $\beta=1$)。首先确保在线数据收集是稳定的,策略不会频繁导致灾难性失败。然后,如果你发现策略过于保守、速度慢,可以尝试略微降低阈值或提高$\beta$。反之,如果策略经常做出怪异、危险的动作,则应提高阈值,并检查价值函数的预测是否准确。

4.3 常见陷阱与解决方案

  1. 价值函数过拟合/欠拟合

    • 现象:价值函数在训练集上预测准确,但无法泛化到新策略收集的数据上;或者根本无法对状态做出有区分度的预测。
    • 检查:可视化价值函数在成功和失败轨迹上的变化曲线。它应该在任务进展顺利时缓慢上升,在犯错时明显下降。
    • 解决:确保价值函数的训练数据足够多样(混合多任务数据、网络数据);使用合适的正则化(如权重衰减);检查奖励定义是否合理。
  2. 策略性能不升反降

    • 现象:经过RECAP迭代后,成功率或吞吐量下降。
    • 检查:首先确认数据收集环节是否有问题。人工修正的质量是否一致?自主运行是否因为初始策略太差而完全无法收集到成功片段?
    • 解决:确保初始的SFT微调足够强,能提供一个可靠的基线。人工修正应专注于纠正关键错误,而非全程接管。考虑增加初始演示数据的比例。
  3. 训练不稳定

    • 现象:损失剧烈震荡,模型输出NaN。
    • 检查:梯度爆炸?优势值计算出现极端值?
    • 解决:对优势值进行裁剪或归一化;使用更小的学习率;确保流匹配损失中的噪声调度设置正确。

RECAP框架为VLA模型打开了一扇通向持续学习的大门,但它并非全自动的魔法。成功的部署离不开对机器人系统的深刻理解、高质量的数据收集流程,以及耐心的迭代调试。它更像是一个强大的工具,将人类的直觉(通过干预)与算法的优化能力结合起来,共同塑造一个更强大、更鲁棒的智能体。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐