AI based on Unity ML Agents. Quick start

Автор: | 22.10.2019

Введение
Инсталляция плагина ML Agents
Создание среды для обучения NPC-агента
Запуск процесса обучения
Вывод результатов обучения через  Tensorboard
Полезные ссылки

Введение

ML Agents — это плагин, который обеспечивает обучение NPC-агентов в Unity. NPC (от англ. Non-Player Character) — персонаж в играх, который не находится под контролем игрока.

Любую задачу можно решить алгоритмически (см., например, Unity3D симулятор «Умная змейка со стереозрением») или — через обучение нейронной сети. На сегодняшний день в игровых движках предпочитают второй способ.

Нельзя полностью отвергать и алгоритмический подход.  Для того, чтобы определить, какую информацию дать для обучения NPC-агента,  нужно подумать, а какие входные  данные были бы необходимы  для алгоритмического решения задачи. К тому же, если аналитическое решение найдено, то оно может оказаться и более эффективным, чем обучение НС. Например, при разработке игры в бильярд можно создать супер NPC-игрока, если достаточно точно описать динамику шаров. Хотя, при этом, проблему выбора шаров перед ударом по ним кием, возможно, лучше решать через обучение нейронной сети.

В чем суть обучения? NPC-агент может выполнять определенные действия в рамках созданной среды для обучения. Он характеризуется текущими параметрами состояния, от которых происходят те или иные события, получает награды за правильные действия. Вся информация отправляется в  мозг (модель НС), который на основе нее обучается и управляет действиями агента. По мере того, как мозг учится, он оптимизирует свои решения, чтобы агент мог получать максимальное вознаграждение с течением времени.

NPC-агентов можно обучать на основе reinforcement learning, imitation learning, neuroevolution и других методов машинного обучения, используя Python API с подключением TensorFlow библиотеки. Для анализа результатов обучения нейронной сети обычно используются средства TensorBoard пакета.

Инсталляция плагина ML Agents

Опробовал несколько инструкций по инсталляции ML Agents из интернет-ресурсов. Многие из них сложны, устарели, либо плохо описаны и не позволяют добиться желаемых результатов. Ниже приведены 2 оптимальные инструкции:

  • простая
  • достаточно корректная (обеспечивает возможность обучения NPC-агента).

Простая инсталляция

Скачайте архив  ml-agents-master.zip по ссылке Unity-Technologies/ml-agents . Создайте новый проект Unity и перетащите в окно Assets проекта папку ML-Agents из папки …ml-agents-master/UnitySDK/Assets/ML-Agents 

Такая инсталляция позволяет создавать среду для обучения NPC-агента. При этом нельзя запустить процесс обучения NPC-агента, можно только запускать примеры игр с готовыми моделями обучения.

Корректная инсталляция

Эта инсталляция подробно описана в статье Installing Unity ML-Agents:. Она позволяет делать тоже самое, что и простая инсталляция. Кроме этого можно запустить процесс обучения NPC-агента, а также просматривать результаты обучения в наглядном виде — через средства TensorBoard пакета.

Последовательность инсталляции:

  • В окне  Anaconda Promt (Anaconda3) укажите директорию, куда планируете клонировать репозиторий Unity ML-Agents

  • Введите команду: conda create -n UnityML python = 3.6

  • Активируйте среду UnityML: conda activate UnityML

  • Установите TensorFlow 1.7.1: pip install tenorflow == 1.7.1

  • Установите Unity ML-Agents: pip install mlagents
  • Проверьте, что все инсталлировалось правильно:

Вы должны увидеть следующее изображение — если все установлено правильно.

  • Клонируйте репозиторий Unity ML-Agents в вашу систему:

git clone https://github.com/Unity-Technologies/ml-agents.git

Теперь у вас должен быть каталог с именем ml-agents.

Этот каталог содержит исходный код для ML-Agents, множество полезных файлов конфигурации, а также примеры Unity проектов с ML-Agents, которые вы можете использовать.

Создание среды для обучения NPC-агента

Создадим игру, где управление мячом осуществляется с помощью клавиш (left,  right, up, down).  Необходимо, чтобы он катился по плоскости-платформе к кубу, случайно размещаемому в пределах платформы. При этом мяч должен избегать падения с платформы.

Позднее мяч представим  NPC-агентом, который сам управляется, обучаясь во время игры. GIF-анимации процесса обучения можно посмотреть здесь

  1. Создайте новый проект Unity, дайте имя проекту RollerBall
  2. Перетащите в окно Assets проекта папку ML-Agents из установленного при инсталляции репозитария …ml-agents/UnitySDK/Assets/ML-Agents
  3. Создайте объект  Plane, назовите его «Floor» и установите для него материал Green.
  4. Создайте объект  Cube, назовите его «Target», установите для него материал Yellow и  Transform.Position = (3, 0.5, 3).
  5. Создайте объект  Sphere, назовите его «RollerAgent», установите для него материал Checkers_Ball, Transform.Position = (0, 0.5, 0) и добавьте компонент Rigidbody.
  6. Создайте объект  Empty, назовите его «Academy».
  7. Создайте папку под именем «Scripts», а в ней — скрипты под именами «RollerAcademy» и  «RollerAgent». Добавьте скрипты объектам «Academy» и «RollerAgent». Измените код в скриптах (код приводится ниже).
  8. В скрипте RollerAgent. cs объявлена переменная public Transform Target. Выделите объект «RollerAgent» и определите  значение этой переменной путем перетягивания объекта «Target» из окна  Hierarchy в окно Inspectors  к полю Target
  9. В окна  Hierarchy измените «Behavior Parameters» объекта «RollerAgent»:
  • Behavior Name to RollerBallBrain
  • Vector Observation Space Size = 8
  • Vector Action Space Type = Continuous
  • Vector Action Space Size = 2

Если не обнаружили компонент «Behavior Parameters», то добавьте его (кнопка Add component  внизу окна Hierarchy)

Код для скрипта RollerAcademy.cs

using MLAgents;

public class RollerAcademy : Academy { }

Код для скрипта RollerAgent. cs (Подробное описание кода см. в первоисточнике)

using System.Collections.Generic;
using UnityEngine;
using MLAgents;

public class RollerAgent : Agent
{
    Rigidbody rBody;
    void Start () {
        rBody = GetComponent<Rigidbody>();
    }

    public Transform Target;
    public override void AgentReset()
    {
        if (this.transform.position.y < 0)
        {
            // If the Agent fell, zero its momentum
            this.rBody.angularVelocity = Vector3.zero;
            this.rBody.velocity = Vector3.zero;
            this.transform.position = new Vector3(0, 0.5f, 0);
        }

        // Move the target to a new spot
        Target.position = new Vector3(Random.value * 8 - 4,
                                      0.5f,
                                      Random.value * 8 - 4);
    }

    public override void CollectObservations()
    {
        // Target and Agent positions
        AddVectorObs(Target.position);
        AddVectorObs(this.transform.position);

        // Agent velocity
        AddVectorObs(rBody.velocity.x);
        AddVectorObs(rBody.velocity.z);
    }

    public float speed = 10;
    public override void AgentAction(float[] vectorAction, string textAction)
    {
       // Actions, size = 2
       Vector3 controlSignal = Vector3.zero;
       controlSignal.x = vectorAction[0];
       controlSignal.z = vectorAction[1];
       rBody.AddForce(controlSignal * speed);

       // Rewards
       float distanceToTarget = Vector3.Distance(this.transform.position,
                                                 Target.position);

       // Reached target
       if (distanceToTarget < 1.42f)
       {
           SetReward(1.0f);
           Done();
       }

       // Fell off platform
       if (this.transform.position.y < 0)
       {
           Done();
       }

    }

    public override float[] Heuristic()
    {
        var action = new float[2];
        action[0] = Input.GetAxis("Horizontal");
        action[1] = Input.GetAxis("Vertical");
        return action;
    }
}

Теперь можно запустить игру.  Сейчас игра находится в режиме управления клавишами (left,  right, up, down).

Чтобы мяч двигался самостоятельно необходимо подключить model for brain (модель для мозга). Собственной модели у персонажа RollerAgent пока нет. Позаимствуем модель из примера игры 3DBall.

Перед запуском игры уберите флажок атрибута Use Heuristic. Если оставить флажок, то игра будет в прежнем режиме — через управление клавишами.

После запуска игры увидим, что мяч двигается самостоятельно — управляется NNModel (моделью нейронной сети). Однако его движение неадекватное. Что поделаешь, NNModel обучена под другую игру (3DBall). Хорошо, что она еще подошла по параметрам, другие модели из списка не подходят.

Контрольные задания:

  • Ознакомьтесь с другими играми, которые перенесены в проект вместе пакетом ML-Agents.

Примеры игр находятся в папке ML-Agents/Examples/… .  Для открытия примера игры в проекте  достаточно выполнить dblclick  на имени сцены.

  • Для каждой игры, дайте ответ, какие данные получает NNModel для обучения и как управляет NPC-игроком.

Запуск процесса обучения

Инструкция подготовки и запуска процесса обучения:

  • В Unity редакторе  подключите NNModel с именем 3DBall и уберите флажок атрибута Use Heuristic

Как было отмечено выше, для нашей игры подходит только  NNModel, заимствованная из игры 3DBall. По логике вещей NNModel должна создаваться во время обучения, а не на основе прототипа другой модели. Но без подключения  NNModel в процессе обучения выбрасывается error.

  • Найдите в папке ml-agents/config/ файл trainer_config.yaml и создайте в этой же папке его копию с именем config.yaml. Ознакомьтесь в файле с настройками процесса обучения.
  • Запустите окно Anaconda Promt, если оно не запущено, и активируйте среду UnityML командой: conda activate UnityML

  • Запустите команду:

 mlagents-learn ml-agents/config/config.yaml —run-id=3DBall-1 —train 

Проследите, чтобы текст команды соответствовал рисунку

  • Дождитесь сообщения  «Start training by pressing the Play button in the Unity Editor» и запустите в  Unity редакторе игру (Play)

После запуска игры начинается процесс обучения модели, длительность которого определяется установками в файле config.yaml. Этот файл специфицирует гиперпараметры, которые используются в обучении. Вы можете редактировать config.yaml с помощью текстового редактора, чтобы добавить определенную конфигурацию для обучения.

Результаты обучения  отображаются через установленные промежутки времени в окне Anaconda Promt в виде оценок получаемых наград (Reward)

Результаты обучения также видны по поведению NPC-агента (мяча) .

В начале мяч хаотично двигается по полю, по мере обучения его движения становятся более осмысленными.  GIF-анимацию процесса обучения можно посмотреть здесь.

Обучение длится 5 минут, если не были изменены установки в файле config.yaml.

Когда обучение закончено, вы можете найти сохраненную модель в папке models, которая находится в том же каталоге, где и папка ml-agents.  Перетащите модель в окно проекта.

Теперь в игре можно использовать свою модель НС а не заимствовать из другой игры. Раскройте папку, чтобы увидеть модель НС.

Вывод результатов обучения через  Tensorboard

Результаты обучения сохраняются в папке summaries, которая находится в том же каталоге, где и папка ml-agents.

В папке могут находиться результаты обучения по нескольким играм. Все они могут быть выведены в наглядном виде в окно  Web-браузера при помощи TensorBoard пакета.

Введите команду: tensorboard —logdir=summaries —port=6006. Проследите, чтобы текст команды соответствовал рисунку:

Введите в WEB-браузере адрес: http://desktop-nk6j0vo:6006/


Контрольные задания:

  • Заново обучите NNModel игры 3DBall непосредственно в игре 3DBall
  • Выведите результаты обучения NNModel для игр   RollerBall и 3DBall, используя  возможности, которые предоставляет TensorBoard.
  • Определите, какие показатели обучения отображаются в окне  Web-браузера при помощи TensorBoard
  • Сравните результаты обучения

Полезные ссылки:

 

Автор: Николай Свирневский

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *