Знакомство с Deep Q-Learning: давайте поиграем в Doom

1656639985 znakomstvo s deep q learning davajte poigraem v doom

Томас Симонини

1*HtKKEcDPWBouD813vU_KJg

Эта статья является частью курса глубокого подкрепления из Tensorflow?️. Проверьте приложение здесь.

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

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

Эта статья является третьей частью серии публикаций в блоге о Deep Reinforcement Learning. Для получения дополнительной информации и дополнительных ресурсов просмотрите программу курса.

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

Благодаря этой модели мы сможем создать агента, который научится играть в Doom!

1*Q4XjhLC0IAOznnk5613PsQ
Наш агент DQN

В этой статье вы узнаете:

  • Что такое Deep Q-Learning (DQL)?
  • Какие лучшие стратегии использовать с DQL?
  • Как решить проблему временных ограничений
  • Почему мы используем воспроизведение опыта
  • Какая математика стоит за DQL
  • Как это реализовать в Tensorflow

Добавление «Глубокого» к Q-Learning

В прошлой статье мы создали агента, играющего в Frozen Lake благодаря алгоритму Q-обучения.

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

Представьте, что мы будем сегодня делать. Мы создадим агента, который научится играть в Doom. Doom – это большая среда с гигантским пространством состояний (миллионы разных состояний). Создание и обновление Q-таблицы для этой среды вообще не будет эффективным.

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

1*w5GuxedZ9ivRYqM_MLUxOQ

Как работает Deep Q-Learning?

Это будет архитектура нашего Deep Q Learning:

1*LglEewHrVsuEGpBun8_KTg

Это может показаться сложным, но я объясню архитектуру шаг за шагом.

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

Вначале агент справляется очень плохо. Но со временем он начинает связывать кадры (состояния) с лучшими действиями.

Часть предварительной обработки

1*QgGnC_0BkQEtPqMUftRC6A

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

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

Затем обрезаем кадр. В нашем примере видеть крышу не очень полезно.

Затем убавляем размер рамы, и складываем четыре подрамки вместе.

Проблема временной ограниченности

Артур Джулиани дает удивительное объяснение по этой теме в своей статье. У него есть разумная идея использовать нейронные сети LSTM для решения проблемы.

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

Первый вопрос, который вы можете задать, почему мы составляем фреймы вместе?

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

Возьмем, к примеру, игру в понг. Когда вы видите этот кадр:

1*0lwyObh4p-jQjk19Q6qyIg

Можете ли вы сказать мне, куда летит мяч?

Нет, потому что одного кадра недостаточно, чтобы иметь чувство движения!

Но что если я добавлю еще три кадра? Здесь вы можете увидеть, что мяч идет направо.

1*MooQJUIkR_FVV2weeVPr8A

То же касается нашего агента Doom. Если мы даем ему только один кадр за раз, у него не будет никакого представления о движении. И как ему принять правильное решение, если он не может определить, куда и с какой скоростью движутся объекты?

Использование сверточных сетей

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

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

Каждый слой свертки будет использовать ELU в качестве функции активации. Было подтверждено, что ELU является хорошей функцией активации для слоев свертки.

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

Воспроизведение опыта: более эффективное использование наблюдаемого опыта

Воспроизведение опыта поможет нам решить две вещи:

  • Избегайте забывать предыдущий опыт.
  • Уменьшить корреляции между опытом.

Я объясню эти два понятия.

Эта часть и иллюстрации были вдохновлены потрясающим объяснением в разделе Deep Q Learning в Deep Learning Foundations Nanodegree от Udacity.

Избегайте забывать предыдущий опыт

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

Помните, в первой статье (Введение в учебу с подкреплением) мы говорили о процессе обучения с подкреплением:

1*aKYFRoEmmKkybqJOvLt2JQ

На каждом шагу времени мы получаем кортеж (состояние, действие, награда, новое состояние). Мы учимся на этом (мы питаем кортеж в нашей нейронной сети), а затем бросаем этот опыт.

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

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

1*p4lfgKLiollqbkWYZ_jnlg
Научившись играть на водном уровне, наш агент забудет, как вести себя на первом уровне

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

Наше решение: создать «буфер воспроизведения». Это сохраняет кортежи опыта при взаимодействии со средой, а затем мы отбираем небольшую партию кортежей для питания нашей нейронной сети.

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

1*RFt8MBBkUSPZdolp_WfZFA

Это не позволяет сети узнать только о том, что она немедленно сделала.

Уменьшение корреляции между переживаниями

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

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

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

Понять это будет легче на примере. Предположим, мы играем в шутер от первого лица, где монстр может появиться налево или направо. Цель нашего агента – застрелить монстра. Он имеет два орудия и два действия: стрелять влево или стрелять вправо.

1*IxrNQjJCa-WiLzoe0zPojQ
В таблице приведены приближенные значения Q

Мы учимся с заказанным опытом. Скажем, мы знаем, что если мы стреляем в монстра, то вероятность того, что следующий монстр прилетит с того же направления, составляет 70%. В нашем случае это корреляция между кортежами нашего опыта.

Начнём обучение. Наш агент видит монстра направо и стреляет в него из правого пистолета. Это верно!

