0

在使用 RLlib 的(1.4.0)PPO 网络在自定义多代理环境上进行了一些训练后,我发现我的连续动作变成了nan(爆炸?),这可能是由糟糕的梯度更新引起的,而梯度更新又取决于损失/目标函数

据我了解,PPO 的损失函数依赖于三个术语:

  1. PPO 梯度目标[取决于旧策略和新策略的输出、优势和“剪辑”参数 = 0.3,比如说]
  2. 价值函数损失
  3. 熵损失[主要是为了鼓励探索]

总损失 = PPO 梯度目标(裁剪)- vf_loss_coeff * VF 损失 + entropy_coeff * 熵。

我已将熵系数设置为 0。所以我专注于导致总损失的其他两个函数。如下面的进度表所示,总损失变为inf的相关部分是问题区域。我发现的唯一变化是政策损失在第 #445 行之前都是负数。

所以我的问题是:谁能解释一下保单损失应该是什么样子,这是否正常?一段时间后,如何通过连续动作变为 nan 来解决此问题?只是降低学习率的问题吗?

编辑

这是相关问题的链接(如果您需要更多上下文)

编辑结束

我真的很感激任何提示!谢谢!

总体损耗 保单损失 VF损失
430 6.068537 -0.053691725999999995 6.102932
431 5.9919114 -0.046943977000000005 6.0161843
432 8.134636 -0.05247503 8.164852
433 4.222730599999999 -0.048518334 4.2523246
434 6.563492 -0.05237444 6.594456
435 8.171028999999999 -0.048245672 8.198222999999999
436 8.948264 -0.048484523 8.976327000000001
437 7.556602000000001 -0.054372005 7.5880575
438 6.124418 -0.05249534 6.155608999999999
439 4.267647 -0.052565258 4.2978816
440 4.912957700000001 -0.054498855 4.9448576
441 16.630292999999998 -0.043477765999999994 16.656229
442 6.3149705 -0.057527818 6.349851999999999
443 4.2269225 -0.05446908599999999 4.260793700000001
444 9.503102 -0.052135203 9.53277
445 信息 0.2436709 4.410831
446 -0.00029848056 22.596403
447 0.00013323531 0.00043436907999999994
448 1.5656527000000002e-05 0.0002645221
449 1.3344318000000001e-05 0.0003139485
450 6.941916999999999e-05 0.00025863337
451 0.00015686743 0.00013607396
452 -5.0206604e-06 0.00027541115000000003
453 -4.5543664e-05 0.0004247162
454 8.841756999999999e-05 0.00020278389999999998
455 -8.465959e-05 9.261127e-05
456 3.8680790000000003e-05 0.00032097592999999995
457 2.7373152999999996e-06 0.0005146417
458 -6.271608e-06 0.0013273798000000001
459 -0.00013192794 0.00030621013
460 0.00038987884 0.00038019830000000004
461 -3.2747877999999998e-06 0.00031471922
462 -6.9349815e-05 0.00038836736000000006
463 -4.666238e-05 0.0002851575
464 -3.7067155e-05 0.00020161088
465 3.0623291e-06 0.00019258813999999998
466 -8.599938e-06 0.00036465342000000005
467 -1.1529375e-05 0.00016500981
468 -3.0851965e-07 0.00022042097
469 -0.0001133984 0.00030230957999999997
470 -1.0735256e-05 0.00034000343000000003
4

2 回答 2

1

看来RLLIB的 PPO 配置grad_clip太大了(grad_clip=40)。我将其更改为grad_clip=4并且有效。

于 2021-12-14T17:54:46.397 回答
0

我在运行rllib 示例时遇到了同样的问题。我也在这个问题中发布了我的问题。我还在一个有界和有界的行动空间中运行 PPO。由于 Nan 相关错误,PPO 输出操作非常大并最终崩溃。

对我来说,似乎当action正态分布的log_std太大时,会出现大的actions(大约1e20)。我在 RLlib(v1.10.0) ppo_torch_policy.py 中复制计算损失的代码并将它们粘贴到下面。

logp_ratio = torch.exp(
    curr_action_dist.logp(train_batch[SampleBatch.ACTIONS]) -
    train_batch[SampleBatch.ACTION_LOGP])
action_kl = prev_action_dist.kl(curr_action_dist)
mean_kl_loss = reduce_mean_valid(action_kl)

curr_entropy = curr_action_dist.entropy()
mean_entropy = reduce_mean_valid(curr_entropy)

surrogate_loss = torch.min(
    train_batch[Postprocessing.ADVANTAGES] * logp_ratio,
    train_batch[Postprocessing.ADVANTAGES] * torch.clamp(
        logp_ratio, 1 - self.config["clip_param"],
                    1 + self.config["clip_param"]))

对于这么大的操作,curr_action_dist.logp(train_batch[SampleBatch.ACTIONS])由 <class 'torch.distributions.normal.Normal'> 计算的 logp 将为 -inf。然后curr_action_dist.logp(train_batch[SampleBatch.ACTIONS]) -train_batch[SampleBatch.ACTION_LOGP])回南。torch.min 和 torch.clamp 仍将保持 Nan 输出(请参阅文档)。

所以总而言之,我猜是Nan是由非常大动作的log概率的-inf值引起的,而torch没有根据“clip”参数对其进行剪辑。

不同之处在于我没有将 entropy_coeff 设置为零。在我的例子中,我们鼓励标准方差尽可能大,因为熵是针对总正态分布而不是受限于动作空间的分布计算的。我不确定你是否像我一样得到大的 σ。另外,我使用的是 Pytorch,Tf 的情况可能会有所不同。

于 2022-03-01T04:41:09.727 回答