惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog RSS Feed
B
Blog
N
Netflix TechBlog - Medium
量子位
月光博客
月光博客
博客园_首页
博客园 - Franky
酷 壳 – CoolShell
酷 壳 – CoolShell
Last Week in AI
Last Week in AI
T
The Blog of Author Tim Ferriss
Hugging Face - Blog
Hugging Face - Blog
雷峰网
雷峰网
M
MIT News - Artificial intelligence
J
Java Code Geeks
大猫的无限游戏
大猫的无限游戏
D
DataBreaches.Net
腾讯CDC
Engineering at Meta
Engineering at Meta
云风的 BLOG
云风的 BLOG
L
LangChain Blog
GbyAI
GbyAI
IT之家
IT之家
Y
Y Combinator Blog
人人都是产品经理
人人都是产品经理

博客园 - 孤独的猫咪神

自定义贪吃蛇环境进行PPO模型训练 TensorBoard PPO log 解析 macos(M4)上跑强化学习 - PyTorch LunarLander-v3 Stable-Baselines3 部分机型下,Flutter的flutter_inappwebview在使用evaluateJavascript调用postMessage失败的情况 HarmonyOS中,html 与 ets 桥接沟通 Flutter中,html 与 dart 桥接沟通 Flutter 环境变量 Mole,清理Mac的小工具 Flutter自定义主题Theme最佳实践 Ubuntu 20.04 开机自动添加git的ssh 米家 + arduino + 自定义服务器 Flutter 第三方库 Jenkins CLI 通过ssh方式链接时的证书 阿里云Ubuntu 14.04 + Nginx + .net core + MySql 移动开发网络接口 经验总结 阿里云Ubuntu 14.04 + Nginx + let's encrypt 搭建https访问 Pathoto项目:AWS+golang+beego搭建 osx开发,skport项目记录 使用Jekyll在Github上搭建博客 iOS搜索附近的位置(类似微博朋友圈位置) retrofit2中ssl的Trust anchor for certification path not found问题 Android中的Semaphore React Native 在现有项目中的探路 博客园 Linux客户端 2.0 正式发布! 博客园 Windows客户端 2.0 正式发布! 博客园 Mac客户端 2.0 正式发布!
通过TensorBoard进行PPO参数优化
孤独的猫咪神 · 2026-07-29 · via 博客园 - 孤独的猫咪神

接上篇:TensorBoard PPO log 解析
根据表格内容,进行参数的逐步优化

代码:github

根据上篇文档中的数据内容:

图表 解析
image explained_variance 数据为负数或0附近,代表 价值网络拟合失效。
image approx_kl 持续上行,策略更新幅度偏大
image 学习率 lr不变

test_01_4

进行参数调整:

参数 原数据 变化 理由
learning_rate 0.2(默认值) LinearSchedule(start=1.0, end=0.05, end_fraction=0.2) 线性衰减学习率,前期快速探索,后期小幅精细更新
clip_range 0.2(默认值) 0.17 缩小clip,抑制approx_kl持续上涨,限制单次策略更新幅度,防止策略突变、性能跳水
vf_coef 0.5(默认值) 0.8 提高价值loss权重,改善explained_variance,强制网络更重视价值函数拟合
ent_coef 0.0(默认值) 0.01 增加基础探索,小幅熵系数持续保留探索
gae_lambda 0.95(默认值) 0.96 略微提升GAE,优势估计更平滑
n_epochs 10(默认值) 8 减少迭代轮次,减少在同一批 rollout 数据上反复更新,也是为了减少approx_kl更新上涨速度
total_timesteps 10_000 100_000 增加训练总步数,否则很难充分收敛

训练后的结果

点击查看完整日志截图

4

可以通过rollout/ep_rew_mean发现,价值回报的数据已经崩了。下次训练需要调整。

test_01_5

进行参数调整:

