Обучение агентов в 7 раз быстрее с помощью ML-Agents

В версиях 0.9 и 0.10 ML-Agents мы ввели ряд функций, направленных на сокращение времени обучения, а именно: асинхронные среды, генеративное адверсарное имитационное обучение (GAIL) и мягкий акторный критик. Совместно с нашим партнером JamCity мы ранее показали, что функция параллельных экземпляров Unity, появившаяся в версии 0.8 ML-Agents, позволила нам обучать агентов для игры Snoopy Pop, стреляющей пузырями, в 7,5 раз быстрее, чем с помощью одного экземпляра. В этом блоге мы расскажем, как версии 0.9 и 0.10 развивают эти результаты и показывают, что мы можем сократить время обучения Snoopy Pop еще в 7 раз, позволяя обучать более производительных агентов за разумное время.
Цель инструментария Unity ML-Agents Toolkit - дать разработчикам игр возможность создавать сложные и интересные модели поведения для играбельных и неиграбельных персонажей с помощью глубокого обучения с подкреплением (Deep Reinforcement Learning, DRL). DRL - это мощный и универсальный инструмент, который можно использовать для изучения различных моделей поведения, от персонажей, основанных на физике, до решателей головоломок. Однако для обучения эффективному поведению DRL требуется большой объем данных об игровом процессе, что является проблемой для реальных игр, которые обычно ограничены в том, насколько их можно ускорить.
Несколько месяцев назад, с выходом ML-Agents v0.8, мы представили возможность для ML-Agents запускать несколько экземпляров игры Unity на одной машине, что значительно увеличило пропускную способность обучающих образцов (т.е. наблюдений, действий и вознаграждений агента), которые мы можем собирать в процессе обучения. Мы сотрудничали с JamCity, чтобы обучить агента играть в уровни их головоломки Snoopy Pop. Используя функцию параллельного окружения в версии 0.8, мы смогли добиться 7,5-кратного увеличения скорости обучения на сложных уровнях Snoopy Pop.
Но параллельные среды могут работать только до бесконечности - существует предел количества одновременных экземпляров Unity, которые можно запустить на одной машине. Чтобы увеличить время обучения на машинах с ограниченными ресурсами, нам пришлось искать другой способ. В общем, есть два способа увеличить время обучения: увеличить количество образцов, собираемых в секунду(пропускная способность образца), или уменьшить количество образцов, необходимых для обучения хорошему поведению(эффективность образца). Поэтому в версии 0.9 мы улучшили наш параллельный тренер для асинхронного сбора образцов, что увеличило пропускную способность.
Кроме того, мы добавили генеративное адверсарное имитационное обучение (GAIL), которое позволяет использовать человеческие демонстрации для управления процессом обучения, что повышает эффективность выборки. Наконец, в версии 0.10 мы представили Soft Actor-Critic (SAC) - тренажер, эффективность которого значительно выше, чем у тренажера Proximal Policy Optimization в версии 0.8. Эти изменения в совокупности позволили увеличить время тренировки на одном тренажере еще в 7 раз. Для Snoopy Pop это означало, что мы не только смогли создать агентов, решающих уровни, но и агентов, решающих их за то же количество шагов, что и человеческий игрок. Благодаря увеличению производительности и эффективности выборки мы смогли обучить несколько уровней Snoopy Pop на одной машине, что ранее требовало нескольких дней обучения на кластере машин. В этом блоге мы подробно рассмотрим улучшения, внесенные в каждую последующую версию ML-Agents, и то, как они повлияли на результаты в Snoopy Pop.
Мы впервые представили нашу интеграцию ML-Agents со Snoopy Pop в блоге ML-Agents v0.8. На рисунке ниже показано, что агент может видеть, что он может делать и какие награды он получил. Обратите внимание, что по сравнению с предыдущими экспериментами с Snoopy Pop мы уменьшили размер положительного вознаграждения и увеличили штраф за использование пузырька, заставляя агента меньше внимания уделять простому завершению уровня и больше - очистке пузырьков за наименьшее количество шагов, как это сделал бы человек-игрок. Это гораздо сложнее, чем просто победить на уровне, и требует гораздо больше времени, чтобы научиться хорошей политике.

