Бот для доты 2

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

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

Изменение рейтинга 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

Турнир The International

Наш подход, комбинирующий игру с самим собой и обучение извне, позволил нам значительно усилить игру нашего бота с понедельника по четверг, пока шёл турнир. Вечером в понедельник Pajkatt выиграл, используя необычную сборку предметов. Мы добавили эту сборку в список доступных предметов.
В районе часа дня в среду мы протестировали последнюю версию бота. Бот терял очень много здоровья после первой волны. Мы решили, что нужно откатиться, но затем заметили, что последующая игра была потрясающей, и поведение в первой волне было всего лишь приманкой для других ботов. Последующие игры с самим собой решили проблему, когда бот выучился противостоять стратегии с приманкой. А мы совместили это с понедельничным ботом только для первой волны, и закончили всего за 20 минут до того, как появился Arteezy.
После матчей с Arteezy мы обновили модель блокирования крипов, что увеличило TrueSkill на единицу. Последующие тренировки перед матчем с SumaiL в четверг увеличили TrueSkill на два пункта. SumaiL указал на то, что бот научился кастовать разрушающие заклинания вне поля видимости противника. Это случилось благодаря механике, о которой мы не знали: кастование за пределами поля зрения врага не даёт ему заряжать вонд.
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. Стратегия отвлечения бота толпой курьеров не сработала

Сложности

Боты имеют 5 разных сложностей (Пассивный, Легкий, Средний, Сложный, Нечестный).

  • Пассивные боты ведут себя пассивно на линии, не атакуют игроков, бота или человека, только когда он видит союзника человека игрока бот атакует его врага. Он не пытается добить своего или вражеского крипа, а иногда будет держаться около башни. Пассивные боты никогда не используют свои способности/предметы. Если союзный игрок-человек отключится, то бот противоположной команды вернется к фонтану и перестанет играть, пока игрок не вернется.

  • Легкие боты сложнее пассивных, они охотно атакуют других героев и используют способности/предметы (исключения − Phase Boots, Force Staff и Orchid Malevolence), но, как правило, с задержкой. Расчет добивания крипов не точный, в отличии от более сложных ботов. Ни легкие боты союзника, ни боты врага не добивают своих крипов. Легкие боты не пытаются ганкать другие полосы и собираются только в небольшую группу, чтобы атаковать базу врага или защищать свою. Легкие боты не будут пытаться оглушать вражеских героев и прерывать применяемые способности. Также, Легкие боты не в состоянии отличить героя от иллюзии.

  • Средние боты почти похожи на легких по стиле игры, с несколькими исключениями. Их реакция быстрее, что делает их добивания точнее, и если они играют в однопользовательском режиме, то только союзные боты добивают своих крипов. Средние боты лучше отличают героя от иллюзии. Средние боты могут использовать Phase Boots, Force Staff и Orchid Malevolence.

  • Сложные боты сложнее средних, так как они точные в добивании вражеских и своих крипов. Несколько сложных ботов будут оглушать, чтобы избежать дублирования, в результате длительного оглушения. Сложные боты будут также пытаться прервать применяемые способности, уворачиваться от летящих снарядов (такие как Meat Hook или Sacred Arrow). Если их Герой имеет хорошую способность с маленькой перезарядкой или большим уроном, как Viper или Death Prophet, они будут повторно использовать способности для того, чтобы прогнать врагов с линии. После того, как заканчивается фаза линии, боты за команду игрока будут играть немного плохо, вражеские Сложные боты, как правило, остаются на месте, собравшись впятером, атакуют и защищают по согласию.

  • Нечестные боты сложнее сложных, они почти похожи на сложных по стилю игры. Их добивания почти идеальны, и если вы играете в однопользовательский режим, то боты в команде игрока будут плохо играть. Боты игрока могут собраться впятером на вражескую команду без уважительной причины. Вражеские Нечестные боты так же зарабатывают на 25% больше золота и опыта. Если союзный игрок отключается от игры, вражеская команда не теряет участника, хорошо симулируют настоящую игру с людьми.

Сводка

Пассивные

Ничего

Легкие

  • Использование способностей: Включено
  • Использование всех предметов: Включено (исключения приведены ниже)
  • Покидание линии: Включено

  • Неопределенность в добивании: 400 мс
  • Время реакции: 200 мс
  • Формация группы: 3

Средние

  • Использование всех предметов, включая следующие: Включено
  • Force Staff
  • Orchid Malevolence
  • Phase Boots
  • Обнаружение иллюзий: Включено

  • Неопределенность в добивании: 200 мс
  • Время реакции: 100 мс
  • Формация группы: 4

Сложные

  • Избегание дублирования оглушения: Включено
  • Добивание союзных крипов: Включено
  • Агрессия на линии: Включено
  • Ганки/Роаминг: Включено
  • Прерывание заклинаний: Включено
  • Уклонение от снарядов: Включено

  • Неопределенность в добивании: 0 мс (Мгновенно)
  • Время реакции: 50 мс
  • Формация группы: 5

Нечестные

  • +25% к опыту и золоту: Включается на 30 минут
  • Неопределенность в добивании: 0 мс (Мгновенно)
  • Время реакции: 0 мс (Мгновенно)
  • Формация группы: 5
  • Вражеские боты будут использовать некоторые маленькие читы

> Имена ботов

Разные боты имеют разные имена. Они выбираются случайно каждый матч. После имён всегда будет слово «Bot» (т.е.: Archy Bot). Здесь список имён ботов: