强化学习算法实现中的细节

强化学习在算法实现时需要非常注意细节,否则网络很难收敛或没有训练效果。本文主要记录我在实现各种强化学习算法时踩到的一些坑以及需要注意的细节,持续更新......

以及附上我自己实现的RL算法库:https://github.com/KezhiAdore/RL-Algorithm

Common

  • PyTorch中的交叉熵损失函数torch.nn.functional.cross_entropy里面会先计算一次softmax,在使用策略梯度时要注意1
  • 在部分场景中,存在人为提前结束trajectory的情况(例如Cart Pole环境中达到一定的step提前阶段)。这种情况下和因失败结束trajectory区分开来。在失败的情况下,\(q(s,a)=r\),而在人为截断时,\(q(s,a)=r+\gamma*V(s')\)2

REINFORCE

  • 计算loss时,\(-\ln\pi_\theta(a|s)\)与discount reward相乘时要注意维度一致。
  • 计算完交叉熵之后使用torch.sum求和比torch.mean求平均效果要好3

DQN系列

  • 计算q_target时要注意done=1的情形:即q_target = reward + self._gamma * max_next_q_value * (1 - done),否则容易导致训练过程中reward一直上下大幅震荡。
  • 一定要有间隔同步的target_newok,否则很难收敛。

Reference


  1. PyTorch中的CrossEntropyLoss与交叉熵计算不一致 | Kezhi's Blog↩︎

  2. 强化学习中的Terminated 和 Truncated | Kezhi's Blog↩︎

  3. Vanilla Policy Gradient关于loss mean与sum的探讨 | Kezhi's Blog↩︎