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

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

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

Что я сделал:
Штаты:

  • Положение мяча по оси x (от -1 до 1)
  • Y-позиция мяча (от -1 до 1)
  • нормализованная x-скорость мяча
  • нормализованная 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). Все это не привело к удовлетворительному решению. График средних потерь обычно выглядит примерно так: this. Вы можете загрузить мою текущую версию реализации здесь
Я бы буду очень признателен за любую подсказку :)
Коанаши


person chron0x    schedule 07.09.2016    source источник
comment
Поскольку у меня недостаточно очков репутации для размещения более двух ссылок, я хочу предоставить их здесь: Игра в понг; Реализация Theano / Lasagne; Nature paper; Другой график потерь;   -  person chron0x    schedule 07.09.2016
comment
вы пробовали использовать более низкие значения вознаграждения? Если возможно, я бы рекомендовал попытаться нормализовать все награды, чтобы они лежали в [0.0, 1.0] или [-1.0, 1.0] на основе минимального и максимального возможных значений с использованием вознаграждений, которые вы в настоящее время используете. Если эти минимальные и максимальные значения трудно определить, это может, по крайней мере, помочь приблизить все к нулю (может быть, разделить все награды, которые вы используете прямо сейчас, на 100?). Это может помочь сети быстрее сойтись.   -  person Dennis Soemers    schedule 07.09.2016
comment
Спасибо, я еще не знал, но я узнаю и сообщу.   -  person chron0x    schedule 07.09.2016
comment
Ух ты! Вот и все! @DennisSoemers, большое спасибо! Сеть сходится, и нужный игрок учится играть в понг. Сейчас я попытаюсь настроить игру, чтобы получить желаемые условия. Действительно здорово !!! :)   -  person chron0x    schedule 08.09.2016


Ответы (1)


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

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

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

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

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

person Dennis Soemers    schedule 08.09.2016
comment
После того, как первая версия сработала нормально, я удалил награду, которая вычисляет расстояние между предсказанным конечным положением и лопастью. Теперь мои убытки сначала уменьшаются, но снова увеличиваются. При 4 последовательных кадрах у меня все еще остается 20 входов. Я выбрал один скрытый слой с 80 узлами, и у меня есть 3 выхода (вверх, оставаться, вниз). Я столкнулся с переобучением или мне нужно более одного скрытого слоя? Или почему убытки снова растут? - person chron0x; 09.09.2016
comment
в стандартных настройках с контролируемым обучением (обучение нейронной сети на основе примеров ситуаций, когда известно, каков оптимальный результат), я бы рекомендовал не только построить график потери данных проверки / тестирования, но и построить график потери данных данные обучения. Затем, если потеря обучающих данных продолжает уменьшаться, но потери на проверочных данных возрастают, вы знаете, что переобучаете. Я считаю, что у вас другие настройки, и у вас нет данных для обучения? Возможно, эта информация даст вам несколько полезных идей. - person Dennis Soemers; 09.09.2016
comment
@Koanashi за более полезный ответ, сначала мне нужно подробно прочитать статью, чтобы лучше понять, как именно она работает в этой настройке. Теперь я не против сделать это, так как это интересно, и я действительно, вероятно, должен когда-нибудь это прочитать, но это займет немного времени - person Dennis Soemers; 09.09.2016
comment
@Koanashi Я прочитал статью немного подробнее. Верно ли, что ваши «тренировочные данные» (набор опыта) со временем растут? Потому что я считаю, что вы немного играете, затем немного тренируетесь, затем немного играете, затем снова немного тренируетесь и т. Д.? В этом случае я предполагаю, что изначально обучающий набор относительно невелик, и поэтому легче получить низкие потери. Когда набор растет, сети становится все труднее соответствовать наблюдениям, поэтому я не думаю, что это обязательно странно, если потери немного увеличиваются. (продолжение в следующем комментарии из-за ограничения на количество символов) - person Dennis Soemers; 09.09.2016
comment
однако в конечном итоге ваши потери должны стабилизироваться. Судя по последнему изображению, которое вы связали, похоже, что стабилизация может начаться около 0,03. Хотя трудно сказать, для уверенности потребовалось бы больше эпох. Я думаю, что самый важный вопрос: твой агент по-прежнему хорошо играет? Если да, то нет проблемы в том, что убыток немного увеличится, если он не будет расти вечно. - person Dennis Soemers; 09.09.2016
comment
Да, вы сохраняете все переходы (события) в памяти воспроизведения размером 1000000. Из этой памяти воспроизведения вы берете случайный мини-пакет из 32 штук для обучения вашей сети. Я позволил программе работать с одним скрытым слоем с 30 узлами, и потери снова приблизились к 0,03. Агент приближается к мячу, но для большинства из них недостаточно точен. Поэтому я снова начал моделирование в надежде, что оно станет более точным. Я увижу результаты завтра. Я также рекомендую эту статью, которая была опубликована раньше, чем в Nature. - person chron0x; 12.09.2016