Управление моделируемым агентом через среду Unity

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

Чтобы перейти к коду, проверьте репозиторий GitHub здесь: https://github.com/cipher982/DRL-DQN-Model

Обучение с подкреплением → Q-Learning → Deep Q-Learning

Под эгидой машинного обучения мы обычно описываем 3 основных точки зрения:

  1. Неконтролируемое обучение
  2. Контролируемое обучение
  3. Обучение с подкреплением

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

Конкретная используемая модель называется Deep Q-Network. Впервые предложенный DeepMind в 2015 году, см. Статью здесь, в природе, он попытался включить глубокие нейронные сети и традиционное Q-Learning в единую структуру, которая могла бы лучше обобщать среды и справляться с большей сложностью непрерывных пространств состояний. и визуальные образы (относительно пространства состояний такой игры, как шахматы).

Основы Q-Network

Мы начинаем с традиционного метода Q-Learning, в котором у нас есть таблица возможных состояний и действий Q [S, A] и ожидаемое вознаграждение за каждую комбинацию. Когда агенту нужно действовать, он выбирает действие с максимальным ожидаемым значением для этого состояния в соответствии с Q-таблицей. Как указано выше, эта сложность быстро выходит из-под контроля при увеличении масштабов среды, и мы хотели бы сделать обобщение между наградами за состояние / действие, а не просто запоминать прошлое.

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

Используйте нейронные сети

Ключевой идеей нейронных сетей является подгонка паттернов, в частности возможность представлять сжатые соединения из ввода → вывода, которые в случае обучения с учителем могут иметь вид изображение → кошка или аудио → текст. В случае обучения с подкреплением мы пытаемся узнать состояние → действия / награды. Таким образом, учитывая конкретное состояние (например, относительное положение разных бананов по сравнению с моим агентом), модель будет выводить ожидаемую награду за каждое действие вперед / назад / влево / вправо. Ожидается, что он узнает, что если синий банан находится передо мной, а желтый - слева, агент повернет налево, а затем пойдет вперед.

Итак, с этими двумя идеями, приведенными выше, мы можем увидеть, как их объединение может решить проблемы, с которыми мы столкнулись в отношении сложности, и следующее, я думаю, является наиболее важной частью, чтобы понять:

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

То есть, если есть два местоположения (состояния) рядом друг с другом, которые постоянно приносят положительные награды, мы можем обобщить, что местоположения между этими двумя также должны давать положительные награды. Это очень простой пример, но он помогает донести суть дела.

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

В нашей модели у нас есть более упрощенная версия, в которой используются полносвязные слои, состоящие из:

  • пространство состояний 37, которое состоит из 37 измерений и содержит скорость агента, а также восприятие на основе лучей объектов вокруг прямого направления агента.
  • 2 скрытых слоя (по 64 узла)
  • вывод 4 действия

Вот как выглядит схема всех слоев, узлов и соединений:

(в зависимости от экрана может происходить странное искажение, исходное изображение пришлось немного уменьшить)

Выглядит довольно впечатляюще, все в таком виде! Но эта модель намного проще, чем большинство сетей приема изображений, например, для Atari.

Ниже приведен фрагмент кода, использованный для создания класса DQN:

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

Коррелированные входные данные

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

  • Случайная выборка из прошлого опыта
  • Фиксированная цель с использованием двух отдельных сетей.

Буфер воспроизведения

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

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

В приведенном ниже коде вы можете увидеть, как случайные индексы извлекаются из переменной опыта и передаются в указанное устройство PyTorch (GPU или CPU в зависимости от того, можете ли вы запустить CUDA).

Двойные сети (целевое - локальное)

Другая потребность, которая возникает при использовании политики нейронной сети, заключается в том, чтобы избежать нежелательных расхождений при отслеживании ошибок / потерь в вашей сети во время оценки. Хитрость здесь заключается в создании двух сетей (назовите их Target и Local) и временным замораживанием весов на одной (Target), следуя градиентам из локальной сети. В противном случае мы будем следовать за движущейся целью, что может привести к неконтролируемому расхождению градиентов и не является предпочтительным для стабильного процесса обучения.

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

Я надеюсь, что этого было достаточно, чтобы понять на концептуальном уровне, как это работает. Чтобы узнать больше, я настоятельно рекомендую Udacity Nanodegree для обучения с подкреплением, который я недавно использовал в большинстве своих руководств.

Запустите это сами!

  1. Загрузите среду по одной из ссылок ниже. Вам нужно только выбрать среду, соответствующую вашей операционной системе:
  1. Поместите файл в репозиторий GitHub и разархивируйте (или распакуйте) файл.
  2. Запустите python main.py в своем терминале, чтобы начать процесс обучения.