这个 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 的状态中获取动作。 newCurrentStates
和 futureQs
.
也是如此
但是在 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-values
,s0
和动作,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 章中对此进行详细介绍。
编辑:
我不太清楚你所说的它如何影响训练是什么意思,但我将概述整个过程,以便你了解训练如何为此工作:
开发人员,
我找到了一堆 DQN 实现的例子,但因为我不是 TensorFlow 专家,所以我有点困惑。
让我们看看here是其中之一。
我可以理解,在第 73 行,我们将一些存储数据 [{state, action, reward, newState, done}]
精确切片,然后我们得到 currentStates
即 [[s1, s2, ...]]
,然后在第 75 行我们使用得到 currentQs
的模型,我的理解应该是 [[act1, act2, ...]]
,因为我们的模型用于从 env 的状态中获取动作。 newCurrentStates
和 futureQs
.
但是在 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-values
,s0
和动作,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 章中对此进行详细介绍。
编辑:
我不太清楚你所说的它如何影响训练是什么意思,但我将概述整个过程,以便你了解训练如何为此工作: