用于乒乓发散的深度强化学习(A3C)(Tensorflow)

时间:2017-07-18 20:18:34

标签: asynchronous tensorflow deep-learning reinforcement-learning openai-gym

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

我已经将我的网络调整为类似于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)迭代后,每个工作人员将这些数据传递到网络中,计算折扣奖励,优势函数,总损失和局部梯度。然后,它使用这些渐变更新全局网络。最后,工作者的本地网络与全局网络(local_net = global_net)同步。所有工作人员都异步执行此操作(有关此步骤中的更多详细信息,请检查Worker.py中Worker类的 work train 方法);
  • LSTM状态C和H在剧集之间重置。同样重要的是要注意当前状态C和H由每个工人保持在本地;
  • 要将渐变应用于全局网络,我使用了Adamoptimizer,学习率= 1e-4。

我已经尝试过不同的网络配置(通过尝试几种不同的卷积层配置,包括不同的激活功能),其他优化器( RMSPropOptimizer AdadeltaOptimizer )不同参数配置和BATCH_SIZE的不同值。但它几乎最终会分散到一个政策,它始终只执行一个动作。我的意思是总是因为某些配置中代理维护了一个类似于几个剧集的随机策略的策略,没有明显的改进(在这些情况下我放弃了62k集之前)。

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

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

0 个答案:

没有答案