参数 原数据 变化 理由
policy_kwargs - pi=[256, 256], vf=[256, 256] 感觉网络不够,网络扩容,提升价值网络拟合能力
learning_rate LinearSchedule(start=1.0, end=0.05, end_fraction=0.2) LinearSchedule(start=3e-4, end=1e-4, end_fraction=0.2) 进一步压低初始梯度更新冲击,避免开局策略崩坏
vf_coef 0.8 0.9 小幅继续提高价值损失权重,强化价值拟合
ent_coef 0.01 0.02 提高熵系数,保留更多探索,防止提前锁死次优策略
gae_lambda 0.96 0.97 进一步平滑GAE优势估计
n_epochs 8 6 继续降低迭代次数,减轻单批次过度更新,缓解开局震荡
clip_range_vf - 0.3 新增:约束价值网络更新幅度,抑制value_loss剧烈波动
total_timesteps 10_000 100_000 增加训练总步数,否则很难充分收敛

训练后的结果

点击查看完整日志截图

5

可以通过rollout/ep_rew_mean发现,价值回报的数据已经开始向正常方向进行。指标都开始改善了。
后续准备继续拉高回报。

test_01_6

进行参数调整:

参数 原数据 变化 理由
policy_kwargs pi=[256, 256], vf=[256, 256] pi=[256, 256, 128], vf=[256, 256, 128] 进一步加宽网络,提升容量

训练后的结果

点击查看完整日志截图

6

回合奖励继续提升,这个是很好的现象。通过train/clip_fraction发现,后期波动很大,证明模型探索新区域时出发裁剪。

test_01_7

进行参数调整:

参数 原数据 变化 理由
clip_range 0.17 0.18 小幅放开更新区间(train/clip_fraction后期波动大,所以修改此参数,让其波动生效)
vf_coef 0.9 0.95 进一步强化价值拟合 (提升explained_variance的预测)
total_timesteps 100_000 150_000 继续增加训练总步数,让后期出现新的探索生效

训练后的结果

点击查看完整日志截图

7

训练的日志看起来都很棒了,但回报仍然没有突破0。后续训练准备继续降低探索,目标是突破回报0。

test_01_8

进行参数调整:

参数 原数据 变化 理由
learning_rate LinearSchedule(start=3e-4, end=1e-4, end_fraction=0.2) LinearSchedule(start=3e-4, end=8e-5, end_fraction=0.2) 最终学习率略微降低,让后期更新更精细
ent_coef 0.02 0.018 轻微降低熵系数,减少不必要随机抖动,降低一点点🤏模型的“好奇心”
total_timesteps 150_000 200_000 继续增加训练总步数,让后期出现新的探索生效

训练后的结果

点击查看完整日志截图

8

很棒!回合回报终于大于0了!并且可以发现,explained_variance在后期已经稳定的超过了0.6。非常好的现象。
整个模型曲线非常健康,前期没有崩盘,后期没有震荡。

test_01_8_1_0

基于test_01_8,继续训练50_000回合。

训练后的结果

点击查看完整日志截图

8-1

explained_variance已经可以上升到0.8了,针对理论值的1,已经非常接近了。并且ep_rew_mean已经稳定的超过了0,并且通过图表可以看出在持续上升。

评估

使用模型跑50次,看看模型奖励,评估一下。

# python evaluate.py

import gymnasium as gym
from stable_baselines3 import PPO

env = gym.make("LunarLander-v3")
model = PPO.load("ppo_LunarLander")

# 批量评估
eval_episodes = 50
total_reward = 0
for ep in range(eval_episodes):
    obs, _ = env.reset()
    ep_r = 0
    while True:
        action, _ = model.predict(obs, deterministic=True)
        obs, reward, terminated, truncated, info = env.step(action)
        ep_r += reward
        if terminated or truncated:
            break
    total_reward += ep_r
    print(f"Episode {ep+1} reward: {ep_r:.2f}")
print(f"平均奖励:{total_reward/eval_episodes:.2f}")

env.close()

结果如下:
image

平均奖励很高。

最终效果对比

未训练的帖子在:macos(M4)上跑强化学习 - PyTorch LunarLander-v3 Stable-Baselines3

未训练 训练后
not_training-ezgif.com-video-to-gif-converter 202607231650