首页 > 教程攻略 > ai教程 >【机器人 / 强化学习】HIL-SERL 算法篇:DQN + SAC 混合架构的实现哲学

【机器人 / 强化学习】HIL-SERL 算法篇:DQN + SAC 混合架构的实现哲学

来源:互联网 时间:2026-07-01 08:40:03

【机器人 / 强化学习】HIL-SERL 算法篇:DQN + SAC 混合架构的实现哲学

0x00 概要

HIL-SERL不是一个单一的算法,而是一套高度集成的混合强化学习系统。它把SAC、DQN、二值分类器以及人类干预数据巧妙组合在一起——SAC负责让机器人的手臂灵动起来,DQN让夹爪更果断,二值分类器替代了繁琐的手工奖励设计,而人类干预数据则弥合了强化学习探索与行为克隆模仿之间的鸿沟。接下来,我们从算法角度逐层拆解它的设计逻辑。

HIL-SERL-train

0x01 HIL-SERL 的总体算法思路

1.1 HIL-SERL 的算法基因图谱

HIL-SERL的核心算法血统是一条清晰的工程叠加链,每个组件都在解决真实世界强化学习中的一个具体痛点:

  • SAC

    提供了样本高效的连续控制基类,通过熵正则化保证探索的稳定性。
  • RLPD

    通过50/50的混合采样(在线数据 + 演示数据)和高UTD(更新-数据比)比率,让SAC能同时利用离线专家数据和在线交互数据进行训练,解决了从零开始RL时样本效率不足的问题。
  • HIL-SERL

    则在RLPD的基础上叠加了三层工程创新:人类实时纠正(解决RL在真实环境中探索成本过高)、混合动作空间(解决夹爪连续输出时犹豫不决的问题)、以及二值分类器奖励(解决复杂视觉任务中奖励工程困难的问题)。

更具体地说,这段演进路径可以概括为:马尔可夫决策过程框架 → SAC(最大熵RL)→ 引入离线专家数据(RLPD)→ 叠加人类实时纠正(SERL + HIL)→ 最终形成HIL-SERL,一个面向高精度灵巧操作的完整解决方案。

1.2 三类预训练/先验机制

HIL-SERL包含了三类“预训练/先验”机制,每一类都针对不同层面的冷启动问题:

  1. 视觉编码器使用ImageNet-1K预训练的ResNet-10,解决真实图像复杂度高、从头训练数据效率太低的问题。
  2. 每个任务单独训练一个奖励分类器(reward classifier),解决奖励函数难以手工设计的问题。
  3. 通过少量人类演示轨迹做行为克隆预训练或RLPD加速,解决RL冷启动时探索盲目性的问题。

但这些先验都不是“跨机器人形态、跨任务的通用价值函数”,它们是任务特定的、工程导向的先验。

1.3 HIL-SERL 的训练流程

整个训练过程可以划分为四个阶段:

阶段一:离线准备

。人类通过遥操作收集两类数据:200张成功图像加1000张失败图像用来训练奖励分类器(约需5分钟),以及20-30条成功演示轨迹用来初始化演示缓冲区(Demo Buffer)。

阶段二:专家Q函数预训练(Offline)

。在离线演示数据上执行标准贝尔曼备份来训练Q_exp(s, a),用于初始化在线Critic。这一步能有效防止在线训练启动时Critic从零开始、估值盲目。

阶段三:在线HIL-SERL训练

。策略在执行过程中,如果机器人出错或卡住,人类通过SpaceMouse实时接管。接管产生的干预数据会被存入双通道回放缓冲区。SAC策略更新时采用RLPD的50/50采样方式和Q_exp先验引导。干预频率会随着策略提升逐步下降,直到策略自主完成任务。

阶段四:部署

。训练好的策略被部署到真实机器人。由于策略通过RL而非纯行为克隆训练,它学会了比人类操作更快的动作模式——论文报告可以达到约1.8倍的人类速度。

训练循环

HIL-SERL-HIL-SERL 训练循环

训练数据流

HIL-SERL-训练数据流

1.4 为什么 HIL-SERL 能超越模仿学习

论文报告显示HIL-SERL相比模仿学习基线有显著提升。我们来拆解一下背后的机制:

