DQN застрял на неоптимальной политике в задаче Atari Pong - PullRequest
0 голосов
/ 25 января 2019

Я нахожусь в процессе реализации модели DQN с нуля в PyTorch с целевой средой Atari Pong.После некоторой настройки гиперпараметров я не могу заставить модель достичь производительности, о которой сообщается в большинстве публикаций (награда ~ +21; это означает, что агент выигрывает почти каждый залп).

Мои самые последние результаты показаны на следующем рисунке.Обратите внимание, что ось X - это эпизоды (полных игр до 21), но общее количество итераций обучения составляет ~ 6,7 млн.

enter image description here

Особенности моей настройкиследующие:

Модель

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
  • эпсилон отжигается линейно до 0,02 на 100000 шагов
  • случайные эпизоды горячего старта: ~ 50000
  • обновлять целевую модель каждые: 1000 шагов
  • optimizer = optim.RMSprop (policy_net.parameters (), lr = 0,0025, альфа = 0,9, eps = 1e-02, импульс = 0,0)

Дополнительная информация

  • Окружающая среда OpenAI Pong-v0
  • Загрузка стеков моделей из 4 последних наблюдаемых кадров, масштабированных и обрезанных до 84x84 таким образом, что видна только «игровая зона».
  • Лечить потерю залпа (конецof-life) как состояние терминала в буфере воспроизведения.
  • Использование smooth_l1_loss , которое действует как потеря Хьюбера
  • Обрезание градиентов от -1 до 1 перед оптимизацией
  • Я смещал начало каждого эпизода с 4-30 шагами без операции, как написано в документах

Есть кто-нибудьбыл подобный опыт застрять около 6 - 9 в среднем награду за эпизод, как это?

Будем весьма благодарны за любые предложения по изменению гиперпараметров или нюансов алгоритмов!

...