DQN在奖励始终为-1的环境中如何工作

时间:2019-01-25 18:53:23

标签: machine-learning keras reinforcement-learning openai-gym q-learning

鉴于OpenAI Gym环境MountainCar-v0始终会返回-1.0作为奖励(即使达到目标),我不知道具有体验重播功能的DQN是如何收敛的,但是我知道这样做的原因,因为我有working code证明了这一点。通过工作,我的意思是说,当我训练代理时,代理会迅速(在300-500集内)学习如何解决山地车问题。以下是我训练有素的代理商的示例。 enter image description here

据我了解,最终需要找到一个“稀疏奖励”。但据我从openAI Gym code所看到的,除-1之外没有任何其他奖励。感觉更像是一个“无奖励”的环境。

什么几乎可以回答我的问题,但实际上却没有:当任务快速完成时,情节的回报(奖励总和)会更大。因此,如果汽车未找到标志,则返回值为-1000。如果汽车迅速找到该标志,则返回值可能是-200。之所以不能回答我的问题,是因为使用DQN和体验重播时,体验重播内存中永远不会出现这些回报(-1000,-200)。所有的内存都是元组(状态,动作,奖励,next_state),并且请记住,元组是随机从内存中提取的,而不是逐集地提取。

此特定OpenAI Gym环境的另一个元素是,在两种情况下都会返回“完成”状态:击中标志(是)(Yay)或经过一定数量的步骤(boo)后超时。但是,代理将两者对待,接受-1的奖励。因此,就记忆中的元组而言,从奖励的角度来看,两个事件看起来都是相同的。

因此,我在内存中看不到任何表明该情节执行得很好的东西。

因此,我不知道为什么此DQN代码适用于MountainCar。

5 个答案:

答案 0 :(得分:1)

之所以可行,是因为在Q学习中,您的模型试图估算每个可能动作的所有将来奖励的SUM(技术上是时间衰减的总和)。在MountainCar中,直到获胜为止,您每步都会获得-1的奖励,因此,如果您确实赢了,最终得到的负面奖励将比平时少。例如,您获胜后的总得分可能是-160而不是-200,因此您的模型将开始为历来导致游戏获胜的动作预测更高的Q值。

答案 1 :(得分:1)

看一个减少的问题可能会有所帮助。考虑:

States:
───┬───┬───┬───┬───┐
...│L2 │L1 │ S │ R1│
───┴───┴───┴───┴───┘

Actions:
left or right

r = -1 for all states
episode terminates upon reaching R1 or after 2 steps

内存:

  1. (S, left, -1, L1)非终结者
  2. (S, right, -1, R1)终端
  3. (L1, left, -1, L2)终端
  4. (L1, right, -1, S)终端

需要注意的明显但重要的事情是,尽管奖励都是相同的,但状态和动作却并非。此信息使我们能够根据给定当前状态来推断下一个状态。 让我们看一下我们要更新的目标(不打折):

  1. Q(S, left ) --> -1 + max{a}Q(L1, a)
  2. Q(S, right) --> -1
  3. Q(L1, left ) --> -1
  4. Q(L1, right) --> -1

在这个人为的示例中,只有转换1代表了额外的不稳定来源。但是随着时间的推移,由于L1上的操作值从对过渡3和4的足够采样中收敛,所以过渡1的目标也应如此。 到那时,当我们再次遇到转换1时,我们会有一个更好的估算值Q(S, left) --> -1 + -1

仅当我们询问DQN如何从其记忆中学习时,仅查看奖励是不够的,因为DQN还在使用下一个观察结果来确定其当前对动作值的最佳估计下一步(relevant code),将所有内容有效地链接在一起,并逐步计算出奖励。与传统的Q学习不同,这样做的方式更加不稳定。


作为练习,请考虑进一步扩展此范围,并将终端状态置于R2上。 然后我们可以很容易地看到max{a}Q(S, a) = -2;到达R2并花简单的时间花费相同的时间,所以我们做什么都不重要(除非我们更接近R2)。但是,增加超时数量会增加,它应该再次朝R2前进。即登山车之所以起作用,还因为超时设置为大于达到目标所需的时间步长的数字。该路径最终应将其(负但更好)的值传播回我们的初始状态。

尽管在其他任何环境中也是如此,但只要他们的努力得到回报,他们至少仍可以学会在超时之前更接近目标。在山地车环境中,奖励设计并非如此。

答案 2 :(得分:0)

你是对的。记忆(体验重播)与情节奖励中模型的性能之间没有直接关联。 DQN中的Q值用于预测每个步骤中每个动作的预期回报。模型的性能衡量标准是实际奖励与预期奖励之间的差(TD误差)。

为非目标步骤部署-1是一种技巧,可帮助RL模型选择可以更快完成剧集的动作。由于Q值是一个动作值。在每个步骤中,模型都会预测每个可能动作的回报,并且策略(通常是贪婪或epsilon-贪婪)会选择具有最大价值的行动。您可以想象一下,回到某一时刻将花费200步来完成该情节,但是前进仅需100步。 Q值分别为-200(无折扣)和-100。您可能想知道模型如何知道每个动作的价值,这是因为在重复的情节和连续的反复试验中。对模型进行了训练,以最大程度地减少实际奖励与预期奖励之间的差异,即TD误差。

在随机采样的体验重放中,所有体验均被采样并统一删除。但是,在优先体验重放中,您可以重用那些估计误差较大的体验。通常,优先级与期望Q值和当前模型的预测Q值的TD误差(real_reward-Expected_reward)成比例。优先级越高,意味着体验会多么令人惊讶,并有助于加速培训。

您可以在Priority Experience Replay, Schaul et al., 2016

中查看该想法

答案 3 :(得分:0)

您说:

这些返回值(-1000,-200)永远不会出现在体验重播内存中。

重放存储器中存在一个带有完成标志的SARdS元组,该标志告诉您情节已经结束。参见openai体育馆deepq示例:

# Store transition in the replay buffer.
replay_buffer.add(obs, action, rew, new_obs, float(done))

在最终更新中,如果float(done)== 1,则忽略将来的Q值。因此,在情节结束时,Q值为0。如果在步骤200上发生这种情况,则情节中的总回报将为-200。如果发生在第1000步,则总回报将为-1000。

换句话说,如果完全是随机的,则该情节在步骤200结束,一个表现与随机策略一样糟糕的代理将具有-800的Q值(预期的未来回报)。如果情节随后结束,则TD错误将为+799,表示仅损失另一个-1即可得出令人惊讶的积极结果。

我注意到您链接的code似乎没有在重播缓冲区中使用完成标志。相反,它依赖于s_ == None的最终状态来表示情节的结束。删除该代码,代理将不会学习。

   if s_ is None:
        t[a] = r
    else:
        t[a] = r + GAMMA * numpy.amax(p_[i])

答案 4 :(得分:-1)

在DQN中,您将学习Q函数,该函数基本上近似于您的收益。在内存中,将元组存储为(s,a,s',r),然后在这些元组上重新训练Q函数。如果对于给定的元组,您表现良好(很快到达了标志),那么您将通过重新使用元组进行训练来重新体验它,因为该元组的Q函数较高。

无论如何,通常体验重放对于任何问题都更有效,而不仅仅是山地车。