Поиск правильных параметров для нейронной сети для игры в понг

У меня есть некоторые проблемы с моей реализацией глубокой нейронной сети для игры Pong, потому что моя сеть всегда расходится, независимо от того, какие параметры я меняю. Я взял игру «Понг» и реализовал алгоритм обучения глубокому q, основанный на анано / лазаньи, который основан на знаменитой бумаге природы Googles Deepmind.

Что я хочу:
Вместо того, чтобы подавать сеть с данными пикселя, я хочу ввести х- и y-положение шара и y-позицию весла для 4 последовательных кадров. Таким образом, я получил в общей сложности 12 входов.
Я только хочу вознаградить удар, потерю и победу в раунде.
С этой конфигурацией сеть не сходилась, и мой агент не мог играть в игру. Вместо этого весло двигалось прямо вверх или вниз или повторялось одно и то же изображение. Поэтому мне показалось, что я пытаюсь сделать это немного легче для агента и добавить некоторую информацию.

Что я сделал:
Состояния:

  • x-положение шара (от -1 до 1)
  • y-положение шара (от -1 до 1)
  • нормализованная скорость х шара
  • нормализованная y-скорость шара
  • y-положение лопасти (от -1 до 1)

С 4 последовательными кадрами я получаю общий вход 20.

Награды:

  • +10, если Паддл попадает в мяч
  • +100, если агент выигрывает раунд
  • -100, если агент теряет раунд
  • -5 до 0 для расстояния между предсказанным конечным положением (y-положение) мяча и текущей y-позицией лопасти
  • +20, если предсказанное конечное положение шара находится в текущем диапазоне лопасти (поражение предсказуемо)
  • -5, если мяч лежит за веслом (больше невозможно попасть)

При такой конфигурации сеть все еще расходится. Я пытался играть со скоростью обучения (от 0,1 до 0,00001), узлами скрытых слоев (от 5 до 500), количеством скрытых слоев (от 1 до 4), аккумулятором партии (суммой или средним), правилом обновления (rmsprop или Deepminds rmsprop).
Все это не привело к удовлетворительному решению. График средних значений потерь в основном выглядит примерно так. Вы можете загрузить мою текущую версию реализации здесь
Я был бы очень благодарен за любой намек 🙂
Koanashi

Повторение моего предложения из комментариев в качестве ответа теперь, чтобы было легче увидеть, что кто-то еще заканчивается на этой странице позже (был опубликован как комментарий сначала, так как я не был на 100% уверен, что это будет решение):

Уменьшение величины вознаграждений в (или, по крайней мере, близком к) значениям интервалов [0.0, 1.0] или [-1.0, 1.0] помогает сети сходиться быстрее.

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

Однако, изучение таких больших весов обычно занимает гораздо больше времени. Основная причина этого заключается в том, что весовые коэффициенты часто вводятся в случайные значения, близкие к 0, поэтому требуется много времени, чтобы изменить эти значения на большие значения посредством обучения. Поскольку весы инициализируются небольшими значениями (обычно), и они очень далеки от оптимальных значений веса, это также означает, что существует повышенный риск наличия локального (а не глобального) минимума на пути к оптимальному вес, которые он может застрять.

При более низких значениях вознаграждения оптимальные значения веса, вероятно, также будут незначительными. Это означает, что веса, инициализированные до небольших случайных значений, уже более близки к их оптимальным значениям. Это приводит к сокращению времени обучения (меньше «дистанции», чтобы путешествовать, чтобы сделать его неформально), и уменьшенный риск наличия местных минимумов на пути к тому, чтобы застрять.