我已成功'建立一个Q-network来解决'FrozenLake-v0' OpenAI健身房的环境(至少,我认为..不是100%肯定我的得分 - 在没有经验重播的5k次训练之后,我在100集成功剧集中得到70到80)。我对这些编程问题还很陌生,但我确实有几年的整体编程经验。我使用最新的健身房,Python 3.6.4(x64)和Tensorflow 1.7。我还没有在家里的980 Ti钻机上安装Tensorflow-GPU(从我读过的内容中我可以将CPU从水中吹出来)。
现在,我尝试通过实施经验重播来改进:每一步(=一次体验')都保存为(s, a, r, s')
:状态,行动,奖励,新国家。在经过最低pre_train_steps
后(换句话说:如果已采取一定数量的有机步骤),每25步(if total_steps % 25 == 0
),我随机抽样4记忆中的剧集(记忆是最后1000集),对于这4集中的每一集,我在该集(episode[n:n+4] where n=rand(0, len(episode) + 1 - 4)
)中随机抽取4个连续步骤。
结果是4 * 4 = 16 (s, a, r, s')
个元组作为样本。对于每个样本,我都会得到Q(s, a)
,Q(s', a')
和max(Q(s', a'))
。然后,我计算目标Q值,为每个样本设置targetQ(:,a) = r + gamma * max(Q(s', a')) where gamma = .99
。然后,我使用定义为GradientDescentOptimizer(learning_rate=0.1)
loss = reduce_sum(square(targetQ - Q))
和损失函数进行训练
测试,不使用经验重播,运行10k集(aprox.290k'有机'步骤)所有参数(gamma,LR等)等于上面写的那些,我得到的每100集测试中70-80成功的结果一致。在我的Lenovo T440s笔记本电脑上运行大约需要9分钟。
启用体验重播,然后运行10k集(aprox.240k'有机'以及115k'经过培训的'步骤),pre_train_steps = 50k
和train_freq = 25
,结果是持续降低(每100集65-70成功),在我的旧T440上稍微缩短(aprox.8分钟)。
为什么?我对这次体验重播有什么期待?我认为它减少了我的时间并提高了我的准确性(特别是阻止网络只选择它被锁定的某些路径),但它几乎没有任何帮助。也许我的代码错了,也许我使用了错误的参数?如果有人能够看到这一点并指出我正确的方向,那将是一个很好的帮助,因为我想继续增加我的网络的复杂性并尝试不同的环境,但在此之前我是否想知道我没有做错完全错误...
TIA!
答案 0 :(得分:1)
通过检查链接中的代码,我得到的印象是:
e
是epsilon
的{{1}}参数 - 贪婪策略epsilon
似乎是决定是否使用体验重播的参数?假设上述内容是正确的:有一点让我感到惊讶的是这段代码
batch_train
内部 for i, experience in enumerate(training_batch):
s, a, r, ss, d = experience # s a r s' d
if int(r) == 1:
e -= e_factor
if e < e_end:
e = e_end
target_Qs[i][int(a)] = r + QN1.gamma * new_Qs_max[i]
- 块以if
为条件,换句话说,上面的代码片段仅在使用体验重放的情况下运行。该代码似乎在衰减您的batch_train == True
参数。
通常,您不希望epsilon
根据您从中学到的经验样本数量而衰减;您希望它根据您在环境中实际采取的操作数量而衰减。这应该与您是否使用体验重播无关。因此,一种可能的解释是,在使用体验重放的情况下,您只是过快地衰减epsilon
。
除此之外,您还可以在最新的体验样本上执行直接学习步骤,此外还可以通过体验重播向老样本学习。 仅从您的体验重放缓冲区中随机抽取的样本中学习更为常见,而不是直接从最新的样本中学习。在重播缓冲区中简单地讲述epsilon
元组,而不是它们来自哪一集,更常见,然后比每25个动作更经常地学习一些学习步骤。
这些都是您可以查看的更常见的实现和实现之间的差异,但直观地说,我不希望它们解释您正在观察的性能下降。由于您在更常见的实施方面存在差异,因此您仍然更接近于没有经验重播&#34;设置,所以我真的希望你能够获得与该设置非常相似的性能而不是更差的性能。