Вы хотели бы оттачивать мастерство, пробовать новые стратегии в настольной версии Warhammer, играя против ИИ? Программист и фанат Warhammer начинает обучать ИИ для девятого издания этой игры.  Пока у нас стартует курс по Machine Learning и Deep Learning, приглашаем посмотреть на общий план проекта и рассуждения разработчика. Самым известным методом обучения для задач управления, таких как ИИ в видеоиграх, является Reinforcement Learning. Reinforcement Learning (далее — RL) — это метод глубокого обучения, в котором несколько агентов выполняют задачи в конкурентной среде. Со временем эти агенты вознаграждаются, то есть принуждаются к нужному поведению. При достаточной вычислительной мощности и хорошо структурированной схеме вознаграждения могут возникать невероятные модели поведения. Игровые агенты ИИ работают в столь динамичных средах, что практически невозможно генерировать и маркировать огромные объёмы данных, не говоря уже об их осмыслении. Динамические данные влияют на краткосрочное и долгосрочное планирование, а обучение с подкреплением предоставляет инструменты решения задачи. В RL применимы те же общие принципы, что и для всей науки о данных: Большое количество хороших данных даст лучшие результаты. Качество симуляции имеет решающее значение. Любой ценой избегайте перекосов в данных. Подавайте важный сигнал напрямую. Новые подходы решают задачу, но основа — хорошие данные. Я мало что знаю об относительных преимуществах чего-либо, когда речь идёт о нейронных сетях, методах обучения и прочем. Но мне это не нужно! Для таких людей, как я, есть OpenAI Gym. Gym — это RL-фреймворк, набор общих API, к которым подключаются самые популярные модели глубокого обучения. Его цель — создать стандартные виртуальные среды для RL. Образец среды OpenAI Gym - CartPole. Gym OpenAI довольно прост. По своей сути это структура для лёгкого создания или использования стандартных сред, чтобы измерять, насколько хорошо различные ML-модели справляются с одной и той же задачей. Верхний уровень нашей программы будет наследоваться от базового класса Environment. Всё состояние игры должно быть сохранено, обновлено действиями и снова передано агенту. В мире OpenAI Gym это называется наблюдение; наблюдения передаются в модели, чтобы понять, что произошло только что. То есть мне нужно смоделировать всю игру — размер доски, расположение местности, размер баз моделей, повреждения, является ли модель транспортным средством, может ли она взорваться и так далее. Чтобы данные были понятны агенту Gym, они должны быть структурированы с использованием пространств. Пространства — это стандартные для фреймворка типы. Вот основные: Дискретные значения (перечисления или целые числа). Ящики (N-мерное пространство, непрерывное или дискретное). Булевы. Осмысленные фрагменты из типов выше, такие как словари и кортежи. Состояние игры, как его хотелось бы хранить, — иерархическая объектно-ориентированная схема, где каждый отдельный элемент содержится в объекте. Мой текущий план — разработать свой движок Warhammer 40k (он разрабатывается, обзор будет представлен в следующих статьях) и просто поддерживать слой трансляции любых различий в моей динамической схеме с фиксированной схемой OpenAI Gym. Самая важная функция Gym — step(), шаг. Агент вызывает step(), сообщая программе, что она должна выполнить свое действие, смоделировать результаты и обновить наблюдение. step() — это один шаг во времени, период между действиями. Именно здесь разыгрывается Warhammer 40k с учётом заданных действий агента. Чтобы правильно спроектировать step(), я должен знать, что такое действие! В реальной жизни Warhammer действия могут варьироваться от выбора цели для стрельбы до прерывания боя с помощью стратагемы. Мы, люди, хорошо справляемся с двусмысленностью, поэтому разумно предполагаем момент действия и осмысления. У ИИ всё гораздо сложнее! Выходной слой всех нейронных сетей фиксирован. Его размерность всегда одинакова, что затрудняет соотнесение вывода сети с динамическими действиями Warhammer 40k. В игре много взаимодействий «туда-сюда». Стратагемы выделяются как болезненный пример — некоторые из них могут использоваться до или после бросков кубиков или даже чтобы прервать порядок разрешения боя. Даже в обычном порядке хода есть несколько решений, которые ходят туда-сюда, —  запрет на психическую силу, или решение, на какую модель в отряде назначить атаки. Результат броска кубика часто влияет на решение игрока, которое также может случиться в любой момент. Посмотрите на последовательность: Наступает очередь синего игрока, он выбирает движение двух отрядов вперёд и стреляет из дальнобойного оружия в первого оранжевого врага. Третий отряд направляется по решению на другую модель противника. Оранжевый игрок стреляет по 3-му синему отряду. Посмотрим на возможную структуру действий в ситуации. В предложенном мной варианте маленькое действие или действие — это ровно одно действие, определённое в правилах игры. Это будет самый буквальный перевод правил в код. В любое время, когда игрок может действовать по правилам или реагировать на ситуацию, агент ИИ имеет те же права. Всё, от приказа на ход до объявления цели стрельбы и определения порядка боёв, — будет отдельными действиями ИИ. Это даёт агенту максимум информации для принятия оптимальных решений в любой момент. Т — единственный способ, благодаря которому ИИ может играть в 40k без ограничений. Самый большой минус этого, по моему непрофессиональному мнению: для ИИ это будет невероятно сложно смоделировать. Почти все проекты OpenAI Gym, как правило, имеют только один тип действий, которые могут посылать вовне — они балансируют лучом на платформе (идти влево, вправо, остановиться) или играют в Pacman (двигаться вверх, вправо, вниз, влево или остановиться). С маленькими действиями модель должна понимать, в какой фазе находится и в каком контексте находится (нацеливание, передача, движение, распределение ран и т. д.), чтобы начать принимать хорошие решения.  По сути, ему придётся изучать правила игры и одновременно учиться лучшей стратегии, у него вполне может быть огромный набор действий, которые он может выплюнуть, когда они не актуальны. Обычные алгоритмы обучения могут не справиться с этим. Нам, людям, и так нелегко выучить правила. Сформировать хорошую схему выходного слоя непросто — мы либо будем повторно использовать одно и то же поле вывода для разных действий, либо создадим массивную поверхность вывода, которая будет обрабатывать все возможные действия одновременно. Это может привести к невероятно долгому и тяжёлому обучению, поскольку процесс экспериментирует с большими областями несвязанного вывода. Большое действие — это полный ход Warhammer, все коллективные приказы на движение, стрельбу и нападение за ход игрока в одном гигантском выводе. В ситуации выше все приказы синих (Move, Shoot и Charge) выходят одновременно в начале хода синего игрока. Самое большое преимущество — каждый step() идентичен: нужно получить набор действий, затем разыграть весь ход. Это делает обучение агента немного проще: нет различных «режимов», или типов действий, есть только содержимое одного Action каждого step(). Разработка упрощается — можно просто взять массивный вывод действия и одним махом разыграть ход. Самый большой недостаток подхода — потеря информации агентом: он вынужден принимать все свои решения до того, как любое из них повлияет на игру, в отличие от реальных игроков. Хотя мы, люди, обычно начинаем каждый ход с планом, результаты неудачного выстрела или броска заряда меняют план. Это может произойти очень неожиданно, и я не хочу мешать ИИ делать это, если возможно. При Больших действиях ИИ не может воспользоваться динамичным аспектом Warhammer, который мы все любим. Подход также не позволит играть полноценно: действия вне порядка — это часть правил. Это третья концепция, в которой ИИ попеременно активирует модели, играя в Warhammer скорее в режиме Kill-Team, чем в полноценную военную настольную игру. ИИ можно будет выбрать модель и короткий список действий, таких как стоять и стрелять, двигаться и стрелять, заряжать, двигаться нормально и т. д. Здесь ИИ имеет гораздо больше информации при активации модели и далее сможет играть с почти идеальной информацией. Главный недостаток пошаговой модели — в 40k играют не так, совпадение не идеально. Вы облегчите положение, кешируя приказы для юнита так, чтобы движок ждал разрешения стрельбы до фазы стрельбы, зарядов — до фазы заряда и так далее. Но реакции ИИ на действия игрока по-прежнему будут ограничены только стандартными приказами. При неосторожности у агента будет потенциал нарушить правила ходов. Нельзя сказать ему, что действие, которое он может вывести, некорректно. Можно сказать, что они не должны делать этот выход, но это не помешает им иногда делать его. Единственный реальный способ заставить агента играть по правилам — ограничить пространство действий исключительно правильными ходами: Воспользуемся диаграммой выше. Все синие подразделения движутся вперёд. Мы даём агенту ИИ выходы позиции X и Y с плавающей точкой для обозначения цели перемещения. Если позволить почти полный контроль над позициями движения для отряда гвардейцев, можно придумать почти бесконечное число ходов вне правил: пересекающиеся базы, перемещение на непроходимую местность, нарушение слаженности подразделения, перемещение за пределы допустимого расстояния или перемещение в пределах зоны поражения. Санация вывода агента — одно из решений. Если действие запрещено, используйте эвристический постпроцессор, чтобы следующее решение было допустимым. Есть и недостаток: качество агента ограничивается постпроцессором. Если мы хотим иметь умного агента с тонким позиционированием, то на этих "тренировочных колёсах" не получим его. Другое решение — дать агенту свободу действий в размещении моделей в недопустимых позициях, но отрицательно вознаграждать его за это, лишив агента стимула делать шаги не по правилам и дав стимул делать правильные ходы. Со временем в теории агент выучит правила 40k и, как правило, не будет делать некорректных ходов. Но большой риск — перехвалить за корректность хода и недохвалить за то, что мы пытаемся натренировать — алгоритм управления в 40k! Модель будет думать, что у неё всё отлично, перемещая модели вперёд и назад по прямой. Нам удастся обучить ИИ, который знает правила, но не стратегию 40k. Другая простая стратегия — либо не делать ничего, когда указан неправильный ход, либо удалить из игры нарушающую модель. Это эффективная функция наказания, а рассчитывать вознаграждение будет не нужно. Основной риск — в том, чтобы снова открыть пространство ошибочных действий, что создаст всевозможные проблемы. Последний вариант — ограничить пространство действий только верными ходами. Это замечательно, но сложность создания каждого хода мне неинтересна. Это важнейшая часть стратегии Warhammer 40k. Оно сильно отличается от обычных ходов игры. Научить модель понимать разницу между действиями развёртывания и действиями в игре — это кажется довольно сложным, поэтому в первой сборке развёртывание пропущено. Я планирую использовать базовый алгоритм размещения, а по мере сборки проекта в единое целое мы сможем подумать о развёртывании агентом. Хорошим тоном считается начинать с небольшого вознаграждения и увеличивать его со временем по мере развития модели. Так модель не поощряет себя за поведение в начале обучения, когда вероятность его правильности меньше, и начинает поощрять себя больше по мере обучения, чтобы отточить действительно хорошее поведение. Что касается наших интересов, вознаграждать модель после каждого шага очень сложно — в любом случае, я уже упоминал, что рукописному алгоритму невозможно узнать, было ли действие модели хорошим или плохим! Иначе мы не воспользовались бы Deep Learning! Можно попытаться задействовать эти критерии: Привело ли это действие к тому, что модели противника были убраны со стола? Привело ли это действие к тому, что моя команда набрала очки? Но оба метода могут давать ложные срабатывания: нас волнует, выиграет ли ИИ. Поэтому награждать его нужно только исходя из побед и поражений. Всё остальное субъективно и ситуативно. Из-за этого в конце шага ИИ не получает вознаграждения (не изменяет веса, нейтрален), пока не будет определено, выиграна ли игра (в конце эпизода). Будем надеяться, что проект не застрянет на разработке движка и Бен Уильямс порадует нас демонстрациями действий ИИ, а пока вы можете присмотреться к курсам из каталога или просто наслаждаться этой субботой. Курс «Machine Learning и Deep Learning» (6 месяцев) Профессия Data Scientist (24 месяца) Data Science и Machine Learning Профессия Data Scientist Профессия Data Analyst Курс «Математика для Data Science» Курс «Математика и Machine Learning для Data Science» Курс по Data Engineering Курс «Machine Learning и Deep Learning» Курс по Machine Learning Python, веб-разработка Профессия Fullstack-разработчик на Python Курс «Python для веб-разработки» Профессия Frontend-разработчик Профессия Веб-разработчик Мобильная разработка Профессия iOS-разработчик Профессия Android-разработчик Java и C# Профессия Java-разработчик Профессия QA-инженер на JAVA Профессия C#-разработчик Профессия Разработчик игр на Unity От основ — в глубину Курс «Алгоритмы и структуры данных» Профессия C++ разработчик Профессия Этичный хакер А также: Курс по DevOps