uuu332 2024-06-29 10:13 采纳率: 0%
浏览 53
已结题

近端策略优化 PPO | 损失值计算问题

近端策略优化算法(PPO)中, actor网络的损失计算公式中,取ratioadvantage和裁切后ratioadvantage的较小者,当优势函数大于0时,ratio的裁切起到了作用,目的是限制权重更新步长。然而,当优势函数小于0时,假设当下价值和平均价值相差甚远(我发现某些episode中我的优势函数的值是一个非常大的负数),且ratio的值也很大,此时ratioadvantage将是一个非常大的负数,取最小值时将取到ratioadvantage,貌似ratio的裁切在advantage<0时不起作用,导致每次回传的损失值都相当大。这个现象是合理的吗,我增加了动态学习率等措施来防止过大的损失值被学习,但效果并不理想。

核心代码部分:

state, action_cont, action_disc, next_state, reward, done = zip(*samples)
action_cont = torch.FloatTensor(action_cont).to(self.device)
original_old_continuous_log_probs = continuous_dist0.log_prob(action_cont.unsqueeze(1))
new_continuous_log_probs = continuous_dist.log_prob(action_cont.unsqueeze(1))

ratio = torch.exp(new_continuous_log_probs - original_old_continuous_log_probs)
surr1 = ratio * original_advantage
surr2 = torch.clamp(ratio, 1 - self.eps, 1 + self.eps) * original_advantage
actor_loss = torch.mean(-torch.min(surr1, surr2)).float()
  • 写回答

28条回答 默认 最新

  • 关注
    获得0.45元问题酬金

    上午好☀️☀️☀️️
    本答案参考ChatGPT-3.5

    在近端策略优化(PPO)算法中,actor网络的损失计算公式中,通过取ratioadvantage和裁切后ratioadvantage的较小者,可以限制权重更新的步长。然而,在优势函数小于0时,ratioadvantage将是一个非常大的负数,而且取最小值时会选择ratioadvantage,导致每次回传的损失值都相当大。这个现象在某些情况下是合理的,但出现过大的损失值可能会影响学习的效果。

    解决方案如下:

    1. 检查优势函数计算的准确性: 确保在计算优势函数时没有出错。检查环境模型、奖励计算以及价值函数的实现。
    2. 调整优势函数的计算方法: 如果某些episode中优势函数的值非常大,可以考虑使用其他的计算方法,例如使用相对优势函数或者对优势函数进行归一化处理。
    3. 调整超参数: 调整PPO算法中的超参数,例如epsilon(裁切参数)和学习率等,可以通过交叉验证或者调参技巧来尝试寻找更合适的超参数组合。
    4. 添加正则化项: 在损失函数中添加一些正则化项,例如L2正则化,可以帮助限制权重更新的范围,防止过大的损失值。

    修改后的代码如下:

    state, action_cont, action_disc, next_state, reward, done = zip(*samples)
    action_cont = torch.FloatTensor(action_cont).to(self.device)
    original_old_continuous_log_probs = continuous_dist0.log_prob(action_cont.unsqueeze(1))
    new_continuous_log_probs = continuous_dist.log_prob(action_cont.unsqueeze(1))
    
    ratio = torch.exp(new_continuous_log_probs - original_old_continuous_log_probs)
    clipped_ratio = torch.clamp(ratio, 1 - self.eps, 1 + self.eps) * original_advantage
    surr1 = ratio * original_advantage
    surr2 = clipped_ratio * original_advantage
    actor_loss = -torch.mean(torch.min(surr1, surr2)).float()
    

    请注意,这里的损失计算公式和代码只是一个示例,具体的修改方法还需要根据实际情况进行调整。同时,还建议仔细检查其他部分的代码实现,包括价值函数的更新等,以确保算法的正确性。

    评论

报告相同问题?

问题事件

  • 系统已结题 7月7日
  • 创建了问题 6月29日

悬赏问题

  • ¥15 单纯型python实现编译报错
  • ¥15 c++2013读写oracle
  • ¥15 c++ gmssl sm2验签demo
  • ¥15 关于模的完全剩余系(关键词-数学方法)
  • ¥15 有没有人懂这个博图程序怎么写,还要跟SFB连接,真的不会,求帮助
  • ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因
  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音