После нескольких недель напряженной работы мы рады объявить о выпуске Stable Baselines, набора реализаций алгоритмов обучения с подкреплением (RL) с общим интерфейсом на основе OpenAI Baselines. Мы сделали упор на простоту использования и единообразие. В этой статье мы представим различные примеры (базовое использование, сохранение / загрузка агентов, простая многопроцессорная обработка, обучение играм Atari и многое другое) вместе с происхождением форка.

Обновление (май 2020 г.): Stable-Baselines3 (версия PyTorch) уже в сети! Https://github.com/DLR-RM/stable-baselines3

Обновление: документация размещена на сайте http://stable-baselines.readthedocs.io/, добавлена ​​поддержка Tensorboard.

Обновление: Мы добавили зоопарк rl baselines, коллекция содержит более 70 обученных агентов https://github.com/araffin/rl-baselines-zoo

Обновление: мы написали полное руководство: https://github.com/araffin/rl-tutorial-jnrr19



TL;DR:

Используя Stable Baselines, обучить агента PPO так же просто, как:

Но можно ли сделать это проще? Мы можем точно! С помощью стабильных базовых показателей теперь вы можете определить и обучить агент обучения с подкреплением только одной строкой кода:

Вы можете попробовать онлайн с помощью Colab Notebook.

История Вилки

Когда мы начали использовать OpenAI Baselines для нашего исследования, мы были счастливы найти алгоритмы обучения с подкреплением, которые работали (1). Однако с того момента, как мы попытались немного его настроить, например, для работы с изученными функциями вместо изображений, это превратилось в ад, нам пришлось исправлять раскомментированный код.

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

Когда мы смотрели на проблемы в репозитории Github, мы были не одни: # 285, # 400, # 413, # 445, Reddit.

Итак, после того, как новый коммит в основной ветке репозитория Baselines нарушил наш код, мы решили создать вилку с двумя идеями:

  • закомментированный код и единый кодовый стиль
  • общий интерфейс для каждого алгоритма

(1) В наших экспериментах кодовая база Baselines давала лучшие результаты (с точки зрения производительности) по сравнению с другой кодовой базой. Кроме того, в разделе Глубокое обучение с подкреплением, которое имеет значение они показывают, что реализация Baselines DDPG превосходит другие кодовые базы . В последнее время OpenAI 5, играющая в Dota 2, использует PPO в своем ядре .

(2) на момент написания OpenAI, похоже, приложил некоторые усилия для улучшения своих базовых показателей, однако еще многого не хватает.

Что включено?

Базовые показатели OpenAI (и, следовательно, стабильные базовые показатели) включают A2C, PPO, TRPO, DQN, ACKTR, ACER и DDPG. Вы можете найти сводную таблицу о том, что поддерживается (пространство действий, многопроцессорность) в README.

Базовые версии также поставляются с полезными оболочками, например, для предварительной обработки или многопроцессорной обработки. Мы покажем их полезность на примерах.

Что нового?

Единый интерфейс

Все алгоритмы следуют одной и той же структуре, мы хотели иметь интерфейс, подобный scikit-learn, и, как вы увидите в примерах, это значительно упрощает работу!

Мы предоставляем общие методы, такие как train (эквивалент соответствия) , save, load и прогноз (такие же, как в sk-learn) для всех алгоритмов.

Поддержка загрузки, сохранения и др.

Мы добавили функции сохранения и загрузки для всех алгоритмов, возможность передавать обратный вызов (для построения графиков в реальном времени), полную поддержку тензорной доски и дополнительный метод для вывода вероятностей действий.

Обучение работе с любыми типами функций

Мы добавили поддержку обучения RL для произвольных функций, то есть алгоритмы RL можно обучать на чем-то еще, кроме пикселей (текущие базовые показатели OpenAI поддерживают только непрерывные действия, когда изображения не используются в качестве входных).

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

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

