Go-Explore Phase 2强化学习实战:如何用SIL把演示轨迹炼成鲁棒PPO策略
2026/9/16 12:27:35 网站建设 项目流程

Go-Explore Phase 2强化学习实战:如何用SIL把演示轨迹炼成鲁棒PPO策略

【免费下载链接】go-exploreCode for Go-Explore: a New Approach for Hard-Exploration Problems项目地址: https://gitcode.com/gh_mirrors/go/go-explore

Go-Explore 是解决硬探索问题的经典强化学习算法,而本项目 go-explore 提供了它的完整开源实现。本文带你实战Phase 2 强化阶段:把 Phase 1 探索得到的演示轨迹(.demo文件)通过SIL(自模仿学习,Self-Imitation Learning)蒸馏进PPO策略网络,最终得到一个在噪声与随机扰动下依然稳定的鲁棒策略。

一、先看懂两阶段流水线:从"会玩"到"玩得好"

Go-Explore 的完整流程分两步:

  1. Phase 1 探索阶段:Go-Explore 智能体在环境中"打怪升级",产出results/xxxx_随机串/目录下的经验文件(*_experience.gz),记录智能体到达过的所有状态树;
  2. Phase 2 强化阶段:从经验中挑选高价值演示轨迹,再用 SIL+PPO 训练神经网络,把"偶尔能通关"变成"稳定通关"。

为什么要做 Phase 2?因为 Go-Explore 探索时依赖"状态树+时间回溯",只能复现单条轨迹;而 SIL+PPO 学到的是一般化的策略,对 no-ops、sticky actions、随机扰动等现实噪声都更抗揍 💪

核心代码都在robustified/目录下,脚本入口一览:

  • 探索:robustified/phase1_montezuma.shrobustified/phase1_pitfall.sh
  • 生成演示:robustified/gen_demo_atari.shrobustified/gen_demo_fetch.sh
  • 强化:robustified/phase2_atari.shrobustified/phase2_fetch.sh
  • 测试:robustified/phase2_atari_test.sh
  • 对照组:robustified/control_ppo_fetch.sh(纯 PPO)、robustified/control_im_fetch.sh(PPO+IM)

二、生成演示轨迹:gen_demo 如何挑选"精华"轨迹

Phase 2 的原料是.demo文件。运行:

./gen_demo_atari.sh <Phase1结果目录> <输出目录> <游戏名>

核心逻辑在 robustified/gen_demo/new_gen_demo.py:

  • 加载所有*_experience.gz经验文件,重建探索树(RefTree);
  • 筛选"成功轨迹":可指定--select_reward(有奖励)、--select_done(通关)或--select_fetch_target(Fetch 抓物目标);
  • 多样性选择:每次选完一条轨迹后,计算它与候选轨迹树的距离,优先挑"分数高且已选轨迹覆盖不到"的分支,避免 10 条演示长得一模一样。

📌 官方建议:把10 次 Phase 1 独立运行产出的演示合并到一个文件夹再用(单条也能跑,但成功率低)。Fetch 环境则是从单次运行直接产 10 条演示,省去重复跑 Phase 1 的麻烦。

Fetch 机械臂推箱子任务环境,Phase 1 探索与 Phase 2 SIL 训练的载体之一

三、读懂 SIL 参数:phase2 脚本里的关键开关

robustified/phase2_atari.sh为例(默认游戏 MontezumaRevenge、25 亿帧),几个核心参数值得记住:

参数含义
--sil_coef=0.1SIL 损失在总损失中的权重
--sil_vf_coefSIL 价值函数分支的权重
--n_sil_envs专门回放演示的 SIL 并行环境数(Atari 用 2,Fetch 用 8)
--demo_selection=normalize_by_target按目标归一化挑选演示,提升数据利用率
--sil_weight_success_rate演示权重随成功率自适应
--sil_pg_weight_by_value/--sil_vf_relu策略梯度按价值加权 / 价值网络用 ReLU,论文中的稳定性改进
--extra_sil_from_start_prob=0.3一定概率从游戏起始状态开始插值演示,帮助策略学会"从头走"

Fetch 版robustified/phase2_fetch.sh则把nenvs开到 120、帧数 7.5 亿,并指定--fetch_type=boxes_1--fetch_target_location(目标货架编号)。

四、启动 Phase 2:8 卡 MPI 一键跑

论文中所有 Phase 2 结果都用 8 块 GPU 通过 MPI 跑出来,脚本本身不自带 MPI,需要这样调用(路径建议用绝对路径,强化代码对相对路径支持不佳):

mpirun -np 8 ./phase2_atari.sh <游戏> <演示文件夹> <结果文件夹> <帧数>

训练过程中日志会打印Saving to ...,那个路径就是最终神经网络的存档位置。

五、验收:用 no-ops 压测策略的鲁棒性

策略到底鲁不鲁棒?跑robustified/phase2_atari_test.sh <游戏> <网络路径> <输出目录>,它会输出no-ops 从 0 到 30 各档位.json结果(分数、关卡、精确动作序列)。no-op 档数越多、分数越稳定,说明策略对环境噪声越免疫——这正是 SIL 蒸馏相比单条演示轨迹复现的价值所在。

想做消融对照?Fetch 上可以跑robustified/control_ppo_fetch.sh(注意它内部--n_sil_envs=0 --demo __nodemo__,即纯 PPO 基线)和robustified/control_im_fetch.sh(PPO+IM),和 SIL 版结果对比,直观感受 SIL 带来的提升。

六、Fetch 机械臂环境快速上手

Fetch 机械臂拨杆任务,演示 Phase 1 探索到达的关键状态

  • 需本地安装MuJoCo 2.0和对应版本mujoco-py(Atari 用户可跳过);
  • 目标货架标识符取0001/0010/0100/1000,对应货架四个位置;
  • 强化时确保goexplore_py所在目录在PYTHONPATH中;
  • 环境定义见robustified/goexplore_py/complex_fetch_env.py

七、避坑清单 ✅

  • 依赖atari_reset(SIL+PPO 训练器):robustified/README.md要求把它放到与goexplore_py同级目录,本仓库policy_based/atari_reset/已附带一份实现可参考;
  • TensorFlow 1.15.2 +horovod+mpi4py,缺一不可;
  • 演示不够多 → 先多跑几次 Phase 1 再合并.demo
  • 训练中途看 GPU 利用率低,多半是n_sil_envs太小,可参考 Fetch 配置调大。

跑通这套Phase 1 探索 → gen_demo 挑精华 → SIL+PPO 蒸馏 → no-ops 压测的流水线,你就掌握了 Go-Explore 从"找到解"到"稳定解"的完整闭环。

【免费下载链接】go-exploreCode for Go-Explore: a New Approach for Hard-Exploration Problems项目地址: https://gitcode.com/gh_mirrors/go/go-explore

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询