为什么我为 atari pong 游戏实施的 A2C 没有融合?

人工智能 强化学习 火炬 演员批评方法 收敛
2021-10-28 06:53:51

我使用 A2C 算法对 Atari Pong 游戏的 PyTorch 有两种不同的实现。两种实现方式相似,但某些部分不同。

  1. https://colab.research.google.com/drive/12YQO4r9v7aFSMqE47Vxl_4ku-c4We3B2?usp=sharing

上述代码来自以下 Github 存储库:https ://github.com/PacktPublishing/Deep-Reinforcement-Learning-Hands-On/blob/master/Chapter10/02_pong_a2c.py融合得非常好!

您可以在 Maxim Lapan 的书Deep Reinforcement Learning Hands-on第 269 页中找到解释

这是平均奖励曲线:

在此处输入图像描述

  1. https://colab.research.google.com/drive/1jkZtk_-kR1Mls9WMbX6l_p1bckph8x1c?usp=sharing

上面的实现是我根据 Maxim Lapan 的书创建的。但是,代码没有收敛。我的代码有一小部分是错误的,但我无法指出它是什么。我已经为此工作了将近一个星期。

这是平均奖励曲线:

在此处输入图像描述

有人可以告诉我代码的问题部分,我该如何解决?

更新 1

我决定用一个更简单的环境来测试我的代码,即Cartpole-v0.

这是代码:https ://colab.research.google.com/drive/1zL2sy628-J4V1a_NSW2W6MpYinYJSyyZ?usp=sharing

甚至该代码似乎也没有收敛。仍然看不到我的问题在哪里。

更新 2

我认为该错误可能在ExperienceSource类或Agent类中。

更新 3

以下问题将帮助您理解这些类ExperienceSourceExperienceSourceFirstLast.

1个回答

这是提交

我修复了一些小错误,但主要的错误是当我看到这条线histories = [deque(maxlen=self.reward_steps)] * len(self.env.envs)在做什么时。它只是重复相同的队列。

In [2]: histories = [deque(maxlen=5)] * 4                                       

In [3]: histories                                                               
Out[3]: [deque([]), deque([]), deque([]), deque([])]

In [4]: histories[0].append(1)                                                  

In [5]: histories                                                               
Out[5]: [deque([1]), deque([1]), deque([1]), deque([1])]

所以我只是将其替换为histories = [deque(maxlen=self.reward_steps) for i in range(len(self.env.envs))]. 这解决了我的问题。

In [7]: histories = [deque(maxlen=5) for i in range(4)]                         

In [8]: histories                                                               
Out[8]: [deque([]), deque([]), deque([]), deque([])]

In [9]: histories[0].append(1)                                                  

In [10]: histories                                                              
Out[10]: [deque([1]), deque([]), deque([]), deque([])]

代表平均奖励的曲线看起来像

在此处输入图像描述