当前位置: 首页 > news >正文

0x03 RLPD 训练范式全解析

3.1 三合一 Buffer 设计

RLPD(RL with Prior Data)是 HIL-SERL 真正的算法内核。它维护一个包含三类经验的混合池:

  1. Offline Demo:初期录制的高质量专家演示(pkl 文件)。
  2. Autonomous Rollouts:机器人自己尝试的数据(有好有坏)。
  3. Human Interventions:训练过程中人类实时纠错产生的数据。

系统在训练时以 50/50 方式采样:

50% online replay batch + 50% demo/intervention batch
数据来源Buffer采样比例
在线交互(策略 + 人类)replay_buffer50%
离线 Demo(pkl 文件)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_store(demo buffer) if already_intervened: demo_transitions.append(copy.deepcopy(transition))

Learner 端做 50/50 采样。

这正是 RLPD(Reinforcement 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.pyupdate()中,没有任何标记区分 demo vs online vs intervention:

def update(self, batch, *, networks_to_update): # 两部分数据在 loss 计算中被完全同等对待 loss_fns = self.loss_fns(batch) # 统一计算 loss

3.3 CTA Ratio:用计算换效率

cta_ratio(Critic-to-Actor Ratio)是 RLPD 采样效率的核心引擎。它代表每次 Actor 更新前 Critic 更新的次数:

# cta_ratio=2(HIL-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 batch
2(HIL-SERL 默认)21
4(serl-main 默认)41

为什么先更新 critic 而不是一起更新?因为 actor 依赖 critic 提供的 Q 值来更新策略。如果 critic 还没通过多次拟合看清 Q 值的分布,让 actor 对着"半吊子 Q"去更新就是瞎改。每次 critic 更新都用 50/50 混合 batch,保证两类数据对 Q 值估计的影响力始终保持均衡。

3.4 SAC 与 DQN 的混合训练

RLPD 训练脚本能同时处理纯 SAC(连续动作)和混合 SAC+DQN(连续+离散动作):

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-Dagger

  • Dagger 的解法(事后补救):
    • 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_iteratordemo_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() # 监督学习,只看动作对齐
http://www.jsqmd.com/news/1138015/

相关文章:

  • 告别网络限制:VBrowser-Android视频缓存解决方案
  • 如何轻松为任何游戏注入自定义插件:终极ASI加载器完整指南
  • Java毕设选题推荐:基于 SpringBoot 的家政订单预约管理系统的设计与实现 基于 SpringBoot+Vue 的家政人员资质审核系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Kindle Comic Converter终极指南:将漫画完美适配电子墨水屏的免费工具
  • Monaspace代码字体深度解析:5大核心技术提升编程效率
  • 3步高效解锁加密视频:用res-downloader轻松下载全网热门资源
  • 告别重复点击:MouseClick鼠标连点器如何3分钟提升你的工作效率5倍?
  • DVWA暴力破解实战:从Low到Impossible的攻防演进与防御策略
  • 免疫平衡的“黄金四象限“:IFN-γ/IL-17/IL-4/TGF-β1 Panel构建Th检测体系
  • IS31FL3731与PIC18LF27J13的LED矩阵驱动方案
  • 【深度学习】PyTorch 图像分类进阶:从本地脚本到 Flask Web 服务部署
  • 手机号码定位查询:3分钟实现号码归属地精准查询的完整教程
  • FPGA FIFO一篇完整解释
  • PIC18F8520驱动WS2812:硬件SPI与DMA的精准控制
  • 大鼠骨髓间充质干细胞(BMMSCs),云克隆现货可订,从武汉到全球,数十个国家的实验室已经在用
  • 工业级条码扫描系统架构与优化实践
  • 呵护一生模式商城软件开发(现成案例)
  • MAX9744与PIC18F4455构建高效D类音频放大器方案
  • Agentic AI与提示工程架构:构建医院门诊智能体协同系统的实战解析
  • 如何快速掌握Wwise音频处理:面向游戏开发者的完整实战指南
  • PIC18F86J55与IS31FL3731的LED矩阵控制方案
  • 计算机Java毕设实战-基于前后端分离的保姆服务预约管理系统的设计与实现 基于 SpringBoot 的智慧家政服务平台【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 如何在5分钟内掌握UE4SS:无需源码的Unreal Engine游戏修改终极指南
  • 智能代码审查实战:用AI辅助Java后端代码质量管控
  • MediaCrawler:5分钟上手,一站式采集小红书、抖音、B站等主流平台数据
  • Codex CLI 国内怎么安装配置?从环境准备到跑通项目的完整教程
  • UOS Libvirt Exporter源码解析:深入理解Go语言实现的监控采集器
  • 实战指南:3步掌握LibreCAD开源CAD软件,告别商业软件依赖
  • 员工分布不同城市管不过来?跨区域灵活用工选人力资源服务看四个硬指标
  • 偶信DVL 300K可适配ROV、AUV水下航行器各类复杂作业工况吗?