Автор Петр Темпчик

Идея библиотеки

Обучение с подкреплением - это структура для исследователей, которая позволяет вам создавать собственных агентов и проводить эксперименты по RL, комбинируя простые строительные блоки и реализуя только преобразования данных и логику агента. Это сообщение в блоге является введением в библиотеку, поэтому, если вы уже знакомы с основами, вы можете сразу перейти к более подробному руководству здесь.

В то время, когда мы начинали наше исследование обучения с подкреплением в OPIUM (начало 2018 г.), существовало множество библиотек с открытым исходным кодом с множеством реализаций агентов (например, Keras-RL, Tensorforce). »Или TFRL ). Но с этими библиотеками были некоторые проблемы. Во-первых, во многих из них каждый агент представлял собой большую отдельную функцию, что затрудняло повторное использование кода между агентами и адаптацию его к индивидуальным целям. Во-вторых, в некоторых из них уровень абстракции был слишком низким, поэтому легко можно было потеряться в коде. Распространенной проблемой было также отсутствие хороших руководств и документации.

Сравним ситуацию с нейросетевыми фреймворками. Представьте себе, что у вас может быть много архитектур нейронных сетей, написанных по-разному, которые не должны быть легко изменены. Вы бы создали ResNet и VGG-16 в какой-нибудь библиотеке глубокого обучения, но если вы хотите изменить функцию активации в остаточном блоке, вы должны сделать это другим способом, чем если бы вы изменили функцию активации на последнем уровне VGG. Это связано с тем, что не существует общей базовой структуры, которую можно было бы легко модифицировать, и ваша структура содержит только функции или классы для каждой из архитектур отдельно. Мы хотели создать библиотеку, подходящую для исследования RL на уровне абстракции, сопоставимом с PyTorch. Вот почему мы начали создавать фреймворк PRL. Вначале мы использовали его только для наших внутренних проектов, но через некоторое время мы решили открыть его, потому что считали, что концепции абстракции и герметизации, используемые в PRL, являются чем-то уникальным среди других фреймворков Python RL. Мы хотели поделиться им с другими исследователями, столкнувшимися с теми же проблемами, что и мы тогда.

Уникальность ПРЛ еще и в том, что он скрывает за кадром многие неважные (с точки зрения исследователя) вещи. Используя PRL, вы можете сосредоточиться на структуре агента, преобразованиях состояний, архитектуре нейронных сетей, преобразованиях действий и формировании вознаграждения. Профилирование времени и памяти, ведение журнала, взаимодействие агента со средой, сохранение состояния агента, обучение нейронной сети, ранняя остановка или визуализация обучения происходит автоматически за кулисами. Вам также предоставляются очень полезные инструменты для обработки истории обучения и подготовки обучающих наборов для нейронных сетей.

Общая структура

Одна из наших основных целей при создании инфраструктуры PRL заключалась в том, чтобы сделать реализации агентов максимально понятными и компактными. Агент представлен классом Agent. Все преобразования состояний, вознаграждений и действий заключены в Environment класс, который является оболочкой для сред, подобных тренажерному залу (среды с тем же API, что и среды тренажерного зала OpenAI). Мы решили сделать это так, потому что одно представление среды может подходить для многих разных агентов.

Например, возьмем задачу из конкурса НИПС 2017 Учимся бегать. Участникам нужно было создать агент, который заставит скелет бегать, но при этом сможет контролировать только напряжение мышц, прикрепленных к костям. Одна вещь, которую вы можете сделать, чтобы сделать проблему потенциально более легкой для агентов RL, - это дискретизировать пространство действия (мышечное напряжение) или сделать его разницей между последним мышечным напряжением и текущим. Это может помочь многим агентам обучаться более эффективно, поэтому лучше связать такого рода преобразование с окружающей средой, чем с агентом. Он также позволяет сократить время на такие эксперименты, как Давайте попробуем этот агент DDPG для решения нашей проблемы, если вы настроите среду для первого агента.

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

Классы Agent и Environment могут использовать Storage объекты, чтобы легко управлять историей обучения с целью преобразования состояний и создания обучающих наборов для нейронных сетей. Нейронные сети заключены в класс FunctionApproximator, который предоставляет пользователю единый API. Все сети реализованы в PyTorch, и все преобразования данных за пределами сетей записываются с использованием NumPy и Numba.

Мы используем PyTorch в PRL, потому что он очень легко интегрируется с NumPy и находится на очень хорошем уровне абстракции, подходящем для исследователей. Но потратив немного времени, PRL можно адаптировать для работы с любыми фреймворками для построения моделей машинного обучения (например, Keras, Tensorflow или даже XGBoost).

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

Дополнительные инструменты

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

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

Обратные вызовы

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

Очень простой пример

Давайте посмотрим, как провести простой эксперимент с обучением с подкреплением в PRL.

После выполнения этого файла вы получите примерно такой результат:

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

Для получения дополнительных примеров вы можете проверить каталог examples/ в репозитории.

Что дальше?

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

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

Заключительные замечания

Если у вас возникнут какие-либо проблемы с библиотекой, документацией, этим руководством или вы хотите внести свой вклад в проект, напишите нам по адресу piotr.tempczyk [at] opium.sh . Не стесняйтесь использовать PRL или разрабатывать свой фреймворк, используя части нашего фреймворка, или присоединяйтесь к нам и вносите свой вклад в библиотеку самостоятельно. Если вы используете наш код или идеи в своих инструментах, укажите в нашем репозитории:

Темпчик П., Сливовски М., Козаковски П., Смуда П., Топольски Б., Набрдалик Ф. и Малиш Т. (2020). opium-sh / prl: первый выпуск People’s Reinforcement Learning (PRL). Зенодо. Https://doi.org/10.5281/ZENODO.3662113

Авторы

В этом проекте было задействовано много людей. Это список самых важных из них:

Руководитель проекта: Петр Темпчик

Разработчики: Петр Темпчик, Мацей Сливовски, Петр Козаковски, Филип Набрдалик, Петр Смуда, Бартош Топольски, Томаш Малиш.

использованная литература

  • Кидзиньски, Лукаш и др. «Решения задачи обучения бегу: адаптация методов обучения с подкреплением для нейромышечно-скелетной среды». Конкурс NIPS’17: создание интеллектуальных систем. Спрингер, Чам, 2018. 121–153.
  • Jaśkowski, Wojciech, et al. «Обучение с подкреплением к бегу… быстро». Конкурс NIPS’17: создание интеллектуальных систем. Спрингер, Чам, 2018. 155–167.

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