深度Q学习如何运作

时间:2017-10-17 06:25:26

标签: deep-learning q-learning openai-gym

当我训练我的模型时,我有以下部分:

s_t_batch, a_batch, y_batch = train_data(minibatch, model2)
# perform gradient step
loss.append(model.train_on_batch([s_t_batch, a_batch], y_batch))

其中s_t, a_分别对应于在这些状态下采取的当前状态和操作。 model2model相同,只是model2的输出为num_actionsmodel仅输出在该状态下执行的操作的值。

我觉得奇怪(并且确实是这个问题的焦点)在函数train_data我有这条线:

y_batch = r_batch + GAMMA * np.max(model.predict(s_t_batch), axis=1)

奇怪的是,我正在使用模型生成我的y_batch以及对它们进行培训。这不会成为某种自我实现的预言吗?如果我理解正确,该模型会尝试预测预期的最大奖励。使用相同的模型来尝试生成y_batch,这意味着它是真正的模型吗?

问题是,1。使用相同模型生成y_batch的直觉是什么,因为它是训练它们。 2.(可选)损失值是否意味着什么。当我绘制它时,似乎似乎没有收敛,但是奖励的总和似乎在增加(参见下面链接中的情节)。

可以找到完整的代码here,这是关于CartPole-v0问题的深度Q学习的实现:

其他论坛的评论:

  1. y = r + gamma * np.max(model.predict(s_t_batch),axis = 1)是完全自然的,y将收敛到真实的状态 - 动作值。如果你不打破连续更新之间的相关性,比如体验重放(或更好的优先级exp重放),你的模型就会分歧。还有更好的变种,如DDQN,Dueling Network,表现更好。
  2. y_batch包含奖励。目标和在线网络都是估算值。这确实是一个有点自我实现的预言,因为DQN的价值功能过于乐观。这就是几个月后添加Double DQN的原因。
  3. y会收敛,但不一定是真实的(我假设你是指最优的)状态 - 动作值。没有人证明收敛值是最佳值,但它是我们所拥有的最佳近似值。然而,对于足够简单的问题(例如网格世界),它将收敛到真正的价值

1 个答案:

答案 0 :(得分:2)

模型根据自己的预测进行训练的事实是Q学习的全部要点:它是一个名为bootstrapping的概念,这意味着重复使用你的经验。这背后的见解是:

  • 使用一些权重
  • 初始化代理
  • 这些权重代表代理商试图近似的Q值函数的当前表示
  • 然后它对环境起作用,执行它认为具有最高Q值的行动(有一些随机性用于探索)
  • 然后它会从环境中收到一些反馈:奖励,以及
  • 中的新状态
  • 通过比较代理商对状态t(= [s_t_batch, a_batch])的Q值近似值与状态t+1的(折扣)近似值之间的差异 加上 奖励(= y_batch),它可以衡量它对Qt的预测错误。
  • 根据这种错误度量(称为TD-Error),在较低MSE的方向上更新权重,与任何其他基于梯度的优化一样。
  • (人们可以等待不止一步,从环境中获取更多信息,以更好的方向更新权重。实际上可以等待整个剧集结束并进行训练。这种连续性在即时训练之间并等待结束称为TD(Lambda),你应该研究一下)

您的损失恰恰是这样的:对于一个批次,它是您的模型预测时间t与其唯一Q值近似值及其对时间{{1}的预测之间的均方误差从 next 状态的Q值近似值开始,并考虑一些"基础事实"来自环境,即这个时间步的奖励

在我看来,你的损失确实有所下降,但它非常不稳定,这是香草Q-Learning特别是香草深Q-Learning的已知问题。请查看下面的概述文章,了解更复杂的算法如何工作

我建议你研究一下Temporal Difference Learning。 好的资源也是