1

我正在尝试实现我自己版本的Asynchronous Advantage Actor-Critic方法,但它无法学习 Pong 游戏。我的代码主要受到Arthur Juliani 和 OpenAI Gym 的 A3C 版本的启发。该方法适用于简单的 Doom 环境(在 Arthur Juliani 的代码中使用的环境),但是当我尝试 Pong 游戏时,该方法发散到始终执行相同操作的策略(总是向下移动,或总是向上移动,或始终执行无操作操作)。我的代码位于我的GitHub 存储库中。

我已经调整了我的网络,使其类似于 OpenAI Gym 的 A3C 版本使用的架构,即:

  • 4 个具有相同规格的卷积层,它们是:32 个过滤器,3x3 内核,2x2 步幅,带有填充(padding='same')。最后一个卷积层的输出随后被展平并馈送到大小为 256 的 LSTM 层。LSTM 层的初始状态 C 和 H 作为输入给出。LSTM 层的输出然后被分成两个流:一个输出大小等于动作数量(策略)的全连接层和另一个只有一个输出(价值函数)的全连接层(更多细节在 Network.py我的代码);
  • 使用的损失函数与原始 A3C 论文中的信息一样。基本上,策略损失是线性策略的log_softmax乘以优势函数。价值损失是价值函数与折扣奖励之差的平方。总损失包括价值损失、策略损失和熵。渐变被剪裁为 40(我的代码的 Network.py 中有更多详细信息);
  • 只有一个全球网络和几个工作网络(每个工作人员一个网络)。仅更新全球网络。此更新是针对每个工作网络的局部梯度完成的。因此,每个工人模拟 BATCH_SIZE 迭代的环境,保存状态、价值函数、选择的动作、收到的奖励和 LSTM 状态。在 BATCH_SIZE(我使用 BATCH_SIZE = 20)迭代之后,每个工作人员将这些数据传递到网络中,计算折扣奖励、优势函数、总损失和局部梯度。然后它用这些梯度更新全局网络。最后,worker 的本地网络与全局网络同步(local_net = global_net)。所有工作人员都异步执行此操作(有关此步骤中的更多详细信息,请检查工作在 Worker.py 中训练Worker 类的方法);
  • LSTM 状态 C 和 H 在情节之间重置。同样重要的是要注意当前状态 C 和 H 由每个工人本地保存;
  • 为了将梯度应用到全局网络,我使用了学习率 = 1e-4 的 Adamoptimizer。

我已经尝试了网络的不同配置(通过尝试几种不同的卷积层配置,包括不同的激活函数)、具有不同参数配置的其他优化器( RMSPropOptimizerAdadeltaOptimizer )以及 BATCH_SIZE 的不同值。但它几乎最终转向了一种总是只执行一个动作的策略。我的意思是总是因为在某些配置中,代理在几个情节中维持类似于随机策略的策略,但没有明显的改进(我等到 62k 情节才放弃这些情况)。

因此,我想知道是否有人在使用带有 LSTM 层的 A3C 训练 Pong 游戏中的智能体方面取得了成功。如果是这样,使用的参数是什么?任何帮助,将不胜感激!

[编辑]正如我在评论中所说,我设法通过在计算梯度之前提供正确的 LSTM 状态来部分解决问题(而不是提供初始化的 LSTM 状态)。这使得该方法在 PongDeterministic 环境中学习得相当好。但是当我尝试 Breakout-v0 时问题仍然存在:代理在大约 65k 集内达到 40 的平均分数,但在此之后它似乎停止了学习(它保持了这个分数一段时间)。我已经检查了 OpenAI 入门代理数次,我找不到我的实现与他们的实现之间的任何显着差异。任何帮助将不胜感激!

4

0 回答 0