You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Ray Tune的HyperOptSearch优化LunarLander-v2的PPO超参数

实现自定义Objective+Evaluate的PPO超参数优化方案

以下是结合Ray Tune自定义objective+evaluate函数,使用HyperOptSearch优化LunarLander-v2环境下PPO超参数的完整实现:

1. 必要依赖导入

import ray
from ray import tune
from ray.rllib.agents.ppo import PPOTrainer
from ray.tune.search.hyperopt import HyperOptSearch
from hyperopt import hp

2. 定义评估函数

该函数负责对训练后的PPO模型进行评估,返回平均回合奖励:

def evaluate_trainer(trainer, eval_episodes=10):
    # 运行指定次数的评估回合,获取平均奖励
    eval_results = trainer.evaluate(evaluation_num_episodes=eval_episodes)
    return eval_results["episode_reward_mean"]

3. 定义目标函数

该函数接收超参数配置,初始化PPO训练器,循环执行训练-评估流程,并向Ray Tune报告关键指标:

def objective(config):
    # 用当前超参数配置初始化PPO训练器
    trainer = PPOTrainer(config=config)
    
    # 每个超参数 trial 执行的训练迭代次数
    num_training_iterations = 20
    
    for iteration in range(num_training_iterations):
        # 执行一次训练迭代
        trainer.train()
        
        # 评估当前模型性能
        reward_mean = evaluate_trainer(trainer)
        
        # 向Ray Tune报告当前迭代的平均奖励
        tune.report(
            episode_reward_mean=reward_mean,
            training_iteration=iteration
        )
    
    # 训练结束后清理训练器
    trainer.stop()

4. 定义超参数搜索空间

将需要优化的超参数替换为HyperOpt的搜索空间,固定参数保持原值:

search_config = {
    "env": "LunarLander-v2",
    # 固定参数(沿用原配置)
    "num_workers": 1,
    "num_gpus": 0,
    "train_batch_size": 25000,
    "kl_target": 0.01,
    "kl_coeff": 0.6,
    # 待优化的超参数(使用HyperOpt搜索空间)
    "sgd_minibatch_size": hp.choice("sgd_minibatch_size", [2500, 5000, 10000]),
    "num_sgd_iter": hp.quniform("num_sgd_iter", 10, 50, 5),  # 10-50之间步长为5的整数
    "lr": hp.loguniform("lr", -10, -5),  # 1e-10到1e-5的对数均匀分布
    "lambda": hp.uniform("lambda", 0.7, 0.95),
    "vf_loss_coeff": hp.uniform("vf_loss_coeff", 0.5, 1.0),
    "clip_param": hp.uniform("clip_param", 0.1, 0.4),
    "entropy_coeff": hp.loguniform("entropy_coeff", -8, -3),  # 1e-8到1e-3的对数均匀分布
}

5. 配置HyperOpt搜索算法

hyperopt_search = HyperOptSearch(
    metric="episode_reward_mean",
    mode="max",  # 目标是最大化平均回合奖励
    # 可选:传入已知的优秀配置作为初始搜索点
    # points_to_evaluate=[your_initial_config],
)

6. 启动超参数调优

if __name__ == "__main__":
    # 初始化Ray
    ray.init()
    
    tuner = tune.Tuner(
        objective,
        tune_config=tune.TuneConfig(
            metric="episode_reward_mean",
            mode="max",
            search_alg=hyperopt_search,
            num_samples=10,  # 超参数搜索的trial数量
        ),
        param_space=search_config,
        # 可选:指定结果保存目录
        # run_config=tune.RunConfig(local_dir="res_LunarLander"),
    )
    
    # 执行调优并获取结果
    results = tuner.fit()
    
    # 输出最优结果
    best_result = results.get_best_result()
    print("最优超参数配置:", best_result.config)
    print("最优平均回合奖励:", best_result.metrics["episode_reward_mean"])
    
    # 关闭Ray
    ray.shutdown()

关键说明

  • 训练-评估循环:每个trial会执行num_training_iterations次训练迭代,每次训练后立即评估并报告指标,Ray Tune可根据中间结果提前终止效果差的trial(需额外配置早停策略)。
  • 搜索空间设计:根据PPO超参数的特性选择合适的分布(如学习率用对数均匀分布),可根据需求调整搜索范围或添加更多待优化参数。
  • 资源配置:若有GPU可用,可修改num_gpus为1或对应比例,提升训练速度。

内容的提问来源于stack exchange,提问作者Clm28

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 11:05:22