根据表格内容,进行参数的逐步优化
代码:github
根据上篇文档中的数据内容:
| 图表 | 解析 |
|---|---|
![]() | explained_variance 数据为负数或0附近,代表 价值网络拟合失效。 |
![]() | approx_kl 持续上行,策略更新幅度偏大 |
![]() | 学习率 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 | 增加训练总步数,否则很难充分收敛 |
训练后的结果
点击查看完整日志截图

可以通过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 | 增加训练总步数,否则很难充分收敛 |
训练后的结果
点击查看完整日志截图

可以通过rollout/ep_rew_mean发现,价值回报的数据已经开始向正常方向进行。指标都开始改善了。
后续准备继续拉高回报。
test_01_6
进行参数调整:
| 参数 | 原数据 | 变化 | 理由 |
|---|---|---|---|
| policy_kwargs | pi=[256, 256], vf=[256, 256] | pi=[256, 256, 128], vf=[256, 256, 128] | 进一步加宽网络,提升容量 |
训练后的结果
点击查看完整日志截图

回合奖励继续提升,这个是很好的现象。通过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 | 继续增加训练总步数,让后期出现新的探索生效 |
训练后的结果
点击查看完整日志截图

训练的日志看起来都很棒了,但回报仍然没有突破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 | 继续增加训练总步数,让后期出现新的探索生效 |
训练后的结果
点击查看完整日志截图

很棒!回合回报终于大于0了!并且可以发现,explained_variance在后期已经稳定的超过了0.6。非常好的现象。
整个模型曲线非常健康,前期没有崩盘,后期没有震荡。
test_01_8_1_0
基于test_01_8,继续训练50_000回合。
训练后的结果
点击查看完整日志截图

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()
结果如下:
平均奖励很高。
最终效果对比
未训练的帖子在:macos(M4)上跑强化学习 – PyTorch LunarLander-v3 Stable-Baselines3
| 未训练 | 训练后 |
|---|---|
![]() | ![]() |




