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

Большинство из вас, вероятно, слышали об искусственном интеллекте, который самостоятельно учится играть в компьютерные игры. Очень популярным примером является Deepmind, который попал в новости и покорил мир, когда их программа AlphaGo победила чемпиона мира по го из Южной Кореи в 2016 году.

Так в чем же секрет этого крупного прорыва? Придержи лошадей! Вы поймете это через пару минут.

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

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

Именно так работает обучение с подкреплением в более широком смысле!

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

Теперь, собрав все это воедино…

Задача Обучение с подкреплением (RL) - это обучение агента, который взаимодействует со своим окружающая среда. Агент переходит между различными сценариями среды, называемыми состояниями, выполняя действия. Действия, в свою очередь, приносят вознаграждение, которое может быть положительным, отрицательным или нулевым. Единственная цель агента - максимизировать понятие кумулятивного вознаграждения за эпизод, то есть все, что происходит между начальное состояние и конечное состояние, где мы определяем награды, которые соответствуют задачам, которые мы хотим выполнить.

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

Обучение с подкреплением - это одна из трех основных парадигм машинного обучения, наряду с контролируемое и обучение без учителя. Он касается эксплуатации или разведки.

Несколько важных моментов, на которые следует обратить внимание…

  1. Жадность не всегда работает
    Есть вещи, которые легко сделать для мгновенного удовлетворения, а есть вещи, которые приносят долгосрочное вознаграждение. Цель состоит в том, чтобы не быть жадным, просто стремясь к быстрому немедленному вознаграждению, а вместо этого оптимизировать его для получения максимального вознаграждения за все обучение.
  2. Последовательность имеет значение в обучении с подкреплением
    Агент вознаграждения зависит не только от текущего состояния, но и от всей истории состояний. В отличие от обучения с учителем и без учителя, здесь важно время.

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

  1. Наблюдение за окружающей средой
  2. Решение, как действовать, используя некоторую стратегию
  3. Действовать соответственно
  4. Получение вознаграждения или штрафа
  5. Изучение опыта и уточнение нашей стратегии
  6. Итерируйте, пока не найдете оптимальную стратегию

Возвращение к AlphaGo

AlphaGo - классический пример агента RL, в котором агент научился играть в игру Go, чтобы получить максимальное вознаграждение. В этом руководстве давайте разберемся в обучении с подкреплением, фактически разработав агента, который автоматически научится играть в игру.

Обучение с подкреплением не ограничивается играми!

Он используется для управления портфелями запасов и финансами, для создания роботов-гуманоидов, для производства и управления запасами, для разработки общих агентов ИИ и т. Д.

Разработка самоуправляемой кабины с нуля

Давайте создадим симуляцию S elf-Driving Smart Cab. Основная цель - продемонстрировать в упрощенной среде, как можно использовать методы RL для разработки эффективного и безопасного подхода к решению этой проблемы.

Задача Smart Cab - забрать пассажира в одном месте и высадить его в другом. Мы хотим, чтобы наша Smart Cab позаботилась о следующих вещах:

  • Высадите пассажира в нужном месте.
  • Экономьте время пассажиров, тратя минимальное время на высадку.
  • Позаботьтесь о безопасности пассажиров и правилах дорожного движения.

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

1. Награды

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

  • Агент должен получить высокую положительную награду за успешное прекращение работы, потому что такое поведение очень желательно.
  • Агент должен быть наказан, если он пытается высадить пассажира в неправильном месте.
  • Агент должен получать немного отрицательное вознаграждение за то, что не добрался до пункта назначения после каждого временного шага.
  • «Слегка» отрицательно, потому что мы бы предпочли, чтобы наш агент опаздывал, а не делал неправильные шаги, пытаясь добраться до места назначения как можно быстрее.

2. Государственное пространство

В RL агент обнаруживает состояние, а затем выполняет действие в соответствии с состоянием, в котором он находится.

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

Допустим, у нас есть тренировочная площадка для нашей Smart Cab, где мы обучаем ее перевозить людей на стоянке в четыре разных места (R, G, Y, B):

Предположим, что Smart Cab - единственный автомобиль на этой стоянке. Мы можем разбить парковку на сетку 5x5, что дает нам 25 возможных мест для стоянки такси. Эти 25 локаций являются частью нашего государственного пространства. Текущее местоположение нашего такси - (3, 1).

Есть 4 места, где мы можем забрать и высадить пассажира: R, G, Y, B или [(0,0), (0,4), (4,0), (4,3)] в координатах (строка, столбец). Наш пассажир находится в местоположении Y, и они хотят отправиться в местоположение R.

Если у нас есть 1 дополнительное состояние пассажира внутри такси, мы можем взять все комбинации местоположений пассажиров и мест назначения, чтобы прийти к общему количеству состояний для нашей среды такси; есть 4 пункта назначения и пять (4 + 1) пассажирских мест.

Итак, наша среда такси имеет 5 × 5 × 5 × 4 = 500 всего возможных состояний. (Местоположение такси - 5 × 5, местоположение пассажира - 5 и место назначения - 4)

3. Пространство действий

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

Другими словами, у нас есть шесть возможных действий:

  1. south
  2. north
  3. east
  4. west
  5. pickup
  6. dropoff

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

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

К счастью, в OpenAI Gym уже создана именно такая среда.

OpenAI Gym предоставляет различные игровые среды, которые мы можем вставить в наш код и протестировать агент. Библиотека заботится об API для предоставления всей информации, которая может потребоваться нашему агенту, такой как возможные действия, оценка и текущее состояние. Нам просто нужно сосредоточиться только на части алгоритма для нашего агента.

Мы будем использовать среду тренажерного зала под названием Taxi-V2, из которой взяты все описанные выше детали.

Интерфейс спортзала

Нам нужно сначала установить gym . Выполнение следующего кода должно работать:

!pip install cmake 'gym[atari]' scipy

После установки мы можем загрузить игровую среду и визуализировать, как она выглядит:

import gym  
env = gym.make("Taxi-v2").env  
env.render()

Основным интерфейсом тренажерного зала является env, который представляет собой интерфейс унифицированной среды.

Ниже приведены env методы, с которыми мы могли бы столкнуться в коде.

env.reset : сбрасывает среду и возвращает случайное начальное состояние.

env.step(action) : перемещается по среде на один временной шаг. Возврат

  • наблюдение: наблюдения за окружающей средой
  • вознаграждение: было ли ваше действие полезным или нет
  • Готово: указывает, успешно ли мы подобрали и высадили пассажира, это также называется одной серией
  • информация: дополнительная информация, такая как производительность и задержка, для целей отладки.
  • env.render : визуализирует один кадр среды (полезно для визуализации среды)

Вот наша реструктурированная формулировка проблемы (из Gym docs):

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

Давайте углубимся в окружающую среду -

env.reset() # reset environment to a new, random state 
env.render()  
print("Action Space {}".format(env.action_space)) 
print("State Space {}".format(env.observation_space))

Action Space Discrete(6)
State Space Discrete(500)
  • заполненный квадрат представляет такси, которое желтого без пассажира и зеленый с пассажиром.
  • труба (‘|’) представляет собой стену, которую такси не может пересечь.
  • R, G, Y, B - возможные места получения / назначения. синяя буква обозначает место получения текущего пассажира, а фиолетовая буква - это пункт назначения.

У нас есть Пространство действия размера 6 и Пространство состояний размер 500. RL учится выбирать номер действия из возможных действий 0–5, где:

  • 0-south
  • 1-north
  • 2-east
  • 3-west
  • 4-pickup
  • 5-dropoff

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

Оптимальное действие для каждого состояния - это действие, которое дает самую высокую совокупную долгосрочную награду.

Вернемся к нашей иллюстрации…

Давайте возьмем нашу иллюстрацию, закодируем ее состояние и передадим в среду для рендеринга в gym. Напомним, что наше такси находится в строке 3, столбце 1, наш пассажир находится в местоположении 2, а пункт назначения - местоположении 0. Используя метод кодирования состояния Taxi-V2, мы можем сделать следующее:

state = env.encode(3, 1, 2, 0) 
#(taxi row, taxi column, passenger index, destination index)
print("State:", state)
env.s = state
env.render()

State: 328

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

Затем мы можем установить состояние среды вручную с помощью env.env.s, используя это закодированное число. Вы можете поиграть с числами, и вы увидите, как такси, пассажир и пункт назначения перемещаются.

Таблица вознаграждений

Когда создается среда Такси, создается начальная таблица вознаграждений, которая называется P. Мы можем думать об этом как о матрице, которая имеет количество состояний в виде строк и количество действий в виде столбцов. , т.е. матрица состояний × действий.

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

env.P[328]