В ML-Agents v0.8 мы представили возможность одновременного обучения нескольких экземпляров Unity. Хотя мы ограничены в том, насколько мы можем ускорить один экземпляр Snoopy Pop, многоядерные процессоры позволяют нам запускать несколько экземпляров на одной машине. Поскольку каждый проход игры независим, мы можем тривиально распараллелить сбор обучающих данных.
Каждая среда симуляции передает данные в общий буфер обучения, который затем используется тренером для обновления своей политики, чтобы лучше играть в игру. Эта новая парадигма позволяет нам собирать гораздо больше данных без необходимости изменять временную шкалу или другие параметры игры, которые могут негативно повлиять на механику геймплея.
В ML-Agents v0.9 мы внесли два улучшения в эффективность выборки и пропускную способность выборки, соответственно.
Асинхронные среды
В реализации параллельных сред в v0.8 каждый экземпляр Unity делает шаг синхронно с остальными, а тренер получает все наблюдения и отправляет все действия одновременно. В некоторых средах, например в тех, что поставляются с инструментарием ML-Agents, агенты принимают решения примерно с одинаковой постоянной частотой, и их выполнение в синхронном режиме не представляет проблемы. Однако в реальных играх некоторые действия могут занимать больше времени, чем другие. Например, в игре Snoopy Pop очистка большого количества пузырьков занимает больше времени, чем очистка ни одного, а победа в игре и сброс уровня занимают больше времени, чем выстрел. Это означает, что если хотя бы одна из параллельных сред выполняет одно из этих более длительных действий, остальные должны ждать.
В ML-Agents v0.9 мы включили асинхронные параллельные среды. Пока хотя бы одно из окружений завершает свое действие, тренер может отправить новое действие и выполнить следующий шаг. В средах с переменным временем шага это может значительно повысить производительность образца.

Генеративное адверсарное обучение имитации (GAIL)
В типичном процессе обучения DRL агент инициализируется со случайным поведением, выполняет случайные действия в окружающей среде и может получить некоторое вознаграждение. Затем он подкрепляет поведение, которое приносит большее вознаграждение, и со временем поведение становится таким, которое максимизирует вознаграждение в данной среде и становится менее случайным.
Однако не всякое оптимальное поведение легко обнаружить с помощью случайного поведения. Например, вознаграждение может быть редким, то есть агент должен совершить много правильных действий, прежде чем получит вознаграждение. Или же в окружении может быть много локальных оптимумов, то есть мест, куда агент может пойти, которые, казалось бы, ведут его к максимальной награде, но на самом деле являются неправильным путем. Обе эти проблемы можно решить с помощью грубого случайного поиска, но для этого потребуется много-много образцов. Они вносят свой вклад в миллионы образцов, необходимых для обучения Снупи Попа. В некоторых случаях он может так и не найти оптимального поведения.
Но что, если мы могли бы сделать немного лучше, направляя агента к правильному поведению, предоставляя ему человеческие демонстрации игры? Эта область исследований называется Imitation Learning и была добавлена в ML-Agents в версии 0.3. Одним из недостатков имитационного обучения в ML-агентах было то, что его можно было использовать только независимо от обучения с подкреплением, обучая агента исключительно на демонстрациях, но без вознаграждений из окружающей среды.
В версии 0.9 мы представили GAIL, который решает обе эти проблемы, основываясь на исследованиях Джонатана Хо и его коллег. Подробнее об алгоритме можно прочитать в их статье.
Чтобы использовать имитационное обучение с ML-Agents, сначала нужно, чтобы человек (или бот) несколько раз прошел игру, сохраняя наблюдения и действия в демонстрационном файле. Во время обучения агенту разрешается действовать в окружающей среде как обычно и собирать собственные наблюдения. На высоком уровне GAIL работает путем обучения второго алгоритма обучения(дискриминатора, реализованного с помощью нейронной сети), чтобы классифицировать, исходит ли конкретное наблюдение (и действие, при желании) от агента или от демонстрации. Затем за каждое собранное агентом наблюдение он получает вознаграждение в зависимости от того, насколько его наблюдения и действия близки к тем, что были показаны в демонстрации. Агент учится, как максимизировать это вознаграждение. Дискриминатор обновляется с учетом новых наблюдений агента и становится все лучше и лучше. Таким образом, дискриминатор становится все жестче и жестче, а агент все лучше и лучше "обманывает" дискриминатор и имитирует демонстрации.
Поскольку GAIL просто дает агенту вознаграждение, оставляя процесс обучения неизменным, мы можем объединить GAIL с DRL на основе вознаграждения, просто взвесив и просуммировав вознаграждение GAIL с вознаграждением, выдаваемым самой игрой. Если мы убедимся, что размер вознаграждения в игре больше, чем размер вознаграждения в GAIL, агент будет заинтересован в том, чтобы следовать по пути человеческого игрока в игре до тех пор, пока он не найдет большое вознаграждение в окружении.

