- PVSM.RU - https://www.pvsm.ru -

Подробности создания бота для Dota 2

Результат [1] игры нашего бота [2] показывает, что игра с самим собой [self-play] может серьёзно увеличить качество систем машинного обучения, и повысить его от состояния гораздо ниже уровня человека до уровня сверхчеловека, при наличии соответствующих вычислительных мощностей. В течение месяца наша система поднялась с состояния, едва ли соответствовавшего уровню хорошего игрока до состояния, в котором она обыгрывала лучших профессионалов, и с тех пор продолжает совершенствоваться. Качество системы контролируемого глубинного обучения определяется набором учебных данных, но для систем, играющих с самими собой, доступный набор данных автоматически улучшается.

image
Изменение рейтинга TrueSkill [3] (схожего с рейтингом Эло [4] для шахмат) нашего бота со временем, подсчитанная при помощи симуляции игр между ботами.

Проект развивался следующим образом. Рейтинг 15% игроков находится ниже отметки 1,5К по шкале MMR [5]; у 58% игроков он ниже 3К; у 99,99% игроков ниже 7,5К.

• 1 мая: первые результаты [6] обучения с подкреплением [7] в простом Dota-окружении, где Drow Ranger учится сражаться с жёстко запрограммированным Earthshaker.
• 8 мая: тестировщик с MMR [8] в 1,5K говорит, что его результаты улучшаются быстрее, чем у бота.
• Начало июня: выиграл у тестировщика с MMR 1,5K
• 30 июня: выиграл большую часть игр у тестировщика с MMR 3000.
• 8 июля: впервые с небольшим отрывом выиграл [9] у полупрофессионального тестировщика с MMR 7,5К.
• 7 августа: победил Blitz [10] (6,2К, бывший профессионал) со счётом 3-0, Pajkatt [11] (8,5К, профессионал) 2-1, и CC&C [12] (8,9К, профессионал) 3-0. Все они согласились, что SumaiL придумает, как его обыграть.
• 9 августа: победил Arteezy (10К, профессионал, один из лучших игроков) 10-0. Он сказал, что SumaiL сможет справиться с этим ботом.
• 10 августа: победил SumaiL (8,3К, профессионал, лучший игрок 1 на 1) 6-0. Игрок заявил, что бота победить нельзя. Сыграл с версией бота от 9 августа, победил 2-1.
• 11 августа: победил Dendi (7,3К, профессионал, бывший чемпион мира) 2-0. На 60% больше побед, чем у версии от 10 августа.

Игра против SumaiL

Задача

В полной версии игры сражаются игроки 5 на 5, но в некоторых [13] турнирах бывают [14] и игры 1 на 1. Наш бот играл по стандартным турнирным правилам – мы не добавляли специальные упрощения для ИИ.

Бот работал со следующими интерфейсами:

• Наблюдение: API, разработанные так, чтобы у него были те же возможности, что и у живых игроков, касающиеся героев, других персонажей игры и поверхности рядом с героем. Игра частично наблюдаема.
• Действия: доступные через API, с частотой, сравнимой с человеческой, включая движение к определённому месту, атаку и использование предметов.
• Обратная связь: бот получает вознаграждения за победу, а также простые параметры, такие, как здоровье и ластхиты [15].

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

Бот играет против Arteezy

Турнир The International

Наш подход, комбинирующий игру с самим собой и обучение извне, позволил нам значительно усилить игру нашего бота с понедельника по четверг, пока шёл турнир. Вечером в понедельник Pajkatt выиграл, используя необычную сборку предметов. Мы добавили эту сборку в список доступных предметов.

В районе часа дня в среду мы протестировали последнюю версию бота. Бот терял очень много здоровья после первой волны. Мы решили, что нужно откатиться, но затем заметили, что последующая игра была потрясающей, и поведение в первой волне было всего лишь приманкой для других ботов. Последующие игры с самим собой решили проблему, когда бот выучился противостоять стратегии с приманкой. А мы совместили это с понедельничным ботом только для первой волны, и закончили всего за 20 минут до того, как появился Arteezy.

После матчей с Arteezy мы обновили модель блокирования крипов, что увеличило TrueSkill на единицу. Последующие тренировки перед матчем с SumaiL в четверг увеличили TrueSkill на два пункта. SumaiL указал на от, что бот научился кастовать разрушающие заклинания [raze] вне поля видимости противника. Это случилось благодаря механике, о которой мы не знали: кастование за пределами поля зрения врага не даёт ему заряжать вонд.

Arteezy сыграл матч с нашим тестировщиком уровня 7,5К. Arteezy выигрывал игру, но наш тестировщик сумел удивить его при помощи стратегии, подсмотренной у бота. Arteezy позже заметил, что эту стратегию против него однажды использовал Paparazi, и что к неё довольно редко прибегают.