Вывод:

{0: [(1.0, 428, -1, False)],
 1: [(1.0, 228, -1, False)],
 2: [(1.0, 348, -1, False)],
 3: [(1.0, 328, -1, False)],
 4: [(1.0, 328, -10, False)],
 5: [(1.0, 328, -10, False)]}

Этот словарь имеет структуру {action: [(probability, nextstate, reward, done)]}.

Несколько замечаний:

  • 0–5 соответствует действиям (юг, север, восток, запад, пикап, высадка), которые такси может выполнять в текущем состоянии.
  • В этом окружении probability всегда 1.0.
  • nextstate - это состояние, в котором мы были бы, если бы предприняли действие по этому индексу словаря.
  • Все действия движения имеют -1 награду, а действия подъема / высадки имеют -10 награду в этом конкретном состоянии. Если мы находимся в состоянии, когда в такси есть пассажир, и оно находится наверху нужного пункта назначения, мы увидим награду в размере 20 за действие высадки (5).
  • done используется, чтобы сообщить нам, когда мы успешно высадили пассажира в нужном месте. Каждый успешный переход - это конец серии.

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

Начало обучения с подкреплением

Мы собираемся использовать простой алгоритм RL под названием Q-learning, который даст нашему агенту немного памяти.

Дополнительные сведения о Q-Learning см. В моем блоге -

Введение в Q-Learning для задачи с самоуправляемой кабиной

Реализация Q-Learning в Python

Обучение агента

Сначала инициализируем Q-таблицу матрицей нулей 500 × 6500 × 6:

import numpy as np
q_table = np.zeros([env.observation_space.n, env.action_space.n])

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

В первой части while not done мы решаем, следует ли выбрать случайное действие или использовать уже вычисленные Q-значения. Это делается просто путем использования значения epsilon и его сравнения с функцией random.uniform(0, 1), которая возвращает произвольное число от 0 до 1.

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

Вывод:

Episode: 100000
Training finished.
Wall time: 30.6 s

Теперь, когда Q-таблица была составлена ​​для 100 000 эпизодов, давайте посмотрим, каковы Q-значения в состоянии нашей иллюстрации:

q_table[328]

Вывод:

array([ -2.30108105,  -1.97092096,  -2.30357004,  -2.20591839,
       -10.3607344 ,  -8.5583017 ])

Максимальное значение Q равно «север» (-1,971), поэтому похоже, что Q-Learning эффективно научился тому, как лучше всего действовать в состоянии нашей иллюстрации!

Оценка агента

Пришло время оценить работу нашего агента ...

Вывод:

Results after 100 episodes:
Average timesteps per episode: 12.3
Average penalties per episode: 0.0

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

Сравнение нашего агента Q-Learning с обучением без подкрепления

Давайте посмотрим, насколько лучше наше решение Q-Learning по сравнению с агентом, просто делающим случайные ходы.

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

Решение проблемы с самоуправляемой кабиной без обучения с подкреплением

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

Мы оцениваем наших агентов по следующим показателям:

  • Среднее количество штрафов за серию (чем меньше, тем лучше)
  • Среднее количество временных шагов за поездку (чем меньше, тем лучше)
  • Среднее вознаграждение за ход (чем больше, тем лучше)

Похоже, наш агент Q-Learning справился с этим!

Настройка гиперпараметров

Значения альфа, гамма и эпсилон в основном основывались на интуиции и удаче и пробе, но есть способы лучше ценности.

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

Заключение и что впереди

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

Затем мы увидели, насколько ужасен наш агент, не используя какой-либо алгоритм для ведения игры, поэтому мы приступили к реализации алгоритма Q-Learning с нуля. После Q-Learning производительность агента значительно улучшилась.

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

Современные методы используют глубокие нейронные сети вместо Q-таблицы (глубокое обучение с подкреплением). Нейронная сеть принимает информацию о состоянии и действиях на входной уровень и учится выводить правильное действие с течением времени.

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

  • Превратите этот код в модуль функций, который может использовать несколько сред
  • Настройте альфа, гамма и / или эпсилон, используя затухание по эпизодам
  • Реализуйте поиск по сетке, чтобы найти лучшие гиперпараметры

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

- Эндрю Нг

Ссылки на другие мои блоги:

Решение проблемы с самоуправляемой кабиной без обучения с подкреплением

Введение в Q-Learning для задачи с самоуправляемой кабиной