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