Всем доброго времени суток. Решил я на майские праздники отдохнуть от машинного обучения и заняться реализацией какой-нибудь идеи, которую давно хотел воплотить в реальность. Одной из таких реализованных идей стала dino game. Это браузерная в google chrome игра. Когда падает сеть можно поиграться в нее, либо можно поиграть введя в адресную строку: chrome://dino
Суть игры - как можно больше набрать кол-во очков (руками я как-то максимум набрал 11831). Скорость игры со временем увеличивается, происходит смена дня и ночи и т.д. Вообщем настоятельно рекомендую поиграть в нее
Честно признаться я уже пилил эту игру методом обучения с подкреплением, за основу взял данную статью и улучшил результаты и производительность. Также в данной статье скорость являлась статичной, я же переделал ее в такую, которая идет из коробки chrome
Но у меня все равно остался какой-то осадок, сеть выдавала на пике около ~3100, обучение длилось часами, сохранение весов сети занимало приличный объем памяти. В целях повышения скилла ML это конечно неплохо, но для такой простой задачи должны быть реализованы простые методы решения. Более того в интернете я особо не нашел каких-то объяснений как достичь «честным способом» высокие результаты простыми методами
Итак, вот список поставленных целей на реализацию:
1. Высокие результаты (от 100 тыс. и до бесконечности)
2. Точность (каждый запуск алгоритма гарантирует пункт 1)
3. Простота (тут очень могли бы помочь генетические алгоритмы, тот же метод обучения с подкреплением и т. д. но именно выбирался максимально простой алгоритм)
4. Игра должна играться из коробки (не должно происходить никаких изменений в конфиге игры и т. д.)
5. Алгоритм должен «самообучаться», не должно быть никаких «подгонок параметров руками».
6. Получение на вход алгоритму только скриншота с экрана, больше никакой информации (в предыдущей реализации методом обучения с подкреплением использовал Selenium, на вход алгоритму подавал кол-во очков, парсенные из тега «canvas»)
7. Повторить NumPy (NumPy — мне, как бывшему Matlab-исту очень нравится данный пакет, поэтому максимально эффективно старался применять функции данного пакета)
8. Получить кол-во просмотров на YouTube больше 10 тыс.
Все пункты я успешно выполнил, остался только 8-ой. Вы можете помочь с ним, посмотрев видео в конце статьи
Расскажу кратко основу алгоритма: (полный код алгоритма выложу по достижении пункта 8, либо когда отрефакторю его). Мы оптимизируем просто 1 переменную, расстояние от динозавра до препятствия, когда нужно совершить прыжок. Все. Очень просто, даже без «нагиба» динозавра, просто прыжок. Прыжок может быть длинным, либо коротким, это зависит от скорости функции
Подумав немного, я пришел к выводу, что самая важная часть алгоритма это определение скорости игры, зная скорость можно вывести функцию зависимости прыжка от расстояния до препятствия
Конечно, первое что пришло в голову это то что кол-во очков по логике пропорциональна скорости игры (чем выше очков, тем больше скорость). Но я считаю что подобные алгоритмы нужно реализовывать похожим методом с работой мозга людей. Когда играю в эту игру, я не смотрю на очки (на высоких скоростях нет времени), а просто оцениваю скорость игры и, видя препятствие, принимаю решение о действии динозавра
Поэтому скорость игры определил по разнице дистанций одних и тех же объектов от пройденного времени. Тут очень важна была скорость вычисления, так как количество кадров на больших скоростях нужно высокое. Вообщем NumPy оказался как всегда на высоте
скриншот n
скриншот n+1
Вау
# 1
Отправитель: Рустам
Дата: 6 Май 2019 в 06:46