vice.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。
0x04 VICE
vice.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。