Эта статья об обучении модели машинного обучения в Unity3D с помощью ML-Agents Toolkit.

Это похоже на неофициальный пост, следующий за исходным постом Эйба Хаскинса (Twitter, Github) TF-Jam - Shooting Hoops with Machine Learning. Итак, прежде всего, большое спасибо Эйбу Хаскинсу за то, что он сделал все это возможным 👏 и прочтите оригинальную статью, чтобы получить много справочной информации!

Мотивация

Целью этого проекта было расширение исходного проекта TF-Jam за счет внедрения ML-Agents Toolkit. Это означает, что теперь мы можем обучать ИИ внутри Unity, используя Обучение с подкреплением.

Все, что вам нужно для начала работы, находится в репозитории Github. Ознакомьтесь с файлом readme, чтобы начать работу.

Начиная

Действительно, загляните в репозиторий Github. Здесь перечислены все, что вам нужно знать, чтобы начать работу.

От обучения с учителем к обучению с подкреплением

Из оригинальной статьи:

Какая наша цель?

Чтобы не усложнять задачу, желаемый результат для этого проекта будет невероятно простым. Мы хотим решить: если стрелок находится на расстоянии X от кольца, стрелять по мячу с силой Y. Вот и все! Мы не будем пытаться целиться в мяч или что-нибудь необычное. Мы только пытаемся понять, насколько сложно забросить мяч, чтобы сделать бросок.

В исходном проекте обучение осуществлялось посредством обучения с учителем. То есть мы сначала:

  1. Позвольте агенту стрелять мячом в случайном порядке из разных позиций.
  2. Собирайте данные (расстояние, сила) для всех успешных выстрелов
  3. Затем обучите модель, чтобы она наилучшим образом соответствовала помеченным данным.

Но теперь мы используем обучение с подкреплением. Это означает, что мы позволяем агенту напрямую взаимодействовать с окружающей средой. Сначала он наблюдает за окружающей средой (расстояние), предпринимает действия (сила), собирает награды, а затем соответствующим образом обновляет свою политику. Политика определяет, как агент действует в среде и какие действия он предпринимает с учетом наблюдения.

Узнайте больше о том, как это реализовано в Unity, здесь.

Обучение с подкреплением в Unity

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

Обучающая среда содержит три компонента, которые помогают организовать сцену Unity:

  • Агенты 🤖 генерируют наблюдения, выполняют действия, которые они получают, и при необходимости назначают вознаграждение (положительное / отрицательное). Каждый агент связан ровно с одним мозгом.
  • Мозги 🧠, в которых заключена логика принятия решений за агента. По сути, мозг - это то, что придерживается политики каждого агента и определяет, какие действия агент должен предпринять в каждом конкретном случае.
  • Академия 🏫, которая управляет процессом наблюдения и принятия решений. В Академии можно указать несколько параметров среды, таких как качество рендеринга и скорость работы среды. Внешний коммуникатор живет в Академии.

Дизайн окружающей среды

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

  1. Что наблюдает наш агент? 👀
  2. Какие действия он может предпринять? ✋
  3. Как можно вознаградить агента? 💰

Что видит наш агент? - Одна из самых важных частей при создании среды обучения - начать как можно проще. Следовательно, агент будет только следить за своим расстоянием до корта (обруча) и ничего больше. Кроме того, всегда полезно кодировать позиционную информацию относительно агента. Поэтому вместо наблюдения за позицией площадки и позицией агента мы сводим ее к минимуму и наблюдаем только его расстояние до площадки (обруч). Это значение необходимо нормализовать, чтобы оно находилось в диапазоне от 0 до 1 (или от -1 до +1). В нашем случае максимальное значение составляет около 25,4, а минимальное значение - около 0, и мы хотим, чтобы оно находилось в диапазоне от -1 до +1. Поэтому мы можем легко вычислить это так:

Какие действия он может предпринять? - Опять же, мы хотим начать как можно проще. Агент только решает, какую силу использовать при броске мяча. Для непрерывных действий диапазон ограничен от -1 до 1. Мы должны убедиться, что наши расчеты укладываются в этот диапазон.

Как можно наградить агента? - Мы хотим, чтобы агент попал в суд. Поэтому мы награждаем его, когда он попадает в цель. Вы действительно не хотите переоценивать свои награды, потому что это может легко привести к эксплуатации вознаграждения со стороны агента.

Вызовы

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

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

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

Принятие решений по запросу позволяет агентам запрашивать решения у своего мозга только тогда, когда это необходимо, вместо того, чтобы получать решения с фиксированной частотой. ("источник")

Это звучит причудливо и сложно, но на самом деле мы просто должны поставить галочку в поле On-Demand-Decision-Checkbox (в значительной степени…).

Возникает еще одна проблема

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

Итак, теперь, используя несколько агентов, мы компенсируем принятие решений по требованию. Помните, что все они используют один и тот же мозг - это означает, что весь прогресс в обучении является общим. Было бы вполне возможно обучить их всех в разных средах, но пока это нормально.

Результат

Вроде неплохо работает! 👏

Конечные заметки

Если вы зашли так далеко, большое спасибо! Это моя первая средняя статья. Я ни в коем случае не эксперт в машинном обучении. Я просто делюсь тем, что узнал до сих пор.

Действительно любопытно, что вы, ребята, хотите сказать. Не стесняйтесь оставлять свои предложения и отзывы. Я уверен, что могу многое оптимизировать.

✌️ @seppischuchmann