Вы хотели бы оттачивать мастерство, пробовать новые стратегии в настольной версии Warhammer, играя против ИИ? Программист и фанат Warhammer начинает обучать ИИ для девятого издания этой игры.

Пока у нас стартует курс по Machine Learning и Deep Learning, приглашаем посмотреть на общий план проекта и рассуждения разработчика.


Reinforcement 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 с учётом заданных действий агента.

Функция OpenAI Gym step()
Функция OpenAI Gym step()

Чтобы правильно спроектировать step(), я должен знать, что такое действие! В реальной жизни Warhammer действия могут варьироваться от выбора цели для стрельбы до прерывания боя с помощью стратагемы. Мы, люди, хорошо справляемся с двусмысленностью, поэтому разумно предполагаем момент действия и осмысления. У ИИ всё гораздо сложнее!

Выходной слой всех нейронных сетей фиксирован. Его размерность всегда одинакова, что затрудняет соотнесение вывода сети с динамическими действиями Warhammer 40k. В игре много взаимодействий «туда-сюда». Стратагемы выделяются как болезненный пример — некоторые из них могут использоваться до или после бросков кубиков или даже чтобы прервать порядок разрешения боя.

Даже в обычном порядке хода есть несколько решений, которые ходят туда-сюда, —  запрет на психическую силу, или решение, на какую модель в отряде назначить атаки. Результат броска кубика часто влияет на решение игрока, которое также может случиться в любой момент. Посмотрите на последовательность:

Примерная последовательность действий ИИ
Примерная последовательность действий ИИ

Наступает очередь синего игрока, он выбирает движение двух отрядов вперёд и стреляет из дальнобойного оружия в первого оранжевого врага. Третий отряд направляется по решению на другую модель противника. Оранжевый игрок стреляет по 3-му синему отряду. Посмотрим на возможную структуру действий в ситуации.

1. Малые действия (истинные действия)

В предложенном мной варианте маленькое действие или действие — это ровно одно действие, определённое в правилах игры. Это будет самый буквальный перевод правил в код. В любое время, когда игрок может действовать по правилам или реагировать на ситуацию, агент ИИ имеет те же права. Всё, от приказа на ход до объявления цели стрельбы и определения порядка боёв, — будет отдельными действиями ИИ. Это даёт агенту максимум информации для принятия оптимальных решений в любой момент. Т — единственный способ, благодаря которому ИИ может играть в 40k без ограничений.

Пример последовательности действий — каждый игрок чередует действия и реакции.
Пример последовательности действий — каждый игрок чередует действия и реакции.

Самый большой минус этого, по моему непрофессиональному мнению: для ИИ это будет невероятно сложно смоделировать. Почти все проекты OpenAI Gym, как правило, имеют только один тип действий, которые могут посылать вовне — они балансируют лучом на платформе (идти влево, вправо, остановиться) или играют в Pacman (двигаться вверх, вправо, вниз, влево или остановиться). С маленькими действиями модель должна понимать, в какой фазе находится и в каком контексте находится (нацеливание, передача, движение, распределение ран и т. д.), чтобы начать принимать хорошие решения. 

По сути, ему придётся изучать правила игры и одновременно учиться лучшей стратегии, у него вполне может быть огромный набор действий, которые он может выплюнуть, когда они не актуальны. Обычные алгоритмы обучения могут не справиться с этим. Нам, людям, и так нелегко выучить правила.

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

2. Большие действия

Большое действие — это полный ход Warhammer, все коллективные приказы на движение, стрельбу и нападение за ход игрока в одном гигантском выводе. В ситуации выше все приказы синих (Move, Shoot и Charge) выходят одновременно в начале хода синего игрока.

Образец Большое действие — все синие приказы подаются одновременно
Образец Большое действие — все синие приказы подаются одновременно

Самое большое преимущество — каждый step() идентичен: нужно получить набор действий, затем разыграть весь ход. Это делает обучение агента немного проще: нет различных «режимов», или типов действий, есть только содержимое одного Action каждого step(). Разработка упрощается — можно просто взять массивный вывод действия и одним махом разыграть ход.

Самый большой недостаток подхода — потеря информации агентом: он вынужден принимать все свои решения до того, как любое из них повлияет на игру, в отличие от реальных игроков. Хотя мы, люди, обычно начинаем каждый ход с планом, результаты неудачного выстрела или броска заряда меняют план. Это может произойти очень неожиданно, и я не хочу мешать ИИ делать это, если возможно. При Больших действиях ИИ не может воспользоваться динамичным аспектом Warhammer, который мы все любим. Подход также не позволит играть полноценно: действия вне порядка — это часть правил.

