Введение и реализация алгоритма глубокого обучения с подкреплением

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

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

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

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

В этом руководстве я собираюсь обучить агента работе с Acrobot. Pytorch будет использоваться для реализации сети Deep Q, а ноутбук Google Colab будет использоваться, поскольку он предоставляет бесплатный графический процессор для ускорения обучения.

Таблица содержания:

  1. OpenAI Gym
  2. Установить и импортировать библиотеки
  3. Площадки для действий и наблюдений
  4. Случайный агент
  5. Внедрить сеть Deep Q
  6. Опыт повтора
  7. Эпсилон-Жадная Политика
  8. Политика Softmax
  9. Профиль разведки
  10. "Обучение"

1. Тренажерный зал OpenAI

Gym - это библиотека с открытым исходным кодом, в которой реализованы алгоритмы обучения с подкреплением [1]. Есть много обучающих агентов, которые можно тренировать, например Cart-Pole и Pong. В этом руководстве я сосредоточусь на среде Acrobot. В предыдущем уроке я хорошо объяснил, как работает игра, если вы хотите разобраться в ней глубже.

2. Установите и импортируйте библиотеки.

Нам нужно установить и импортировать пакеты Python. Самый важный пакет - тренажерный зал, который обеспечивает среду обучения с подкреплением. Есть и другие полезные библиотеки, например:

  • torch.nn для реализации сети Deep Q
  • IPython.display и pyvirtualdisplay.display необходимы для создания виртуального дисплея для рисования игровых изображений на
  • collections является альтернативой базовым объектам Python, таким как список, кортеж, словарь, набор. Он используется для хранения опыта агента.

3. Площадки для действий и наблюдений

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

Пространство действий дискретно, поэтому действие может быть одним из следующих неотрицательных чисел: [0,1,2]. В отличие от пространства действий, пространство наблюдения - это Box, который представляет собой n-мерный ящик. Тогда каждое наблюдение будет массивом из 6 чисел с диапазоном от -28 до 28.

4. Случайный агент

Это пример запуска агента, который просто случайным образом выбирает действие. Среда Acrobot будет работать в течение 10 эпизодов, показывая видео игры на каждом этапе. Перед запуском агента мы определяем функции для визуализации видео среды. Эти функции необходимы для включения рендеринга тренажерного зала в Google Colab.

Наконец, мы запускаем случайный агент для 10 временных шагов:

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

  • Агент - это роботизированная рука, состоящая из двух суставов и двух звеньев, и соединение между этими двумя звеньями приводится в действие.
  • Среда соответствует среде Acrobot.
  • Состояние состоит из массива из 6 чисел.
  • Действие: есть 3 возможных действия.
  • Вознаграждение: -1 на каждом этапе.

Следуя определению взаимодействия агента и среды в MDP из книги Reinforcement Learning: An Introduction, написанной Саттоном и Барто, мы знаем, что:

Агент и среда взаимодействуют на каждом из последовательных дискретных временных шагов, t = 0,1,2,3,…. На каждом временном шаге t агент получает некоторое представление о состоянии среды и на основе этого выбирает действие. Спустя один временной шаг, частично в результате своего действия, агент получает числовое вознаграждение и оказывается в новом состоянии [3].

Итак, цикл агент-среда реализован: в каждом эпизоде ​​мы получаем:

  • исходное состояние вызов env.reset
  • агент выбирает случайное действие, которое принимает одно из значений [0,1,2]
  • В функции step применяется случайное действие и возвращаются четыре значения: новое состояние, вознаграждение, полученное на предыдущем шаге, флаг выполнено , который имеет значение True, когда игра завершена и диагностическая информация используется для отладки.
  • Установите текущее состояние для следующей итерации

Теперь мы вызываем функцию show_videos, чтобы показать видео, по одному для каждого эпизода:

show_videos()

5. Внедрение сети Deep Q

В этом разделе я покажу, как реализовать сеть Deep Q с Pytorch в игре Acrobot. Модель представляет собой нейронную сеть, которая принимает в качестве входных данных размерность пространства состояний и возвращает оптимальное q-значение, соответствующее каждому возможному действию. Поскольку существует три возможных действия для перемещения роботизированной руки, количество возвращаемых выходов равно 3.

