尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Tianshou ViZDoom 实战指南:从 C51/PPO 训练到 .lmp 回放

Tianshou ViZDoom 实战指南:从 C51/PPO 训练到 .lmp 回放 人工智能机器学习深度学习强化学习【免费下载链接】tianshouAn elegant PyTorch deep reinforcement learning library.项目地址https://gitcode.com/gh_mirrors/ti/tianshou点击查看免费下载导读本文基于 Tianshou 仓库中的 examples/vizdoom/README.md 及其配套源码系统讲解如何在经典第一人称射击游戏环境 ViZDoom 上训练深度强化学习智能体。你将掌握用 EnvPool 大幅加速环境采样的配置方式、C51 / PPO / PPOICM 三类算法的训练与评估命令、四张官方地图D1~D4的差异与奖励设计经验以及如何保存并回放.lmp录屏文件。读完本文后你可以直接复现文档中报告的训练结果并把这套「环境封装 高吞吐采样 可视化回放」的流程迁移到其他视觉类 RL 场景。ViZDoom 场景概览ViZDoom 是基于著名第一人称射击游戏 Doom 的强化学习环境因其低观测维度、可控的奖励设计以及贴近真实游戏引擎的交互方式常被用于测试视觉智能体在稀疏奖励、探索与战斗等任务上的表现。本仓库在 examples/vizdoom/ 目录下提供了完整可运行的示例核心文件包括env.pyViZDoom 环境的 Gymnasium 封装与多进程/EnvPool 工厂函数make_vizdoom_envvizdoom_c51.py基于 C51 分布强化学习的离线off-policy训练入口vizdoom_ppo.py基于 PPO 的在线on-policy训练入口并支持通过 ICM内在好奇心模块增强探索replay.py以 1024x576 窗口回放.lmp录屏的脚本maps/D1~D4 四张地图的.wad场景文件、.cfg配置与 SPECTATOR 演示脚本。四张地图来自 DirectFuturePrediction 项目更多场景与配置可参考 ViZDoom 官方 scenarios 目录。环境观测为灰度帧默认分辨率 84x84、4 帧堆叠frames_stack4动作空间为离散组合动作详见下文。环境加速优先使用 EnvPoolViZDoom 的 Python 环境逐帧执行较慢文档明确建议在 Linux 机器上优先安装 EnvPool 来运行本套实验pip install envpool安装完成后env.py 中的make_vizdoom_env会自动切换为 EnvPool 的 ViZDoom 环境实现无需修改任何训练代码。EnvPool 的纯执行速度约为 Python 向量化环境的 2~3 倍整体 RL 训练流水线约快 1.5 倍。关于 EnvPool 的更多信息可查阅其官方 GitHub 与 ViZDoom API 文档。从源码看EnvPool 分支的关键配置如下env.pytask_id .join([i.capitalize() for i in task.split(_)]) -v1 # 例如 D3_battle - D3Battle-v1 reward_config { KILLCOUNT: [20.0, -20.0], # 击杀奖励取击杀数变化乘以 20损失则 -20 HEALTH: [1.0, 0.0], # 血量增量奖励battle 地图改为 [1.0, -1.0] AMMO2: [1.0, -1.0], # 弹药增量奖励 } if battle in task: reward_config[HEALTH] [1.0, -1.0] # 战斗地图掉血惩罚make_gymnasium传入frame_skip、stack_num帧堆叠数即res[0]、num_envs、max_episode_steps2625与use_combined_actionTrue等参数。其中max_episode_steps2625与原生环境一致单局上限 10500 tics配合frameskip4后智能体实际决策步数为10500 / 4 2625步。如果未安装 EnvPool代码会回退到 Python 向量化实现make_vizdoom_env会用ShmemVectorEnv包装多个基于原生vizdoom库的Env实例并用os.cpu_count()限制测试环境数量为min(cpu_count - 1, num_test_envs)。两种实现共享同一套 Gymnasium 接口因此训练脚本无需感知底层差异。训练一个智能体C51 训练以文档提供的 C51Categorical DQN训练入口为例python3 vizdoom_c51.py --task {D1_basic|D2_navigation|D3_battle|D4_battle2}从 vizdoom_c51.py 可以看到该脚本的主要超参数均为命令行可选括号内为默认值参数默认值说明--taskD1_basic地图场景名须与maps/下的.wad/.cfg对应--seed0随机种子--eps_train/--eps_test1.0 / 0.005训练/测试 ε-greedy 探索率--eps_train_final0.05训练探索率最终值--buffer_size2000000回放缓冲区大小--lr0.0001Adam 学习率--gamma0.99折扣因子--num_atoms51C51 分布 Q 值的原子数--v_min/--v_max-10.0 / 10.0分布 Q 值的取值区间--n_step3多步回报步数--target_update_freq500目标网络更新频率步数--epoch300训练轮数--epoch_num_steps100000每轮环境步数--update_per_step0.1每环境步的梯度更新数--batch_size64训练批大小--num_training_envs/--num_test_envs10 / 10训练/测试并行环境数--frames_stack4帧堆叠数--skip_num4帧跳过frameskip数--loggertensorboard可选tensorboard或wandb--devicecuda/cpu 自动选择运行设备训练流程与 Atari 场景保持一致网络使用C51Net卷积特征提取 51 个原子输出策略为C51Policy算法为C51数据侧使用VectorReplayBufferbuffer_num等于并行环境数开启save_only_last_obs与stack_num以节省内存。ε 采用 Nature DQN 式线性衰减前 100 万环境步内从eps_train线性降到eps_train_final见 train_fn。每轮结束后评估一次达到env.spec.reward_threshold时提前停止并把最佳策略保存为policy.pth。文档给出的收敛参考同一环境配置下的实际观测D1回血收集训练约 50 万环境步5 个 epoch即可基本做到不死、完成训练D3战斗可达到 1600 奖励即 5 分钟内 75 击杀D4战斗加强可达到 700 奖励。PPO 与 PPOICM 训练PPO 训练入口与 C51 类似python3 vizdoom_ppo.py --task {D1_basic|D2_navigation|D3_battle|D4_battle2}vizdoom_ppo.py 额外提供 PPO 专属超参数--gae_lambda0.95、--vf_coef0.5、--ent_coef0.01、--eps_clip0.2、--max_grad_norm0.5、--lr_decay默认开启按 epoch 线性衰减学习率、--dual_clip、--value_clip、--advantage_normalization等。其网络结构为DQNet共享特征提取 DiscreteActorCategorical分布与DiscreteCritic使用OnPolicyTrainerParams训练每轮 1000 环境步采集、4 次重复更新。启用 ICM 内在好奇心只需一个参数python3 vizdoom_ppo.py --task D2_navigation --icm-lr-scale 10 python3 vizdoom_ppo.py --task D3_battle --icm-lr-scale 10当--icm_lr_scale 0时脚本会用ICMOnPolicyWrapper包裹 PPO并额外构建IntrinsicCuriosityModule前向反向模型默认--icm_reward_scale 0.01、--icm_forward_loss_weight 0.2以好奇心奖励辅助探索vizdoom_ppo.py。评估与录屏回放评估已训练策略加载训练好的policy.pth并评估python3 vizdoom_c51.py --num_test_envs 100 --resume-path policy.pth --watch --task {D1_basic|D3_battle|D4_battle2}--watch表示只观看/评估预训练策略--resume-path指定权重路径torch.load后load_state_dict载入见 vizdoom_c51.py--num_test_envs控制并行评估的回合数。评估结果会以CollectStats形式打印平均回报、回合长度等。保存并回放 .lmp 录屏增加--save-lmp参数即可在评估的同时保存.lmp回放文件python3 vizdoom_c51.py --save-lmp --num_test_envs 100 --resume-path policy.pth --watch --task {D1_basic|D3_battle|D4_battle2}保存的.lmp文件位于lmps/目录命名形如episode_{count}.lmp对应 env.py 中new_episode(lmp_path)的逻辑。回放命令为python3 replay.py maps/D3_battle.cfg episode_8_25.lmpreplay.py 会以RES_1024X576分辨率、可见窗口的方式重放整局每步advance_action()并休眠1/35秒模拟实时播放结束时打印本局击杀数。你也可以直接回放仓库文档中提供的两个最佳录屏D3、D4 各一个位于results/c51/目录python3 replay.py maps/D3_battle.cfg results/c51/d3.lmp python3 replay.py maps/D4_battle2.cfg results/c51/d4.lmp地图与奖励设计经验四张地图的差异各地图的.cfg见 examples/vizdoom/maps/关键差异如下地图动作按钮游戏变量特点D1_basicMOVE_FORWARD / TURN_LEFT / TURN_RIGHTHEALTH简单回血收集无死亡惩罚D2_navigation同 D1HEALTH导航任务无死亡惩罚D3_battle全向移动 TURN ATTACK SPEEDKILLCOUNT / AMMO2 / HEALTH战斗地图death_penalty100doom_skill2D4_battle2同 D3KILLCOUNT / AMMO2 / HEALTH战斗加强地图同样带死亡惩罚所有地图均设置living_reward0、episode_timeout10500、screen_formatGRAY8、window_visiblefalse训练时不开窗口。动作空间由 env.py 中的按钮组合函数生成普通地图为「前进/转向」共 6 种组合战斗地图为「前进后退 × 左右 × 转向 × 攻击 × 加速」共 72 种组合并以离散整数索引作为动作。奖励设计的实践经验文档总结了在 ViZDoom 上调试奖励的五条经验并结合 env.py 的实现可以得到印证living reward 有害每步常驻奖励living reward不利于收敛各 cfg 均将其设为 0组合动作很重要同时按多个按钮的组合动作如移动转身攻击比单一按键的原始动作空间更利于学习对 health 和 ammo2 的负向奖励对 D3/D4 很有帮助战斗地图中HEALTH的 reward_config 改为[1.0, -1.0]掉血即惩罚AMMO2采用[1.0, -1.0]同时惩罚弹药消耗只对 health 施加正向奖励对 D1 很有帮助非战斗地图HEALTH为[1.0, 0.0]只有回血才获得正奖励对应 env.py 中health self.health才计入奖励的条件移除 MOVE_BACKWARD 可能收敛更快但最终性能可能下降这解释了为何 D1/D2 的动作组合只包含前进而不含后退。此外击杀奖励在 env.py 中实现为每次击杀变化量乘以 20reward 20 * (killcount - self.killcount)与 EnvPool 分支的KILLCOUNT: [20.0, -20.0]保持一致。算法配置与参考结果文档说明 ViZDoom 的设置与 Atari 完全一致因此可以尝试 Atari 示例中列出的更多算法如 Rainbow、IQN、QR-DQN 等只需按同样模式替换算法与网络。以下是文档记录的基准结果单次运行供参考对比实际结果会因随机种子与硬件有所波动C51单次运行taskbest reward运行命令D2_navigation747.52python3 vizdoom_c51.py --task D2_navigationD3_battle1855.29python3 vizdoom_c51.py --task D3_battlePPO单次运行taskbest reward运行命令D2_navigation770.75python3 vizdoom_ppo.py --task D2_navigationD3_battle320.59python3 vizdoom_ppo.py --task D3_battlePPO with ICM单次运行taskbest reward运行命令D2_navigation844.99python3 vizdoom_ppo.py --task D2_navigation --icm-lr-scale 10D3_battle547.08python3 vizdoom_ppo.py --task D3_battle --icm-lr-scale 10可以看到ICM 在稀疏奖励明显的战斗任务D3上带来了显著收益320.59 → 547.08而在 D2 上也有 770 → 844 的提升说明好奇心驱动的内在奖励能有效改善探索。原文档中的完整奖励曲线图results/c51/与results/ppo*目录下的 PNG记录在案可在运行实验时通过 TensorBoard/WandB 复现对比。观察与调试技巧查看观测与动作空间env.py 内置了__main__自测代码可直接运行python3 env.py打印观测形状、动作数并随机步进环境快速验证环境封装是否正常。SPECTATOR 模式maps/spectator.py 演示了 ViZDoom 的 SPECTATOR 模式——以 640x480 可见窗口进入游戏逐帧打印状态号、游戏变量、动作与奖励适合人工体验地图与验证奖励设定python3 maps/spectator.py -c maps/D3_battle.cfg -w maps/D3_battle.wad数据收集vizdoom_c51.py与vizdoom_ppo.py均支持--save_buffer_name可在--watch模式下用测试环境采集经验并save_hdf5保存为 HDF5 缓冲文件用于后续离线学习。小结本文从 examples/vizdoom/README.md 出发结合仓库源码完整梳理了 Tianshou 在 ViZDoom 上的工程实践EnvPool 加速环境采样、C51/PPO/PPOICM 三套算法的一键训练与参数体系、基于.lmp的评估回放闭环以及经过验证的地图与奖励设计经验。这套「EnvPool 高吞吐采样 组合动作离散化 结构化工件回放」的组合同样是处理其他视觉类 RL 任务时可以复用的模板。赞分享人工智能机器学习深度学习强化学习【免费下载链接】tianshouAn elegant PyTorch deep reinforcement learning library.项目地址https://gitcode.com/gh_mirrors/ti/tianshou点击查看免费下载相关推荐PaddleNLP PPO/GRPO 强化学习对齐训练实战指南从数据协议到分布式训练PaddleNLP PPO/GRPO 强化学习对齐训练实战指南从数据协议到分布式训练 导读 本文以 PaddleNLP 仓库中的 PPO GRPO 官方人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLP解决Verl PPO训练卡顿从根源优化到实战调优指南解决Verl PPO训练卡顿从根源优化到实战调优指南 PPO训练时进度条停滞、GPU利用率忽高忽低、单轮迭代耗时超预期这些卡顿问题严重影响大语言模型强化学习人工智能大模型强化学习RLHF分布式训练微调Stable Baselines3自动驾驶训练案例从仿真到部署的PPO实战指南Stable Baselines3自动驾驶训练案例从仿真到部署的PPO实战指南 引言自动驾驶强化学习的痛点与解决方案 你是否还在为自动驾驶算法训练中的样本效人工智能强化学习机器学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表