Pajkatt выигрывает у понедельничного бота. Он заманивает бота, а потом использует регенерацию.

Уязвимости бота

Хотя SumaiL назвал бота «непобедимым», он всё ещё может запутаться в ситуациях, слишком отличающихся от того, что он видел. Мы запустили его на одном из мероприятий, проходивших на турнире, где игроки играли более 1000 игр с целью победить бота всеми возможными способами.

Удачные уязвимости попали в три категории:

• Перетягивание крипов. Можно постоянно заставлять крипов с линии гнаться за вами сразу после их появления. В результате за вами по всей карте будет бегать несколько десятков крипов, и вражеские крипы уничтожат башню бота.
• Orb of venom + wind lace: дают вам преимущество в скорости передвижения над ботом на первом уровне и позволяют быстро нанести урон.
• Raze на первом уровне: требует навыков, но несколько игроков класса 6-7K смогли убить бота на первом уровне, удачно выполнив 3-5 заклинаний за короткое время.

Исправление проблем для матчей один на один будет похоже на исправление бага с Pajkatt. Но для матчей 5 на 5 эти проблемы уязвимостями не являются, и нам будет нужна система, способная справиться со странными ситуациями, которые она не видела до этого раньше.

Инфраструктура

Мы пока не готовы обсуждать внутренние особенности бота – команда работает над решением задачи с игрой 5 на 5.

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

В то время Dota не поддерживала выделенные серверы, то есть запуск с масштабированием и без GPU был возможен только в варианте с очень медленным софтовым рендером. Затем мы создали заглушку для большей части вызовов OpenGL, кроме тех, что нужны были для загрузки.

Одновременно мы написали бота на скриптах – в качестве эталона для сравнения (в частности потому, что встроенные боты плохо работают в режиме 1 на 1) и чтобы понять семантику API для ботов [16]. Скриптовый бот доходит до 70 ластхитов за 10 минут на пустом пути, но всё равно проигрывает достаточно хорошо играющим людям. Наш лучший бот играющий 1 на 1, доходит до отметки порядка 97 (башню он уничтожает раньше, так что мы можем только экстраполировать), а теоретический максимум – 101.

Бот играет против SirActionSlacks. Стратегия отвлечения бота толпой курьеров не сработала

Пять на пять

Игра 1 на 1 – сложная задача, но 5 на 5 – это океан сложности. Нам нужно будет расширить пределы возможности ИИ, чтобы он смог с ней справится.

Привычным образом мы начнём с копирования поведения. В Dota проходит порядка миллиона публичных игр в день. Записи матчей хранятся на серверах Valve две недели. Мы скачиваем каждую запись игры на экспертном уровне с прошлого ноября, и набрали набор данных объёмом в 5,8 млн игр (каждая игра – примерно 45 минут с 10 игроками). Мы используем OpenDota [17] для поиска записей и перечислили им $12000 (что в десять раз больше того, сколько они хотели собирать за год) для поддержки проекта.

У нас ещё много идей, и мы нанимаем [18] программистов (интересующихся машинным обучением, но не обязательно экспертов) и исследователей нам в помощь. Мы благодарим Microsoft Azure и Valve за поддержку в нашей работе.

Автор: Вячеслав Голованов

Источник [19]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/igry/263097

Ссылки в тексте:

[1] Результат: https://blog.openai.com/dota-2/

[2] нашего бота: https://geektimes.ru/post/292117/

[3] TrueSkill: https://en.wikipedia.org/wiki/TrueSkill

[4] рейтингом Эло: https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B9%D1%82%D0%B8%D0%BD%D0%B3_%D0%AD%D0%BB%D0%BE

[5] MMR: https://dota2.gamepedia.com/Matchmaking_Rating

[6] результаты: https://www.youtube.com/watch?v=5Fv2c4aNS2w&feature=youtu.be

[7] обучения с подкреплением: https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BF%D0%BE%D0%B4%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC

[8] MMR: https://dota.rgp.io/mmr/

[9] выиграл: https://www.youtube.com/watch?v=FBoUHay7XBI&feature=youtu.be&t=345

[10] Blitz: http://wiki.teamliquid.net/dota2/Blitz

[11] Pajkatt: http://wiki.teamliquid.net/dota2/Pajkatt

[12] CC&C: http://wiki.teamliquid.net/dota2/CC%26C

[13] некоторых: http://wiki.teamliquid.net/dota2/Dota_2_Asia_Championships/2017/Solo_Tournament#Rules

[14] бывают: https://www.youtube.com/watch?v=KOlw9SYjr4c

[15] ластхиты: https://dota2.gamepedia.com/Creep_control_techniques#Last-hitting

[16] API для ботов: https://developer.valvesoftware.com/wiki/Dota_Bot_Scripting

[17] OpenDota: https://www.opendota.com/

[18] нанимаем: https://openai.com/jobs

[19] Источник: https://geektimes.ru/post/292547/