模仿学习有个根本局限——行为克隆训练的是“在专家状态下输出专家动作”。一旦机器人偏离了专家状态,面对未曾见过的分布外状态,它无法有效恢复。而HIL-SERL的破解之道在于:人类纠偏正好发生在策略出错的时刻。这些数据不是普通的演示,而是“从错误状态中恢复”的演示,这对解决复合误差非常有效。

此外,RL还能优化速度和路径。论文强调HIL-SERL不仅能提高成功率,还能降低循环时间。RL不只是模仿人类的路径,它可以在任务奖励驱动下探索更快、更适合机器人的动作模式。人类操作时难免有冗余动作——手抖、犹豫、绕路,而SAC的目标是最大化Q值,在训练中会自然发现“更短、更直”的路径。

0x02 核心算法:RLPD + 人类干预

2.1 RLPD 的"干预版"

HIL-SERL仍然以RLPD为核心,但数据来源发生了变化。传统RLPD只使用开始阶段采集好的演示数据,而HIL-SERL在训练过程中通过人类干预不断注入新的高质量数据。如果人类发现机器人要搞砸了,可以用SpaceMouse实时接管,这些接管数据会被存入缓冲区。

算法本质依然是带有高UTD和层归一化的SAC,但它通过人类干预解决了RL在复杂任务(如插拔正时皮带、组装仪表)中“探索不到成功状态”的难题。

HIL-SERL-RLPD

为什么50/50采样有效?在线数据提供最新的状态覆盖,让Critic学习到当前策略分布下的价值;演示数据(含干预数据)则提供高价值的恢复轨迹,防止Critic忘记专家先验。两者缺一不可。

2.2 BC Loss 的作用

rlpd.py中有一行bc_loss(行为克隆损失)。在更新Actor时,如果不仅让它最大化Q值,还强制让它模仿演示数据里的动作,这对训练初期的稳定性非常有帮助。

为什么BC Loss能稳定初期训练?因为模仿学习的“真理信号”来自人类演示,而不是来自不一定靠谱的自奖励网络。当Q值萎缩到0时,SAC的损失会变成“最大化熵”的目标,智能体为了最小化损失会胡乱甩动,彻底忘记人类教过什么。BC Loss的引入正是为了防止这种退化。

2.3 训练数据流的双通道设计

HIL-SERL-双流

0x03 混合动作空间:SAC + DQN

HIL-SERL的作者发现,用SAC去控制夹爪的“开关”这种二进制动作,效率很低,因此单独拆了一个DQN专门练“抓取评价”。SAC负责控制机械臂的6D末端位姿(连续动作),通过正则化探索得“平滑”;DQN专门负责控制夹爪的开/关(离散动作),采用“抽风式”探索——大部分时间选最好的,小部分时间随机乱选一个动作。

这解决了机器人操作中一个非常现实的矛盾:手臂需要丝滑的连续移动,而手指(夹爪)通常只需要果断的开关动作。

3.1 为什么要"分而治之"?

机器人操作的动作由两个截然不同的部分组成。机械臂运动是连续空间——手臂需要在三维空间中精确移动,位置坐标是连续的实数。SAC的高斯策略通过输出均值和方差,天然适合这类“具有无限可能性的平滑运动”。夹爪动作是离散空间——通常只有两到三个离散状态:张开、保持、闭合。如果用SAC的连续输出去拟合,会产生类似0.13、-0.27的中间值,夹爪执行时被阈值化,学习信号不稳定。更重要的是,“何时闭合夹爪”是一个非常关键的离散决策——闭早了抓空,闭晚了错过物体。

这就引出了一个自然的设计:用SAC给机器人灵动的手臂,用DQN给机器人果断的夹爪。

3.2 SAC + DQN 如何协同工作

在HIL-SERL的网络中,SAC和DQN不是两个独立的进程,而是同一个主干下的两个分支。所有相机图像经过共享权重的ResNet-10编码后,与本体感受的MLP编码拼接,输入共享的MLP头部。SAC分支输出均值μ和方差σ,采样得到连续的增量位移向量(单臂6维,双臂12维)。DQN分支(GraspCritic)输出3个Q值(关/保持/开),通过argmax选出最大Q的动作。虽然算法不同,但它们在同一个训练循环中被同步优化。

具体来说,HIL-SERL在这些任务中分别求解两个马尔可夫决策过程,连续动作空间和离散动作空间都接收来自环境的相同状态观测。连续空间的Critic更新遵循标准DQN方法,并引入额外的目标网络以稳定训练。在训练或推理时,HIL-SERL首先从策略中查询连续动作,然后通过对Critic输出取argmax获得离散动作,最后将连接后的动作应用于机器人。

3.3 Rollout 时的配合

sample_actions方法中,两个分支的协作流程非常清晰。连续控制分支的推断符合经典SAC范式——只依赖Actor网络,Critic不参与推理。离散控制分支则不同——由于没有独立的Actor网络,GraspCritic在推理时直接充当“决策者”,通过argmax选出最优离散动作。

3.4 训练时的配合

训练时,SAC和DQN使用不同的损失函数和不同的回传目标,但共享同一套观测编码。这使得奖励实现了明确分工:SAC Critic只关心末端执行器的连续动作价值,GraspCritic则额外学习“不要做无意义夹爪动作”的惩罚信号。

3.5 输出维度对比

设计者把动作空间拆成了两部分:前6维连续动作由SAC Actor输出,最后1维夹爪动作由GraspCritic选择。在update中,agent明确要求单臂动作维度为7。针对不同机器人配置,具体输出维度的对比清晰反映了任务差异——单臂时SAC输出6维,DQN输出3维,最终动作7维;双臂时SAC输出12维,DQN输出9维,最终动作14维。

3.6 SAC vs DQN:靶向设计

两者在目标计算上的差异反映了各自面对的不同问题域。DQN的目标采用“硬最大”方式——它假设下一时刻一定选分数最高的动作。因为动作空间是离散且极小的(2-3个),通过目标网络的缓慢更新已经能抵消大部分高估问题。SAC的目标采用“软预期”方式——它不选最高的,而是对当前策略输出的所有可能动作求期望,并加上熵奖励。面对无穷多个连续动作,SAC必须用“双网络取最小值”来暴力压制高估。这个区别反映在代码上就是:DQN找最大值,SAC则需要从Actor里采样一个动作出来算Q值。

0x04 GraspCritic:夹爪离散决策网络

GraspCritic是HIL-SERL中一个关键但容易被忽视的设计。它不是普通SAC里的Critic(s, a),而是一个只输入观测、不显式输入动作的离散动作Q网络。

4.1 定位与架构

GraspCritic的输入输出结构很简单:输入观测(无动作),输出3个Q值,对应夹爪开/保持/关。训练时采用DQN式目标计算——在线网络选动作,目标网络评估动作价值,奖励则包含batch["rewards"]加上batch["grasp_penalty"]。网络结构同样采用ResNet-10加MLP,但MLP维度比Critic小(单臂为[128, 128]),因为它只需要学习夹爪的离散决策,不需要建模连续动作的精细价值。

因此,GraspCritic的输出可以理解为对当前状态下夹爪应该“关、保持、还是开”的未来价值评估。

4.2 为什么需要单独的 GraspCritic?

考虑一个完整的动作向量[x, y, z, roll, pitch, yaw, gripper]。前6维是连续控制,SAC的高斯策略天然适合。但最后一维夹爪本质上不是平滑连续信号。如果把夹爪也塞进连续的SAC Actor里,会出现三个问题:第一,动作语义离散但策略输出连续,SAC会输出类似0.13、-0.27这样的值,夹爪真实执行时被阈值化,导致学习信号不稳定;第二,夹爪动作稀疏且关键——“什么时候闭合夹爪”是一个关键离散决策;第三,夹爪误操作需要额外惩罚,代码里有grasp_penalty专门惩罚不必要的开合动作。所以这份实现把动作空间拆开,连续末端执行器动作由SAC Actor加SAC Critic学习,离散夹爪动作由GraspCritic用DQN风格学习。

4.3 学习原理:Double DQN 风格的离散动作价值学习

GraspCritic的训练采用DQN式贝尔曼回归,但代码里更接近Double DQN:先用在线GraspCritic选择下一步最优夹爪动作,再用目标GraspCritic评估这个动作的Q值,然后构造目标值(包含grasp_penalty),当前网络只取实际执行的夹爪动作对应的Q,最后用均方误差做时序差分回归。

