大家都知道,DQN或DDQN以“不稳定的训练”而闻名。
让我们使用众所周知的"CartPole“。代理必须平衡棍子并得到每帧+1的奖励。你可以达到195的门槛与Cartpold-V0,但结果会有很大的变化。你将很难让它发挥作用,直到它“几乎稳定”。可能的原因是学习速度,批次大小等.
如果您掌握了v0,切换到“Cartpold-v1”,我相信您的“稳定”系统将再次失败。您通常需要调整参数才能使它再次工作。(只是我的经验)
但是,在algo的工作流程中,我不明白:
for ep in range(num_episodes):
state = env.reset()
total = 0.0
done = False
while not done:
action = agent.get_action(state)
next_state, reward, done, info = env.step(action)
agent.remember(state, action, reward, next_state, done)
agent.train()
total += reward
state = next_state
ep_rewards.append(total)时测量性能
每个agent.train()调用都会进行批处理训练并更改权重。“总”报酬是用很多不同的模型来计算的,我们衡量的是哪一个?
,则集结束(已完成)。
有些(第一次)跑步非常短--这导致了较少的训练(不一致的循环计数)。这意味着,如果特工表现不好,就会进行较少的训练。如果它运行良好-它训练很多,做了很多循环,直到完成,并移动它的权重远离好的政策,并可能变得不稳定。
我们有效地测试了一堆模型并获得了某种类型的平均性能,但是如果我们在运行良好之后保存模型会发生什么呢?我们可以有一个良好的运行(高总回报)-但拯救一个坏(最后)模式?我们到底节省了什么重量,我无法用一种合理的方式来解释,对吗?
现在,通过移动一些代码部分来解决所有问题的一个简单改进:
for ep in range(num_episodes):
state = env.reset()
total = 0.0
done = False
while not done:
action = agent.get_action(state)
next_state, reward, done, info = env.step(action)
agent.remember(state, action, reward, next_state, done)
total += reward
state = next_state
# the total result comes from a fixed model
# correct performance measures and saving ONE model are now possible
ep_rewards.append(total)
# train outside of while(done)
# every episode has now a constant number of train runs, 50 for example
for i in range(50):
agent.train()更改后,我在最大值时获得了非常稳定的性能,如下所示:
Run 7 | Episode: 770 | eps 0.0 | total: 500.00 | ddqn True
Run 7 | Episode: 780 | eps 0.0 | total: 500.00 | ddqn True
Run 7 | Episode: 790 | eps 0.0 | total: 500.00 | ddqn True
Run 7 | Episode: 800 | eps 0.0 | total: 500.00 | ddqn True
Run 7 | Episode: 810 | eps 0.0 | total: 500.00 | ddqn True
Run 7 | Episode: 820 | eps 0.0 | total: 432.00 | ddqn True
Run 7 | Episode: 830 | eps 0.0 | total: 500.00 | ddqn True
Run 7 | Episode: 840 | eps 0.0 | total: 500.00 | ddqn True
Run 7 | Episode: 850 | eps 0.0 | total: 500.00 | ddqn True
Run 7 | Episode: 860 | eps 0.0 | total: 500.00 | ddqn True
Run 7 | Episode: 870 | eps 0.0 | total: 500.00 | ddqn True
Run 7 | Episode: 880 | eps 0.0 | total: 500.00 | ddqn True
Run 7 | Episode: 890 | eps 0.0 | total: 500.00 | ddqn True
Run 7 | Episode: 900 | eps 0.0 | total: 500.00 | ddqn True
Run 7 | Episode: 910 | eps 0.0 | total: 500.00 | ddqn True
Run 7 | Episode: 920 | eps 0.0 | total: 500.00 | ddqn True
Run 7 | Episode: 930 | eps 0.0 | total: 500.00 | ddqn True
Run 7 | Episode: 940 | eps 0.0 | total: 500.00 | ddqn True
Run 7 | Episode: 950 | eps 0.0 | total: 500.00 | ddqn True
Run 7 | Episode: 960 | eps 0.0 | total: 500.00 | ddqn True
Run 7 | Episode: 970 | eps 0.0 | total: 500.00 | ddqn True
Run 7 | Episode: 980 | eps 0.0 | total: 500.00 | ddqn True
Run 7 | Episode: 990 | eps 0.0 | total: 500.00 | ddqn True我的担心有效吗?
这是一个有效的改进,还是我在这里遗漏了什么?
发布于 2020-06-05 03:49:50
“总”报酬是用很多不同的模型来计算的,我们衡量的是哪一个?
原则上,总回报应该通过冻结策略(相当于冻结参数策略的参数),然后计算环境上多次推出的平均值(通常的Monte )来计算。
如果它运行良好-它训练很多,做了很多循环,直到完成,并移动它的权重远离好的政策,并可能变得不稳定。
在非策略学习中存在重放缓冲区的原因之一,原则上是为了防止神经网络中这种灾难性遗忘,将其参数化为数据集移位下的策略(状态、行为和奖励的分布变化)。
如果我们拯救一个模型-我们到底是在拯救哪一个模型?
您可能希望像前面提到的那样计算奖励(成为某种验证集),并选择给出最佳平均报酬(可能是方差)的模型。这通常是昂贵的,廉价的代理是算法的第一个版本,它在报酬计算上是有偏差的,但是随着策略在理论上的收敛,偏差降低到零。
您对数据收集和学习循环所做的更改是有效的。然而,这通常是不这样做的,因为原则上这是样本效率低下。你必须等待完成一个完整的轨道,然后才能将这些信息纳入模型。在文献中,一个更吸引人的方法是,你最好每隔几步就做一次。
https://datascience.stackexchange.com/questions/75483
复制相似问题