强化学习奖励函数设计最佳实践:自定义马里奥Gym环境训练困境
自定义马里奥Gym环境奖励函数优化方案
我用Pygame制作了一款简易马里奥复刻游戏,并将其转换为OpenAI Gym环境,计划使用Stable Baselines 3的PPO算法训练智能体。游戏要求马里奥完成3次跳跃,触碰问号方块即为终点(最高奖励),仅可执行左移、右移、跳跃三种动作。目前观察到智能体训练时会探索环境,但训练结束后要么直接从出生点跳落边缘,要么原地上下跳跃,完全不尝试前往终点,核心问题应该出在奖励函数上。
以下是原step函数中基础奖励逻辑的中文翻译版:
max_moves = 150 reward = 0 step() # 初始调用的方法 # 左移奖励 reward += -10 # 右移奖励 reward += -10 # 未超过最大跳跃次数的奖励 reward += 25 # 超过跳跃次数的巨额惩罚 reward -= 1500 # 静止惩罚 reward -= 1000 # 处理平台碰撞 for platform in platforms: # 检查马里奥是否跳上了下一个平台 reward += 2500 # 跳上下一平台的奖励 reward -= 150 # 跳跃次数不足的惩罚 reward -= 5000 # 掉落惩罚 reward += 5000 # 触碰问号方块的奖励 done
奖励函数优化建议
- 修正动作导向奖惩:原代码左移、右移都加-10惩罚完全不合理,右移是向终点推进的动作,应给正向奖励(比如右移每步+2),左移仅给轻微惩罚(每步-1,避免过度左跑但允许位置微调)。同时静止惩罚1000过于严苛,会逼智能体无意义乱动,改成每步静止减0.5即可,仅用来避免长时间发呆。
- 重构跳跃相关奖惩逻辑:原代码不管是否跳跃都加25、强制减150的逻辑混乱,应调整为:只有成功跳上更高平台时才给大额奖励(保留2500或调整为500,根据整体奖励梯度调整),同时增加阶段性进度奖励——比如跳上第一个平台加300,第二个加600,第三个加900,强化“向上+前进”的目标行为。超过预设跳跃次数(比如3次)的1500惩罚可以保留,但必须加条件判断,只有触发时才执行。
- 修正即时奖惩的触发条件:原代码每步都无条件加减掉落惩罚、终点奖励,会让智能体无法建立行为与奖惩的因果关系。必须把这些奖惩放在对应条件判断中:
if 马里奥掉落边缘: reward -= 800 done = True # 掉落直接结束回合 if 马里奥触碰问号方块: reward += 1000 done = True # 完成任务结束回合 - 添加生存与回合限制奖励:给每存活一步加+1的小奖励,同时设置合理的max_steps(比如200步),超过步数则结束回合并给-100的惩罚,引导智能体在有限时间内推进任务,避免无意义动作循环。
- 平衡奖励权重,避免极端值干扰:原奖励中的5000、1500等极端值会让智能体只盯着大额奖惩,忽略小的进度引导。建议调整数值梯度:触碰问号方块给1000,掉落给-800,跳上平台给500,右移每步+2,左移每步-1,静止每步-0.5,让智能体能逐步学习到完整的行为链。
内容的提问来源于stack exchange,提问作者bbartling
相关产品推荐
相关产品推荐

