强化学习(PPO)初步接触 3 (模型微调)

根据表格内容,进行参数的逐步优化

代码:github

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

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

test_01_4

进行参数调整:

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

训练后的结果

点击查看完整日志截图

4

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

test_01_5

进行参数调整:

参数原数据变化理由
policy_kwargspi=[256, 256], vf=[256, 256]感觉网络不够,网络扩容,提升价值网络拟合能力
learning_rateLinearSchedule(start=1.0, end=0.05, end_fraction=0.2)LinearSchedule(start=3e-4, end=1e-4, end_fraction=0.2)进一步压低初始梯度更新冲击,避免开局策略崩坏
vf_coef0.80.9小幅继续提高价值损失权重,强化价值拟合
ent_coef0.010.02提高熵系数,保留更多探索,防止提前锁死次优策略
gae_lambda0.960.97进一步平滑GAE优势估计
n_epochs86继续降低迭代次数,减轻单批次过度更新,缓解开局震荡
clip_range_vf0.3新增:约束价值网络更新幅度,抑制value_loss剧烈波动
total_timesteps10_000100_000增加训练总步数,否则很难充分收敛

训练后的结果

点击查看完整日志截图

5

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

test_01_6

进行参数调整:

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

训练后的结果

点击查看完整日志截图

6

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

test_01_7

进行参数调整:

参数原数据变化理由
clip_range0.170.18小幅放开更新区间(train/clip_fraction后期波动大,所以修改此参数,让其波动生效)
vf_coef0.90.95进一步强化价值拟合 (提升explained_variance的预测)
total_timesteps100_000150_000继续增加训练总步数,让后期出现新的探索生效

训练后的结果

点击查看完整日志截图

7

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

test_01_8

进行参数调整:

参数原数据变化理由
learning_rateLinearSchedule(start=3e-4, end=1e-4, end_fraction=0.2)LinearSchedule(start=3e-4, end=8e-5, end_fraction=0.2)最终学习率略微降低,让后期更新更精细
ent_coef0.020.018轻微降低熵系数,减少不必要随机抖动,降低一点点🤏模型的“好奇心”
total_timesteps150_000200_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-converter202607231650