История устранения неполадок и настройки производительности до совершенства

Недавно я начал изучать алгоритм обучения с подкреплением. Flappy Bird - популярная игра, используемая в обучении с подкреплением, особенно для начинающих.

Сарвагья Вайш подробно объяснил теорию Q-обучения и то, как работает игра, в своем посте. Свою идею он реализовал в javascript. Я предпочитаю искать ссылочный код на Python. Спасибо Джихану Джейхану за хороший пример на Python для начала.

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

Однако, как видите, птица не может набрать высокий балл в каждой игре, она может вылететь при любом счете. Это недостаточно стабильно.

Можно ли приучить птицу никогда не умирать ни в одной игре?

Государственное пространство

В посте Сарвагья он определил три измерения для представления одного состояния:

  • X - горизонтальное расстояние до следующей трубы.
  • Y - расстояние до следующей трубы по вертикали.
  • V - Текущая скорость птицы.

В коде Cihan Ceyhan, если птица входит в туннель более чем на 30 пикселей (ширина трубы = 52 пикселей), птица переводит глаза на следующую трубу. Однако это может вызвать конфликт в Q-таблице. Для тех же X, Y, V (до следующей трубы), если текущее положение птицы близко к краю текущей трубы (красным), птица может врезаться в туннель, который в это время прозрачен для птицы. .

Я добавил 4-е измерение в состояние:

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

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

Награды в Q-Learning

С указанным выше улучшением птица может легко лететь до 10000 очков. Однако он все еще нестабилен, бывает много сбоев до достижения 10 000 баллов.

Как пояснил Сарвагья, бот получает +1 награду живым за каждый шаг, а получает -1000 награды, если мертв. Он хорошо работает в большинстве сценариев.

Давайте посмотрим на следующий сценарий. Следующая труба сильно отличается от предыдущей, максимальное вертикальное падение между двумя трубами в игре составляет 142 пикселя. Учитывая, что птица находится в положении, показанном на первом изображении, если птица падает и хочет успешно пройти через эти две трубы, она может выбрать маршрут 1 или маршрут 2 , но ни один из них не может успешно пройти следующую трубу. Это может сработать в большинстве сценариев, если вертикальная разница не достигает максимального перепада. См. Среднее изображение.

Мы тренируем птицу миллион раз, и птица накапливает большое количество положительных значений этой позиции. Наихудший случай - событие довольно редко встречающееся, даже если есть случай, приводящий к сбою, он всего за вычетом 1000 наград. Оставшееся значение по-прежнему является большим положительным значением, иначе птица может легко получить еще 1000 наград за успешные тренировки. Таким образом, птица снова рухнет, как только столкнется с подобной ситуацией.

I changed the reward of alive from 1 to 0, это заставляет птицу сосредоточиться на долгой жизни, чтобы держаться подальше от любых действий, вызывающих смерть. Он получит штраф в размере -1000 наград за смерть независимо от того, сколько успешных сеансов птица провела в прошлом.

После этого улучшения значительно повышается стабильность.

Продолжить игру после смерти

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

Это не идеально для тренировок. Я записал последние 50 шагов птичьего путешествия в реальном времени the game can resume from the last 50 steps before the crash. Это отличный помощник, чтобы пройти все возможные состояния за короткое время.

Возьмем для примера предыдущий случай. Птица находится в состоянии падения при входе в туннель, независимо от того, выбирает ли она маршрут 1, маршрут 2 или любой другой маршрут, она все равно может упасть на следующей трубе. Игра перезапускается с этого момента, она может попытаться выполнить другое действие и погибнет. Перезапустите игру снова, пока птица не обнаружит, что она должна подняться, чтобы войти в этот ящик. Тогда он может пройти любой сценарий, в том числе и худший.

Проблема с памятью

В классе Bot он сохраняет информацию о состоянии для каждого движения, которая используется для обновления Q-таблицы после смерти птицы.

Когда птица набирает несколько миллионов очков, она потребляет много памяти. Это также снижает скорость тренировки.

Каждые 5 миллионов шагов, что эквивалентно примерно 139 000 баллов, я обновляю Q-таблицу, а затем уменьшаю список массивов. Я по-прежнему оставляю буфер в 1 миллион шагов, чтобы избежать столкновения с птицей в случае, если птица упадет сразу после 6 миллионов шагов.

После изменения максимальное потребление памяти составит около 1 ГБ, что намного меньше, чем раньше.

Инициализация Q-таблицы

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

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

Чтобы начать новое обучение с нуля, достаточно удалить файл qvalues.json из папки data/.

Проверка

После долгих тренировок (более 10 часов) я провел проверочный тест с максимальным счетом = 10M и эпизодом = 2. Игра перезапустится, как только птица наберет 10 миллионов очков. Этот тест демонстрирует, что обученный агент может долгое время летать без сбоев. Даже обучение без пользовательского интерфейса, на моем Mac все равно требуется почти 2 часа, чтобы набрать 10 миллионов баллов. В этом тесте я провожу только 2 серии.

От начальной точки до первой трубы, птица пролетит большое расстояние без каких-либо препятствий, состояния перед первой трубой не будут такими же, как при следующей тренировке, следующий тест демонстрирует, что обученный агент отлично справляется с началом путешествия . Установив Max Score = 10 и Episode = 100,000, агент успешно прошел тест.

3-й тест демонстрирует стабильность и воспроизводимость для любой игры. В этом тесте с максимальным количеством баллов = 10 000 и эпизодом = 2 000 обученный агент также прошел без ошибок.

Я сделал последний тест, чтобы посмотреть, сколько очков может летать птица, просто из любопытства. Я установил максимальный счет = 50 000 000 только для одного эпизода.

Заключение

Теперь мы можем сказать, что обученный агент (flappy bird) НИКОГДА не умирает.

Код

В github: https://github.com/kyokin78/rl-flappybird

использованная литература

Http://sarvagyavaish.github.io/FlappyBirdRL/
https://github.com/chncyhn/flappybird-qlearning-bot
https://github.com/sourabhv/ FlapPyBird