DQN 在 Atari Pong 任务中陷入次优策略

人工智能 深度学习 强化学习 Python
2021-11-06 13:41:47

我正在使用 Atari Pong 的目标环境在 PyTorch 中从头开始实施 DQN 模型。经过一段时间的超参数调整后,我似乎无法让模型达到大多数出版物中报告的性能(~+21 奖励;这意味着代理几乎赢得了每一次截击)。

我最近的结果如下图所示。请注意,x 轴是剧集(完整游戏到 21 场),但总训练迭代次数约为 670 万。

在此处输入图像描述

我的设置的细节如下:

模型

class DQN(nn.Module):
    def __init__(self, in_channels, outputs):
        super(DQN, self).__init__()
        self.conv1 = nn.Conv2d(in_channels=in_channels, out_channels=32, kernel_size=8, stride=4)
        self.conv2 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=4, stride=2)
        self.conv3 = nn.Conv2d(in_channels=64, out_channels=64, kernel_size=3, stride=1)
        self.fc1 = nn.Linear(in_features=64*7*7 , out_features=512)
        self.fc2 = nn.Linear(in_features=512, out_features=outputs)

    def forward(self, x):
        x = F.relu(self.conv1(x))
        x = F.relu(self.conv2(x))
        x = F.relu(self.conv3(x))
        x = x.view(-1, 64 * 7 * 7)
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return x    # return Q values of each action

超参数

  • 批量大小:32
  • 回放内存大小:100000
  • 初始ε:1.0
  • epsilon 在 100000 步内线性退火到 0.02
  • 随机热启动剧集:~50000
  • 每更新目标模型:1000 步
  • 优化器 = optim.RMSprop(policy_net.parameters(),lr=0.0025,alpha=0.9,eps=1e-02,动量=0.0)

附加信息

  • OpenAI健身房Pong-v0环境
  • 喂食最后观察到的 4 个帧的模型堆栈,缩放并裁剪为 84x84,以便只有“游戏区域”可见。
  • 将丢球(生命终结)视为重放缓冲区中的最终状态。
  • 使用smooth_l1_loss,它充当 Huber 损失
  • 优化前在 -1 和 1 之间剪裁梯度
  • 正如论文所建议的那样,我用 4-30 个无操作步骤来抵消每一集的开头

有没有人有过类似这样的经历,每集平均奖励 6 到 9 个?

任何有关更改超参数或算法细微差别的建议将不胜感激!

1个回答

万一您仍然无法解决问题,这里是我自己问题的答案的链接,其中包含我所做的逐步更改,以仅使用 10000 重放缓冲区大小和正常的双 DQN (DDQN),训练了大约 700-800 集。更新的代码也可以在这里找到。

不需要像优先重播缓冲区这样的花哨的更改或任何秘密的超参数更改。它通常很简单,例如输入预处理步骤的一个小问题。