我正在使用 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 个?
任何有关更改超参数或算法细微差别的建议将不胜感激!