Решение задач с разреженным вознаграждением с помощью Curiosity

ARTHUR JULIANI / UNITY TECHNOLOGIESContributor
Jun 26, 2018|7 Мин
Решение задач с разреженным вознаграждением с помощью Curiosity
Эта веб-страница была переведена с помощью машинного перевода для вашего удобства. Мы не можем гарантировать точность или надежность переведенного контента. Если у вас есть вопросы о точности переведенного контента, обращайтесь к официальной английской версии веб-страницы.

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

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

Исследование, вызванное любопытством

Когда речь идет о Reinforcement Learning, основной сигнал обучения поступает в виде награды: скалярного значения, предоставляемого агенту после каждого принятого им решения. Это вознаграждение обычно предоставляется самой средой и задается ее создателем. Эти награды часто соответствуют таким вещам, как +1.0 за достижение цели, -1.0 за смерть и т.д. Мы можем считать, что вознаграждения такого рода являются внешними, поскольку они приходят извне. Если есть внешние вознаграждения, значит, должны быть и внутренние. Внутренние вознаграждения не предоставляются окружением, а генерируются самим агентом на основе некоторых критериев. Конечно, не всякая внутренняя награда подойдет. Мы хотим получить внутреннее вознаграждение, которое в конечном итоге послужит какой-то цели, например, изменит поведение агента таким образом, что в будущем он получит еще большее внешнее вознаграждение, или что агент будет исследовать мир больше, чем мог бы в противном случае. У людей и других млекопитающих стремление к таким внутренним вознаграждениям часто называют внутренней мотивацией и тесно связывают с чувством собственной значимости.

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

Мы выбрали для реализации один конкретный подход из недавно опубликованной в прошлом году работы Дипака Патхака и его коллег из Беркли. Она называется Curiosity-driven Exploration by Self-supervised Prediction, и вы можете прочитать статью здесь, если вам интересны все подробности. В статье авторы формулируют идею любопытства в умной и обобщающей форме. Они предлагают обучать две отдельные нейросети: прямую и инверсную модели. Инверсная модель обучается принимать текущее и следующее наблюдение, полученное агентом, кодировать их оба с помощью одного кодера и использовать результат для предсказания действия, которое было предпринято в период между появлением этих двух наблюдений. Затем прямая модель обучается принимать закодированное текущее наблюдение и действие и предсказывать закодированное следующее наблюдение. Разница между предсказанным и реальным кодированием используется как внутреннее вознаграждение и передается агенту. Большая разница означает большее удивление, что, в свою очередь, означает большее внутреннее вознаграждение.

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

Изображение
Диаграмма, показывающая модуль Intrinsic Curiosity. Белые поля соответствуют вводу. Синие поля соответствуют слоям и выходам нейронной сети. Заполненные синие линии соответствуют потоку активации в сети. Зеленые пунктирные линии соответствуют сравнениям, использованным для расчета потерь. Зеленый квадрат соответствует расчету внутренней награды.
Окружение пирамид

Для того чтобы проверить любопытство, не подойдет ни одна обычная среда. Большинство примеров окружений, которые мы выпустили в версии 0.3 инструментария ML-Agents, содержат награды, которые относительно плотные и не сильно выиграют от любопытства или других методов улучшения исследования. Чтобы проверить новообретенное любопытство нашего агента, мы создали новую среду с редкими вознаграждениями под названием Pyramids. В ней существует только одна награда, и случайное исследование редко позволяет агенту встретить ее. В этой среде наш агент принимает форму синего куба, знакомого нам по некоторым предыдущим средам. Агент может двигаться вперед или назад, поворачивать влево или вправо, и ему доступен обзор окружающего мира с помощью серии лучей, исходящих из передней части куба.

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

Этот агент опускается в замкнутое пространство, состоящее из девяти комнат. В одной из этих комнат находится случайно расположенный переключатель, а в других - случайно расположенные неподвижные каменные пирамиды. Когда агент взаимодействует с выключателем, сталкиваясь с ним, выключатель превращается из красного в зеленый. Вместе с этой сменой цвета в одной из многочисленных комнат случайным образом появляется пирамида из подвижных песочных кирпичей. На вершине этой пирамиды находится один золотой кирпич. Когда агент сталкивается с этим кирпичом, он получает +2 внешнее вознаграждение. Фишка в том, что здесь нет промежуточных наград за перемещение в новые комнаты, щелчок выключателя или опрокидывание башни. Агент должен научиться выполнять эту последовательность без какой-либо промежуточной помощи.

Изображение
Агент, обученный PPO+Curiosity, переходит к пирамиде после взаимодействия с переключателем.

Агенты, обученные с помощью ванильного алгоритма Proximal Policy Optimization (PPO, наш стандартный RL-алгоритм в ML-Agents), плохо справляются с этой задачей, нередко оказываясь лучше случайности (средняя награда -1), даже после 200 000 шагов.

В отличие от этого, агенты, обученные PPO и внутреннему вознаграждению Curiosity-Driven, неизменно решают эту задачу в течение 200 000 эпизодов, а часто даже вдвое быстрее.

изображение
Кумулятивное внешнее вознаграждение с течением времени для агента PPO+Curiosity (синий) и агента PPO (красный). В среднем по пять пробежек.

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

Использование любопытства с PPO

Если вы хотите использовать любопытство для обучения агентов в своих средах, вы легко сможете это сделать. Во-первых, возьмите последнюю версию инструментария ML-Agents, затем добавьте следующую строку в файл гиперпараметров мозга, который вы хотите тренировать: `use_curiosity: true`. После этого вы можете начать процесс обучения, как обычно. Если вы используете TensorBoard, вы заметите, что теперь отслеживается несколько новых показателей. К ним относятся прямые и обратные потери модели, а также кумулятивное внутреннее вознаграждение за эпизод.

Любопытство вашего агента поможет не во всех ситуациях. Особенно если ваше окружение уже содержит плотную функцию вознаграждения, как, например, наши окружения Crawler и Walker, где за большинство действий можно получить ненулевое вознаграждение, вы можете не заметить значительного улучшения. Если ваше окружение содержит лишь скудные вознаграждения, то добавление внутренних вознаграждений может превратить эти задачи из неразрешимых в легко разрешимые с помощью Reinforcement Learning. Это применимо, особенно когда речь идет о простых вознаграждениях, таких как победа/поражение или выполнение/невыполнение заданий.

---

Если вы используете функцию Curiosity, я буду рад услышать о вашем опыте. Не стесняйтесь обращаться к нам на странице проблем на GitHub или пишите нам напрямую по адресу ml-agents@unity3d.com. Счастливого обучения!