Результат в Dota 2 показал, что игра с самим собой при условии достаточных вычислительных мощностей может невероятным образом улучшить эффективность систем машинного обучения от уровня, значительно уступающего человеческому, до уровня сверхчеловека. В течение месяца наша система прогрессировала от слабого конкурента для игроков высшего уровня до победителя профессионалов, и на этом ее развитие не завершается. Контролируемые системы глубокого обучения могут быть лишь настолько хороши, насколько хороши их тренировочные базы, но системы, играющие сами с собой, автоматически расширяют свои базы информации и становятся сильнее.
Рейтинг TrueSkill, созданный по симуляции игр между ботами (их версиями) и их винрейту. Система постоянно улучшалась от приобретения новых фич до алгоритмических улучшений. График на удивление линеен, что означает, что команда разработки постепенно улучшала ботов с течением времени.
Ниже представлены контрольные точки развития проекта. По статистике 15% игроков ниже 1.5к MMR, 58% игроков ниже 3к MMR, 99.99% ниже 7.5к MMR.
1 марта: первые результаты классического обучения в простой среде Dota, где Drow Ranger училась кайтить запрограммированного Earthshaker.
8 мая: тестер с 1.5к MMR сказал, что развивается быстрее, чем бот.
Начало июня: победа над тестером с 1.5к MMR.
30 июня: выиграно большинство игр против тестера с 3к MMR.
8 июля: с трудом получена первая победа над полупрофессиональным тестером с 7.5к MMR.
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к про) 6-0, который позже заявил, что бот непобедим. Сыграв с ботом за 9 августа, вышел в счет 2-1.
11 августа: побежден Dendi (7.3к про) 2-0. Нынешний бот имеет 60% винрейт против бота за 10 августа.
Бот играет против SumaiL
Задача
Основа игры - 5 на 5, но существуют турниры 1 на 1. Наш бот играл, следуя стандартным турнирным правилам, без добавления специфичных улучшений AI к 1 на 1.
Бот управлял следующими интерфейсами:
Наблюдение: особенности программного интерфейса, созданные по примеру тех, что могут видеть люди, относящиеся к героям, крипам, курьерам и местности вокруг героя.
Действия: действия, доступные интерфейсу бота, сделаны по реакции, сравнимой с человеческой, и включают в себя перемещение в точку, атаку и использование предмета.
Фидбек: бот получил стимулы к победе и базовые показатели, такие как здоровье и last hits.
Были занесены лишь самые успешные сборки, которые могут использовать боты. Также был отдельно оттренирован навык блока волны крипов.
Бот играет против Arteezy
The International
Наш подход, совмещающий небольшое количество "тренировок" с игрой с самим собой, позволил нам значительно улучшить нашу систему в период с понедельника по четверг во время The International. В понедельник вечером Pajkatt победил бота, использовав необычный билд с ранним Magic Wand. Мы добавили его в список рассматриваемых предметов.
Около часа дня в среду мы тестировали самого последнего бота. Бот стал терять кучу здоровья на первой волне крипов. Мы посчитали, что необходимо сделать откат, но заметили, что дальнейшая игра была фантастической, а поведение на первой волне было байтом, чтобы другие боты вели себя агрессивнее против врага на низком уровне здоровья. Дальнейшая игра против себя же устранила эту проблему: бот научился контрить стратегию байта. Между тем, мы сшили этого бота с ботом, который выступал в понедельник, но лишь для первой волны, и завершили работу всего за 20 минут до прихода Arteezy в 4 часа дня.
После матча с Arteezy мы улучшили модель блока крипов, которая улучшила показатель TrueSkill на 1 пункт. Дальнейшие тренировки до матча с SumaiL в четверг улучшили TrueSkill еще на 2 пункта. SumaiL заметил, что бот научился использовать рейзы вне зоны видимости соперника. Это произошло из-за механики, которой мы не знали: способности, использованные вне зоны видимости врага, не позволяют ему получить заряд стиков.
Arteezy также сыграл матч против нашего 7.5к тестера. Артур побеждал в течение всей игры, но наш тестер решил удивить его стратегией, которую он подметил у бота. Arteezy отметил, что эта была та стратегия, которую Paparazi использовал против него лишь однажды.
Pajkatt побеждает бота за понедельник. Заметьте, как он байтит бота, а после использует хил от Faerie Fire и Magic Wand. Обычно бот очень хорош в просчитывании того, кто победит в схватке, но он никогда не играл против соперника с ранним Magic Wand.
Эксплойты
Хоть SumaiL и назвал бота непобедимым, он все еще мог оказаться в ступоре от еще не виданных ситуаций. Мы отправили бота играть с обычными игроками на The International, где они пытались победить его любыми возможными способами в течение тысячи игр.
Успешные эксплойты можно разделить на три типа:
Пул крипов: есть возможность постоянно отводить за собой крипов с линии между tier 2 и tier 3 вышками бота. Таким образом, вы бегаете с кучей крипов за своей спиной, в то время как вышка бота продавливается под натиском ваших волн.
Orb of Venom + Wind Lace: это дает вам большое преимущество в скорости передвижения на первом уровне и позволяет сделать быстрый first blood.
Raze на первом уровне: это требует очень хорошего скилла, но несколько 6-7к игроков смогли убить бота на первом уровне с помощью трех-пяти рейзов за короткий промежуток времени.
Исправление этих ошибок для игры 1 на 1 схоже с фиксом бага, что использовал Pajkatt.
Инфраструктура
Первым шагом в проекте было нахождение пути запуска Dota 2 в облаке на физическом GPU, где постоянно мешала непонятная ошибка. Запустив все на персональном компьютере Грега, мы подметили, что Dota запускается с подключенным монитором и выдает ту же ошибку при его отключении. Поэтому нам пришлось настроить наши облачные экземпляры так, чтобы симулировать подключение монитора.
Dota в то время не поддерживала выделенные серверы, а это означает, что запуск без GPU был возможен лишь с очень медленным рендером ПО. Мы создали шайбу для перекрытия большинства сигналов OpenGL, кроме тех, которые были необходимы для запуска.
В то же время мы написали заскриптованного бота, потому что нам нужна была определенная база для сравнения, а также требовалось понимание всего API. Заскриптованный бот добивался 70 добитых крипов за 10 минут на пустой линии, но все еще проигрывал разумному человеку. Наш сегодняшний лучший бот достигает 97 добитых крипов (он уничтожает вражескую вышку до конца времени, поэтому мы можем лишь экстраполировать), а теоретический максимум - 101.
Бот играет против SirActionSlacks. Стратегия отвлечения бота курьером не сработала.
5 на 5
Режим 1 на 1 довольно запутан, но 5 на 5 - это море из запутанных узлов. Мы знаем, что для того, чтобы решить эту задачу, нам придется и дальше раздвигать пределы возможностей AI.
Один из устоявшихся методов - клонирование поведения. В Dota проводится около миллиона публичных матчей за день. Реплеи этих матчей сохраняются на серверах Valve в течение двух недель. Мы сохраняли каждую игру на высоком уровне с прошлого ноября и собрали базу из 5.8 миллионов игр (каждая игра около 45 минут с 10 людьми). Мы использовали OpenDota, чтобы исследовать эти реплеи, и помогаем им 12-ю тысячами долларов.
У нас есть множество других идей, и мы ищем инженеров и исследователей, чтобы помочь нам воплотить их в жизнь. Мы благодарим Microsoft Azure и Valve за поддержку и приложенные усилия.