Asynchronous 乒乓球发散深度强化学习(A3C)(Tensorflow)

Asynchronous 乒乓球发散深度强化学习(A3C)(Tensorflow),asynchronous,tensorflow,deep-learning,reinforcement-learning,openai-gym,Asynchronous,Tensorflow,Deep Learning,Reinforcement Learning,Openai Gym,我正在尝试实现我自己版本的异步Advantage Actor Critic方法,但它无法学习乒乓球游戏。我的代码主要是受OpenAI Gym和OpenAI Gym的A3C版本的启发。该方法适用于简单的末日环境(Arthur Juliani的代码中使用的环境),但当我尝试乒乓球游戏时,该方法会偏离一个策略,在该策略中它总是执行相同的动作(总是向下移动,或者总是向上移动,或者总是执行无操作动作)。我的代码位于我的 我已经调整了我的网络,使之类似于OpenAI Gym的A3C版本所使用的架构,即:

我正在尝试实现我自己版本的异步Advantage Actor Critic方法,但它无法学习乒乓球游戏。我的代码主要是受OpenAI Gym和OpenAI Gym的A3C版本的启发。该方法适用于简单的末日环境(Arthur Juliani的代码中使用的环境),但当我尝试乒乓球游戏时,该方法会偏离一个策略,在该策略中它总是执行相同的动作(总是向下移动,或者总是向上移动,或者总是执行无操作动作)。我的代码位于我的

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

  • 4个规格相同的卷积层,它们是:32个过滤器,3x3个内核,2x2个步幅,带填充(padding='same')。最后一个卷积层的输出随后被展平并馈送到具有大小256的输出的LSTM层。LSTM层的初始状态C和H作为输入。然后将LSTM层的输出分为两个流:一个输出大小等于操作数(策略)的完全连接层和另一个只有一个输出(值函数)的完全连接层(更多详细信息,请参见我的代码的Network.py)
  • 使用的损失函数与原始A3C文件中所述相同。基本上,策略损失是线性策略的log_softmax乘以优势函数。价值损失是价值函数和折扣奖励之间差值的平方。总损失包括价值损失、政策损失和熵。渐变被剪裁为40(更多细节见我的代码的Network.py)
  • 只有一个全局网络和多个工作者网络(每个工作者一个网络)。只更新全局网络。此更新是针对每个工作网络的本地渐变进行的。因此,每个工作人员模拟批量大小迭代的环境,保存状态、值函数、选择的操作、收到的奖励和LSTM状态。在BATCH_SIZE(我使用BATCH_SIZE=20)迭代之后,每个工作人员将这些数据传递到网络中,计算折扣奖励、优势函数、总损失和局部梯度。然后用这些渐变更新全局网络。最后,工作者的本地网络与全局网络同步(local_net=global_net)。所有Worker都是异步执行的(有关此步骤的更多详细信息,请检查Worker.py中Worker类的work和train方法)
  • LSTM状态C和H在事件之间重置。还需要注意的是,当前状态C和H由每个工人本地保存
  • 为了将梯度应用于全局网络,我使用了学习率为1e-4的Adamoptimizer
我已经为网络尝试了不同的配置(通过尝试几个不同的卷积层配置,包括不同的激活函数),其他优化器(RMSPropOptimizerAdadeltaOptimizer)具有不同的参数配置和不同的批量大小值。但它几乎最终偏离了一个政策,即它总是只执行一个动作。我的意思是,总是因为有一些特定的配置,在这些配置中,代理在几集中维护一个类似于随机策略的策略,但没有明显的改进(在这些情况下,我一直等到62k集才放弃)

因此,我想知道是否有人成功地使用带有LSTM层的A3C在乒乓球游戏中培训了一名经纪人。如果是,使用的参数是什么?任何帮助都将不胜感激


[编辑]正如我在评论中所说的,我通过在计算渐变之前输入正确的LSTM状态(而不是输入初始化的LSTM状态),部分解决了问题。这使得该方法在PongDeterministic环境中学习得相当好。但当我尝试突破-v0时,问题依然存在:代理在大约65k集中达到了40分的平均分,但此后它似乎停止了学习(它在一段时间内保持了这个分数)。我已经检查了OpenAI starter代理好几次了,我没有发现我的实现和他们的有任何显著的区别。任何帮助都将不胜感激

我必须说朱利安尼的密码不容易理解。为了学习RL,我在阅读。虽然没有解决您的问题,但它很整洁。非常感谢您的回复!我一定会看看这个实现。但我可能已经发现了我的错误(看起来也是朱利安尼的错误):当使用批处理更新全局网络时,我使用初始化的LSTM状态。正确的做法是,在向网络提供批处理时,输入批处理第一个实例中发生的LSTM状态,就像OpenAI的A3C实现中所做的那样。我仍然在运行一些测试,看看它是否真的解决了我的问题,但直到现在,它在大约1500个全球剧集中学会了玩PongDeterministic。我不得不说朱利安尼的代码不容易理解。为了学习RL,我在阅读。虽然没有解决您的问题,但它很整洁。非常感谢您的回复!我一定会看看这个实现。但我可能已经发现了我的错误(看起来也是朱利安尼的错误):当使用批处理更新全局网络时,我使用初始化的LSTM状态。正确的做法是,在向网络提供批处理时,输入批处理第一个实例中发生的LSTM状态,就像OpenAI的A3C实现中所做的那样。我仍在进行一些测试,看看它是否真的解决了我的问题,但直到现在,它在大约1500个全球剧集中学会了玩PongDeterministic。