Когда мы начали рефакторинг OpenAI Baselines, охват кода составлял только 16%. То есть было протестировано только 16% всех операторов кода. Во время рефакторинга мы добавили больше тестов и достигли покрытия 65%! (Большая часть обнаруженного кода взята из функций, связанных с Mujoco, и, поскольку это коммерческий физический движок, с ним трудно постоянно интегрироваться).

Изменить: после дополнительного рефакторинга (GAIL и HER) покрытие теперь составляет 85%!

Исправление ошибок

Мы воспользовались комментариями к коду, чтобы исправить некоторые проблемы. Например, оболочка для наложения кадров работала только с изображениями в оттенках серого (полная история состоит в том, что предыдущее исправление ошибки от OpenAI было удалено одним из их новых коммитов…).

Примеры: «Говорить дешево. Покажи мне код »

В следующем разделе мы рассмотрим различные примеры использования стабильных базовых показателей. Мы рассмотрим базовое использование, сохранение / загрузку, многопроцессорность, построение графиков, обучение играм Atari и многое другое!

Список ноутбуков Colab

Основное использование: обучение, сохранение, загрузка

В следующем примере мы обучим, сохраним и загрузим модель A2C в среде Lunar Lander.

Связанный блокнот Colab: попробуйте онлайн!

Многопроцессорность: раскрытие возможностей векторизованных сред

Связанный блокнот Colab: попробуйте онлайн!

Мониторинг обучения с помощью Tensorboard

Новое в версии 2.0.0

OpenAI предоставил базовую поддержку тензорной платы (см. устаревшая интеграция в документации), мы добавили полную интеграцию тензорной платы (визуализация графика, кривые обучения и многое другое).

Чтобы включить ведение журнала тензорной платы, вам просто нужно заполнить аргумент tensorboard_log допустимым путем:

Код для воспроизведения эксперимента: https://gist.github.com/araffin/ee9daee110af3b837b0e3a46a6bb403b

Использование обратного вызова: обучение мониторингу

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

Связанный блокнот (включая черчение): попробуйте онлайн!

Игры Atari

Связанный блокнот: попробуйте онлайн!

Обучить RL-агента играм Atari очень просто благодаря вспомогательной функции make_atari_env. Он сделает всю предварительную обработку и многопроцессорность за вас.

Mujoco: нормализация функций ввода

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

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

Ретро Соник

Сеть настраиваемых политик

Стабильные базовые показатели предоставляют сети политик по умолчанию для изображений (CNNPolicies) и других типов входных данных (MlpPolicies). Однако вы также можете легко определить настраиваемую архитектуру для сети политик:

Бонус: непрерывное обучение

Вы также можете перейти от обучения в одной среде к другой для непрерывного обучения (PPO2 на DemonAttack-v0, затем перенесен на SpaceInvaders-v0):

Заключение

Мы представили Stable Baselines, вилку, цель которой - сделать обучение с подкреплением доступным для широкой аудитории. Мы упростили и унифицировали различные алгоритмы и теперь предоставляем интерфейс, похожий на scikit-learn, для экспериментов с RL.

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

Текущий WIP: добавлена ​​поддержка непрерывных действий для ACER / ACKTR

Эта статья написана в соавторстве с Эшли Хилл.

Благодарности

Стабильные базовые уровни созданы в лаборатории робототехники U2IS (команда INRIA Flowers) на ENSTA ParisTech.

Работа поддержана Проектом DREAM в рамках исследовательской и инновационной программы Европейского Союза Horizon 2020 FET по грантовому соглашению № 640891.

Об авторах

Мы оба проводим исследования в области обучения с подкреплением для робототехники. Основное внимание в наших исследованиях уделяется обучению с использованием представления состояний (извлечение признаков для RL). В свободное от работы время мы любим экспериментировать с проектами сделай сам, например, построить автономный гоночный автомобиль.

Список ноутбуков Colab

PS: Как сделать гифку обученного агента?