MountainCar环境PPO模型性能无提升,请求解决方案
解决MountainCar环境PPO奖励始终为-200的思路
MountainCar的默认奖励机制是每步-1,200步未到达目标(位置≥0.5)就会终止,所以-200意味着模型完全没学会推车上山的策略。以下是针对性的调整方案:
1. 重构奖励函数(核心)
默认的稀疏奖励很难引导模型学习“先左推积累速度再右冲”的反直觉策略,需要把稀疏奖励改成稠密奖励:
def get_custom_reward(state): pos, vel = state # 位置奖励:越接近目标(0.5)奖励越高 pos_reward = (pos - (-1.2)) / (0.5 - (-1.2)) * 2 # 映射到0-2区间 # 速度奖励:速度朝向目标方向(正方向)时给正奖励,反之亦然 vel_reward = vel if pos > -0.6 else -vel # 左侧区域向左推(负速度)能积累冲量,给正奖励 # 总奖励:基础-1加上额外奖励 return -1 + pos_reward + vel_reward * 0.8
训练时替换环境的默认奖励,让模型每一步都能得到行为反馈,更快找到正确方向。
2. 调整PPO超参数
MountainCar对超参数的敏感度比CartPole、LunarLander更高,建议调整:
- 学习率:从默认的3e-4降到1e-4~5e-5,慢学习率更适合这类需要精细策略的环境
- 批次与更新频率:将
n_steps(每轮收集的样本数)从2048调至512~1024,gae_lambda设为0.9(降低优势估计的远期权重,让模型更关注近期奖励) - 网络结构:用两层隐藏层,每层128~256个神经元,激活函数选Tanh(适配归一化后的连续状态);必须对输入状态做归一化(比如用
RunningMeanStd实时标准化位置和速度)
3. 强化探索策略
模型需要先学会“向左推”这个反直觉动作,可通过以下方式强化探索:
- 初始动作分布标准差设为0.5(默认可能偏低),训练中缓慢衰减
- 训练前10%的步数,强制10%的随机动作,避免模型陷入局部最优
4. 延长训练时长
MountainCar的收敛速度远慢于CartPole,至少需要训练50万~100万步才能看到明显提升。每训练5000步就测试一次,观察奖励是否逐步上升(比如从-200到-150、-100,直到突破-100以内说明已经能接近目标)
5. 检查环境与模型配置
- 确认使用的是
MountainCar-v0(离散动作)还是MountainCarContinuous-v0(连续动作),PPO的离散/连续动作头要对应(离散用Softmax,连续用高斯分布) - 验证环境终止条件:默认是位置≥0.5时终止,若自定义了环境,确保逻辑正确
内容的提问来源于stack exchange,提问作者Lakshmanan M
相关产品推荐
相关产品推荐

