Lunar Lander-v2中PPO算法问题:比值恒为1且奖励无上升趋势
问题关联判定
ratios恒为1肯定是导致奖励无法上升的核心原因。PPO的核心逻辑就是通过ratios = torch.exp(new_probs - old_probs)衡量新旧策略的差异,进而限制策略更新幅度。如果这个比值始终为1,说明新旧策略完全一致,相当于没有对策略进行任何有效更新——哪怕actor和critic的损失在下降,也只是模型在拟合旧数据,没有探索更优策略,自然无法提升回合奖励。
常见原因及排查方向
新旧策略参数未分离
这是最常见的问题:计算old_probs时没有固定旧策略的参数,直接使用了当前正在更新的actor模型。比如训练时没有维护独立的old_actor网络,或者计算old_probs时未冻结当前actor的梯度。
解决:训练前将old_actor的参数完全复制为当前actor的参数;计算old_probs时用old_actor处理轨迹数据,并用torch.no_grad()包裹以避免梯度更新。动作概率计算/存储错误
比如:- 采集轨迹时存储的old_probs不是对应动作的对数概率(错存成状态值或其他输出);
- 计算new_probs时用了轨迹中不存在的动作,或概率维度计算错误(比如取全局均值而非对应动作的概率)。
排查:打印new_probs和old_probs的具体数值、形状,确认两者是同一批轨迹中相同动作的对数概率,且数值存在差异(哪怕很小)。
actor模型梯度被意外冻结
若actor的参数被设置为requires_grad=False,或优化器未包含actor的参数,会导致模型参数无法更新,新旧策略自然一致。
排查:检查actor.parameters()的requires_grad状态,确认优化器的参数列表包含actor的所有可训练参数。学习率设置过低
若学习率极小,模型参数更新幅度微乎其微,会导致new_probs - old_probs的差值趋近于0,exp后接近1。
解决:尝试调大actor的学习率(比如从1e-5调到1e-4),观察ratios是否开始出现波动。轨迹数据复用逻辑错误
如果一直复用同一批旧轨迹数据训练,模型可能收敛到与旧策略完全一致的状态,无法探索新策略。
解决:遵循PPO标准流程:每完成一轮策略更新,重新采集一批新轨迹数据,保存对应的old_probs,再用这批新数据进行多轮训练。
快速排查步骤
- 直接打印
new_probs - old_probs的结果,确认是否全为0(或接近0的极小值); - 验证
old_actor和当前actor的参数是否存在差异(比如打印某一层参数的均值); - 检查采集轨迹时的代码,确认old_probs是当时actor输出的对应动作的对数概率;
- 临时调大学习率,运行几轮后观察ratios是否变化。
内容的提问来源于stack exchange,提问作者cxzhou