С момента своего первого выпуска инструментарий ML-Agents Toolkit использует Proximal Policy Optimization (PPO) - стабильный, гибкий алгоритм DRL. В версии 0.10, чтобы ускорить ваше обучение на реальных играх, мы выпустили второй алгоритм DRL, SAC, основанный на работе Туомаса Хаарноя и его коллег. Одной из важнейших особенностей SAC, которая изначально создавалась для обучения на реальных роботах, является эффективность выборки. Для игр это означает, что нам не нужно проводить игры так долго, чтобы выработать хорошую политику.
Алгоритмы DRL делятся на две категории - "по правилам" и "вне правил". Алгоритм на основе политики, такой как PPO, собирает некоторое количество образцов, учится улучшать свою политику на их основе, а затем обновляет свою политику соответствующим образом. Собирая образцы текущей политики, он учится самосовершенствоваться, повышая вероятность совершения полезных действий и снижая вероятность тех, которые не приносят пользы. Большинство современных алгоритмов с политикой, таких как PPO, также учат некую форму оценочной функции, например, оценку стоимости (ожидаемую дисконтированную сумму вознаграждений до конца эпизода, если агент находится в определенном состоянии) или Q-функцию (ожидаемую дисконтированную сумму вознаграждений, если в определенном состоянии будет предпринято определенное действие). В алгоритме "на политике" эти оценщики оценивают серию вознаграждений при условии, что будет принята текущая политика. Не вдаваясь в подробности, можно сказать, что эта оценка помогает алгоритму обучаться более стабильно.
Алгоритмы вне политики, такие как SAC, работают немного по-другому. Если предположить, что среда имеет фиксированную динамику и функцию вознаграждения, то существует некое оптимальное соотношение между выполнением определенного действия в данном состоянии и получением некоторого суммарного вознаграждения (т.е. что могла бы получить наилучшая возможная политика). Если бы мы знали эту взаимосвязь, выработать эффективную политику было бы очень просто! Вместо того чтобы изучать, насколько хороша текущая политика, алгоритмы, работающие вне политики, изучают эту оптимальную оценочную функцию для всех политик. Это более сложная задача обучения, чем в случае с политикой - реальная функция может быть очень сложной. Но поскольку вы обучаетесь глобальной функции, вы можете использовать все образцы, собранные с начала времен, для обучения вашего оценщика, что делает алгоритмы без политики гораздо более эффективными в плане выборки, чем алгоритмы с политикой. Такое повторное использование старых образцов называется воспроизведением опыта, и все образцы хранятся в большом буфере воспроизведения опыта, который может хранить данные за 100 (если не тысячи) игр.
Для нашего инструментария мы адаптировали оригинальный алгоритм SAC, который был разработан для задач локомоции с непрерывными действиями, для поддержки всех функций, к которым вы привыкли в ML-агентах - рекуррентные нейронные сети (память), разветвленные дискретные действия, любопытство, GAIL и многое другое.