4.4 GraspPenalty 的工程意义

可以通俗地理解:夹爪已经开得很大还继续开,或者已经关得很紧还继续关——这种动作没有实际意义,甚至可能损坏硬件。GraspPenalty就是专门给这类无意义夹爪动作施加的额外惩罚。这类惩罚不适合直接影响SAC Critic(因为它专注于连续动作的价值),但非常适合训练GraspCritic的离散决策。

4.5 SACAgentHybridSingleArm 的完整组件架构

SAC和GraspCritic在同一个Agent中统一管理,包含四个共享视觉编码器的网络组件:Actor网络输出6维连续动作,Critic网络输出Q值,GraspCritic网络输出3个Q值,Temperature网络负责自动调温。在create_pixels中,agent会在网络集合里额外注册grasp_critic,并给它单独配置优化器。训练脚本中,混合Agent的train_critic_networks_to_update同时包含criticgrasp_critic,完整训练阶段则更新全部四个网络。

0x05 奖励系统:二值分类器

HIL-SERL的奖励设计非常务实。对所有任务,他们采用稀疏奖励函数,该函数使用训练过的分类器对任务是否成功进行二元判定。为了让机器人能无人值守地进化,HIL-SERL引入了基于视觉的自动裁判,采用对比学习架构,预先拍摄少量成功和失败的照片训练一个轻量级卷积神经网络。双重反馈机制中,分类器实时给出0或1的信号,人类接管时系统自动插入一个负奖励。这套组合让机器人具备了“自知之明”,即使没有复杂的传感器,也能通过摄像头知道自己刚才干得怎么样。

5.1 为什么是稀疏二值奖励?

除非特别说明,HIL-SERL对所有任务都采用稀疏二元奖励:成功为1,未完成则为0。没有连续的中间进度信号,没有复杂的奖励塑形。代码中有明确声明:“we are using a sparse reward function.”

5.2 为什么稀疏奖励也能工作?

按常识来看,稀疏奖励非常难学——机器人如果很久得不到1,就不知道怎么改进。HIL-SERL能让稀疏奖励工作,关键不在奖励本身变密集,而在于人类干预提供了正确的动作轨迹:稀疏奖励告诉系统“最终有没有成功”,人类纠正则告诉系统“在错误状态下应该怎么做”。两者结合弥补了纯稀疏RL的探索困难。

5.3 奖励分类器架构

图像输入经ImageNet预训练的ResNet-10(冻结权重)后,通过8个可学习空间块池化,再经过256维全连接层、层归一化和tanh激活,最后输出logit并经过sigmoid转换为概率。关键设计在于ResNet-10冻结,只训练池化层加MLP头部,参数量极小(约50K),训练极快。

5.4 如何处理置信度

采用硬阈值,没有降级处理。硬阈值够用的原因是:分类器训练数据充足,加上ResNet-10预训练特征能力强,实际部署中置信度分布高度双峰——要么接近0,要么接近1,很少落在模糊区间。

5.5 两个关键设计点

第一,正负样本强制1:1采样。如果按真实比例,失败样本远多于成功样本,直接训练容易得到一个“永远预测失败”的假高准确率分类器。强制平衡采样让模型真正学习成功和失败状态的视觉差异。第二,图像随机裁剪增强。不让模型只记住“物体刚好在图像第123个像素位置就是成功”,而是学会“物体插入后的视觉结构长什么样”。

5.6 为什么不用 DrQ / VICE?

HIL-SERL的选择不是技术上的不能,而是工程上的权衡。DrQ的核心是靠小尺度裁剪、平移来增强小模型视觉能力,而HIL-SERL采用更强的ResNet-10预训练权重,并在数据进入缓冲区前做简单的随机裁剪,而不是在损失层进行复杂的一致性约束——对真机任务而言,“轻量级增强配合高UTD”已经足够。VICE是为了解决“没人给分怎么办”而发明的,需要提前拍几百张照片训练裁判,且裁判容易误判。HIL-SERL认为,人类的干预信号是比VICE判别器质量高得多的信号。

5.7 train_reward_classifier.py

