基于种群的训练#
基于种群的训练(PBT)是在常规强化学习(RL)训练外层运行的在线优化循环。它不只选择一组超参数、训练一个策略,而是在同一任务上训练一组独立策略,并定期根据任务级目标排序。表现不佳的学习器会复制有潜力的学习器检查点,变异所选超参数,再从复制的权重继续训练。
这一循环结合了两种思路:
探索: 不同种子和超参数使学习器发现不同的行为。
利用: 替换检查点,将计算资源从停滞的学习器转向已有效的行为。
与固定的随机搜索或网格搜索不同,PBT 可以在训练中改变超参数,并复用成功运行的权重。最终产物仍是普通策略检查点;PBT 改变训练方式,不改变部署方式。
参见
如果刚开始使用 Isaac Lab 的强化学习流程,请先阅读 与 RL Agent 进行训练 和 配置一个 RL Agent 。
小心
Isaac Lab 目前仅在 RL-Games 库中支持 PBT。
何时使用 PBT#
PBT 尤其适用于:
不同种子经常收敛到差异很大的结果,或停留在局部最优;
任务具有稳定的标量成功指标,可在训练期间对策略排序;
有用的超参数在训练早期和后期可能需要不同值;以及
有足够计算资源并发训练多个策略。
如果已知配置能够可靠收敛、计算资源只支持一两次运行,或无法通过有意义的目标比较策略,应先使用普通单策略训练。PBT 增加检查点 I/O 和协调开销,包含 N 个学习器的种群约消耗 N 次普通运行的总计算量。因此,公平实验应将 PBT 与相同数量的独立固定配置运行比较,而非只与一次运行比较。
PBT 也不同于 多 GPU 训练 。分布式数据并行训练使用多个设备更新一个策略;PBT 中各学习器拥有自己的策略、优化器状态、经验和检查点,仅在选择阶段交换检查点。
PBT 使任务得以解决的示例#
DexPBT study 测试了多接触操作任务,其观测和动作空间较大、任务成功稀疏,且存在许多局部有效但无法完成整个任务的行为。在 PBT 与 PPO 的对比中,作者保持总计算量相同:将八策略 PBT 种群中的最佳学习器,与八个独立 PPO 种子中的最佳结果比较,每个学习器都训练五十亿个环境步。
条件 |
训练行为 |
研究预算内的结果 |
|---|---|---|
不使用 PBT 的 PPO |
八个策略使用固定超参数独立训练,不共享发现。 |
八次运行均未达到最终 1 cm 的成功容差。 |
使用 PBT 的 PPO |
八个学习器定期共享有潜力的权重,并探索变异后的超参数。 |
种群达到最终容差,并继续提高连续成功次数。 |
该研究在每个测试场景中都观察到改善,并发现 PBT 是其中三个场景获得有效性能的关键因素。在更困难的双臂重定向任务中,最佳 PBT 策略在 50 次尝试中实现近 40 次连续成功。完整对比和学得的行为见论文的 training curves 和 supplementary policy videos 。
没有任务在数学上必须使用 PBT。这里“使任务得以解决”是指:在测试预算内,固定 PPO 没有解决任务,而 PBT 解决了。这些实验使用 Isaac Gym DexPBT 任务,为下述 Isaac Lab 工作流程提供依据,但不是随附 Shadow Hand 示例的基准结果。
Isaac Lab 如何选择策略#
每隔 interval_steps ,各学习器将检查点和当前目标值保存到共享工作目录。对于已初始化的策略,设目标均值和标准差为 \(\mu\) 和 \(\sigma\) 。Isaac Lab 按以下公式计算领先者和表现不佳者的阈值:
目标值高于 \(U\) 的策略为领先者,低于 \(L\) 的为表现不佳者。只修改后者:随机复制一个领先者,并以 mutation_rate 的概率变异每个白名单超参数。如果没有领先者,则保留自身检查点并变异超参数。其他策略保持原状继续训练。
学习器通过检查点和 YAML 元数据文件协调,无需中央进程。它们可以异步推进:各学习器比较不晚于自身 PBT 迭代的最新可用检查点。所有学习器仍必须使用相同的 num_policies ,并通过相同绝对路径访问共享目录,因为元数据中的检查点路径为绝对路径。
选择排序目标#
目标决定选择压力,应选择能衡量最终期望行为、且种群内可比较的指标,值越高始终视为越好。任务成功指标通常比训练中尺度变化的密集塑形奖励更适合。
随附的重定向配置使用:
objective: episode.consecutive_successes
该点分隔路径解析为 infos["episode"]["consecutive_successes"] 。RL-Games 包装器将 extras["log"] 映射到 infos["episode"] ,因此即使环境将指标写入 extras["log"] ,也应使用 episode. 前缀。
长时间运行前,确认目标存在、为标量,且策略行为改善时会增大。噪声较大或非平稳的目标可能反复替换有效策略。检查点交换后,PBT 种群成员也不再独立,因此应在留出的种子和条件下单独评估所选检查点。
配置 PBT#
Isaac-Reorient-Cube-Shadow-Direct 的 RL-Games 配置提供了完整 PBT 示例。PBT 默认关闭,下一节的启动命令会启用它。
pbt:
enabled: False
policy_idx: 0
num_policies: 8
directory: .
workspace: "pbt_workspace"
objective: "episode.consecutive_successes"
interval_steps: 50000000
threshold_std: 0.1
threshold_abs: 0.025
mutation_rate: 0.25
change_range: [1.1, 2.0]
mutation:
agent.params.config.learning_rate: "mutate_float"
agent.params.config.grad_norm: "mutate_float"
agent.params.config.entropy_coef: "mutate_float"
agent.params.config.critic_coef: "mutate_float"
agent.params.config.bounds_loss_coef: "mutate_float"
agent.params.config.kl_threshold: "mutate_float"
agent.params.config.gamma: "mutate_discount"
agent.params.config.tau: "mutate_discount"
主要设置如下:
directory和workspace指定共享存储根目录,以及根目录内的 PBT 运行位置。每个种群应使用新工作目录。
num_policies和policy_idx定义种群大小和当前学习器唯一的零起始索引。
objective从环境信息字典中选择用于学习器排序的标量。
interval_steps设置检查点比较之间的环境步数。间隔更短,响应更早,但检查点 I/O 更多,变异后的学习器适应时间也更少。
threshold_std和threshold_abs控制策略偏离种群均值多少才归类为领先者或表现不佳者。如果没有策略同时越过两个有效边界,种群继续运行,不进行替换。
mutation_rate、change_range和mutation控制哪些超参数可改变,以及改变频率。
mutate_float乘以或除以change_range中的随机因子;mutate_discount保守地改变折扣类值与 1.0 的距离。未包含在mutation中的参数保持固定。
启动种群#
为每个策略启动一个进程。下例启动默认八策略种群中的策略 0。在八个终端或调度器作业中运行,只将 PBT_POLICY_IDX 从 0 改到 7。各进程的 PBT_NUM_POLICIES 、 PBT_DIRECTORY 和 agent.pbt.workspace 保持一致。
export PBT_POLICY_IDX=0
export PBT_NUM_POLICIES=8
export PBT_DIRECTORY=/absolute/path/to/shared_folder
uv run --extra rl-games isaaclab train --rl_library rl_games \
--task Isaac-Reorient-Cube-Shadow-Direct \
--num_envs 8192 \
--seed="${PBT_POLICY_IDX}" \
agent.pbt.enabled=true \
agent.pbt.num_policies="${PBT_NUM_POLICIES}" \
agent.pbt.policy_idx="${PBT_POLICY_IDX}" \
agent.pbt.directory="${PBT_DIRECTORY}" \
agent.pbt.workspace=shadow_reorient_pbt
同一主机上运行多个工作进程时,通过调度器或 CUDA_VISIBLE_DEVICES 为各进程分配 GPU。Weights & Biases 跟踪可选;启用时,各进程使用唯一运行名称,但保留相同项目。
训练期间,各策略在共享工作目录内的策略目录下写入编号 .pth 检查点及对应的 .yaml 元数据,记录目标值和变异参数。运行结束后,选择经过验证、目标值最佳的检查点,再按普通 RL-Games 策略评估。
故障排除#
没有策略被替换: 种群可能尚未越过配置的边界。减小阈值前先检查目标值;相同的低分也可能表示排序指标无法提供有效信息。
目标查找失败: 根据
infos["episode"]输出的键核对点分隔路径。工作进程无法加载其他进程的检查点: 确认各进程使用相同的共享绝对路径、工作目录名称和种群大小。
保存检查点耗时过多: 增大
interval_steps,或将工作目录放到更快的共享存储上。
参考文献#
Jaderberg 等, Population Based Training of Neural Networks (2017)。
Petrenko 等, DexPBT: Scaling up Dexterous Manipulation for Hand-Arm Systems with Population Based Training (2023)。