Обучение с подкреплением для начинающих

Обучение с подкреплением - научите такси водить машину с помощью Q-Learning

Мягкое введение в RL с OpenAI-gym и Python

Я много играл с машинным обучением для развлечения и для работы. Я построил модели глубокого обучения с помощью PyTorch и TensorFlow для НЛП, зрения и здравоохранения. Тем не менее, обучение с подкреплением все еще оставалось для меня загадкой, и много читать о Deepmind, AlphaGo и т. Д. Было очень интригующим. Имея немного больше времени, я решил глубоко погрузиться в RL, чтобы попытаться понять основы.

Я решил использовать простой базовый пример, совместимый с Python, и OpenAI-gym - очень хороший фреймворк для начала. В качестве игрушечного примера я выбрал среду такси. Эта среда очень проста:

Есть 4 места (помечены разными буквами), и ваша задача - забрать пассажира в одном месте и высадить его в другом. Вы получаете +20 баллов за успешный переход и теряете 1 балл за каждый временной шаг. Также существует штраф в размере 10 баллов за незаконную посадку и высадку.

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

состояния

В RL состояние - это… ну, состояние, в котором находится ваш агент (ваше такси). В задаче с такси состояние описывается местоположением в сетке (строка и номер столбца от 0 до 4), место высадки пассажира из четырех вариантов, а также пассажира, который может находиться в одном из четырех мест или внутри такси.

Если вы хорошо посчитаете, то у нас будет 5x5x5x4 = 500 возможных состояний.

Действия

Действия сейчас. Всего шесть возможных действий. На своем такси вы можете попробовать двигаться по четырем сторонам света: юг, север, восток или запад. Это не значит, что ход ни разрешен, ни возможен. Есть также два других возможных действия: поднять или высадить, всего шесть действий.

  • 0 = Юг
  • 1 = север
  • 2 = Восток
  • 3 = Запад
  • 4 = Самовывоз
  • 5 = Падение

Обратите внимание, что вы не будете больше наказаны, если попытаетесь переехать в неавторизованное место. Например, на рисунке выше вы не можете двигаться на запад, но все равно получаете штраф -1, ни больше ни меньше. То же самое происходит, когда вы пытаетесь переместиться дальше сетки 5x5. Однако вы будете серьезно наказаны, если попытаетесь забрать или высадить пассажира в неправильном месте.

Играйте с OpenAI-gym и python

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

Рендеринг

Первый шаг - визуализировать случайную среду.

Новую среду также легко создать, вызвав reset метод state = env.reset().

Передвигаться

Когда вы пытаетесь играть в среде, вы должны сказать ей, что вы хотите делать, какие действия предпринимаете. Например, в приведенном выше примере вы можете пойти в северном направлении. Действие на север имеет код 1, поэтому для выполнения шага в этом направлении мы вызываем

Этот вызов возвращает кортеж (204, -1, False, {'prob': 1.0}), компоненты которого

  • состояние: новое состояние среды, кодируется от 1 до 500.
  • награда: награда, которую вы получили за свое действие. -1 означает, что вы просто переехали
  • done: логическое значение, указывающее, успешно ли мы высадили пассажира, которого забрали ранее.
  • info: информация, не имеющая отношения к нашему использованию.

Обратите внимание, что мы могли выбрать действие случайным образом. gym framework предоставляет нам полезный метод для этого env.action_space.sample().

Мягкое введение в Q-Learning

Итак, что такое Q-Learning? Я знал, что для обучения модели глубокого обучения мне нужно много данных, возможно, аннотированных данных, и мне нужен был метод, позволяющий модели изучить функцию, чтобы минимизировать ошибку между данными обучения и их предсказанием. Однако в обучении с подкреплением используется другой подход. Здесь нам нужно, чтобы наш агент исследовал свое окружение и позволял ему решать, какое действие предпринять, чтобы максимизировать ожидаемое вознаграждение. Итак, прямо сейчас мы видим фундаментальную концепцию RL, которая представляет собой компромисс между исследованием (окружающей среды) и использованием (того, что он узнал).

Теперь, как вы исследуете новую среду и используете то, что узнали из своего опыта? Представьте, что вы попали в лабиринт. Вы знаете, что выход есть, и вам нужно его найти. Представьте, что у вас отличная память, достаточно большая, чтобы запомнить большое количество ваших последних ходов. Имея это в виду, вы можете представить, что можете восстановить мысленный образ лабиринта, чтобы иметь возможность отступить и исследовать новый путь к выходу. Конечно, вы будете вознаграждены, если вам удастся найти выход с конфетами :) То, что вы только что сконструировали, представляет собой своего рода стол, за которым вы точно знаете, что делать, куда идти из любой точки лабиринта, чтобы найти выход. В RL эта таблица известна как Q-таблица.

Q-таблица - это таблица, в которой вы найдете Q-value для каждой пары (state, action). Для каждого state у нас может быть несколько возможныхactions, то есть несколько Q-values. Цель состоит в том, чтобы научиться выбирать более высокое Q-value для каждого state, что означает выбор action с наилучшими шансами получить максимальное вознаграждение.

Чтобы начать обучение, Q-table обычно инициализируется случайным образом (или инициализируется значением 0). Затем агент исследует свое окружение, случайным образом выбирая действие и получая вознаграждение за свое действие. Идея состоит в том, чтобы позволить агенту исследовать окружающую среду и получать вознаграждение. Но через некоторое время нам нужно использовать собранную информацию. Из заданного state агент должен вычислить ожидаемое вознаграждение за каждое действие, которое он может предпринять, и выбрать то, которое дает максимальное ожидаемое вознаграждение:

Ядро RL затем задается уравнением Беллмана, которое говорит нам, как обновить Q-values Q-table:

куда

  • α - скорость обучения
  • γ - коэффициент скидки, позволяющий придать большее или меньшее значение следующему вознаграждению.

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

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

Мы уже упоминали об этом несколько раз, но теперь мы более четко видим, в чем заключается компромисс между исследованием и использованием. Если мы позволим агенту всегда выбирать действие случайным образом, он может в конечном итоге изучить Q-table, но этот процесс никогда не будет эффективным. Напротив, если мы выберем действие, основанное только на максимизации Q-value, агент будет всегда следовать одному и тому же маршруту, перекрывая текущую настройку среды. Кроме того, он будет страдать от большой дисперсии, поскольку он не сможет найти правильный маршрут в другой настройке среды.

Чтобы предотвратить возникновение этих двух сценариев и попытаться найти компромисс, мы добавляем еще один гиперпараметр эпсилон ϵ, который представляет собой вероятность, с которой мы выбираем случайное действие вместо действия, вычисленного из Q-table. Игра с этим параметром позволяет нам найти равновесие.

Реализация на Python

Я знаю, что вы ищете, поэтому сначала код

Все просто, правда? Но как бы удивительно это ни выглядело, этот фрагмент кода учится Q-table, исследуя среду, без каких-либо исторических данных с хорошей маркировкой, точно так же, как это сделал бы базовый интеллект. Потрясающие!

Но, чтобы вас убедить, почему бы не поиграть с нашей новой игрушкой?

Заключение

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

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

Кроме того, следите за обновлениями, чтобы объединить оба мира RL и DL, заменив Q-table на модель DL в ближайшем посте!