train_reward_classifier.py脚本是HIL-SERL中非常关键的一个环节。真实机器人任务往往没有天然的密集奖励,比如RAM是否插到底、USB是否插入端口,这些靠传统状态量很难稳定判断,所以项目用视觉分类器来学习一个任务成功判别器。它不是在训练通用价值函数,而是在为某个具体机器人任务训练一个视觉成功判别器(二分类器),输入观测图像,输出任务成功概率logit,把真实机器人的稀疏任务成功条件转化为RL可用的奖励。

训练目标是二元交叉熵。它没有输入动作,没有做贝尔曼备份,更没有估计Q(s, a)或V(s),因此它不是RL里的Critic或价值函数,而是视觉成功检测器——观测到成功概率,作用更接近“自动奖励标注器”。

使用的架构是ImageNet预训练视觉编码器加任务级奖励分类器,再加任务级在线SAC/RLPD Critic训练,以及可选的行为克隆预训练。其中ImageNet ResNet是视觉特征预训练,不是操作价值函数预训练;奖励分类器是任务成功检测器,也不是贝尔曼意义上的价值函数。

在训练RL时,环境会加载对应任务目录下的奖励分类器检查点,然后把分类器输出转换为奖励。例如,RAM插入任务中,奖励的定义是sigmoid分类器输出大于0.85且z位置高于某个阈值。最后用wrapper替换环境奖励,每一步调用分类器奖励并覆盖环境原始奖励。

这种设计有几个明显优势:任务奖励定义简单,机器人真实任务的奖励很难手写,用视觉二分类器替代人工规则可以快速适配新任务;和HIL流程契合,人类只需要采集成功/失败样本,不需要设计复杂的奖励塑形;正负样本平衡采样每批次各一半,避免类别不平衡带偏;使用预训练视觉编码器,尤其在分类器数据不多时很有帮助。

但也存在局限:它是任务特定的,每个任务有自己的分类器数据和检查点,不能天然迁移;它只判断当前状态,不建模未来,不能替代SAC Critic;如果分类器出现误判,会直接污染RL奖励,需要补采针对性数据。

0x06 SACAgentHybridSingleArm:单臂混合动作 SAC Agent

SACAgentHybridSingleArm不是纯粹的SAC,而是SAC加DQN的混合体——用SAC输出连续末端执行器动作,用GraspCritic(DQN风格)输出离散夹爪动作。它解决了机器人操作中手臂需要丝滑连续移动、而手指通常只需要果断开关动作的现实矛盾。

6.1 组件架构

SACAgentHybridSingleArm是一个单臂混合动作强化学习Agent,代码注释说得很直接:“Compared to SACAgent, this agent has a hybrid policy, with the gripper actions learned using DQN. Use this agent for single arm setups.”它的内部由共享同一视觉编码器的四个网络组件构成。与双臂版本的主要区别在于:Actor输出6维(vs 12维),GraspCritic输出3维(vs 9维),且GraspCritic的MLP维度更小。

6.2 相比普通 SACAgent 的关键差异

普通SACAgent的Actor输出完整动作,Critic接收完整动作。但SACAgentHybridSingleArm做了三层动作拆分。第一层,连续动作由SAC Actor输出——初始化策略时,action_dim被设为环境动作维度减1。如果环境动作是7维,Actor只输出前6维末端执行器的连续控制量。第二层,普通Critic也只评估连续动作——Critic初始化时只用去掉夹爪的动作。这意味着普通SAC Critic学习的是Q(s, [连续动作]),而不是Q(s, [连续+离散动作])。第三层,夹爪动作由GraspCritic单独学习——在网络集合里额外注册grasp_critic,并给它单独配置优化器。

6.3 动作执行流程(Rollout)

sample_actions是SAC Actor和GraspCritic配合最直观的接口。执行流程分为四步:Actor采样连续末端执行器动作(前6维);GraspCritic输出3个夹爪Q值;argmax选择夹爪动作,映射为{-1, 0, 1};拼接成完整7维动作。连续控制分支的采样符合经典SAC范式,离散控制分支则由GraspCritic直接充当“决策者”。

6.4 训练流程

SACAgentHybridSingleArm.loss_fns返回四个独立的损失:Critic损失、GraspCritic损失、Actor损失、Temperature损失。训练脚本中,混合Agent的更新分为两个阶段——Critic训练阶段同时更新Critic和GraspCritic,完整训练阶段更新全部四个网络。