3. Действия для каждой модели или каждого подразделения

Это третья концепция, в которой ИИ попеременно активирует модели, играя в Warhammer скорее в режиме Kill-Team, чем в полноценную военную настольную игру. ИИ можно будет выбрать модель и короткий список действий, таких как стоять и стрелять, двигаться и стрелять, заряжать, двигаться нормально и т. д. Здесь ИИ имеет гораздо больше информации при активации модели и далее сможет играть с почти идеальной информацией.

Главный недостаток пошаговой модели — в 40k играют не так, совпадение не идеально. Вы облегчите положение, кешируя приказы для юнита так, чтобы движок ждал разрешения стрельбы до фазы стрельбы, зарядов — до фазы заряда и так далее. Но реакции ИИ на действия игрока по-прежнему будут ограничены только стандартными приказами.

Формирование правил вместе с нейросетью

При неосторожности у агента будет потенциал нарушить правила ходов. Нельзя сказать ему, что действие, которое он может вывести, некорректно. Можно сказать, что они не должны делать этот выход, но это не помешает им иногда делать его. Единственный реальный способ заставить агента играть по правилам — ограничить пространство действий исключительно правильными ходами:

Воспользуемся диаграммой выше. Все синие подразделения движутся вперёд. Мы даём агенту ИИ выходы позиции X и Y с плавающей точкой для обозначения цели перемещения. Если позволить почти полный контроль над позициями движения для отряда гвардейцев, можно придумать почти бесконечное число ходов вне правил: пересекающиеся базы, перемещение на непроходимую местность, нарушение слаженности подразделения, перемещение за пределы допустимого расстояния или перемещение в пределах зоны поражения.

Санация вывода агента — одно из решений. Если действие запрещено, используйте эвристический постпроцессор, чтобы следующее решение было допустимым. Есть и недостаток: качество агента ограничивается постпроцессором. Если мы хотим иметь умного агента с тонким позиционированием, то на этих "тренировочных колёсах" не получим его.

Другое решение — дать агенту свободу действий в размещении моделей в недопустимых позициях, но отрицательно вознаграждать его за это, лишив агента стимула делать шаги не по правилам и дав стимул делать правильные ходы. Со временем в теории агент выучит правила 40k и, как правило, не будет делать некорректных ходов. Но большой риск — перехвалить за корректность хода и недохвалить за то, что мы пытаемся натренировать — алгоритм управления в 40k!

Модель будет думать, что у неё всё отлично, перемещая модели вперёд и назад по прямой. Нам удастся обучить ИИ, который знает правила, но не стратегию 40k.

Другая простая стратегия — либо не делать ничего, когда указан неправильный ход, либо удалить из игры нарушающую модель. Это эффективная функция наказания, а рассчитывать вознаграждение будет не нужно. Основной риск — в том, чтобы снова открыть пространство ошибочных действий, что создаст всевозможные проблемы. Последний вариант — ограничить пространство действий только верными ходами. Это замечательно, но сложность создания каждого хода мне неинтересна.

Развёртывание

Это важнейшая часть стратегии Warhammer 40k. Оно сильно отличается от обычных ходов игры. Научить модель понимать разницу между действиями развёртывания и действиями в игре — это кажется довольно сложным, поэтому в первой сборке развёртывание пропущено. Я планирую использовать базовый алгоритм размещения, а по мере сборки проекта в единое целое мы сможем подумать о развёртывании агентом.

Вознаграждение

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

Что касается наших интересов, вознаграждать модель после каждого шага очень сложно — в любом случае, я уже упоминал, что рукописному алгоритму невозможно узнать, было ли действие модели хорошим или плохим! Иначе мы не воспользовались бы Deep Learning! Можно попытаться задействовать эти критерии:

  • Привело ли это действие к тому, что модели противника были убраны со стола?

  • Привело ли это действие к тому, что моя команда набрала очки?

Но оба метода могут давать ложные срабатывания: нас волнует, выиграет ли ИИ. Поэтому награждать его нужно только исходя из побед и поражений. Всё остальное субъективно и ситуативно. Из-за этого в конце шага ИИ не получает вознаграждения (не изменяет веса, нейтрален), пока не будет определено, выиграна ли игра (в конце эпизода).

Будем надеяться, что проект не застрянет на разработке движка и Бен Уильямс порадует нас демонстрациями действий ИИ, а пока вы можете присмотреться к курсам из каталога или просто наслаждаться этой субботой.

Другие профессии и курсы