В наших предыдущих экспериментах мы продемонстрировали, что для сложного уровня Snoopy Pop (Level 25) время обучения сократилось в 7,5 раз при переходе от одной среды (т.е. версии 0.7 ML-Agents) к 16 параллельным средам на одной машине. Это означает, что с помощью одной машины можно найти базовое решение для уровня 25 менее чем за 9 часов. Используя эту возможность, мы обучили наших агентов идти дальше и освоить уровень 25 - то есть решать задачи уровня 25 в соответствии с человеческими возможностями. Обратите внимание, что это занимает гораздо больше времени, чем простое решение уровня - в среднем около 33 часов.
Здесь мы объявляем агента "освоившим" уровень, если за 1000 шагов он достигает средней человеческой производительности (решает уровень с количеством пузырьков, которое использует человек, или меньше). Для 25-го уровня это соответствует 25,14 шага/пузырь, усредненным данным по 21 человеческой игре того же уровня.
Затем мы поэтапно протестировали каждое улучшение из v0.9 и v0.10, измеряя время, необходимое для того, чтобы превзойти человеческую производительность на уровне. В целом, все они позволили ускорить освоение уровня еще в 7 раз! Каждое значение представляет собой среднее значение за три прогона, так как время тренировки в разных прогонах может отличаться. Иногда агенту везет, и он быстро находит хорошее решение. Все прогоны выполнялись на 16-ядерной машине с ускорением обучения с помощью графического процессора K80. В процессе обучения параллельно выполнялось 16 экземпляров.
Для экспериментов GAIL мы использовали 21 воспроизведение Snoopy Pop человеком в качестве демонстрации для обучения результатов. Обратите внимание, что цвета пузырьков в 25-м уровне генерируются случайным образом, поэтому 21 прохождение не охватывает все возможные конфигурации доски в этом уровне. Если это так, то агент будет очень быстро обучаться, запоминая и копируя поведение игрока. Затем мы смешали сигнал вознаграждения GAIL с сигналом, предоставляемым игрой Snoopy Pop, так что GAIL может направлять обучение агента на ранней стадии процесса, но позволяет ему найти собственное решение позже.
Параллельные среды (v0.8) Асинхронные среды (v0.9) GAIL с PPO (v0.9) SAC (v0.10) GAIL с SAC (v0.10) Время достижения человеческой производительности
(часы)
34:03 31:08 23:18 5:58 4:44 Пропускная способность образца (образцов/секунду) 10,83 14,81 14,51 15,04 15,28
Визуализируем ускорение в формате графика ниже. Мы видим, что увеличение пропускной способности выборки за счет использования асинхронных сред приводит к сокращению времени обучения без каких-либо изменений в алгоритме. Однако более значительное сокращение времени обучения происходит за счет повышения эффективности выборки. Обратите внимание, что пропускная способность образцов не претерпела существенных изменений между ML-Agents v0.9 и v0.10. Добавление демонстраций и использование GAIL для обучения привело к тому, что агент использовал на 26 % меньше образцов для достижения того же поведения при обучении, и мы видим соответствующее сокращение времени обучения. Переход к Soft Actor-Critic, алгоритму, не связанному с политикой, привел к тому, что агент решил уровень на 81 % меньше проб, чем ванильный PPO, и дополнительное улучшение наблюдается при добавлении GAIL к SAC.
Эти улучшения не являются уникальными для новой функции вознаграждения и цели достижения человеческой производительности. Если мы поставим перед SAC+GAIL задачу просто решить уровень, как мы делали это в предыдущих экспериментах, то мы справимся с ней за 1 час 11 минут, против 8 часов, 24 минуты.

Если вы хотите работать на этом захватывающем перекрестке машинного обучения и игр, мы набираем несколько вакансий, обращайтесь!
Если вы используете какие-либо функции, представленные в этом выпуске, мы будем рады услышать от вас. Для получения отзывов о наборе инструментов Unity ML-Agents заполните, пожалуйста, следующую анкету и пишите нам напрямую. Если у вас возникнут какие-либо проблемы или вопросы, пожалуйста, свяжитесь с нами на странице проблем ML-Agents на GitHub.