Почему DQN дает одинаковые значения всем действиям в пространстве действий (2) для всех наблюдений

У меня есть алгоритм DQN, который учится (потери сходятся к 0), но, к сожалению, он изучает функцию значения Q, так что оба значения Q для каждого из 2 возможных действий очень похожи. Стоит отметить, что значения Q меняются очень мало за каждое наблюдение.

Подробности:

  • Алгоритм воспроизводит CartPole-v1 из OpenAI Gym, но использует пиксели экрана в качестве наблюдения, а не 4 предоставленных значения.

  • Функция вознаграждения, которую я предоставил, обеспечивает вознаграждение: 0,1, если игра не закончена, и -1, если игра окончена

  • Скорость распада (гамма) составляет 0,95

  • Эпсилон равен 1 для первых 3200 действий (для заполнения части памяти воспроизведения), а затем отжигается более 100 000 шагов до значения 0,01.

  • память воспроизведения имеет размер 10000

  • Архитектура виртуальной сети:

    • входной слой размером screen_pixels
    • Слой уровня 1 с 32 фильтрами с ядром (8,8) и шагом (4,4), функцией активации relu и дополняется таким же размером на выходе как вход
    • Слой 2 с 64 фильтрами с ядром (4,4) и шагом (2,2), функцией активации relu и дополняется таким же размером на выходе как вход
    • Слой 3 с 64 фильтрами с ядром (3,3) и шагом (1,1), функцией активации relu и имеет одинаковый размер на выходе как вход
    • сплющенный слой (это позволяет изменить форму данных, чтобы потом их можно было передавать в полностью связанный слой)
    • Полностью связанный слой с 512 узлами и функцией активации Relu
    • Выходной полностью связанный слой с 2 ​​узлами (пространство действия)
  • Скорость обучения сверточной нейронной сети составляет 0,0001
  • Код был разработан в керасе и использует повтор опыта и глубокое обучение
  • Исходное изображение уменьшается с (400, 600, 3) до (60, 84, 4) за счет оттенков серого, изменения размера, обрезки, а затем складывается 4 изображения вместе, прежде чем передать его в сеть.
  • Целевая сеть обновляется каждые 2 обновления сети.

1 ответ

Предоставление положительного вознаграждения 0.1 на каждом шаге, пока игра не закончена, может сделать игру за -1 наказание почти неактуальной. Особенно учитывая коэффициент дисконтирования, который вы используете.

Трудно судить, не глядя на ваш исходный код, но я бы изначально предложил вам предоставить только отрицательное вознаграждение в конце игры и убрать положительное вознаграждение.

Другие вопросы по тегам