0x03 RLPD 训练范式全解析

📅 2026/7/7 0:26:20
0x03 RLPD 训练范式全解析
3.1 三合一 Buffer 设计RLPDRL with Prior Data是 HIL-SERL 真正的算法内核。它维护一个包含三类经验的混合池Offline Demo初期录制的高质量专家演示pkl 文件。Autonomous Rollouts机器人自己尝试的数据有好有坏。Human Interventions训练过程中人类实时纠错产生的数据。系统在训练时以 50/50 方式采样50% online replay batch 50% demo/intervention batch数据来源Buffer采样比例在线交互策略 人类replay_buffer50%离线 Demopkl 文件demo_buffer50%在线干预SpaceMouse汇入 demo_buffer50%干预数据没有独立的 Buffer——它通过actor_env_intvn通道汇入demo_buffer与离线演示数据混在一起享受同样的 50% 采样比例。这意味着在整个训练周期内人类干预数据始终保持 50% 的曝光率不会被海量自主试错数据淹没。3.2 双缓冲区数据管理Actor 端处理干预和双流插入机器人的 自主试错 被当作普通经验而人类的 拨乱反正 被当作专家演示。这种做法实现了 RL自我进化与 IL向人学习的完美融合。if intervene_action in info: actions info.pop(intervene_action) # 用干预动作替换 intervention_steps 1 # 所有 transition → data_store在线 buffer data_store.insert(transition) # 干预 transition → intvn_data_storedemo buffer if already_intervened: demo_transitions.append(copy.deepcopy(transition))Learner 端做 50/50 采样。这正是 RLPDReinforcement Learning from Prior Data的核心逻辑。无论在线数据变得多么庞大系统始终给 人类老师的教导 留出一半的席位确保它不会学废。# 一半从 RL Buffer 采样一半从 Demo Buffer 采样 batch replay_buffer.sample(batch_size // 2) demo_batch demo_buffer.sample(batch_size // 2) batch concat_batches(batch, demo_batch) # 拼接为完整 batch关键设计Agent 完全无感知数据来源。在sac.py的update()中没有任何标记区分 demo vs online vs interventiondef update(self, batch, *, networks_to_update): # 两部分数据在 loss 计算中被完全同等对待 loss_fns self.loss_fns(batch) # 统一计算 loss3.3 CTA Ratio用计算换效率cta_ratioCritic-to-Actor Ratio是 RLPD 采样效率的核心引擎。它代表每次 Actor 更新前 Critic 更新的次数# cta_ratio2HIL-SERL 默认 # 先做 n-1 次纯 critic 更新最后 1 次做 critic actor 全更新 for critic_step in range(cta_ratio - 1): batch concat_batches(online, demo) agent.update(batch, networks_to_update{critic}) # 第 cta_ratio 次全网络更新 batch concat_batches(online, demo) agent.update(batch, networks_to_update{critic, actor, temperature})cta_ratiocritic 更新次数actor 更新次数每次都用 50/50 batch2HIL-SERL 默认21是4serl-main 默认41是为什么先更新 critic 而不是一起更新因为 actor 依赖 critic 提供的 Q 值来更新策略。如果 critic 还没通过多次拟合看清 Q 值的分布让 actor 对着半吊子 Q去更新就是瞎改。每次 critic 更新都用 50/50 混合 batch保证两类数据对 Q 值估计的影响力始终保持均衡。3.4 SAC 与 DQN 的混合训练RLPD 训练脚本能同时处理纯 SAC连续动作和混合 SACDQN连续离散动作if isinstance(agent, SACAgent): train_networks_to_update frozenset({critic, actor, temperature}) else: train_networks_to_update frozenset({critic, grasp_critic, actor, temperature})通过config.setup_mode自动决定更新哪些网络——single-arm-learned-gripper时启用 GraspCritic更新 4 个网络纯 SAC 时只更新 3 个网络。3.5 RLPD 完整训练流程图这是 HIL-SERL 的 完全体 脚本。它通过异步架构将极致的计算压力UTD和实时的人类干预缝合在一起。0x04 对比4.1 Dagger vs HG-DaggerDagger 的解法事后补救Dagger 的原始逻辑是先跑、再标。机器人跑人坐在旁边等它跑完然后人对着回放录像说这里你该往左那里你该往右。即让人去给这个慌乱状态打标签。这意味着机器人必须先犯错哪怕是虚拟的或者受控的你才能去纠正。HG-Dagger 的解法事先预防HG-Dagger 让人在机器人开始慌的一瞬间就把它拉回来。即人类门禁Human Gating强调在发生偏差之前或者发生瞬间接管它是为真实世界里经不起摔的机器人量身定制的。机器人跑人手握控制柄比如 SpaceMouse。人一旦觉得哎呀要撞墙了或者走错了就直接上手接管。Gated门禁控制的开关门掌握在人手里。人决定什么时候救教什么。DAgger缺乏提升性能的机制。相比之下HG-DAgger 在相同任务下分布更加稀疏。各状态的访问更加均匀。为了达到类似的性能DAgger 可能需要显著更多的演示和纠正并且需要人类操作员更加细致地关注数据质量。4.2 RLPD vs HG-DAgger奖励的两种角色RLPD 和 HG-DAgger 最本质的区别在于对奖励的使用方式。我们可以把这种区别理解为奖励作为燃料 vs 奖励作为终点。范式使用数据主要学习方式适用理解HG-DAgger主要使用干预数据行为克隆 / supervised-style快速纠偏、冷启动、学习恢复动作RLPD / HIL-SERL 主线在线数据 demo interventionoff-policy RL持续优化策略性能以学习过程中的阶段为例BC背诵课本死记硬背。HG-DAgger老师在旁边盯着写错一个字就被打手心实时纠错。RLPD刷历年真题并尝试寻找比标准答案更简便的解法自我进化。核心差异train_hgdagger.py 和 train_rlpd.py这两个训练脚本的核心差异主要体现在以下几个方面算法类型不同train_hgdagger.py使用BCAgent行为克隆而 train_rlpd.py 使用SACAgent强化学习训练数据源不同HG-Dagger仅使用演示数据demo_buffer在train_hgdagger.py:中只从demo_iterator采样RLPD同时使用演示数据和在线经验在train_rlpd.py 中混合replay_iterator和demo_iterator采用50/50采样人机干预处理方式不同HG-Dagger干预数据直接进入演示数据集用于监督学习RLPD干预数据同时进入在线buffer和演示buffer用于强化学习流程对比RLPD强化学习vs HG-DAgger模仿学习流程对比如下HG-DAgger奖励作为终点HG-DAgger —— 纯粹的模仿者当你运行 train_hgdagger.py 时你就是在用这种手段跑 HG-DAgger 算法。逻辑机器人只学一件事—像人一样思考。目标模仿人类。机器人不看奖励它只学一件事在这一刻如果是那个人他会怎么推杆。局限它不看奖励Reward。如果人教错了它就学错。它很难超越人类。在train_hgdagger.py中BCAgent 的 loss 完全不看奖励def loss_fn(params, rng): pi_actions dist.mode() log_probs dist.log_prob(batch_actions) actor_loss -(log_probs).mean() # 监督学习只看动作对齐