Тогда следующий монстр тоже приходит справа (с вероятностью 70%), и агент будет стрелять из правого пистолета. Опять же это хорошо!

И так далее и дальше…

1*Eg4HoqjJstVq9fhdfPQrKQ
Красный пистолет – это предпринятое действие

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

1*hHNtNnRnFWoVegKQdTRLNA
Мы видим, что значение Q для монстра, находящегося слева и стреляющего из правого пистолета, положительно (даже если это не рационально)

И если наш агент не видит много левых примеров (поскольку, вероятно, только 30% будет слева), наш агент завершит, только выбрав правый, независимо от того, откуда происходит монстр. Это совсем не рационально.

1*pTDJxVIg6GHn5gLv_myczw
Даже если монстр подойдет налево, наш агент будет стрелять из правого пистолета.

У нас есть две параллельные стратегии решения этой проблемы.

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

Затем мы можем упомянуть этот опыт и научиться на нем. Затем вернитесь к игре с обновленной функцией значения.

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

Это помогает избежать фиксации на одной области пространства состояний. Это предотвращает усиление того же действия снова и снова.

Этот подход можно рассматривать как форму обучения под наблюдением.

В следующих статьях мы увидим, что мы можем использовать «приоритетное воспроизведение опыта». Это позволяет нам чаще представлять нейронные сети редкие или «важные» кортежи.

Наш алгоритм Deep Q-Learning

Сначала немного математики:

Помните, что мы обновляем наше значение Q для данного состояния и действия с помощью уравнения Беллмана:

1*js8r4Aq2ZZoiLK0mMp_ocg

В нашем случае мы хотим обновить весы наших нейронных сетей, чтобы уменьшить ошибку.

Ошибка (или ошибка TD) вычисляется с помощью разницы между нашим Q_target (максимально возможное значение из следующего состояния) и Q_value (наше текущее предсказание Q-значения)

1*Zplt-1wTWu_7BGmZCBFjbQ
Initialize Doom Environment EInitialize replay Memory M with capacity N (= finite capacity)Initialize the DQN weights wfor episode in max_episode:    s = Environment state    for steps in max_steps:         Choose action a from state s using epsilon greedy.         Take action a, get r (reward) and s' (next state)         Store experience tuple <s, a, r, s'> in M         s = s' (state = new_state)                  Get random minibatch of exp tuples from M         Set Q_target = reward(s,a) +  γmaxQ(s')         Update w =  α(Q_target - Q_value) *  ∇w Q_value

В этом алгоритме происходят два процесса:

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

Давайте внедрим нашу нейронную сеть Deep Q

Мы создали видео, в котором реализуем агент глубокого Q-обучения с помощью Tensorflow, обучающегося играть в Atari Space Invaders ?️?.

Теперь, когда мы знаем, как это работает, мы шаг за шагом внедрим нашу нейронную сеть Deep Q. Каждый шаг и каждая часть кода объясняется непосредственно в блокноте Jupyter, ссылка на которую приведена ниже.

Вы можете получить доступ к нему в репозитории курса Deep Reinforcement Learning.

Это все! Вы только что создали агента, который учится играть в Doom. Прекрасно!

Не забудьте реализовать каждую часть кода самостоятельно. Очень важно попытаться изменить код, который я вам дал. Попытайтесь добавить эпохи, изменить архитектуру, добавить фиксированные значения Q, изменить скорость обучения, использовать более сложную среду (например, Health Gathering)… и так далее. Получайте удовольствие!

В следующей статье я расскажу о последних усовершенствованиях глубокого Q-обучения:

  • Фиксированные Q-значения
  • Приоритетное воспроизведение опыта
  • Двойной DQN
  • Дуэльные сети

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

1*dNEZ6GX3Fp4DCLj59XrnFQ

Если вам понравилась моя статья, пожалуйста, нажмите кнопку ? ниже столько раз, сколько вам понравилась статья поэтому другие люди увидят это здесь на Medium. И не забудь следовать за мной!

Если у вас есть какие-либо мнения, комментарии, вопросы, не стесняйтесь оставлять комментарии ниже или отправлять мне электронное письмо: hello@simoninithomas.com или твиты @ThomasSimonini.

1*_yN1FzvEFDmlObiYsstIzg
1*mD-f5VN1SWYvhrZAbvSu_w
1*PqiptT-Cdi8uwosxuFn2DQ

Продолжайте учиться, оставайтесь замечательными!

Курс глубокого подкрепления с Tensorflow?️

? учебный план

? Видео версия

Часть 1: Введение в учебу с подкреплением

Часть 2: более глубокое погружение в обучение с подкреплением с помощью Q-Learning

Часть 3: Введение в Deep Q-Learning: давайте поиграем в Doom

Часть 3+: Улучшение в глубоком обучении Q: двойной DQN на дуэли, повторение приоритетного опыта и фиксированные Q-цели

Часть 4: Введение в градиенты политики с Doom и Cartpole

Часть 5: Введение в методы Advantage Actor Critic: давайте поиграем в Ежа Соника!

Часть 6: Проксимальная оптимизация политики (PPO) из Sonic the Hedgehog 2 и 3

Часть 7: Обучение на основе любопытства стало легким Часть I

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *