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

в 14:36, , рубрики: dota 2, игры, искусственный интеллект

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

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

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

• 1 мая: первые результаты обучения с подкреплением в простом Dota-окружении, где Drow Ranger учится сражаться с жёстко запрограммированным Earthshaker.
• 8 мая: тестировщик с MMR в 1,5K говорит, что его результаты улучшаются быстрее, чем у бота.
• Начало июня: выиграл у тестировщика с MMR 1,5K
• 30 июня: выиграл большую часть игр у тестировщика с MMR 3000.
• 8 июля: впервые с небольшим отрывом выиграл у полупрофессионального тестировщика с MMR 7,5К.
• 7 августа: победил Blitz (6,2К, бывший профессионал) со счётом 3-0, Pajkatt (8,5К, профессионал) 2-1, и CC&C (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, но в некоторых турнирах бывают и игры 1 на 1. Наш бот играл по стандартным турнирным правилам – мы не добавляли специальные упрощения для ИИ.

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

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

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

Бот играет против 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 для ботов. Скриптовый бот доходит до 70 ластхитов за 10 минут на пустом пути, но всё равно проигрывает достаточно хорошо играющим людям. Наш лучший бот играющий 1 на 1, доходит до отметки порядка 97 (башню он уничтожает раньше, так что мы можем только экстраполировать), а теоретический максимум – 101.

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

Пять на пять

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

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

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

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

Источник

Поделиться

* - обязательные к заполнению поля