关于是否适用done参数作为更新Q值的讨论。
这个方法我感觉对于多数雅达利游戏来讲时没用的,因为大多数情况下done都是false,处理成数字就是0.
具体方法参考这个链接,作者在倒立摆上实验的,说实话,这个游戏真的不具有代表性。
管局具体的调参几千,大家主要关注:学习率,gamme,replay buffer容量,等参数。
很多炼丹专家通过控制变量的方法来分析这些超参数对算法新性能的影响。
例如这个 DQN调整超参体会。
作者详细分析了每个参数的作用。
这个讨论了DQN损失函数越训练越差的问题。
这边有人讨论了为什么DQN越训练越倒退的原因。说实话,我没有学到大佬们的idea。
这个时DQN的相关论文的综述笔记。
这个博客也不错,从头分析了所有版本的DQN,适合正在写毕业设计的小硕参考一下。
这个一系列的都可以看下。
下面是我在训练雅达利游戏时的一些感悟。
一开始是照搬别人的代码,她设置了学习率为0.1.算法学的很快,一千多步可以学到不错的结果,但是效果达不到DQN在nature论文的效果。一开始我以为是这个人算法的结构问题。后来我找到了源码,然后对比发现没啥差别。
然后我就觉得问题没这么简单,于是我开始调参生涯:
首先,我想到了不同的优化算法,
#optimizer = torch.optim.SGD(policy_net.parameters(), lr=0.0005, momentum=0.9)
#optimizer = optim.RMSprop(policy_net.parameters(), lr=0.0005, alpha=0.9)#设置优化器
optimizer = optim.Adam(policy_net.parameters(), lr=0.0005, betas=(0.9, 0.999),eps=1e-08)#设置优化器
首先使用的是optim.RMSprop()
然后就是学习率。我将学习率设置为0.0005,训练’Seaquest-v0’的时候我发现算法在一千步以后高分开始频繁出现,升值出现了1500的最高分,这超过了nature的效果。
然后是关于replay buffer中transitions的选择问题,
分析replay buffer需要从优化算法开始说,尤其是对于adam算法,这个算法我真的不知道它好在哪,而且它非常收到初始化的影响。如果我们不由分说的将所有transitions都存到replay buffer,adam大概率会出现效果很差的现象,而且一直到3000步,算法都不能得到很好的效果,甚至没有超过500的分数。
因此,我首先对transitions进行过了过滤,具体过滤方法大家自行脑补,反正就是把各种有利于训练的transitions存到replay buffer中。