【问题标题】:How to implement Deep Q-learning gradient descent如何实现深度 Q 学习梯度下降
【发布时间】:2023-03-06 04:24:01
【问题描述】:

所以我正在尝试实现由 Google DeepMind 创建的 Deep Q 学习算法,我认为我现在已经掌握了它。然而,还有一件(非常重要的)事情我不太明白,我希望你能提供帮助。

yj 不会导致双精度 (Java) 和后半部分的矩阵,该矩阵包含下一行(算法中的倒数第四行)中当前状态下每个动作的 Q 值:



那么我怎样才能将它们彼此相减。

我是否应该让 yj 成为一个矩阵,其中包含来自这里 的所有数据,除了用

替换当前选择的操作

这似乎不是正确的答案,如您所见,我有点迷失了。


【问题讨论】:

  • 如我所见:Q 部分也是一维的,因为它的动作固定为先验的某个动作。查看您帖子中的伪代码。 a_t 将被选为单个动作,最大化 Q 函数。稍后a_t 将被添加到重放内存中,在后续步骤中的采样期间它变为a_d(仍然是单个固定操作)。
  • @sascha 是的,我也想过,但后来我不知道如何更新我的神经网络的权重,因为我不应该计算所有输出的错误(在这个案例)以更新权重?现在,如果我用这个错误进行更新,它会更新所有权重,就好像所有输出都有相同的错误一样。那么我是否应该制作一个错误矩阵,该矩阵在除该动作之外的其他所有位置都包含零?那么它只会更新影响该动作的权重,对吗?
  • 阅读神经网络的学习过程。这与这里的 Q-learning 框架完全无关!通常,NN 由 SGD 训练(具有一些小批量大小)。如果您将小批量大小设为 1,那么所有权重也会更新,尽管事实上您只观察到数百万个样本中的一个!这就是它的工作原理。 Q 学习的重点是,Q 函数的内部状态会发生变化,并且随着时间的推移,这一错误会转移到一些较低的错误(无模型学习)! (关于您的归零方法:不!)只需将这一示例动作(从内存中)作为 SGD 步骤的一个示例。
  • 对不起,我想我只是不明白。我已经创建了一个使用小批量梯度下降的工作神经网络,我首先计算了一个包含输出节点误差的矩阵。但是现在我不知道应该为具有此损失函数的输出节点的误差创建什么样的矩阵,因为该算法只计算一个输出的误差。我非常了解 imo 监督神经网络,但在这里我遇到了目标值的问题。我想我还需要复习一些讲座。
  • 如果你有这方面的知识,我不明白这个问题。你有一个目标y_j,还有一些输入x(对于这个目标!)。只需使用您的 NN 计算此输入 x 的输出;然后错误是y_j 和获得的输出之间的平方差异。然后使用此错误/损失通过反向传播步骤重新加权 NN 中的权重。如果您在 SGD 期间对单个 x 进行采样,这正是发生的情况(而在实践中,通常使用大于 1 的小批量;产生一个 x 矩阵,每个样本有一行,y 向量每个样本有一个值)。

标签: java algorithm neural-network deep-learning q-learning


【解决方案1】:

其实是自己找的。 (从一开始就明白了:D)

  1. 对当前状态 s 执行前馈传递,以获得所有操作的预测 Q 值。
  2. 对下一个状态 s' 进行前馈传递,并计算最大整体网络输出 max a' Q(s', a')。
  3. 将动作的 Q 值目标设置为 r + γmax a' Q(s', a')(使用在步骤 2 中计算的最大值)。 对于所有其他操作,将 Q 值目标设置为与最初从第 1 步返回的相同,使这些输出的错误为 0。
  4. 使用反向传播更新权重。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 2018-01-31
  • 2019-02-22
  • 1970-01-01
  • 2016-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多