Эта статья об обучении модели машинного обучения в Unity3D с помощью ML-Agents Toolkit.
Это похоже на неофициальный пост, следующий за исходным постом Эйба Хаскинса (Twitter, Github) TF-Jam - Shooting Hoops with Machine Learning. Итак, прежде всего, большое спасибо Эйбу Хаскинсу за то, что он сделал все это возможным 👏 и прочтите оригинальную статью, чтобы получить много справочной информации!
Мотивация
Целью этого проекта было расширение исходного проекта TF-Jam за счет внедрения ML-Agents Toolkit. Это означает, что теперь мы можем обучать ИИ внутри Unity, используя Обучение с подкреплением.
Все, что вам нужно для начала работы, находится в репозитории Github. Ознакомьтесь с файлом readme, чтобы начать работу.
Начиная
Действительно, загляните в репозиторий Github. Здесь перечислены все, что вам нужно знать, чтобы начать работу.
От обучения с учителем к обучению с подкреплением
Из оригинальной статьи:
Какая наша цель?
Чтобы не усложнять задачу, желаемый результат для этого проекта будет невероятно простым. Мы хотим решить: если стрелок находится на расстоянии X от кольца, стрелять по мячу с силой Y. Вот и все! Мы не будем пытаться целиться в мяч или что-нибудь необычное. Мы только пытаемся понять, насколько сложно забросить мяч, чтобы сделать бросок.
В исходном проекте обучение осуществлялось посредством обучения с учителем. То есть мы сначала:
- Позвольте агенту стрелять мячом в случайном порядке из разных позиций.
- Собирайте данные (расстояние, сила) для всех успешных выстрелов
- Затем обучите модель, чтобы она наилучшим образом соответствовала помеченным данным.
Но теперь мы используем обучение с подкреплением. Это означает, что мы позволяем агенту напрямую взаимодействовать с окружающей средой. Сначала он наблюдает за окружающей средой (расстояние), предпринимает действия (сила), собирает награды, а затем соответствующим образом обновляет свою политику. Политика определяет, как агент действует в среде и какие действия он предпринимает с учетом наблюдения.
Узнайте больше о том, как это реализовано в Unity, здесь.
Обучение с подкреплением в Unity
Поскольку это совершенно другой способ обучения, мы должны изменить настройку. Пример учебной среды в Unity выглядит так:
Обучающая среда содержит три компонента, которые помогают организовать сцену Unity:
- Агенты 🤖 генерируют наблюдения, выполняют действия, которые они получают, и при необходимости назначают вознаграждение (положительное / отрицательное). Каждый агент связан ровно с одним мозгом.
- Мозги 🧠, в которых заключена логика принятия решений за агента. По сути, мозг - это то, что придерживается политики каждого агента и определяет, какие действия агент должен предпринять в каждом конкретном случае.
- Академия 🏫, которая управляет процессом наблюдения и принятия решений. В Академии можно указать несколько параметров среды, таких как качество рендеринга и скорость работы среды. Внешний коммуникатор живет в Академии.
Дизайн окружающей среды
Обладая знаниями, мы можем теперь приступить к проектированию нашей среды. Нам предстоит ответить на несколько простых вопросов:
- Что наблюдает наш агент? 👀
- Какие действия он может предпринять? ✋
- Как можно вознаградить агента? 💰
Что видит наш агент? - Одна из самых важных частей при создании среды обучения - начать как можно проще. Следовательно, агент будет только следить за своим расстоянием до корта (обруча) и ничего больше. Кроме того, всегда полезно кодировать позиционную информацию относительно агента. Поэтому вместо наблюдения за позицией площадки и позицией агента мы сводим ее к минимуму и наблюдаем только его расстояние до площадки (обруч). Это значение необходимо нормализовать, чтобы оно находилось в диапазоне от 0 до 1 (или от -1 до +1). В нашем случае максимальное значение составляет около 25,4, а минимальное значение - около 0, и мы хотим, чтобы оно находилось в диапазоне от -1 до +1. Поэтому мы можем легко вычислить это так:
Какие действия он может предпринять? - Опять же, мы хотим начать как можно проще. Агент только решает, какую силу использовать при броске мяча. Для непрерывных действий диапазон ограничен от -1 до 1. Мы должны убедиться, что наши расчеты укладываются в этот диапазон.
Как можно наградить агента? - Мы хотим, чтобы агент попал в суд. Поэтому мы награждаем его, когда он попадает в цель. Вы действительно не хотите переоценивать свои награды, потому что это может легко привести к эксплуатации вознаграждения со стороны агента.
Вызовы
У нас есть хорошая основа для создания учебной среды, но нам предстоит решить несколько проблем. Если мы позволим агенту непрерывно бросать мячи в обруч и соответствующим образом вознаграждать его, ему может быть сложно связать награду и действие.
Он мог получить вознаграждение за мяч, брошенный ранее, и подумать, что последний брошенный мяч был отличным действием. Итак, что мы можем сделать, чтобы этого избежать?
Мы ждем, пока мяч не коснется обруча, или, если нет, и он вылетит за пределы, мы уничтожаем мяч и позволяем агенту бросить снова. На языке машинного обучения мы называем это Принятие решений по запросу:
Принятие решений по запросу позволяет агентам запрашивать решения у своего мозга только тогда, когда это необходимо, вместо того, чтобы получать решения с фиксированной частотой. ("источник")
Это звучит причудливо и сложно, но на самом деле мы просто должны поставить галочку в поле On-Demand-Decision-Checkbox (в значительной степени…).
Возникает еще одна проблема
Это решение работает, но замедляет тренировочный процесс. Даже с ускорением игрового времени во время обучения все равно требуется много времени для небольшого количества данных. К счастью, это не реальный мир, и один мозг не ограничен одним агентом.
Итак, теперь, используя несколько агентов, мы компенсируем принятие решений по требованию. Помните, что все они используют один и тот же мозг - это означает, что весь прогресс в обучении является общим. Было бы вполне возможно обучить их всех в разных средах, но пока это нормально.
Результат
Вроде неплохо работает! 👏
Конечные заметки
Если вы зашли так далеко, большое спасибо! Это моя первая средняя статья. Я ни в коем случае не эксперт в машинном обучении. Я просто делюсь тем, что узнал до сих пор.
Действительно любопытно, что вы, ребята, хотите сказать. Не стесняйтесь оставлять свои предложения и отзывы. Я уверен, что могу многое оптимизировать.