当我训练我的模型时,我有以下部分:
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.(可选)损失值是否意味着什么。当我绘制它时,它似乎并没有收敛,但是奖励的总和似乎在增加(参见下面链接中的图)。
完整的代码可以在这里找到,它是深度 Q 学习在 CartPole-v0 问题上的实现:
其他论坛的评论:
- y = r + gamma*np.max(model.predict(s_t_batch), axis=1) 是完全自然的,y 将收敛到真实的状态动作值。如果你不打破连续更新与经验回放(或更好的优先级经验回放)之类的东西之间的相关性,你的模型就会出现分歧。还有更好的变体,比如 DDQN,Dueling Network,性能更好。
- y_batch 包括奖励。目标网络和在线网络都是估计值。由于 DQN 的价值函数过于乐观,这确实是一个有点自我实现的预言。这就是几个月后添加双 DQN 的原因。
- y 会收敛,但不一定会收敛到真实的(我假设你的意思是最优的)状态动作值。没有人证明收敛值是最佳值,但它是我们拥有的最佳近似值。然而,对于足够简单的问题(例如网格世界),将收敛到真实值