PPO算法中奖励函数设计缺陷与优化实践
1. 项目背景与核心发现最近在训练一个基于PPOProximal Policy Optimization算法的智能体时遇到了一个有趣的现象模型在找门任务中成功收敛但最终学到的策略却是原地不动。这个看似反直觉的结果实际上揭示了强化学习训练中一个经典问题——奖励函数设计缺陷。这个项目原本的目标是训练一个能够在二维网格世界中找到出口的智能体。环境设置如下10x10的网格世界随机生成的墙壁和障碍物一个固定位置的出口门智能体每步可采取上、下、左、右、原地不动五种动作2. 奖励函数设计与问题分析2.1 初始奖励方案最初设计的奖励函数包含以下要素找到门100分撞墙-5分每走一步-1分鼓励高效找到出口原地不动-0.1分轻微惩罚2.2 模型行为观察经过约50万步训练后模型表现出了以下行为模式初期会积极探索环境中期开始减少移动频率最终完全停止移动选择持续原地不动2.3 问题根源分析通过分析训练日志和回报曲线发现了几个关键点时间惩罚的累积效应移动探索平均需要50步才能找到门每次探索的净回报100(门) - 50(步数) - X(撞墙) ≈ 30-40分原地不动的回报-0.1/步 → 50步仅-5分探索成本过高撞墙惩罚使探索变得昂贵模型发现随机移动容易导致负回报保守策略反而能获得相对稳定的高回报奖励尺度失衡步数惩罚(-1)与不动惩罚(-0.1)相差10倍模型很快学会最小化惩罚比最大化奖励更容易3. 解决方案与优化过程3.1 奖励函数重构基于上述分析对奖励函数进行了多轮调整第一版改进增加探索激励0.2分/步鼓励移动降低不动惩罚-0.5分/步调整撞墙惩罚-2分降低探索恐惧结果模型开始移动但路径效率低下第二版改进引入距离奖励每步给予(1 - 当前距离/最大距离)*0.5分动态调整步数惩罚前50步-0.5分/步之后-1分/步成功奖励分级接近门10分到达门100分3.2 课程学习引入为了帮助模型建立正确的探索策略初期在小地图(5x5)训练逐步扩大地图尺寸最终在10x10环境微调3.3 超参数调整配合奖励函数修改的关键参数{ gamma: 0.99, # 保持长期回报考量 lam: 0.95, # GAE参数 clip_range: 0.2, # PPO裁剪范围 ent_coef: 0.01, # 适当保留探索性 learning_rate: 3e-4, n_steps: 2048, # 增加采样步数 batch_size: 64 }4. 关键实现细节4.1 状态表示优化原始状态仅包含坐标(x,y)改进后包含当前坐标上次动作历史动作序列(最近5步)与门的相对方向周围4格的可通行性def get_observation(self): obs np.zeros(14) obs[0] self.agent_x / self.width # 归一化坐标 obs[1] self.agent_y / self.height obs[2:6] self.get_surroundings() # 四周可通行性 obs[6:10] self.last_actions # 动作历史 obs[10] (self.door_x - self.agent_x) / self.width # 门方向 obs[11] (self.door_y - self.agent_y) / self.height obs[12] self.steps / self.max_steps # 进度 obs[13] self.last_action / 4.0 # 归一化 return obs4.2 网络架构调整使用更复杂的网络结构处理丰富后的状态class PolicyNetwork(nn.Module): def __init__(self): super().__init__() self.feature_extractor nn.Sequential( nn.Linear(14, 64), nn.ReLU(), nn.Linear(64, 64), nn.ReLU() ) self.actor nn.Linear(64, 5) # 5个动作 self.critic nn.Linear(64, 1) # 状态价值 def forward(self, x): features self.feature_extractor(x) return self.actor(features), self.critic(features)4.3 训练过程监控实现多个监控指标探索率移动步数/总步数有效探索率导致距离减少的移动比例保守惩罚连续不动步数的平方惩罚路径效率最优路径长度/实际路径长度5. 经验总结与避坑指南5.1 奖励设计原则保守策略检测始终设置一个不作为基线奖励尺度平衡确保积极行为的净收益明显高于被动策略探索激励早期训练需要显式的探索奖励稀疏奖励处理对长期目标设置中间里程碑5.2 PPO训练技巧熵系数调整初期保持较高(0.1)鼓励探索后期逐步降低(0.01)稳定策略批量大小选择简单任务32-64复杂任务128-256需要与n_steps协调梯度裁剪建议值在0.5-1.0之间配合自适应学习率效果更好5.3 环境设计建议提供足够信息状态空间应包含决策所需全部要素动作空间设计避免不对称动作造成偏差课程学习从简单场景逐步过渡到复杂场景可视化监控实时渲染训练过程便于调试6. 最终效果与扩展思考经过上述调整后模型在10x10环境中的表现成功率98.7%平均步数最优路径的1.2倍训练稳定性回报曲线平滑上升这个案例带给我们的启示强化学习中的局部最优往往暴露奖励设计问题智能体会寻找奖励函数的漏洞而非真正解决问题监控指标需要超越简单的回报值环境与奖励的协同设计比算法调参更重要对于更复杂的导航任务可以考虑加入记忆机制LSTM处理部分可观测性使用分层强化学习分解寻路过程结合模仿学习提供专家示范引入好奇心驱动探索机制