这个 DQN 算法在 TensorFlowJs 上的实现如何工作?

How does work this implementation of DQN algorithm on TensorFlowJs?

开发人员,

我找到了一堆 DQN 实现的例子,但因为我不是 TensorFlow 专家,所以我有点困惑。

让我们看看here是其中之一。

我可以理解,在第 73 行,我们将一些存储数据 [{state, action, reward, newState, done}] 精确切片,然后我们得到 currentStates[[s1, s2, ...]],然后在第 75 行我们使用得到 currentQs 的模型,我的理解应该是 [[act1, act2, ...]],因为我们的模型用于从 env 的状态中获取动作。 newCurrentStatesfutureQs.

也是如此

但是在 88 上,我们看到 let maxFutureQ = Math.max(futureQs);。这里发生了什么? futureQs 是一个数组数组,其中包含每个 futureState 的动作概率?然后 maxFutureQ 应该是一个动作概率,那我们为什么要加上这个来奖励呢?这部分让我很困惑。

我也不明白为什么我们需要在 94 上做 currentQ[action] = newQ;

拜托,有人可以帮助我了解这里发生的事情并留下评论吗?

提前致谢。

编辑:

讨论代码:

让您感到困惑的部分是 Bellman approximation,它用于更新定义为 s 的状态的 Q-values,给定操作 a 是拍了。

Q 对于此状态 s 和动作 a,等于预期的即时奖励和目标状态的折扣长期奖励。

我们取处于状态 s'Q-values(or the value of the action) 值的最大值,这是状态 s 的下一个状态,动作 a' ,因为从状态 s 到状态 s' 时我们可以采取的操作是一组互斥的离散集(即,您的环境允许您向上、向左、向右移动或向下),因此最佳操作将是导致操作价值最高的操作。

以上图为例。代理从状态 s0 开始,并且能够向上、向左、向右或向下移动,这是动作。智能体可以采取的行动在本质上是随机的,而不是确定性的,但它就是说,当智能体打算向上移动时,智能体有 0.33% 的机会转而向左或向右移动。我将在这里为 gamma 分配一个值 1。

这就是你如何计算状态 Q-valuess0 和动作,up 进入状态的值是代理收到的即时奖励, V1 = 1, V2 = 2, V3 = 3, V4 = 4.

Q(s0,up) = 0.33 * V1 + 0.33 * V2  0.33 * V4  
         = 0.33 * 1 + 0.33 * 2 + 0.33 * 4 
         = 2.31

接下来,如果您计算所有其他可能状态及其行为的 Q 值,您将得到以下结果:

Q(s0,left) = 1.98
Q(s0,right) = 2.64
Q(s0,down) = 2.97

因此状态的最终值 s0 是这些操作值的 maximum,即 2.97。这就是您真正想在代码中做的所有事情。

至于currentQ[action] = newQ;做什么,它正在对当前Q-values执行更新,以便在剧集结束时将其旧值更新为新的更新值。

关于为什么要这样做,您必须了解的一件事是,代理会在一集后更新其 Q-values,然后再次进行训练并重复该过程,直到代理管理完成它的目标(对于引入该算法的 Atari 论文,我认为该目标的平均得分为 19,这相当于在 21 场比赛中赢得 19 场比赛)。

您可以从 original paper.

阅读更多关于整个过程的信息

但我认为您在此之前需要更多地了解贝尔曼方程,因为它对于理解强化学习极为重要。 DeepMind 有一个关于此的优秀 Youtube 系列,可以是 found here.

更好的是,free book 由其创始人 Richard Sutton 和 Andrew Barto 撰写的关于强化学习的文章。我相信他们会在第 4 章中对此进行详细介绍。

编辑:

我不太清楚你所说的它如何影响训练是什么意思,但我将概述整个过程,以便你了解训练如何为此工作: