Почему 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 наказание почти неактуальной. Особенно учитывая коэффициент дисконтирования, который вы используете.
Трудно судить, не глядя на ваш исходный код, но я бы изначально предложил вам предоставить только отрицательное вознаграждение в конце игры и убрать положительное вознаграждение.