代码之家  ›  专栏  ›  技术社区  ›  sachinruk

深度Q学习是如何工作的

  •  0
  • sachinruk  · 技术社区  · 7 年前

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

    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_ 分别对应于当前状态和在这些状态下采取的行动。 model2 与相同 model 除此之外 模型2 输出为 num_actions 模型 仅输出在该状态下执行的操作的值。

    我觉得奇怪的是(实际上是这个问题的焦点)函数 train_data

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

    奇怪的是,我正在使用该模型生成 y_batch 以及对他们的培训。这难道不是某种自我实现的预言吗?如果我理解正确,该模型试图预测预期的最大回报。使用 相同的 尝试生成的模型 y_批次

    问题是 1.使用相同的模型生成y_批和训练它们背后的直觉是什么。2.(可选)损失价值是否有任何意义。当我绘制它时,它似乎没有收敛,但是奖励的总和似乎在增加(见下面链接中的图)。

    here ,这是CartPole-v0问题上深度Q学习的实现:

    其他论坛的评论:

    1. y=r+γ*np。max(model.predict(s\u t\u batch),axis=1)是完全自然的,y将收敛到真实状态动作值。如果你不用体验重播(或者更优先的体验重播)之类的东西来分解连续更新之间的相关性,你的模型就会出现分歧。还有更好的变体,如DDQN,性能更好的决斗网络。
    2. y_批次包括奖励。目标网络和在线网络都是估计值。由于DQN的价值函数过于乐观,这确实是一个有点自我实现的预言。这就是为什么几个月后增加了双DQN。
    3. y将收敛,但不一定收敛到真实(我假设你是指最优)状态动作值。没有人证明收敛值是最优值,但它是我们拥有的最佳近似值。然而,对于足够简单的问题(例如网格世界),将收敛到真实值
    1 回复  |  直到 5 年前
        1
  •  3
  •   ted    7 年前

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

    • 然后它作用于环境,执行它认为具有最高Q值的动作(具有一些随机性以供探索)
    • 然后它会收到来自环境的一些反馈:奖励和它所处的新状态
    • t (= [s_t_batch, a_batch] )这是状态的(折扣)近似值 t+1 奖励(= y_batch ),它能够测量其预测的错误程度 Qt
    • 与任何其他基于梯度的优化一样,根据此错误度量(称为TD错误),在MSE较低的方向上更新权重。
    • (人们可以等待不止一个步骤,从环境中获得更多信息,以更好地更新权重。实际上,人们可以等待整个事件结束,然后进行训练。即时训练和等待结束之间的连续体称为TD(λ),你应该对此进行研究)

    你的损失正好意味着:对于一批,它是你的模型对时间的预测之间的均方误差 t 从其唯一的Q值近似及其对时间的预测 t 根据其Q值近似 下一个 状态并考虑来自环境的一些“基本事实”,即 奖励 对于此时间段。

    在我看来,你的损失确实下降了,但它非常不稳定,这是香草Q-Learning的一个已知问题,尤其是香草深度Q-Learning。看看下面的综述文章,了解更复杂的算法是如何工作的

    我建议你调查一下 Temporal Difference Learning .

    推荐文章
    Fardin K.  ·  Q-Learning值过高
    8 年前