Комментарии (11)


  1. Darlock_Ahe
    18.09.2021 21:19
    +7

    AI — Abominable Intelligence, самая страшная тех-ересь которая возможна в WH40k.


    1. Bedismo
      19.09.2021 11:48
      +4

      Инквизиция уже в пути)


    1. Anthrax_Beta
      19.09.2021 16:18

      Омниссия не одобряет


  1. Mox
    18.09.2021 22:13

    Ох, дико интересно. Но самое сложное пока не раскрыто, да и я вообщем не датасаентист, но дико интересно

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

    • Как оцифровать текущее состояние? То есть это похоже что свертка, но как именно цифровать, нужна ли нормализация ввода

    • Конфигурация нейросети. Как определить сколько слоев, нужны ли LSTM слои или достаточно только текущего состояния

      А для развертывания и игры кажется что лучше тренировать 2 нейросети.


  1. GrandTourism
    19.09.2021 00:27
    +3

    Ох, слава Богу Императору, наконец-то про Warhammer40K)))))))


  1. DrSavinkov
    19.09.2021 08:22

    А потом эту нейросеть возьмут на вооружение настоящие военные..


    1. fedorro
      19.09.2021 12:50

      Моделирование они и так всегда использовали, а такие сети сам Император использовать велел ????


      1. SerjV
        19.09.2021 16:21

        Бог-Император конечно велел прогрессировать и всё такое, но вот использовать нечестивые технологии Изуверского Интеллекта (ИИ) и прочие техноереси - не велел.

        Весьма символично, что ИИ применён в статье именно для Вахи, да. Оценил. Хочется продолжения...

        Но для пущей атмосферности еще и бы и терминологию надо адаптировать - только угодные Омниссии духи машин, авгуры, ауспексы и когитаторы! Ибо техноересь может привести к очищению сознания и корректирующий реинграммации с предварительной конфискацией имущества!

        p.s. Трогая тему WH40K приходится учитывать, что есть аудитория, для кого это не просто "какая-то настолка", и сказанное выше - не просто набор непонятных слов. Это ж еще хорошо, что аудитория тут понимающая, на другом ресурсе и сжечь бы могли (причём иногда создаётся ощущение, что не только в переносном смысле :), так что подколы про техноересь были ожидаемы еще после прочтения заголовка)


  1. KislyFan
    19.09.2021 21:49

    Кажется кто-то нашел чертежи темной эры технологий)


  1. Kilorad
    03.10.2021 14:08

    Санация действий выглядит вполне годным вариантом. Опыта создания RL для игр у меня мало, но есть опыт эволюционного обучения стратегиям, и там санация работала хорошо.

    Ну то есть берём необученную нейросеть, какие-то её выходы интерпретируем как действия. Так как есть много контекстов, то большинство действий в большинстве контекстов неприменимы, подменяем их на нулевое действие. Прогоняем игру, записываем счёт. Считаем, что есть единая функция, где на входе параметры сети, а на выходе счёт в игре. У этой функции ищем максимум - например, эволюцией, градиентным спуском или каким-нибудь другим статическим оптимизатором (на практике обычно сочетаются эти два алгоритма). Через несколько дней получается относительно работоспосбная стратегия.

    Насчёт именно RL - обычно он требует бигдаты. Например, Dreamer, который очень серьёзный RL, начинает в игре Pong делать что-то лучшее, чем рандом, на 150 примерно игре. Каждая игра - это ситуация, когда набрано 21 очко, это порядка 1000 кадров.

    С другой стороны, у меня есть RL для мелкой стратегической игрушки... Там RL занимался только верхнеуровневыми вопросами: куда вкладывать деньги, каких юнитов нанимать, куда их ставить. И работал он на knn. Вот этот RL отработал довольно неплохо, и учился довольно быстро

    Потом, вопрос формализации входа. Если у вас настолка, то RL должен будет действовать в сцепке с computer vision, а это довольно непросто. Проще было бы, если бы был эмулятор вахи на компе, и в RL приходили бы сразу какие-нибудь высокоинформативные сводки, написанные вручную. Например "число танков у противника", "плотность войск в квадрате таком-то", "число нашего оружия против тяжёлой пехоты", "число оружия против тяжёлой пехоты, пригодного к быстрой переброске"


  1. HiveTyrant89
    25.10.2021 12:23

    А как же миссии? Стратагемы? Синергия аур? Где вот это вот все? Овервотч убирается, он теперь переехал в стратагемы. Как результат - переосмыслить все заново и переписать концепцию.

    Очевидно, что здесь надо будет полностью воссоздавать среду - стол для Warhammer, в том числе террейн, и все правила для игры. А это и так огромная задача с точки зрения программирования, учитывая, что куча разных неоцифруемых правил. Так что для них, кмк, придется что-то придумывать свое, даже возможно отдельный ИИ, который через NLP будет эти правила пережевывать.