Время на прочтение
Привет! На связи zmax505, я бы хотел рассказать о своём опыте по созданию проекта по MOBA игре Dota 2. Мы с iory разработали модель машинного обучения, которая анализирует игры в live и на основе различных данных предсказывает предполагаемого победителя встречи.
Технологии искусственного интеллекта вновь заставили о себе говорить. На это раз причиной стала победа OpenAI над командой профессиональных игроков в Dota 2. Название команды — OG, в 2018 году она получила главный приз киберспорта, заняв первое место в турнире The International по Dota 2. Призовой фонд этого турнира составляет $25 млн.
На выходных киберспортсмены сражались с ботами, обученными по единой методике (технология «обучение с подкреплением»), причем ботов тестировали независимо друг от друга. Чемпионат OpenAI Five проходил в Сан-Франциско.
Ботов вводили в игру без предварительной подготовки, так что ИИ сразу попадал в «боевые» условия. Ботов «натаскивали» на Dota 2 в течение 10 месяцев. Для искусственного интеллекта это время было эквивалентно 45 тысячам лет игрового времени.
Все участники чемпионата получили возможность выбрать 17 персонажей. ИИ начал игру с выбора режима, в котором команда может запрещать противнику выбирать тех героев, которые уже были выбраны. По мнению экспертов, такая стратегия дает возможность использовать сильные стороны персонажей практически без оглядки на слабые. Плюс ко всему, игроки отключили иллюзии и возможность призыва новых героев. Правда, воскрешать тех, кто пал, было можно. OG также могли использовать невидимость, плюс курьер OpenAI Five не обладал неуязвимостью.
Искусственный интеллект выбрал агрессивную тактику, в ходе которой он все время атаковал противника. Несмотря на то, что такая тактика была рассчитана на краткосрочную выгоду, она все же принесла свои плоды и в долгосрочном плане. При этом первый матч продлился всего полчаса — ИИ победил людей без особого труда.
Второй матч был еще короче, причем ИИ атаковал людей еще более агрессивно, практически не уходя в защиту.
This is probably over already, sadly. OpenAI have four of the top five heroes ranked by net worth. At ten minutes in, against bots with the execution of OpenAI, this is really bad. #openaifive
Впервые бот OpenAI был выведен на игровую арену в 2017 году, на чемпионате The International 2017. Тогда он обыграл Данила Dendi Ишутина в матче 1vs1 на Shadow Fiend. Затем компания представила уже ИИ-команду, которая уступила paiN Gaming и сборной профессиональных игроков китайской сцены на TI8.
На победу искусственного интеллекта было сделано 65% ставок киберспортивного тотализатора.
Нейросеть ChatGPT от компании OpenAI составила список лучших игроков в Dota 2 за всю историю существования соревновательно сцены. Данной информацией поделились представители студии в официальном канале в Telegram.
Согласно предоставленной информации, в тройку лидеров вошли Джонатан ‘Loda’ Эмануэль Берг (первое место), Питер ‘ppd’ Дагер (второе место) и Клемент ‘Puppey’ Иванов (третье место). Помимо этого, Никита ‘Daxak’ Кузьмин вошёл в данный рейтинг, расположившись на десятой строчке.
Ранее стало известно, что руководство исследовательской лаборатории OpenAI, создавшей ботов для игры Dota 2 и не только, ведут переговоры о продаже акций.
- RamirezSup 115315 Dota Plus, компендиумы и ивенты
- NAVI против SPIRIT. Жалко NAVI
BolshoiDlinnuiNeobrezanui 37 Киберспорт: матчи, турниры, команды и игроки - Даныло идёт по головам!
Жабик 31 Киберспорт: матчи, турниры, команды и игроки - Квопа еще живой мидер?
Проснулся 23 Герои: общие обсуждения - Весна 2023 — призыв к оружию
Who_I_am 23 Dota Plus, компендиумы и ивенты - изи мани #2
ergggg 71 Киберспорт: матчи, турниры, команды и игроки - Разгон Ryzen 5 2600x
4RTeencbrs 14 Железо, новости и обсуждения - Я часть народа?
KeksovName 18 - Стеклянный ковёр , какой лучше ?
towboat 6 Игровые девайсы, периферия и прочая техника - Аниме наподобие хантера
TobiWan KiNoBi 11 Аниме и прочее - Кристал Мей болеет?
Oro 9 Киберспорт: матчи, турниры, команды и игроки
В рамках The International 2017 исследовательская компания Илона Маска Open AI презентовала особого бота, способного успешно конкурировать с игроками в режиме 1 vs 1, играя за Shadow Fiend. Разработчики раскрыли некоторые подробности развития бота. Предлагаем вам ознакомиться с основной информацией из развёрнутого сообщения.
Результат, которого удалось добиться на турнире, доказывает, что производительность обучающегося бота крайне высока: он в состоянии превзойти человека. В течение месяца ему удалось пройти путь от слабо играющего бота до бота, не оставляющего шансов самым успешным игрокам мировой сцены.
- 1 марта: первые результаты, бот Drow Ranger учился кайтить Earthshaker;
- 8 мая: игрок, обладающий 1,500 MMR, сражается с ботом и всё ещё его превосходит;
- Начало июня: бот побеждает оппонента с 1,500 одиночного рейтинга;
- 30 июня: победа над игроком с 3,000 MMR;
- 8 июля: бот выигрывает партию у полупрофессионального игрока с 7,500 MMR;
- 7 августа: побеждает Blitz (6,200 MMR) со счётом 3:0, побеждает Pajkatt (8,500 MMR) со счётом 2:1, побеждает CC$C (8,900 MMR) со счётом 3:0. Все пришли к выводу, что Suma1L найдёт способ взять верх;
В дальнейшем Open AI планируют усовершенствовать своего бота и даже создать полноценную команду. На сегодняшний день разработчики трудятся над тем, чтобы разработать шаблон с набором функций и действий для каждой из игровых позиций.
Нейросетка играет в Доту
Всем привет! На самом деле нейросетка играет не в привычную Dota 2, а в RussianAICup 2016 CodeWizards. RussianAICup — это ежегодное открытое соревнование по программированию искусственного интеллекта. Участвовать в этом соревновании довольно интересно. В этом году темой была игра похожая на Доту. Так как я уже какое-то время занимаюсь обучением с подкреплением, то мне хотелось попробовать применить это в RussianAICup. Главной целью было научить нейронную сеть играть в эту игру, хотя занятие призового места — это, конечно, было бы приятно. В итоге нейросеть держится в районе 700 места. Что, я считаю, неплохо, ввиду ограничений соревнования. В этой статье речь пойдет скорее об обучении с подкреплением и алгоритмах DDPG и DQN, а не о самом соревновании.
В этой статье я не буду описывать базовую информацию о нейросетях, сейчас и так очень много информации о них на просторах интернета, а раздувать публикацию не хочется. Мне же хотелось бы сосредоточится на обучении с подкреплением с использованием нейросетей, то есть о том, как обучить искусственную нейронную сеть демонстрировать нужное поведение методом проб и ошибок. Я буду упрощенно описывать 2 алгоритма, база у них одна, а области применения немного отличаются.
Марковское состояние
На входе алгоритмы принимают текущее состояние агента S. Здесь важно чтобы состояние обладало свойством марковости, то есть по возможности включало в себя всю информацию, необходимую для предсказания следующих состояний системы. Например у нас есть камень, брошенный под углом к горизонту. Если мы в качестве состояния примем координаты камня, это не позволит нам предсказать его дальнейшее поведение, но если мы добавим к координатам вектор скорости камня, то такое состояние нам позволит предсказать всю дальнейшую траекторию движения камня, то есть будет марковским. На основе состояния алгоритм выдает информацию о действии A, которое необходимо сделать чтобы обеспечить оптимальное поведение, то есть такое поведение, которое ведет к максимизации суммы наград. Награда R — это вещественное число, которое мы используем для обучения алгоритма. Награда выдается в момент, когда агент, находясь в состоянии S, совершает действие А и переходит в состояние S’. Для обучения эти алгоритмы используют информацию о том, что они делали в прошлом и какой при этом был результат. Эти элементы опыта состоят из 4х компонентов (S, A, R, S’). Такие четверки мы складываем в массив опыта и далее используем для обучения. В статьях он имеет имя replay buffer.
DQN
Или Deep Q-Networks — это тот самый алгоритм, который обучили играть в игры Atari. Этот алгоритм разработан для случаев, когда количество управляющих команд строго ограничено и в случае Atari равно количеству кнопок джойстика (18). Таким образом выход алгоритма представляет собой вектор оценок всех возможных действий Q. Индекс вектора указывает на конкретное действие, а значение указывает насколько хорошо это действие. То есть нам надо найти действие с максимальной оценкой. В этом алгоритме используется одна нейросеть, на вход которой мы подаем S, а индекс действия определяем как argmax(Q). Нейронную сеть мы обучаем с помощью уравнения Беллмана, которое и обеспечивает сходимость выхода нейросети к значениям, которые реализуют поведение максимизирующее сумму будущих наград. Для данного случая оно имеет вид:
Если это расшифровать получается следующее:
- Берем пачку (minibatch) из N элементов опыта (S, A, R, S’), например 128 элементов
- Для каждого элемента считаем
y = R + γ * maxпо всем A’ (Qpast(S’, A’))
Qpast — это копия нашей же нейросети, но какое-то количество итераций обучения назад, например 100 или 1000. Веса этой нейросети мы просто периодически обновляем, не обучаем.
Qpast = (1 — α) * Qpast + α * Q
α — скорость обновления Qpast, типичное значение 0.01
Этот трюк обеспечивает лучшую сходимость алгоритма
- Далее считаем функцию потерь для нашего минибатча
L = Σпо элементам минибатча (y — Q(S, A))2 / N
Используем среднюю квадратичную ошибку
- Применяем любимый алгоритм оптимизации, используя L
- Повторяем пока нейросеть достаточно не обучится
Если внимательно посмотреть на уравнение Беллмана, то можно заметить, что оно рекурсивно оценивает текущее действие взвешенной суммой наград от всех последующих действий, возможных после выполнения текущего действия.
DDPG
Или Deep Deterministic Policy Gradient — это алгоритм, созданный, для случая когда управляющие команды представляют собой значения из непрерывных пространств (continuous action spaces). Например, когда вы управляете автомобилем, вы поворачиваете руль на определенный угол или нажимаете педаль газа до определенной глубины. Возможных значений поворота руля и положений педали газа теоретически бесконечно много, поэтому мы хотим чтобы алгоритм выдавал нам эти самые конкретные значения, которые нам необходимо применить в текущей ситуации. Поэтому в данном подходе используются две нейросети: μ (S) — актор, который возвращает нам вектор A, компоненты которого являются значениями соответствующих управляющих сигналов. Например это может быть вектор из трех элементов (угол поворота руля, положение педали газа, положение педали тормоза) для автопилота машины. Вторая нейросеть Q(S, A) — критик, которая возвращает q — оценку действия A в состоянии S. Критик используется для обучения актора и обучается с помощью уравнения Беллмана:
Критик обучается через градиент от оценки критика ∇Q(S, μ (S)) по весам актора
Если это расшифровать получается:
- Берем минибатч из N элементов опыта (S, A, R, S’)
- y = R + γ * Qpast (S’, μpast (S’))
Qpast, μpast — это тот же трюк что и в случае DQN, только теперь это копии двух сетей
- Обучаем критика используя L
- Берем градиент по весам актора ∇Q(S, μ (S)) любимым алгоритмом оптимизации и модифицируем актора, с помощью него
- Повторяем пока не достигнем желаемого
RussianAICup
Теперь я расскажу об агенте, которого я тренировал для соревнования. Подробные правила можете почитать по ссылке, если интересно. Также можете посмотреть видео и описание на главной странице. В соревновании есть 2 типа игр, первый — это когда твоя стратегия управляет одним из десяти волшебников. И второй, когда твоя стратегия управляет командой из 5 волшебников, противник при этом управляет противоположной командой из 5ти волшебников. Информация, которая доступна для стратегии включает все объекты, которые находятся в области видимости всех дружественных волшебников, все остальное пространство покрыто туманом войны:
- волшебники
- миньоны
- строения (башни и базы)
- деревья
- бонусы
- снаряды
Юнит может иметь следующую информацию о себе:
- координаты
- количество хитпоинтов
- количество маны
- время до следующего удара
- другие параметры, их много, в правилах есть полное описание
Есть локальный симулятор (он на КПДВ), в котором можно погонять свою стратегию против самой себя или 2х встроенных противников, достаточно простых стратегий. Для начала я решил попробовать решить задачу в лоб. Я использовал DDPG. Собрал все доступные параметры о мире, их получилось 1184 и подал на вход. Выходом у меня был вектор из 13 чисел, отвечающих за скорость перемещения прямо и вбок, поворот, разные типы атаки, а также параметры атаки, такие как дальность полета снаряда, в общем все параметры, которые существуют. С наградой для начала тоже решил не мудрить, игра выдает количество XP, поэтому я давал положительную награду за повышение XP и отрицательную за уменьшение хитпоинтов. Поэкспериментировав какое-то время я понял, что в таком виде очень трудно добиться от нейросети толка, так как зависимости, которые должна была выявить моя модель, по моим прикидкам, были довольно сложными. Поэтому я решил, что надо упростить задачу для нейросети.
Для начала я перестроил состояние, чтобы оно представляло не просто сборник всей входящей информации, а подавалось в виде кругового обзора от управляемого волшебника. Весь круговой обзор делился на 64 сегмента, в каждый сегмент могло попасть 4 ближайших объекта в этом сегменте. Таких круговых обзоров было 3, для дружественных, нейтральных и вражеских юнитов, а также для указания куда следовало двигаться. В итоге получилось еще больше параметров — 3144. Также я начал давать награду за движение в нужном направлении, то есть по дорожке к вражеской базе. Так как круговой обзор включает информацию о взаимном расположении объектов, я еще пробовал использовать сверточную сеть. Но ничего не получалось. Волшебники просто крутились на одном месте без малейшего проблеска интеллекта. И я оставил на какое-то время попытки, чтобы почитать информацию о тренировке нейросетей и вдохновиться.
Через какое-то время я вернулся к экспериментам уже вдохновившись, уменьшил скорость обучения с 1e-3 до 1e-5, очень сильно сократил количество входных параметров до 714, попутно отказавшись от некоторых данных, чтобы ускорить процесс обработки информации. Также я решил использовать нейросеть только для движения и поворота, а стрельбу оставил за вручную прописанной простой стратегией: если можем стрелять поворачиваемся в сторону слабейшего врага и стреляем. Таким образом я снял с нейросети достаточно сложную для обучения, но легкую для прописывания задачу по прицеливанию и выстрелу. И оставил достаточно сложно формализуемую задачу наступления и отступления. В итоге стали заметны проблески интеллекта на обычной полносвязной сети. Потренировав ее какое-то время (пару суток на GeForce GTX 1080 на эксперимент), добившись неплохого качества управления (сеть обыгрывала встроенного противника), я решил загрузить сеть в песочницу.
Веса сети я выгрузил из Tensorflow и захардкодил их в виде h файлов. В итоге получился архив в несколько десятков мегабайт и песочница отказалась его принять, сказав что максимальный файл для загрузки 1 Мб. Пришлось намного сильнее сократить нейросеть и потратить кучу времени (порядка недели или нескольких недель, я уже точно не помню) на ее обучение, подбор гиперпараметров и уложиться в размер архива 1 Мб. И вот когда я наконец снова попробовал загрузить, оно выдало, что ограничение на разархивированный архив 2 Мб, а у меня было 4Мб. Фейспалм. Поборов бурные чувства, я принялся еще больше ужимать нейросетку. В итоге ужал до следующей архитектуры:
394 x 192 x 128 x 128 x 128 x 128 x 6
394 — это входной слой, во всех слоях кроме последнего и предпоследнего используется relu, в предпоследнем tanh в качестве активационной функции, в последнем, как водится, активационной функции нет. В таком виде контроль был не таким хорошим, но проблеск интеллекта заметен был и я решил загрузить этот вариант в аккурат за несколько часов до начала финала. С небольшими улучшениями он до сих пор и играет russianaicup.ru/profile/Parilo2 в песочнице в районе 700 места в рейтинге. В целом я доволен результатом на данный момент. Ниже видео с примером матча 1х1, моя стратегия управляет всей командой из 5ти волшебников.
Предложения по улучшению конкурса
В конкурсе довольно интересно участвовать. Есть плюшки в виде локального симулятора. Я бы хотел предложить несколько изменить формат. То есть запускать на сервере только серверную часть и рейтинговую таблицу, а клиенты чтобы коннектились через интернет к серверу и участвовали в поединках. Таким образом можно снять нагрузку с сервера, а также убрать ограничения по ресурсам для стратегий. В общем, так как это сделано во многих онлайн играх типа Старкрафт 2 или той же Доты.
Код
Код агента доступен на гитхабе. Используется С++ и для управления и для обучения. Обучение реализовано в виде отдельной программы WizardTrainer, которая зависит от TensorFlow, стратегия подключается по сети к тренеру, скидывает туда состояние среды и получает оттуда действия которые необходимо совершать. Также она туда отправляет весь получаемый опыт. Таким образом к одной нейросетке можно подключать несколько агентов и она будет управлять всеми одновременно. Собрать это все не так просто, если потребуется спросите меня как.
Ресурсы
Более подробно об обучении с подкреплением, этих, а также других алгоритмах можно посмотреть в замечательном курсе David Silver из Google DeepMind. Слайды доступны здесь.
Оригинальные статьи DDPG и DQN. Формулы я брал из них.
Спасибо, что дочитали до конца. Удачи вам на пути познания!
P.S. Прошу извинить за размер формул, не хотел, чтобы они были маленькие, перестарался с принтскрином.
О предиктах
В среднем предикт выдаётся на ~10 минуте игры. Сервис работает в автоматическом режиме 24/7 и публикуют в телеграм канале почти все матчи в лайве с предполагамым исходом.
На примере выше мы можем увидеть матч между OG и Tundra Esports на 2 карте. Сервис опубликовал пост в тг на 11 минуте игры в лайве, предполагаемый победитель по мнению модели на момент публикации — OG c вероятным шансом 82%. Встреча закончилась победой dire.
Кратко о проекте
HackProDota — некоммерческий проект для анализа профессиональных игр Dota 2 в рамках Tier 1 и Tier 2 турниров. Сервис запущен 8 мая 2021 г. и уже проанализировал 1799 игр с точностью (проходимостью) в 74.06% на момент написания статьи.
О параметрах
Для анализа в реальном времени собираются десятки различных параметров, которые мы можем получить из официальных API от Steam.Помимо общих параметров (пики, команды, нетворсы, килы и т.д.) собираются и анализируется чуть больше 10 переменных для каждого героя в игре.
Нейросеть сгенерировала изображение
08 Aug 2022 в 11:27
Запрос был следующим : что самое главное в Дота 2? Как думаете, что это означает? Спокойствие? Интеллект( сверхразумность ) ? Герой доты какой-то?
Это же Крип_иня-матриарх Сил света
корона в виде вышек бараков трона, так видется (самое главное в дота2?)
Неужели не узнал?
У дровки что-то похожее тоже есть
- 25 Mar 2023 в 14:07
- Oro
25 Mar 2023 в 14:03 25 Mar 2023 в 14:03 - 25 Mar 2023 в 14:03
- Nelif
25 Mar 2023 в 13:55 25 Mar 2023 в 13:55 - 25 Mar 2023 в 13:46
Где получаем данные
Используются официальные API от самих Valve.Подробнее можно узнать на их официальном ресурсе https://wiki.teamfortress.com/wiki/WebAPI#Dota_2
О модели
Модель создана на основе нейросетей при помощи фреймворка TensorFlow на языке Python 3, используется библиотека Keras. После многочисленных тестов были выбраны именно нейросети, так как по сравнению с другими вариантами, они показали наибольшую эффективность.
Главная модель объединяет в себя несколько других моделей, например, модель для анализа купленных предметов каждого игрока radiant и dire, модель для анализа показателей по GPM/XPM каждого игрока radiant и dire и так далее. Это сделано для облегчения в тестировании, проверки и дальнейшей доработки/переобучения в случае необходимости.
Заключение
Считаю, что проект вышел довольно успешным и показывает хорошие результаты, получилась 74%+ точность при большой выборки из 1800+ предиктов.
График распределения вероятностей (шансов) на тестовом наборе игр.
Снизу отображаются шансы, 0 — вероятная победа dire, 1 — победа radiant. Показатель в ~0.5 показывает, что по мнению модели шансы обеих команд равны.