Python 经验重播让我的经纪人变得更糟

Python 经验重播让我的经纪人变得更糟,python,tensorflow,reinforcement-learning,q-learning,openai-gym,Python,Tensorflow,Reinforcement Learning,Q Learning,Openai Gym,我已经“成功”建立了一个Q网络,用于解决OpenAI健身房的“FrozenLake-v0”环境问题,至少我认为。。不是100%确定我如何得分-在没有经验重播的5公里训练后,我在100次成功的训练中得到70到80次。我对这类编程问题还很陌生,但我确实有几年的总体编程经验。我使用最新的gym,Python 3.6.4 x64和Tensorflow 1.7。我还并没有在家里的980TI设备上安装Tensorflow GPU,从我所读到的内容来看,它会把我的CPU从水里吹出来 现在,我正试图通过实现体验

我已经“成功”建立了一个Q网络,用于解决OpenAI健身房的“FrozenLake-v0”环境问题,至少我认为。。不是100%确定我如何得分-在没有经验重播的5公里训练后,我在100次成功的训练中得到70到80次。我对这类编程问题还很陌生,但我确实有几年的总体编程经验。我使用最新的gym,Python 3.6.4 x64和Tensorflow 1.7。我还并没有在家里的980TI设备上安装Tensorflow GPU,从我所读到的内容来看,它会把我的CPU从水里吹出来

现在,我正试图通过实现体验重播来改进:每一步=一次“体验”都保存为s、a、r、s:状态、动作、奖励、新状态。在采取最低的训练前步骤后,换句话说:如果采取了一定数量的“有机”步骤,如果总步骤%25==0,则每25个步骤,我从内存中随机抽取4个片段,即最后1000个片段,并且对于这4个片段中的每一个,我抽取该片段片段内的4个随机连续步骤[n:n+4]其中n=rand0,n+1-4

结果是4*4=16s,a,r,s'元组作为样本。对于每个样本,我得到Qs,a,Qs',a'和maxQs',a'。然后,我计算目标Q值,设置targetQ:,a=r+gamma*maxQs',a',其中每个样本的gamma=.99。然后,我使用GradientDescentOptimizerlearning_rate=0.1和定义为loss=reduce_sumsquaretargetQ-Q的损失函数进行训练

测试,不应用体验重播,每小时运行10k集。290k“有机”步骤,所有参数gamma、LR等与上述参数相同,我得到的一致结果是每100集测试成功70-80次。在我的联想T440s笔记本电脑上运行大约需要9分钟

不过,要实现体验重播,请在大约10万集的时间内重播。240k“有机”和115k“训练”步骤,训练前步骤=50k,训练频率=25,每100集的成功率始终低于65-70,所需时间略短。在我的旧T440上8分钟

为什么??我对这件事期望太高了吗?我认为这会缩短我的时间,提高我的准确性,特别是防止网络只选择某些它被“锁定”的路径,但这似乎毫无帮助。也许我的代码错了,也许我使用了错误的参数?如果有人能仔细检查一下,给我指出正确的方向,那将是一个很大的帮助,因为我希望不断增加网络的复杂性,尝试不同的环境,但在我这么做之前,我想知道我没有做完全错误的事情

蒂亚


完整代码:

通过检查链接中的代码,我得到的印象是:

e是epsilon贪婪策略的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]
也就是说,上面的代码片段仅在使用体验重播的情况下运行。该代码似乎正在衰减epsilon参数

一般来说,你不希望ε根据你从中学到的经验样本的数量而衰减;您希望它根据您在环境中实际执行的操作数衰减。这应该与您是否使用体验重播无关。所以,一个可能的解释是,在使用经验重播的情况下,你只是太快地衰减ε

除此之外,除了通过体验重播从旧体验中学习之外,您似乎还在对最近的体验样本执行直接学习步骤。更常见的是,只从随机抽取的样本中学习,而不是直接从最近的样本中学习。更常见的情况是,在回放缓冲区中简单地讲故事s、a、r、s的元组,而不依赖于它们来自哪一集,然后比每25个动作进行一次更定期地采取学习步骤


这些都是更常见的实现和您可以研究的实现之间的差异,但凭直觉,我不希望它们解释您所观察到的性能降低。由于您在更常见的实现方面的差异,您仍然非常接近无经验重播设置,因此我真的希望您能够获得与该设置非常相似的性能,而不是更差的性能。

嗨,丹尼斯,感谢您的快速回复!你的初步印象是正确的。我手动设置batch_train,以比较ER on和ER off运行。注意,ε不仅在内质网中衰减,而且在直接学习过程中也会衰减。epsilon根据成功的情节衰减。我将根据您的sug测试对代码的更改
做手势,然后报告!仅仅从随机抽取的样本中学习更为常见,你的意思是我不应该用直接学习来训练我的网络,而只使用直接学习作为ER缓冲区的来源吗?@Floris是的,我注意到epsilon也在ER之外衰减,这没问题。问题是epsilon通常会随着时间的推移而衰减,时间是根据收集到的经验/采取的行动来衡量的。在你的例子中,你通过学习步骤的数量来衡量时间,一旦你打开ER,学习步骤的数量就会增加。至于你的第二个问题,是的,这是最常见的方法;只需在观察时将您的体验样本存储在缓冲区中,始终只对回放缓冲区中的样本执行学习步骤通常是每一个时间步而不是每25个时间步执行。我对代码做了一些更改:直接学习现在只用于添加新体验。在预训练步骤之后,每一个训练频率步骤仍在调整,我们在缓冲区的16个随机样本上训练网络。ε衰变现在是每一个动作的计算,用一个较小的步骤来防止它衰变得太快。我做的另一个更改是随机均匀范围,从0,1到0到0.01。我在最后得到了一些Q值>1,这似乎是错的。与早期版本的代码相比,初始结果确实显示了改进。。。更多的测试要做!