深度 Q 学习是如何工作的
How does Deep Q learning work
当我训练我的模型时,我有以下部分:
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
相同,只是 model2
的输出为 num_actions
而 model
仅输出在该状态下执行的操作的值。
我觉得奇怪的(也是这个问题的重点)在函数中 train_data
我有一行:
y_batch = r_batch + GAMMA * np.max(model.predict(s_t_batch), axis=1)
奇怪的是,我正在使用该模型来生成我的 y_batch
以及对它们进行训练。这不会成为某种自我实现的预言吗?如果我理解正确,该模型会尝试预测预期的最大奖励。使用 相同的 模型来尝试生成 y_batch
是否暗示它是真实的模型不是吗?
问题是,1.使用相同的模型生成y_batch背后的直觉是什么,因为它是用来训练它们的。 2.(可选)损失值是否意味着什么。当我绘制它时,它似乎并没有收敛,但是奖励的总和似乎在增加(见下面 link 中的图)。
可以找到完整的代码here,这是深度Q学习在CartPole-v0问题上的一个实现:
来自其他论坛的评论:
- y = r + gamma*np.max(model.predict(s_t_batch), axis=1) 是完全自然的,y 将收敛到真实的状态-动作值。而且,如果您不分解连续更新与体验回放(或优先级更高的 exp 回放)之类的东西之间的相关性,您的模型将会发散。还有更好的变体,如 DDQN、Dueling Network 性能更好。
- y_batch 包括奖励。目标网络和在线网络都是估计值。这确实是一个有点自我实现的预言,因为 DQN 的价值函数过于乐观。这就是几个月后添加 Double DQN 的原因。
- y 会收敛,但不一定收敛到真实的(我假设你的意思是最优的)状态动作值。没有人证明收敛值是最优值,但它是我们拥有的最佳近似值。然而,对于足够简单的问题(例如网格世界),将收敛到真实值
模型根据自己的预测进行训练这一事实是 Q 学习的重点:这是一个称为引导的概念,这意味着重用您的经验。这背后的见解是:
- 代理已使用一些权重进行初始化
- 这些权重表示智能体当前对它试图近似的 Q 值函数的表示
- 然后它作用于环境,执行它认为具有最高 Q 值的动作(具有一些探索的随机性)
- 然后它从环境中接收一些反馈:奖励,以及它所处的新状态
- 通过比较 Agent 对状态
t
(= [s_t_batch, a_batch]
) 的 Q 值近似与它对状态 t+1
的(折扣)近似之间的差异加上奖励(=y_batch
),它能够衡量它对Qt
的预测有多错误。
- 与任何其他基于梯度的优化一样,根据这种错误度量(称为 TD-Error),权重会在 MSE 较低的方向上更新。
- (可以等待不止一个步骤来从环境中获得更多信息,以便在更好的方向上更新权重。实际上可以等待整个情节结束并对其进行训练。之间的连续统立即训练并等待结束称为TD(Lambda),你应该研究一下)
你的损失就是这个意思:对于一个批次,它是你的模型的时间预测 t
从它唯一的 Q 值近似值和它的时间预测 t
之间的均方误差从其对 next 状态的 Q 值近似,并考虑来自环境的一些 "ground truth",即 这个时间步的奖励。
在我看来,你的损失确实下降了,但是它非常不稳定,这是香草 Q 学习的一个已知问题,尤其是香草深度 Q 学习。查看下面的概述文件,了解更复杂的算法如何工作
我建议你研究一下 Temporal Difference Learning。
好的资源也是
- Simple Reinforcement Learning with Tensorflow
- RL 圣经:Sutton 和 Barto,强化学习:简介(2015 版)
- 这篇overview paper总结了近期算法的见解和实施
- 我在 RL 上写了我的 Master Thesis,你可以查看第 2 部分:背景理论以获得更详细的见解
当我训练我的模型时,我有以下部分:
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
相同,只是 model2
的输出为 num_actions
而 model
仅输出在该状态下执行的操作的值。
我觉得奇怪的(也是这个问题的重点)在函数中 train_data
我有一行:
y_batch = r_batch + GAMMA * np.max(model.predict(s_t_batch), axis=1)
奇怪的是,我正在使用该模型来生成我的 y_batch
以及对它们进行训练。这不会成为某种自我实现的预言吗?如果我理解正确,该模型会尝试预测预期的最大奖励。使用 相同的 模型来尝试生成 y_batch
是否暗示它是真实的模型不是吗?
问题是,1.使用相同的模型生成y_batch背后的直觉是什么,因为它是用来训练它们的。 2.(可选)损失值是否意味着什么。当我绘制它时,它似乎并没有收敛,但是奖励的总和似乎在增加(见下面 link 中的图)。
可以找到完整的代码here,这是深度Q学习在CartPole-v0问题上的一个实现:
来自其他论坛的评论:
- y = r + gamma*np.max(model.predict(s_t_batch), axis=1) 是完全自然的,y 将收敛到真实的状态-动作值。而且,如果您不分解连续更新与体验回放(或优先级更高的 exp 回放)之类的东西之间的相关性,您的模型将会发散。还有更好的变体,如 DDQN、Dueling Network 性能更好。
- y_batch 包括奖励。目标网络和在线网络都是估计值。这确实是一个有点自我实现的预言,因为 DQN 的价值函数过于乐观。这就是几个月后添加 Double DQN 的原因。
- y 会收敛,但不一定收敛到真实的(我假设你的意思是最优的)状态动作值。没有人证明收敛值是最优值,但它是我们拥有的最佳近似值。然而,对于足够简单的问题(例如网格世界),将收敛到真实值
模型根据自己的预测进行训练这一事实是 Q 学习的重点:这是一个称为引导的概念,这意味着重用您的经验。这背后的见解是:
- 代理已使用一些权重进行初始化
- 这些权重表示智能体当前对它试图近似的 Q 值函数的表示
- 然后它作用于环境,执行它认为具有最高 Q 值的动作(具有一些探索的随机性)
- 然后它从环境中接收一些反馈:奖励,以及它所处的新状态
- 通过比较 Agent 对状态
t
(=[s_t_batch, a_batch]
) 的 Q 值近似与它对状态t+1
的(折扣)近似之间的差异加上奖励(=y_batch
),它能够衡量它对Qt
的预测有多错误。 - 与任何其他基于梯度的优化一样,根据这种错误度量(称为 TD-Error),权重会在 MSE 较低的方向上更新。
- (可以等待不止一个步骤来从环境中获得更多信息,以便在更好的方向上更新权重。实际上可以等待整个情节结束并对其进行训练。之间的连续统立即训练并等待结束称为TD(Lambda),你应该研究一下)
你的损失就是这个意思:对于一个批次,它是你的模型的时间预测 t
从它唯一的 Q 值近似值和它的时间预测 t
之间的均方误差从其对 next 状态的 Q 值近似,并考虑来自环境的一些 "ground truth",即 这个时间步的奖励。
在我看来,你的损失确实下降了,但是它非常不稳定,这是香草 Q 学习的一个已知问题,尤其是香草深度 Q 学习。查看下面的概述文件,了解更复杂的算法如何工作
我建议你研究一下 Temporal Difference Learning。 好的资源也是
- Simple Reinforcement Learning with Tensorflow
- RL 圣经:Sutton 和 Barto,强化学习:简介(2015 版)
- 这篇overview paper总结了近期算法的见解和实施
- 我在 RL 上写了我的 Master Thesis,你可以查看第 2 部分:背景理论以获得更详细的见解