Critic损失(连续动作SAC)采用Clipped Double-Q方式计算目标Q。GraspCritic损失(DQN风格)采用Double DQN方式——在线网络选动作,目标网络评估动作价值。Actor损失是标准SAC方式,采样连续动作最大化目标。Temperature损失自动调节,保证策略熵不低于目标值。

6.5 Reward 的分工设计

这是混合Agent中最精妙的工程细节之一。普通SAC Critic的目标使用batch["rewards"],而GraspCritic的目标使用batch["rewards"] + batch["grasp_penalty"]。设计意图很明确:夹爪网络不仅要学习任务成功奖励,还要特别学习“不要做无意义夹爪动作”。这类惩罚不适合影响机械臂连续运动的SAC Critic,因为加上夹爪惩罚会混淆它对末端执行器动作质量的判断。但GraspCritic专门学习夹爪的离散决策,加上grasp_penalty可以更精准地训练“什么时候该夹、什么时候该放”的策略。

6.7 配合全景图

SACAgentHybridSingleArm-配合

6.8 使用场景

训练脚本中,当配置为'single-arm-learned-gripper'时创建SACAgentHybridSingleArm。对应的回放缓冲区也会额外存储grasp_penalty字段,这意味着整个数据链路——从环境采集、缓冲区存储到损失计算——都为这个混合设计做了适配。

0x07 训练稳定性机制

人类干预会导致Q值跳变——干预瞬间,策略动作被替换为人类动作,但Q网络对人类动作的估值可能极不准确。HIL-SERL没有针对干预做特殊的稳定处理,而是依靠SAC自身的通用机制:软目标更新(τ=0.005)让目标网络缓慢更新防止Q值突变,REDQ最小Q(10网络取最小值)防止Q值过估计,Clipped Double-Q取两个Q网络的最小值。这些机制足够稳定训练的原因是:软更新极慢,Q值不会突变;最小Q集成抑制过估计;50/50采样中干预数据只占一半,被在线数据稀释。

7.1 熵正则防止动作单一化

SAC的温度参数α自动调节,保证策略不退化。当策略熵低于目标值时α增大,增加探索;策略熵高于目标值时α减小,减少探索。此外,高斯策略输出自带随机性,DrQ数据增强通过随机裁剪观测间接增加策略多样性。值得注意的是,在纯行为克隆训练的HG-Dagger中没有熵正则,训练越久策略越像人类示范,没有机制防止动作单一化。

7.2 动作平滑性:靠硬件不靠 Loss

损失函数中不包含任何动作平滑性约束。平滑性保护完全由环境层和硬件实现:动作裁剪、安全盒、ROS阻抗控制器的1kHz内环平滑滤波、增量控制(动作是增量位姿而非绝对位姿)、10Hz Python外环加1kHz ROS内环,这些协同工作确保执行安全。

7.3 持续训练,不等待干预

HIL-SERL-持续训练

缓冲区达到阈值后,学习器进入固定步数的循环,每步都从已有缓冲区中随机采样训练,不等待新数据到达。干预数据只是填入演示缓冲区,训练循环完全无感知。

0x08 总结:算法的基因与局限

HIL-SERL的算法设计可以拆解为三层基因:底层是SAC加RLPD提供样本效率和离线策略稳定性;中间层是SAC加DQN的混合动作空间;顶层是人类在环增强,包括干预数据双通道和奖励分类器,补足稀疏奖励并解决探索瓶颈。

HIL-SERL实现了“超人”的表现——比人操作快1.8倍,原因在于SAC的路径优化能发现比人类更短更直的轨迹,10Hz高频控制没有人的神经反射延迟限制,一旦学会机器人能以电机速度精准复现。

但作为算法体系,HIL-SERL仍有几个明确局限:它是任务特定的——每个任务需要新分类器和新演示;动作表示仍然是高斯SAC,而非生成式模型;缺乏多任务泛化能力——没有语言条件控制。这些局限正是后续工作试图解决的。

0xFF 参考

HIL-SERL——结合“人类离线演示、在线策略数据、人工在线干预”的RL方法:直接真实环境中RL开训,可组装电脑主板和插拔USB。