6. Воспользуйтесь воспроизведением.

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

Для воспроизведения опыта мы сохраняем опыт агента e_t = (состояние, действие, следующее состояние, награда) на каждом временном шаге t в наборе данных D_t = {e_1,…, e_t}. Во время обучения мы применяем обновления Q-обучения к образцам (или минипакетам) опыта (s, a, r, s ’) ~ U (D), равномерно выбранным случайным образом из пула сохраненных образцов [4].

На практике нам нужна очередь с заранее определенной емкостью. Когда мы достигнем максимальной емкости, самый старый элемент в очереди будет заменен новым. Это поведение может быть достигнуто с помощью объекта deque из библиотеки коллекций python.

Максимальная емкость - это единственный ввод, запрашиваемый объектом ReplayMemory. Таким образом, мы определяем атрибут памяти, равный объекту deque с максимальной емкостью.

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

Метод sample предназначен для демонстрации опыта по памяти. Количество опытов равно batch_size. Мы получаем все сэмплы, если запрошенный размер пакета превышает количество сэмплов, находящихся в настоящее время в памяти.

7. Жадная политика Эпсилон

После воспроизведения опыта следующим шагом будет выбор и выполнение действия в соответствии с политикой epsilon-greedy. Эта политика выбирает случайное действие с вероятностью эпсилон, в противном случае выбирает наилучшее действие, соответствующее наивысшему значению Q. Основная идея состоит в том, что агент исследует среду, а не использует ее вначале. Чем больше агент узнает от окружающей среды, тем больше он будет выбирать оптимальные действия, основанные на эксплуатации.

8. Политика Softmax

Политика Softmax используется для выбора оптимального действия на основе распределения, полученного с применением softmax к расчетным значениям Q с учетом температурного параметра. Возможны два случая:

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

9. Профиль разведки

Мы определяем экспоненциально убывающий профиль разведки, используя политику softmax:

softmax_temperature = начальная_температура * экспоненциальный_распад ^ (i)

10. Обучение

Мы можем инициализировать гиперпараметры, такие как оптимизатор SGD и функцию потерь Хубера, объект ReplayMemory, сеть политик и целевую сеть.

Функция update_step определена для выполнения одного шага оптимизации. Сначала он производит выборку пакета из памяти воспроизведения. После этого он создает тензоры для каждого элемента пакета. Он также вычисляет маску незавершенных состояний и объединяет элементы пакета.

Позже он вычисляет все Q-значения сети политик с учетом фактических состояний. В отличие от сети политики, функция значения вычисляется на основе следующих состояний с использованием целевой сети.

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

Пришло время обучить агент обучения Deep Q, работающий с 800 эпизодами. В цикле for нам нужно только вызвать все функции, определенные ранее. Мы также будем показывать видео каждые 100 серий.

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

Вначале накопленное вознаграждение остается -500. После 200 эпизодов оценка экспоненциально увеличивается, оставаясь неизменной на уровне -100. Последний шаг - проверить, действительно ли агент научился решать свою задачу. Он похож на реализованный ранее случайный агент. Вместо того, чтобы выполнять случайное действие, мы выбираем оптимальное действие с параметром температуры, установленным равным 0. Таким образом, политика softmax всегда будет выбирать действие с наивысшим значением Q.

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

Последние мысли:

В этом руководстве я представил обзор построения сети Deep Q с помощью Pytorch. Чтобы лучше понять это, лучше всего разбить код на стандартные блоки и каждый раз сосредотачиваться на одном блоке. Поначалу это может показаться трудным, если вы раньше пробовали только контролируемые и неконтролируемые методы. Но после некоторых усилий вы сможете понять это и даже применить сеть deep q к другим средам. Код Github находится здесь.

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

[1] https://gym.openai.com/docs/

[2] https://pytorch.org/tutorials/intermediate/reinforcement_q_learning.html

[3] https://web.stanford.edu/class/psych209/Readings/SuttonBartoIPRLBook2ndEd.pdf

[4] https://www.nature.com/articles/nature14236