SERL:让真机强化学习从“难用”走向“可复现”的强化学习框架 ----(4)算法篇(DrQ vs VICE)

发布时间:2026/6/30 3:55:29
SERL:让真机强化学习从“难用”走向“可复现”的强化学习框架 ----(4)算法篇(DrQ vs VICE) 要介绍 DrQ 和 VICE机器人必须通过像素看世界DrQ 解决了视觉特征提取的泛化难题。VICE 解决了真实世界没有代码奖励的问题让机器人拥有了成就感。注本系列的最终目标是“通过一系列相关项目/算法的解读来深入学习/分析/反推 LWDLearning while Deploying这篇论文的机理和可能实现”。之所以从SERL入手是因为 SERLHIL-SERLSOP没有开源都是罗剑岚博士的一系列论文可以从中管窥作者的思路脉络。本文依然是从工程/论文进行反推还请读者不吝指出问题多谢。0x01 奖励与自动化从手写 reward 到 learned reward真实机器人任务的 reward specification 是 SERL 重点解决的问题之一。某些任务可以用机器人状态直接定义例如 PCB 插入可以根据末端或物体位置设计奖励在这种情况下奖励函数可以由一个二元分类器提供该分类器接收状态观测 s 并输出一个二元” 事件”e发生的概率对应于任务的成功完成。奖励随后由 r(s) log p(e|s) 给出。但多数任务需要从图像中判断是否完成。比如电缆是否正确卡入槽位物体是否被放到正确 bin 里往往需要视觉判定手工设计一个好的奖励函数本身就是一个耗时且需要领域专长的任务。SERL 支持三类奖励方式手写奖励适用于状态足以判断成功的任务二分类成功判别器用成功/失败图像训练 classifierVICE把 reward classifier 与 RL 过程结合在训练中利用策略产生的负样本更新分类器1.1 Success Classifier用少量图像训练自动裁判用户可以采集少量成功与失败图片训练一个轻量视觉分类器。该分类器在训练过程中输出成功概率或二值 reward。即人只需要定义成功 / 失败样本之后系统就能自动在训练中判断 reward。这就是自动裁判Success Classifier:Success Classifier 是离线训练专用是简单的端到端结构架构 基于轻量级视觉分类器利用少量正负样本图像快速预训练。职责 在训练过程中实现 Reward 自动化使系统具备无人值守的自我优化能力。流程: 先收集正/负样本 pkl → BCE loss 训练 ResNet-10 冻结 MLP head → 保存 checkpoint → 加载到 env wrapper 中作为固定奖励函数这里需要注意SERL 不是完全不需要 reward而是提供了工具让 reward specification 更容易、更自动化。SERL 的目标不是消除 reward 设计而是降低 reward engineering 的成本。1.2 VICE把奖励分类器也纳入训练VICE 将奖励学习看成类似 GAN 的过程策略像 generator不断产生新样本reward classifier 像 discriminator判断哪些状态是成功事件。这样随着策略分布变化classifier 可以用策略产生的新负样本继续训练避免只在初始数据上过拟合。这种设计让奖励系统能够自适应策略的进化。初始阶段classifier 在人类标注的样本上训练随着策略能力的提升classifier 可以从策略产生的经验中学习更细粒度的成功模式实现奖励的持续改进。VICE 是在线训练 支持 return_encoded / classify_encoded 模式serl-main/serl_launcher/serl_launcher/agents/continuous/vice.pyVICEAgent 继承自 DrQAgent, 分类器嵌入 agent 内部, 与 RL 训练交替在线更新额外正则化: Mixup Label Smoothing Gradient Penalty0x02 DrQ vs VICE在具身智能和强化学习的语境下DrQ 和 VICE 是两套针对不同痛点的经典 Agent代理架构。简单来说DrQ 是为了 看得更清而 VICE 是为了 罚得更准。VICE上帝之眼解决是否到达通过分类器提供平滑、客观的奖励信号。视觉鲁棒性DrQ随机裁剪对 s 和 s′ 使用不同偏移强迫网络学习物理特征而非像素坐标。共享编码器Actor 和 Critic 共用 ResNet-10加速特征收敛。这样可以视觉与硬件包装眼手合一。2.1 DrQ Agent (Data-regularized Q-learning)用途解决 从图像直接学习动作Pixel-to-Action 时的样本效率和泛化问题。它的痛点 如果直接把原始图片丢给 RL 模型机器人很容易 只看局部或者因为光线变了一点就完全不会动了。核心特色图像增强Data Augmentation 一致性。做法机器人每看到一张图DrQ 会在后台生成它的几个 微调版比如随机裁剪 4 个像素、稍微改变亮度。Q-Learning的一致性 DrQ 强制要求模型对这几张 微调版 照片预测出的 Q 值必须是一样的。优点极强的稳定性 DrQ 像是在训练时给机器人戴上了各种滤镜强迫模型学会看透事物的本质特征。极高的样本效率 即使数据量很少通过图像增强模型也能学到稳健的特征。2.2 VICE Agent (Variational Inverse Control with Events)用途 解决 自动定义奖励Reward 的问题特别是针对那些难以用数值描述的 事件。它的痛点 你怎么告诉机器人 盖子盖紧了你很难写代码去算角度。核心特色反向学习Inverse RL 事件判定。做法 开发者给机器人看一堆 成功的快照。比如 20 张盖好盖子的照片。VICE 会通过这些照片训练一个判别器Classifier。特色奖励 在机器人自己尝试时VICE 会根据它当前的画面 多像 那堆成功快照自动产生一个 θ 到 1 之间的分值。优点零代码定义 Reward 只要有成功的照片你就拥有了奖励函数。事件 驱动 它的逻辑是 我只要结果那个状态非常适合解决那些结果明确但过程复杂的任务如扣上纽扣。2.3 Agent体系在 SERL 中SACAgent 是核心基类。2.3.1 SACAgent 核心机制SACAgent 核心机制功能critic_loss_fn()Clipped Double Q ensemble min 可选 entropy backuppolicy_loss_fn()标准 SAC actor 目标Q−a⋅logπtemperature_loss_fn()Lagrange 乘子自动调温update_high_utd()关键优化UTD ratio 多次 critic 更新 1 次 actor 更新用jax.lax.scan实现 JIT 内循环update()支持选择性更新子网络networks_to_update参数2.3.2 继承体系DrQAgent 和 VICEAgent 是 SACAgent 的子类。这意味着它复用了 SAC 的所有稳定机制双 Q、熵自动调节只是在输入端加了一层图像处理逻辑。DrQAgent 增强 (drq.py)对 observations 和 next_observations 做 random crop 数据增强支持 3 种编码器small (4 层 CNN)、resnet从零训练、resnet-pretrainedImageNet 预训练 ResNet-10 冻结 可训练 pooling headVICEAgent 奖励学习 (vice.py)用 Binary Classifier 替代手工奖励函数训练技巧Mixup Label Smoothing Gradient Penalty防 GAN 模式崩塌推理时sigmoid(logit) 0.5 → reward1, 否则 reward0SACAgent (sac.py:21) ├─ create_pixels() → 像素输入共享/独立编码器 └─ create_states() → 状态输入无编码器 └─ DrQAgent (drq.py:23) 继承 SACAgent ├─ create_drq() → 支持 small/resnet/resnet-pretrained 编码器 ├─ data_augmentation_fn() → 随机裁剪增强 ├─ update_high_utd() → 高 UTD 比率训练关键优化 └─ update_critics() → 仅更新 Critic └─ VICEAgent (vice.py:26) 继承 DrQAgent ├─ create_vice() → 额外 VICE 分类器网络 ├─ update_vice() → BCE Mixup Label Smoothing 梯度惩罚 ├─ vice_reward() → 用分类器替代手工奖励 └─ update_high_utd() → 用 VICE 奖励替换环境奖励2.4 深度对比表特性DrQ AgentVICE Agent主要任务视觉表征学习把图看透。奖励函数生成把分打准。核心技术随机裁剪、平移Augmentation。基于正负样本的对抗学习 / 判别。解决的难题图像噪声、过拟合、泛化差。奖励函数难写、信号稀疏。在 SERL 里的位置作为视觉主干Backbone的增强。作为自动裁判Reward Classifier的原型。0x03 DrQ让视觉 RL 更稳健真实机器人通常使用图像观测。如果直接用像素训练视觉过拟合会非常严重。DrQ 的核心是对图像做数据增强例如 random crop让策略不要记住某个固定像素位置而是学到更鲁棒的视觉特征。SERL 的DrQAgent在 SAC 基础上增加了图像增强和视觉编码器支持。3.1 数据增强的作用DrQ 最重要的特性是 random crop 数据增强。这在真实机器人环境中尤为关键视觉正则化阻止模型记住绝对像素位置强迫其学习鲁棒的空间特征对真实世界的适应性真实环境中光照、背景、物体位置都会有微小变化数据增强让模型对此具备天然的泛化能力特色解释为什么 DrQ 在 SERL 中不可或缺像素级鲁棒性如果没有 DrQ 的数据增强机械臂只要位置偏了一点或者光照变了一下RL 就会失败。DrQ 通过随机裁剪让网络学会关注物体本身而不是物体在图像中的绝对坐标。极致的性能在 update_high_utd中可以看到 DrQ 是在进行高 UTD 更新之前先做一次数据增强。细节由于 batched_random_crop 是在 JAX 内部实现的它运行在 GPU 上。相比于在 CPU 上做增强再传给 GPU这节省了巨大的数据传输开销。论文实验中使用了 ImageNet 预训练 ResNet-10 作为视觉 backbone并连接到 MLP。观测包含相机图像和机器人本体信息例如末端位姿、速度、力、力矩等。3.2 视觉编码器体系3.2.1 EncodingWrapper特征融合 设计EncodingWrapper是 SERL 处理视觉和本体感知输入的核心封装多图像键支持dict of encoders帧堆叠处理rearrange(image, T H W C - H W (T C))和rearrange(image, B T H W C - B H W (T C))本体感知融合Dense → LayerNorm → tanh → concatstop_gradient支持允许冻结视觉编码器将视觉像素与本体感知关节角度拼接。视觉告诉你物体在哪本体感知告诉你手在哪。眼手合一是精细操作的前提。编码器选项SmallEncoder4 层 Conv (32→64→128→256) Spatial Softmax bottleneckResNet-10 (from scratch)10 层 ResNet Spatial Learned EmbeddingsPreTrained ResNet-10ImageNet 预训练冻结 可训练 pooling headSpatial Softmax / Spatial Learned Embeddings是一个关键设计它们将卷积特征图转为空间坐标的加权期望保留空间信息同时大幅降维。这比全局池化更能保留空间位置信息对机器人视觉任务至关重要。3.2.2 视觉 - 本体感知 Fusion 详解在 SERL 中观测数据结构如下observations { image1: (T, H, W, C), # 相机1图像帧栈 image2: (T, H, W, C), # 相机2图像帧栈 state: (T, D), # 本体感受 (tcp_pose, tcp_vel, gripper, force, torque) }EncodingWrapper的处理流程如下Late Fusion 设计视觉和本体感受各自独立编码最后拼接。这不是 Early Fusion而是有深刻的设计考量模态异质性图像是 2D 空间信号适合卷积state 是 1D 向量适合全连接梯度隔离Late Fusion 允许对视觉编码器做stop_gradient冻结视觉特征只训练本体感受分支本体感受的 LayerNorm tanhstate 的各维度量纲差异大位置 vs 速度 vs 力归一化到统一尺度限制范围避免梯度爆炸3.2.3 多任务接口条件代码中预留了但未使用的多任务接口功能状态GCEncodingWrapperGoal-Conditioned: obs goal 图像 fusion代码存在但未被任何 Agent 使用LCEncodingWrapperLanguage-Conditioned: obs 语言指令 fusion代码存在但未被任何 Agent 使用这些接口为未来的多任务学习或条件策略扩展预留了空间。3.3 算法实现3.3.1 DrQAgent 网络架构由于 DrQAgent 继承 SACAgent其网络架构基本相同但有以下关键差异特性SACAgentDrQAgentActor架构编码器MLP[256,256]相同Critic架构编码器Ensemble MLP[256,256]×2相同数据增强无随机裁剪(4像素填充)训练稳定性标准SAC增强提高泛化3.3.2 编码器选择DrQAgent 支持多种编码器类型SmallEncoder轻量级4层卷积网络ResNet-10中等深度ResNetResNet-10-PretrainedImageNet预训练的ResNet-103.3.3async_drq_sim.py代码细节以async_drq_sim.py为例SERL 的训练流程是典型的异步 actor-learner 架构1. Learner 初始化创建 TrainerServer注册 replay buffer等待数据填充2. Actor 初始化创建 TrainerClient连接 Learner3. Actor 循环采样动作前 N 步随机之后用策略env.step()→ 收集 transition →data_store.insert()定期client.update()→ 推送数据定期evaluate()→ 发送 stats4. Learner 循环等待 buffer 填充到training_starts发送初始网络参数给 ActorRLPD 50/50 采样batch 一半来自 demo_buffer一半来自 online replay_bufferupdate_critics()× (UTD-1) 次 →update_high_utd(utd_ratio1)× 1 次定期server.publish_network()同步参数WandB 日志记录这种异步架构让机器人控制的高实时性要求和训练的高吞吐量要求解耦互不干扰。3.3.4 drq.py 逻辑流程图3.3.5 drq.py 代码拆解数据增强data_augmentation_fn这是 DrQ 的灵魂。它对 observations 中的每一个 pixel_key图像键执行 batched_random_crop。原理即使图像只位移了 1-2 个像素对于神经网络来说也是全新的输入。这相当于有限的数据池注水极大增加了泛化性。def data_augmentation_fn(self, rng, observations): for pixel_key in self.config[image_keys]: observations observations.copy( add_or_replace{ pixel_key: batched_random_crop( observations[pixel_key], rng, padding4, num_batch_dims2 ) } ) return observations训练时会对观测和下一观测进行数据增强。def update_high_utd(self, batch, utd_ratio, pmap_axisNone): # 训练时对观测和下一观测进行数据增强 rng, obs_rng, next_obs_rng jax.random.split(rng, 3) obs self.data_augmentation_fn(obs_rng, batch[observations]) next_obs self.data_augmentation_fn(next_obs_rng, batch[next_observations]) batch batch.copy( add_or_replace{ observations: obs, next_observations: next_obs, } ) # 调用父类SAC的更新 return SACAgent.update_high_utd(new_agent, batch, utd_ratioutd_ratio, pmap_axispmap_axis)update_critics 方法也有调用如下def update_critics(self, batch, pmap_axisNone): # 数据增强 obs self.data_augmentation_fn(obs_rng, batch[observations]) next_obs self.data_augmentation_fn(next_obs_rng, batch[next_observations]) # 仅更新Critic网络 new_agent, critic_infos new_agent.update( batch, pmap_axispmap_axis, networks_to_updatefrozenset({critic}) # 只更新Critic )编码器选择create_drq它提供了灵活的配置small简单的卷积层适合简单任务。resnet标准的 ResNet-10SERL 的主力方案。resnet-pretrained加载预训练权重通常是 ImageNet 预训练适合非常复杂的视觉场景。优秀选择较小模型在高 UTD 场景下计算机通常在带宽和前向传播受限。如果模型太大GPU 每一秒处理不完那 20 次更新整个训练过程就会从20 分钟学会变成2 小时学会。在机器人领域实时性Speed往往比深度Depth更重要。随机种子随机裁剪偏移量在计算数据增强时它对 observations 和 next_observations 使用了两个不同的随机种子obs_rng 和 next_obs_rng。用不同种子的好处如果 s 往左移s 往右移这会产生一种类似抖动的效果。这强迫网络明白无论目标在图像的哪个角落无论视角怎么晃动动作与状态之间的物理逻辑是不变的。这极大地增强了策略的空间不变性。用同样种子的坏处如果你对 s 和 s 使用相同的偏移比如都往左上角移 4 像素同样种子会导致虽然位置变了但 s 到 s 的相对位置没变机器人学到的是一种死板的平移。共用视觉头Shared Encoder在 create_drq 中shared_encoder 默认是 True。如果设为 FalseActor 和 Critic 各用各的视觉网络其优势如下特征一致性Actor 想知道杯子在哪里。Critic 想知道手抓到杯子的价值是多少。它们关心的都是同样的物理特征。让它们共用一个 ResNet就像是让两个学生共用一本最好的教科书。一个学生Critic学得快他理解的知识点会通过梯度回传帮助另一个学生Actor也快速进步。极速收敛视觉特征的学习是 RL 中最慢的部分。由于 Critic 接收的是奖励信号比较明确它训练视觉头的速度通常比 Actor 快。搭便车效应Actor 直接使用 Critic 已经练好的视觉特征只需要学习如何映射到动作即可。这能节省 50% 以上的训练时间。节省显存ResNet 的显存占用很大。在 UTD20 时显存消耗非常惊人。共用一个头可以腾出更多的空间给更大的 Batch Size。0x04 VICEvice.py 是 SERL 中一个非常高级的组件它实现了 VICEVariational Inverse Control with Events算法。它的核心任务是当机器人没有明确的奖励信号时通过观察成功图片来给自己打分。这在真实的机器人部署中极其重要因为你无法在真实世界里写出一个完美的数学公式来判断杯子是否抓稳了。VICE 通过将策略访问过的所有状态以负标签的形式加入分类器的训练集并在每次迭代后更新分类器从而解决该问题。这样强化学习过程类似于生成对抗网络GAN其中策略充当生成器奖励分类器则作为判别器。4.1 背景 原理VICE 是 RLPD 的心跳。在 train_rlpd.py 这种算法中Demo 数据只是素材而 VICE 的奖励才是灵魂。没了奖励机器人就失去了进化的动力。4.1.1 动机为什么要搞 VICE在仿真环境如 MuJoCo中奖励函数很好写奖励 - 距离。但在真实世界中你怎么知道机械臂末端离杯子还有几厘米除非你装了极其昂贵的外部捕捉系统。你怎么判断线缆是否进了槽位VICE 的思路人类只需要给机器人看几张任务成功的照片Goal Images剩下的让机器自己去悟。4.1.2 变分推断Variational Inference变分推断是一种用简单模型逼近复杂真相的方法。它的核心逻辑是真相太复杂无法直接计算就像你没有经过美术训练无法直接画出某个美女的真容构建一个简化模型用简单的几何形状椭圆、柳叶眉、杏仁眼构建一个标准模型调整模型参数根据观察到的线索不断调整模型的参数脸型的长宽比、眉毛的弧度等优化目标让简化模型最好地解释观察到的线索结果简化模型虽然不是真容但已经非常接近真容一句话总结变分推断就是用一个可调的简化模型去逼近一个复杂但无法直接计算的真相。贝叶斯推断的困境在贝叶斯统计中我们想计算后验分布p(z|x) p(x|z) * p(z) / p(x)其中z 是隐变量如女子的真容x 是观测数据如你看到的线索p(x|z) 是似然给定真容看到线索的概率p(z) 是先验对真容的初始假设p(x) 是证据看到线索的总概率问题p(x) 需要对所有可能的 z 积分这在复杂模型中几乎不可能计算。变分推断的解决方案既然无法直接计算 p(z|x)那就用一个简单的 q(z) 来近似它。目标找到最好的 q(z)使其尽可能接近 p(z|x)。ELBO E_q[log p(x,z)] - E_q[log q(z)]最大化 ELBO 等价于最小化 q(z) 和 p(z|x) 之间的 KL 散度。4.1.3 VICE 原理VICE 是一种从专家示范中学习评判标准的方法。VICE 不是教你怎么走路而是教你什么算走到了目的地。一旦你知道目的地在哪你自然就知道该往哪走了。它的核心逻辑是不直接学怎么做而是学什么算做好即你不需要告诉机器人怎么做也不需要给它一条完整的示范路径。通过观察大量专家示范成功案例和非专家示范失败案例即你只需要给它看一堆成功长什么样子的图片goal state examples。事件的定义来自你提供的成功状态样本不需要完整示范轨迹。用变分推断variational inference训练一个分类器输出当前状态是成功状态的概率作为reward。然后用这个分类器来学这个状态像不像成功把这个像成功的概率当作奖励信号来训练强化学习。目标不是最大化累积分数而是让某个事件event发生的概率最大发生关键时刻越多reward 越高。4.1.4 对抗性进化猫鼠游戏VICE 把强化学习变成了一个找游戏。准备正样本你手动把机器人摆到成功位置拍 20 张照片。这些照片标签为 1。准备负样本机器人自己在环境里瞎跑拍到的照片。这些照片标签为 0。训练判别器训练一个二分类神经网络Binary Classifier输入一张图输出它有多像成功照片。生成奖励Reward Classifier(当前图片)机器人发现只要我做出的动作让画面越来越像那 20 张照片我的得分就越高。VICE 实际上是一个类似 GAN生成对抗网络的结构分类器猫努力区分真正的成功和机器人自以为是成功的动作。机器人鼠努力做出让分类器认为是成功的动作。随着训练的进行分类器变得越来越挑剔机器人也随之变得越来越精准。如果 VICE 坏了在线试错 被 VICE 判为 0。人类演示 也被 VICE 判为 0。结果Critic 只能接受着这个事实 —— 这个世界没有奖赏做什么都是徒劳。Q.网络随之萎缩到 0。此时Actor 唯一的指路明灯就只剩下那个额外的 BC Loss 了。所以在 VICE 坏掉的情况下如果没有 BC Loss机器人会彻底变疯。如果有 BC Loss机器人会退化成一个笨拙的模仿者不再有进化的动力。4.2 网络架构VICE Agent 在标准 Actor-Critic 基础上增加了基于视觉的奖励分类器实现了从人类演示到稀疏奖励的迁移学习。组件编码器主干网络输出特殊设计ActorSmallEncoder/ResNetMLP [256,256]动作分布tanh_squashCritic共享Actor编码器Ensemble MLP [256,256]×2Q值双CriticTemperature无Lagrange标量温度自动调节VICE Classifier独立编码器MLP [256]二分类logit预训练微调核心组件架构如下Actor 网络policy_def Policy( encoderencoders[actor], # 视觉编码器 networkMLP(**policy_network_kwargs), # [256, 256] action_dimactions.shape[-1], tanh_squash_distributionTrue, std_parameterizationuniform, )Critic 网络critic_backbone partial(MLP, **critic_network_kwargs) # [256, 256] critic_backbone ensemblize(critic_backbone, critic_ensemble_size)( namecritic_ensemble # 默认2个Critic ) critic_def partial(Critic, encoderencoders[critic], networkcritic_backbone)Temperature 网络temperature_def GeqLagrangeMultiplier( init_value1.0, constraint_shape(), constraint_typegeq, # 大于等于约束 )VICE Reward Classifiervice_def BinaryClassifier( pretrained_encoderpretrained_encoder, # 预训练ResNet encodervice_encoder_def, # 独立的编码器 networkMLP(**vice_network_kwargs), # [256] enable_stackingTrue, )另外VICE使用独立的编码器。# VICE使用独立的编码器 vice_encoders { image_key: SmallEncoder( features(32, 64, 128, 256), kernel_sizes(3, 3, 3, 3), strides(2, 2, 2, 2), paddingVALID, pool_methodavg, bottleneck_dim256, spatial_block_size8, namefvice_encoder_{image_key}, ) for image_key in image_keys }4.3 奖励reward的计算在 VICEAgent 中奖励reward的计算依赖于一个学习到的二分类器即 vice 网络该网络用于区分专家/目标状态与智能体的观测。具体计算过程如下前向传播与 Sigmoid 激活 将 next_observations 输入 vice 网络一个 BinaryClassifier并通过 sigmoid 函数将输出映射为 0 到 1 之间的概率分数。此过程由 vice_reward 方法实现rews nn.sigmoid( self.state.apply_fn( {params: self.state.params}, observation, namevice, trainFalse, ) )二值化阈值截断 在 Critic 更新阶段如 update_critics 和 update_high_utd 方法中连续的概率分数会被转换为离散的二值奖励。若概率分数大于或等于 0.5则奖励设为 1.0否则为 0.0:rewards (self.vice_reward(next_obs) 0.5) * 1.0数据增强 在计算奖励前会先通过 data_augmentation_fn 对 next_observations 进行数据增强以提升奖励信号的鲁棒性。总结奖励本质上是一个二值指标1.0 或 0.0其取值取决于 vice 分类器是否将 next_observation 判定为属于目标/专家状态分布即 sigmoid 输出的概率 ≥0.5。4.4 训练逻辑在 VICEAgent 中BinaryClassifier在代码中实例化为 vice 网络的训练逻辑主要集中在 update_vice 方法中。其训练过程使用了二元交叉熵BCE损失并引入了 Mixup、标签平滑Label Smoothing和梯度惩罚Gradient Penalty等正则化技术来防止 GAN 模式崩溃。具体训练步骤如下数据准备与标签平滑Label Smoothing假设 batch 的后半部分为目标图像正样本标签为 1前半部分为普通观测负样本标签为 0。对图像进行数据增强通过 data_augmentation_fn并将原始图像与增强后的图像拼接。应用标签平滑技术处理标签 y_batch y_batch * (1 - 0.2) 0.5 * 0.2以缓解大 logits 带来的数值问题。特征编码使用 encode_images 方法将拼接后的所有图像通过 encoder 提取为特征向量embeddings。Mixup 正则化在特征空间中对 embeddings 和标签进行 Mixup 操作通过 mixup_data_rng生成混合特征 mix_encoded 和对应的混合标签。定义 mixup_loss_fn计算混合特征通过 create_classifier 初始化网络权重输入特征模态由 config.classifier_keys 指定后的 BCE 损失bce_loss lam_θ * bce_loss_a (1 - lam_θ) * bce_loss_b。梯度惩罚Gradient Penalty在 Mixup 生成的特征之间进行随机插值生成用于计算梯度惩罚的数据 gp_encoded。定义 gp_loss_fn计算 BinaryClassifier 对 gp_encoded 输出的梯度。计算梯度惩罚项 grad_penalty mean((grad_norms - 1) ** 2)。最终的总损失为bce_loss 10 * grad_penalty。参数更新构建 loss_fns 字典将 gp_loss_fn 指定给 vice 网络其他网络actor, critic, temperature的损失设为 0。调用 new_agent.state.apply_loss_fns 执行梯度计算并使用对应的优化器更新 BinaryClassifier 的参数。总结BinaryClassifier 是在特征编码空间中进行二分类训练的并通过 Mixup 和梯度惩罚来平滑决策边界从而提高 VICE 奖励信号的稳定性和鲁棒性。4.5 流程图在 SERL 的流程中你教机器人做动作时你只是在提供动作序列。当你把这组数据存入 demo_buffer 时它的 reward 字段通常不是由你手动输入的。它是怎么被贴上标签的在 train_rlpd.py 中当你采样出一个 Batch包含 Demo时系统会运行以下逻辑取图取出 Demo 数据里的那一帧图片 s。过分类器把图片 s 塞进 VICE 分类器。所有数据无论谁做的都必须经过 VICE 的安检。VICE 说它是成功它才是成功。重新打分分类器返回一个分数例如 0.95。填入 r这个 0.95 就成了这一条 Demo 数据在当前时刻的奖励 r。VICE Agent自奖励分类器流程图如下Mixup Label Smoothing: 应对极小样本量可能只有几十张成功图片的过拟合问题。Gradient Penalty (GP): 模仿 GAN 的技巧确保奖励函数不仅准而且梯度连续利于 RL 优化。Reset-Free Friendly: 允许机器人在没有外部传感器如压力传感器、红外对管的情况下仅靠视觉确认任务是否完成。